blobs, signalers in element macros, and removing the big fucking if statement that was causing all the confusion
This commit is contained in:
		
							parent
							
								
									0cd6971e70
								
							
						
					
					
						commit
						85dc35dcc2
					
				
					 3 changed files with 64 additions and 51 deletions
				
			
		|  | @ -49,27 +49,33 @@ struct cfglr_element { | |||
|   cfglr_datatype_e datatype; | ||||
|   // TODO precalcualte sizes in an array and use datatype enum to look up
 | ||||
|   uint8_t datatype_size; | ||||
|   uint8_t default_size; | ||||
|   void *data; | ||||
|   void *default_data; | ||||
|   cfglr_handle_t *handle; | ||||
|   cfglr_signaler_t signalers[CFGLR_SIGNALERS_MAX]; | ||||
| }; | ||||
| 
 | ||||
| #define CFGLR_ELEMENT(KEY, TYPE, DEFAULT, SIZE) (cfglr_element_t){\ | ||||
| #define CFGLR_ELEMENT(KEY, TYPE, SIZE, DEFAULT, DEF_SIZE, SIGNALERS...) (cfglr_element_t){\ | ||||
|   .key = KEY,\ | ||||
|   .datatype = TYPE,\ | ||||
|   .datatype_size = SIZE,\ | ||||
|   .default_data = (void*)DEFAULT,\ | ||||
|   .default_size = DEF_SIZE,\ | ||||
|   .signalers = {\ | ||||
|     SIGNALERS,\ | ||||
|     { NULL }\ | ||||
|   }\ | ||||
| } | ||||
| 
 | ||||
| #define CFGLR_ELEMENT_U8(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U8, DEFAULT, sizeof(uint8_t)) | ||||
| #define CFGLR_ELEMENT_I8(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I8, DEFAULT, sizeof(int8_t)) | ||||
| #define CFGLR_ELEMENT_U16(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U16, DEFAULT, sizeof(uint16_t)) | ||||
| #define CFGLR_ELEMENT_I16(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I16, DEFAULT, sizeof(int16_t)) | ||||
| #define CFGLR_ELEMENT_U32(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U32, DEFAULT, sizeof(uint32_t)) | ||||
| #define CFGLR_ELEMENT_I32(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I32, DEFAULT, sizeof(int32_t)) | ||||
| #define CFGLR_ELEMENT_U64(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U64, DEFAULT, sizeof(uint64_t)) | ||||
| #define CFGLR_ELEMENT_I64(KEY, DEFAULT) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I64, DEFAULT, sizeof(int64_t)) | ||||
| #define CFGLR_ELEMENT_U8(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U8, sizeof(uint8_t), DEFAULT, 1, SIGNALERS) | ||||
| #define CFGLR_ELEMENT_I8(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I8, sizeof(int8_t), DEFAULT, 1, SIGNALERS) | ||||
| #define CFGLR_ELEMENT_U16(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U16, sizeof(uint16_t), DEFAULT, 2, SIGNALERS) | ||||
| #define CFGLR_ELEMENT_I16(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I16, sizeof(int16_t), DEFAULT, 2, SIGNALERS) | ||||
| #define CFGLR_ELEMENT_U32(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U32, sizeof(uint32_t), DEFAULT, 4, SIGNALERS) | ||||
| #define CFGLR_ELEMENT_I32(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I32, sizeof(int32_t), DEFAULT, 4, SIGNALERS) | ||||
| #define CFGLR_ELEMENT_U64(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_U64, sizeof(uint64_t), DEFAULT, 8, SIGNALERS) | ||||
| #define CFGLR_ELEMENT_I64(KEY, DEFAULT, SIGNALERS...) CFGLR_ELEMENT(KEY, CFGLR_DATATYPE_I64, sizeof(int64_t), DEFAULT, 8, SIGNALERS) | ||||
| 
 | ||||
