diff options
-rw-r--r-- | calibrate_client.c | 6 | ||||
-rw-r--r-- | src/survive_config.c | 81 | ||||
-rw-r--r-- | src/survive_config.h | 1 |
3 files changed, 86 insertions, 2 deletions
diff --git a/calibrate_client.c b/calibrate_client.c index 927f40f..9867d67 100644 --- a/calibrate_client.c +++ b/calibrate_client.c @@ -149,6 +149,12 @@ int main() const char *s = config_read_str(&global_config_values, "test123","default"); printf("%s\n", s); + FLT *f; + + uint16_t fs = config_read_float_array(lh_config+1, "fcalgibpha", &f, NULL, 0); + printf("%d\n", fs); + printf("===> %f %f\n", f[0], f[1]); + // config_save("config.json"); diff --git a/src/survive_config.c b/src/survive_config.c index 83951fb..d8bad17 100644 --- a/src/survive_config.c +++ b/src/survive_config.c @@ -4,6 +4,8 @@ #include "survive_config.h" #include <json_helpers.h> +#include <errno.h> + #define MAX_CONFIG_ENTRIES 100 #define MAX_LIGHTHOUSES 2 @@ -99,6 +101,21 @@ FLT config_read_float(config_group *cg, const char *tag, const FLT def) { return config_set_float(cg, tag, def); } +uint16_t config_read_float_array(config_group *cg, const char *tag, FLT** values, const FLT* def, uint16_t count) { + config_entry *cv = find_config_entry(cg, tag); + + if (cv != NULL) { + *values = (FLT*)cv->data; + return cv->elements; + } + + if (def == NULL) return 0; + + config_set_float_a(cg, tag, def, count); + *values = def; + return count; +} + config_entry* next_unused_entry(config_group *cg) { config_entry *cv = cg->config_entries + cg->used_entries; assert(cg->used_entries < cg->max_entries); @@ -239,13 +256,73 @@ void pop_config_group() { cg_stack_head--; } + +int parse_floats(char* tag, char** values, uint16_t count) { + uint16_t i = 0; + FLT f[count]; + char* end = NULL; + config_group* cg = cg_stack[cg_stack_head]; + + for(i=0;i<count;++i) { + + #ifdef USE_DOUBLE + f[i] = strtod(values[i], &end); + #else + f[i] = strtof(values[i], &end); + #endif + +// if (values[i] == end) return 0; //not a float + if (*end != '\0') return 0; //not an integer + } + + if (count>1) { + config_set_float_a(cg, tag, f, count); + } + else { + config_set_float(cg, tag, f[0]); + } + + return 1; +} + +int parse_uint32(char* tag, char** values, uint16_t count) { + uint16_t i = 0; + uint32_t l[count]; + char* end = NULL; + config_group* cg = cg_stack[cg_stack_head]; + +/* + //look for non numeric values + for(end=values[0];*end!='\0';++end) { + if ((*end<48) || (*end>57)) return 0; + } + + end=NULL; +*/ + for(i=0;i<count;++i) { + l[i] = strtol(values[i], &end, 10); +// if (values[i] == end) return 0; //not an integer + if (*end != '\0') return 0; //not an integer + } + +// if (count>1) +// config_set_uint32_array(cg, tag, f, count); +// else + config_set_uint32(cg, tag, l[0]); + + return 1; +} + void handle_tag_value(char* tag, char** values, uint16_t count) { print_json_value(tag,values,count); config_group* cg = cg_stack[cg_stack_head]; - //parse out numeric values + if (parse_uint32(tag,values,count) > 0) return; //parse integers first, stricter rules + + if (parse_floats(tag,values,count) > 0) return; - if (count == 1) config_set_str(cg,tag,values[0]); + //should probably also handle string arrays + config_set_str(cg,tag,values[0]); // else if (count>1) config_set_str } diff --git a/src/survive_config.h b/src/survive_config.h index b14f928..234db68 100644 --- a/src/survive_config.h +++ b/src/survive_config.h @@ -48,6 +48,7 @@ const uint32_t config_set_uint32(config_group *cg, const char *tag, const uint32 const char* config_set_str(config_group *cg, const char *tag, const char* value); FLT config_read_float(config_group *cg, const char *tag, const FLT def); +uint16_t config_read_float_array(config_group *cg, const char *tag, FLT** values, const FLT* def, uint16_t count); uint32_t config_read_uint32(config_group *cg, const char *tag, const uint32_t def); const char* config_read_str(config_group *cg, const char *tag, const char *def); |