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.
87 lines
2.4 KiB
87 lines
2.4 KiB
#include "znvs.hpp"
|
|
|
|
#include <string.h>
|
|
|
|
#include "zsimple_flash.hpp"
|
|
|
|
using namespace iflytop;
|
|
using namespace std;
|
|
|
|
#define TAG "ZNVS"
|
|
#define MARK_S 0x12345678
|
|
#define MARK_E 0x87654321
|
|
#ifdef IFLYTOP_NVS_CONFIG_FLASH_SECTOR
|
|
|
|
ZNVS& ZNVS::ins() {
|
|
static ZNVS s_ins;
|
|
return s_ins;
|
|
}
|
|
|
|
void ZNVS::initialize() { zsimple_flash_init(IFLYTOP_NVS_CONFIG_FLASH_SECTOR); }
|
|
bool ZNVS::alloc_config(const char* key, uint8_t* data, size_t datalen) {
|
|
ZASSERT(m_index_num < ZARRAY_SIZE(m_index));
|
|
m_index[m_index_num].name = key;
|
|
m_index[m_index_num].len = datalen;
|
|
m_index[m_index_num].defaultval = data;
|
|
m_index_num++;
|
|
return true;
|
|
}
|
|
bool ZNVS::init_config() {
|
|
int configtotallen = 0;
|
|
for (int i = 0; i < m_index_num; i++) {
|
|
configtotallen += m_index[i].len;
|
|
}
|
|
configtotallen = configtotallen + sizeof(config_t) /*head*/ + 4 /*tail*/;
|
|
|
|
m_cfgcache = (config_t*)malloc(configtotallen);
|
|
ZASSERT(m_cfgcache);
|
|
m_cfgcachesize = configtotallen;
|
|
|
|
zsimple_flash_read((uint8_t*)m_cfgcache, m_cfgcachesize);
|
|
if (m_cfgcache->config_start != MARK_S || m_cfgcache->data_size != (m_cfgcachesize - sizeof(config_t))) {
|
|
ZLOGW(TAG, "config uninitialized, initialize it");
|
|
memset(m_cfgcache, 0, m_cfgcachesize);
|
|
m_cfgcache->config_start = MARK_S;
|
|
m_cfgcache->data_size = m_cfgcachesize - sizeof(config_t);
|
|
flush_all_to_configcache();
|
|
zsimple_flash_write((uint8_t*)m_cfgcache, m_cfgcachesize);
|
|
} else {
|
|
ZLOGI(TAG, "config initialized successfully");
|
|
}
|
|
inited = true;
|
|
return true;
|
|
}
|
|
|
|
void ZNVS::flush_all_to_configcache() {
|
|
for (int i = 0; i < m_index_num; i++) {
|
|
memcpy(m_cfgcache->data, m_index[i].defaultval, m_index[i].len);
|
|
}
|
|
}
|
|
|
|
bool ZNVS::get_config(const char* key, uint8_t* data, size_t len) {
|
|
ZASSERT(inited);
|
|
int dataoffset = 0;
|
|
for (int i = 0; i < m_index_num; i++) {
|
|
if (strcmp(m_index[i].name, key) == 0) {
|
|
ZASSERT(len == m_index[i].len);
|
|
memcpy(data, m_cfgcache->data + dataoffset, m_index[i].len);
|
|
return true;
|
|
}
|
|
dataoffset += m_index[i].len;
|
|
}
|
|
return false;
|
|
}
|
|
bool ZNVS::set_config(const char* key, uint8_t* data, size_t len) {
|
|
ZASSERT(inited);
|
|
int dataoffset = 0;
|
|
for (int i = 0; i < m_index_num; i++) {
|
|
if (strcmp(m_index[i].name, key) == 0) {
|
|
memcpy(m_cfgcache->data + dataoffset, data, len);
|
|
return true;
|
|
}
|
|
dataoffset += m_index[i].len;
|
|
}
|
|
return false;
|
|
}
|
|
void ZNVS::flush() { zsimple_flash_write((uint8_t*)m_cfgcache, m_cfgcachesize); }
|
|
#endif
|