#include "param_mgr.h" #include "app_config.h" #include #include #include #ifndef PARAM_PROPS_MAXLEN #define PARAM_PROPS_MAXLEN (350) #endif param_prop props[PARAM_PROPS_MAXLEN]; uint16_t param_count = 0u; param_prop *param_get_by_idx(uint16_t idx) { if (idx < param_count) { return props + idx; } return NULL; } uint16_t param_get_count(void) { return param_count; } static int16_t find_idx_by_name2(uint16_t b, uint16_t e, const char name[16]) { if (b + 1u == e) { return e; } uint16_t m; m = (b + e) >> 1; int cmp = strncmp(name, props[m].name, 16); if (cmp < 0) { return find_idx_by_name2(b, m, name); } else { return find_idx_by_name2(m, e, name); } } uint16_t find_idx_by_name(const char name[16]) { int cmp; if (param_count == 0u) { return 0u; } else if (param_count == 1u) { cmp = strncmp(name, props[0].name, 16); if (cmp < 0) { return 0u; } else { return 1u; } } else { cmp = strncmp(name, props[0].name, 16); if (cmp < 0) { return 0; } else { cmp = strncmp(name, props[param_count - 1].name, 16); if (cmp < 0) { return find_idx_by_name2(0, param_count - 1, name); } else { return param_count; } } } } param_prop *param_get_by_name(const char name[16]) { uint16_t idx = find_idx_by_name(name); if (idx > 0u && idx <= param_count && strncmp(name, props[idx - 1].name, 16) == 0) { return props + (idx - 1); } return NULL; } int16_t param_get_idx_by_name(const char name[16]) { uint16_t idx = find_idx_by_name(name); if (idx > 0u && idx <= param_count && strncmp(name, props[idx - 1].name, 16) == 0) { return idx - 1; } return -1; } int param_mgr_regist(param_prop *prop) { if (param_count < PARAM_PROPS_MAXLEN) { uint16_t idx = find_idx_by_name(prop->name); for (uint16_t i = param_count; i > idx; --i) { memcpy(&props[i], &props[i - 1u], sizeof(param_prop)); } memcpy(&props[idx], prop, sizeof(param_prop)); ++param_count; return 0; } return -1; } int param_get_size(param_prop *prop) { switch (prop->typ) { case PARAM_TYPE_UINT8: case PARAM_TYPE_INT8: return 1; case PARAM_TYPE_UINT16: case PARAM_TYPE_INT16: return 2; default: return 4; } } void param_set_value(param_prop *prop, const uint8_t value[4]) { param_value_ptr_t val_ptr; val_ptr.B = (uint8_t *)value; if (prop->setter_ptr) { (*props->setter_ptr)(val_ptr); } else { memcpy(prop->val_ptr.B, value, param_get_size(prop)); } } void param_get_value(param_prop *prop, uint8_t value[4]) { float val; param_value_ptr_t val_ptr; if (prop->getter_ptr) { val_ptr.B = value; (*props->getter_ptr)(val_ptr); } else { val_ptr = prop->val_ptr; memcpy(value, val_ptr.B, param_get_size(prop)); } } #if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ #ifndef __weak #define __weak __attribute__((weak)) #endif /* __weak */ #else #define __weak #endif /* __GNUC__ */ __weak bool param_NVRAM_write(uint32_t offset, uint8_t *buf, uint32_t size) { return false; } __weak bool param_NVRAM_read(uint32_t offset, uint8_t *buf, uint32_t size) { return false; } bool save_param(void) { uint16_t n = param_get_count(); uint8_t param_buff[20]; for (uint16_t i = 0u; i < n; ++i) { param_prop *p = param_get_by_idx(i); if (p) { memset(param_buff, 0, 20); param_get_value(p, ¶m_buff[16]); strncpy((char *)param_buff, p->name, 16); if (!param_NVRAM_write(i * 20, param_buff, 20)) { goto onError; } } else { goto onError; } } return true; onError: return false; } bool param_save(int16_t i, param_prop *p) { uint16_t n = param_get_count(); uint8_t param_buff[20]; if (i >= 0 && i < n && p) { memset(param_buff, 0, 20); param_get_value(p, ¶m_buff[16]); strncpy((char *)param_buff, p->name, 16); if (!param_NVRAM_write(i * 20, param_buff, 20)) { goto onError; } } return true; onError: return false; } bool restore_param(void) { uint16_t n = param_get_count(); uint8_t param_buff[20]; for (uint16_t i = 0u; i < n; ++i) { param_prop *p = param_get_by_idx(i); if (p) { if (param_NVRAM_read(i * 20, param_buff, 20)) { if (strncmp(p->name, (char *)param_buff, 16) == 0) { if (strncmp(p->name, "ap_ver", 6) == 0) { if (*(p->val_ptr.I) != *((uint32_t *)¶m_buff[16])) { goto onError; } else { break; } } } else { goto onError; } } else { goto onError; } } else { goto onError; } } for (uint16_t i = 0u; i < n; ++i) { param_prop *p = param_get_by_idx(i); if (p) { if (param_NVRAM_read(i * 20, param_buff, 20)) { if (strncmp(p->name, (char *)param_buff, 16) == 0) { param_set_value(p, ¶m_buff[16]); } else { goto onError; } } else { goto onError; } } else { goto onError; } } return true; onError: return false; }