You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

157 lines
5.8 KiB

#include "znvs.hpp"
#include <string.h>
#include "sdk\components\flash\zsimple_flash.hpp"
#define TAG "config"
using namespace iflytop;
using namespace std;
#define MARK_S 0x123456
#define MARK_E 0x87654321
#define GET_CFG(typename) \
cfg_t* cfg = get_cfg(key); \
if (cfg == nullptr || cfg->type != kcfg_type_##typename) { \
allocate_cfg(key, kcfg_type_##typename, (uint8_t*)&default_val, sizeof(default_val)); \
cfg = get_cfg(key); \
} \
return *(typename*)cfg->val;
#define SET_CFG(typename) \
cfg_t* cfg = get_cfg(key); \
if (cfg == nullptr || cfg->type != kcfg_type_##typename) { \
allocate_cfg(key, kcfg_type_##typename, (uint8_t*)&val, sizeof(val)); \
cfg = get_cfg(key); \
} else { \
*(typename*)cfg->val = val; \
flush(); \
}
ZNVS& ZNVS::ins() {
static ZNVS instance;
return instance;
}
void ZNVS::initialize() {
zsimple_flash_init(IFLYTOP_NVS_CONFIG_FLASH_SECTOR);
zsimple_flash_read((uint8_t*)&m_cfg, sizeof(m_cfg));
if (m_cfg.config_start != MARK_S || m_cfg.config_end != MARK_E) {
ZLOGW(TAG, "config uninitialized, initialize it");
memset(&m_cfg, 0, sizeof(m_cfg));
m_cfg.config_start = MARK_S;
m_cfg.config_end = MARK_E;
zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg));
} else {
ZLOGI(TAG, "config initialized");
}
}
void ZNVS::factory_reset() {
memset(&m_cfg, 0, sizeof(m_cfg));
m_cfg.config_start = MARK_S;
m_cfg.config_end = MARK_E;
zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg));
}
ZNVS::cfg_t* ZNVS::get_cfg(const char* key) {
for (int i = 0; i < IFLYTOP_NVS_CONFIG_MAX_ITEM_NUM; i++) {
if (strcmp(m_cfg.cfgs[i].key, key) == 0) {
return &m_cfg.cfgs[i];
}
}
return nullptr;
}
void ZNVS::allocate_cfg(const char* key, type_t type, uint8_t* default_val, uint8_t len) {
cfg_t* cfg = get_cfg(key);
for (int i = 0; i < IFLYTOP_NVS_CONFIG_MAX_ITEM_NUM; i++) {
if (m_cfg.cfgs[i].is_initialed == false) {
cfg = &m_cfg.cfgs[i];
strcpy(cfg->key, key);
cfg->is_initialed = true;
cfg->type = (uint8_t)type;
memcpy(cfg->val, default_val, len);
/**
* @brief 刷新flash
*
* TODO:优化这里的代码,不要每次都刷新flash
*/
zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg));
break;
}
}
}
ZNVS::cfg_t* ZNVS::get_and_create_cfg(const char* key, type_t type, uint8_t* default_val, uint8_t len) {
cfg_t* cfg = get_cfg(key);
if (cfg == nullptr) {
allocate_cfg(key, type, default_val, len);
cfg = get_cfg(key);
}
return cfg;
}
void ZNVS::dumpcfg() {
ZLOGI(TAG, "=================dump nvs config ==================");
ZLOGI(TAG, "=");
for (int i = 0; i < IFLYTOP_NVS_CONFIG_MAX_ITEM_NUM; i++) {
if (m_cfg.cfgs[i].is_initialed) {
dumpcfg(&m_cfg.cfgs[i]);
}
}
ZLOGI(TAG, "=============");
}
void ZNVS::dumpcfg(cfg_t* cfg) {
if (!cfg->is_initialed) return;
switch (cfg->type) {
case kcfg_type_int8_t:
ZLOGI(TAG, "= %s val:%d", cfg->key, *(int8_t*)cfg->val);
break;
case kcfg_type_int16_t:
ZLOGI(TAG, "= %s val:%d", cfg->key, *(int16_t*)cfg->val);
break;
case kcfg_type_int32_t:
ZLOGI(TAG, "= %s val:%d", cfg->key, *(int32_t*)cfg->val);
break;
case kcfg_type_uint8_t:
ZLOGI(TAG, "= %s val:%u", cfg->key, *(int8_t*)cfg->val);
break;
case kcfg_type_uint16_t:
ZLOGI(TAG, "= %s val:%u", cfg->key, *(int16_t*)cfg->val);
break;
case kcfg_type_uint32_t:
ZLOGI(TAG, "= %s val:%u", cfg->key, *(int32_t*)cfg->val);
break;
case kcfg_type_float:
ZLOGI(TAG, "= %s val:%f", cfg->key, *(float*)cfg->val);
break;
case kcfg_type_bool:
ZLOGI(TAG, "= %s val:%d", cfg->key, *(bool*)cfg->val);
break;
default:
ZLOGI(TAG, "= %s val:unknow type", cfg->key);
break;
}
return;
}
int8_t ZNVS::get_config_int8(const char* key, int8_t default_val) { GET_CFG(int8_t); }
void ZNVS::set_config_int8(const char* key, int8_t val) { SET_CFG(int8_t); }
uint8_t ZNVS::get_config_uint8(const char* key, uint8_t default_val) { GET_CFG(uint8_t); }
void ZNVS::set_config_uint8(const char* key, uint8_t val) { SET_CFG(uint8_t); }
int16_t ZNVS::get_config_int16(const char* key, int16_t default_val) { GET_CFG(int16_t); }
void ZNVS::set_config_int16(const char* key, int16_t val) { SET_CFG(int16_t); }
uint16_t ZNVS::get_config_uint16(const char* key, uint16_t default_val) { GET_CFG(uint16_t); }
void ZNVS::set_config_uint16(const char* key, uint16_t val) { SET_CFG(uint16_t); }
int32_t ZNVS::get_config_int32(const char* key, int32_t default_val) { GET_CFG(int32_t); }
void ZNVS::set_config_int32(const char* key, int32_t val) { SET_CFG(int32_t); }
uint32_t ZNVS::get_config_uint32(const char* key, uint32_t default_val) { GET_CFG(uint32_t); }
void ZNVS::set_config_uint32(const char* key, uint32_t val) { SET_CFG(uint32_t); }
float ZNVS::get_config_float(const char* key, float default_val) { GET_CFG(float); }
void ZNVS::set_config_float(const char* key, float val) { SET_CFG(float); }
bool ZNVS::get_config_bool(const char* key, bool default_val) { GET_CFG(bool); }
void ZNVS::set_config_bool(const char* key, bool val) { SET_CFG(bool); }
void ZNVS::flush() { zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg)); }