| typedef struct cfglr_backend cfglr_backend_t; | ||||
| 
 | ||||
|  | @ -98,6 +104,7 @@ struct cfglr_backend { | |||
| 
 | ||||
| struct cfglr_handle_struct { | ||||
|   const char *namespace; | ||||
|   // TODO cleanup, what is store_default for?
 | ||||
|   uint8_t store_default; | ||||
|   uint8_t backend_count; | ||||
|   uint8_t element_count; | ||||
|  |  | |||
|  | @ -17,53 +17,60 @@ void cfglr_backend_nvs_close(cfglr_backend_t *backend, cfglr_handle_t *handle) { | |||
| uint16_t cfglr_backend_nvs_get(cfglr_backend_t *backend, cfglr_element_t *element, cfglr_handle_t *handle) { | ||||
|   esp_err_t err = ESP_OK; | ||||
| 
 | ||||
|   if(element->datatype <= CFGLR_DATATYPE_I32) { | ||||
|     switch(element->datatype) { | ||||
|       case CFGLR_DATATYPE_U8: | ||||
|         err = nvs_get_u8((nvs_handle_t)backend->handle, element->key, (uint8_t*)element->data); | ||||
|       break; | ||||
|   switch(element->datatype) { | ||||
|     case CFGLR_DATATYPE_U8: | ||||
|       err = nvs_get_u8((nvs_handle_t)backend->handle, element->key, (uint8_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       case CFGLR_DATATYPE_I8: | ||||
|         err = nvs_get_i8((nvs_handle_t)backend->handle, element->key, (int8_t*)element->data); | ||||
|       break; | ||||
|     case CFGLR_DATATYPE_I8: | ||||
|       err = nvs_get_i8((nvs_handle_t)backend->handle, element->key, (int8_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       case CFGLR_DATATYPE_U16: | ||||
|         err = nvs_get_u16((nvs_handle_t)backend->handle, element->key, (uint16_t*)element->data); | ||||
|       break; | ||||
|     case CFGLR_DATATYPE_U16: | ||||
|       err = nvs_get_u16((nvs_handle_t)backend->handle, element->key, (uint16_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       case CFGLR_DATATYPE_I16: | ||||
|         err = nvs_get_i16((nvs_handle_t)backend->handle, element->key, (int16_t*)element->data); | ||||
|       break; | ||||
|     case CFGLR_DATATYPE_I16: | ||||
|       err = nvs_get_i16((nvs_handle_t)backend->handle, element->key, (int16_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       case CFGLR_DATATYPE_U32: | ||||
|         err = nvs_get_u32((nvs_handle_t)backend->handle, element->key, (uint32_t*)element->data); | ||||
|       break; | ||||
|     case CFGLR_DATATYPE_U32: | ||||
|       err = nvs_get_u32((nvs_handle_t)backend->handle, element->key, (uint32_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       case CFGLR_DATATYPE_I32: | ||||
|         err = nvs_get_i32((nvs_handle_t)backend->handle, element->key, (int32_t*)element->data); | ||||
|       break; | ||||
|     case CFGLR_DATATYPE_I32: | ||||
|       err = nvs_get_i32((nvs_handle_t)backend->handle, element->key, (int32_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       case CFGLR_DATATYPE_U64: | ||||
|         err = nvs_get_u64((nvs_handle_t)backend->handle, element->key, (uint64_t*)element->data); | ||||
|       break; | ||||
|     case CFGLR_DATATYPE_U64: | ||||
|       err = nvs_get_u64((nvs_handle_t)backend->handle, element->key, (uint64_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       case CFGLR_DATATYPE_I64: | ||||
|         err = nvs_get_i64((nvs_handle_t)backend->handle, element->key, (int64_t*)element->data); | ||||
|       break; | ||||
|     case CFGLR_DATATYPE_I64: | ||||
|       err = nvs_get_i64((nvs_handle_t)backend->handle, element->key, (int64_t*)element->data); | ||||
|     break; | ||||
| 
 | ||||
|       default: | ||||
|         CFGLR_LOGI(TAG, "unhandlable datatype: %d", element->datatype); | ||||
|     } | ||||
|     case CFGLR_DATATYPE_STR: | ||||
|     case CFGLR_DATATYPE_BIN: | ||||
|       uint8_t read_size = 0; | ||||
| 
 | ||||
|     if(err == ESP_ERR_NVS_NOT_FOUND) { | ||||
|       CFGLR_LOGI(TAG, "NOT FOUN!!!!"); | ||||
|     } else if(err != ESP_OK) { | ||||
|       ESP_ERROR_CHECK(err); | ||||
|     } else if(err == ESP_OK) { | ||||
|       element->dirty = 0; | ||||
|     } | ||||
|   } else { | ||||
|     // handle [UI]64, STR and BIN datatype
 | ||||
|       err = nvs_get_blob((nvs_handle_t)backend->handle, element->key, element->data, &read_size); | ||||
| 
 | ||||
|       if(read_size != element->datatype_size) { | ||||
|         CFGLR_LOGW(TAG, "blob read size does not match declared size"); | ||||
|       } | ||||
|     break; | ||||
| 
 | ||||
|     default: | ||||
|       CFGLR_LOGI(TAG, "unhandlable datatype: %d", element->datatype); | ||||
|   } | ||||
| 
 | ||||
|   if(err == ESP_ERR_NVS_NOT_FOUND) { | ||||
|     CFGLR_LOGI(TAG, "NOT FOUN!!!!"); | ||||
|   } else if(err != ESP_OK) { | ||||
|     ESP_ERROR_CHECK(err); | ||||
|   } else if(err == ESP_OK) { | ||||
|     element->dirty = 0; | ||||
|   } | ||||
| 
 | ||||
|   return err; | ||||
|  | @ -110,8 +117,7 @@ uint16_t cfglr_backend_nvs_set(cfglr_backend_t *backend, cfglr_element_t *elemen | |||
| 
 | ||||
|     case CFGLR_DATATYPE_STR: | ||||
|     case CFGLR_DATATYPE_BIN: | ||||
|       // determine length
 | ||||
|       // fetch data by length
 | ||||
|       err = nvs_set_blob((nvs_handle_t)backend->handle, element->key, element->data, element->datatype_size); | ||||
|     break; | ||||
| 
 | ||||
|     default: | ||||
|  |  | |||
|  | @ -25,10 +25,10 @@ uint8_t cfglr_init(cfglr_handle_t *handle) { | |||
| 
 | ||||
|     CFGLR_LOGI(TAG, "Initializing element: %s", element->key); | ||||
|     CFGLR_LOGI(TAG, "size: %d", element->datatype_size); | ||||
|     CFGLR_LOGI(TAG, "default: %d", (int)element->default_data); | ||||
| 
 | ||||
|     element->handle = handle; | ||||
|     element->data = (void*)malloc(element->datatype_size); | ||||
|     bzero(element->data, 0); | ||||
|     CFGLR_LOGW(TAG, "malloc: %d @ %p", element->datatype_size, element->data); | ||||
| 
 | ||||
|     //CFGLR_LOGI(TAG, "element->data: %p", element->data);
 | ||||
|  | @ -50,7 +50,7 @@ uint8_t cfglr_init(cfglr_handle_t *handle) { | |||
|     } else { | ||||
|       CFGLR_LOGI(TAG, "failed to load %s, setting default", element->key); | ||||
| 
 | ||||
|       memcpy((void*)element->data, (void*)&element->default_data, element->datatype_size); | ||||
|       memcpy((void*)&element->data, (void*)&element->default_data, element->default_size); | ||||
|       if(handle->backend.set(&handle->backend, element, handle) == 0) { | ||||
|         dispatch = true; | ||||
|       } | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue