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
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)); }
|