diff --git a/CMakeLists.txt b/CMakeLists.txt index 95f95e8..12a1964 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ set(REQUIRES "") -set(SRCS src/configulator.c src/cfglr_signal_callback.c) +set(SRCS + src/configulator.c + src/cfglr_signal_callback.c + src/element_list.c +) if(${ESP_PLATFORM}) list(APPEND REQUIRES nvs_flash esp_event) diff --git a/include/configulator.h b/include/configulator.h index a43e5c1..970055d 100644 --- a/include/configulator.h +++ b/include/configulator.h @@ -30,9 +30,10 @@ typedef enum { #define CFGLR_DATATYPE_COUNT (uint8_t)(CFGLR_DATATYPE_BIN - CFGLR_DATATYPE_U8) -typedef struct cfglr_signaler cfglr_signaler_t; -typedef struct cfglr_handle_struct cfglr_handle_t; +typedef struct cfglr_config cfglr_config_t; typedef struct cfglr_element cfglr_element_t; +typedef struct cfglr_handle cfglr_handle_t; +typedef struct cfglr_signaler cfglr_signaler_t; typedef void (*cfglr_signaler_init_t)(cfglr_signaler_t *signaler, cfglr_element_t *element, cfglr_handle_t *handle); typedef void (*cfglr_signaler_dispatch_t)(cfglr_signaler_t *signaler, cfglr_element_t *element, cfglr_signal_e sig); @@ -120,16 +121,24 @@ struct cfglr_backend { .set = SET,\ } -struct cfglr_handle_struct { +struct cfglr_config { const char *namespace; - // TODO cleanup, what is store_default for? - uint8_t store_default; uint8_t backend_count; uint8_t element_count; cfglr_backend_t backend; cfglr_element_t elements[CFGLR_ELEMENTS_MAX]; }; + +struct cfglr_handle { + const char *namespace; + uint8_t backend_count; + uint8_t element_count; + cfglr_backend_t backend; + cfglr_element_t elements[CFGLR_ELEMENTS_MAX]; + void *extra; +}; + extern cfglr_handle_t *configulator; uint8_t cfglr_init(cfglr_handle_t *handle); diff --git a/src/configulator.c b/src/configulator.c index 296642c..1e97500 100644 --- a/src/configulator.c +++ b/src/configulator.c @@ -1,11 +1,32 @@ #include "string.h" #include "configulator.h" #include "cfglr_log.h" +#include "element_list.h" #define TAG "CFGLR" cfglr_handle_t *configulator; +element_list_node_t *cfglr_element_list_add(cfglr_handle_t *handle, cfglr_element_t *element) { + element_list_node_t *node = malloc(sizeof(element_list_node_t)); + bzero(node, sizeof(element_list_node_t)); + + node->element = element; + + // initiaze the first node + // it is only first/last + if(handle->extra == NULL) { + handle->extra = node; + + node->first = node; + node->last = node; + + return node; + } + + return element_list_add(handle->extra, node); +} + uint8_t cfglr_add_element(cfglr_handle_t *handle, cfglr_element_t *element) { cfglr_signaler_t *signaler; @@ -51,6 +72,8 @@ uint8_t cfglr_add_element(cfglr_handle_t *handle, cfglr_element_t *element) { element->signalers[i].dispatch(&element->signalers[i], element, signal); } + cfglr_element_list_add(handle, element); + return ++handle->element_count; } @@ -102,13 +125,17 @@ uint16_t cfglr_commit_data(cfglr_backend_t *backend, cfglr_element_t *element, c cfglr_element_t * cfglr_get_element(cfglr_handle_t *handle, const char *name) { cfglr_element_t *element; + element_list_node_t *node = handle->extra; + node = node->first; - uint8_t i = 0; - for(; i < handle->element_count; i++) { - element = &handle->elements[i]; + while(node) { + element = node->element; CFGLR_LOGI(TAG, "element: %s @ %p", element->key, element); + if(strcmp(element->key, name) == 0) return element; + + node = node->next; } return NULL;