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.
 
 

91 lines
2.6 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
ZNVS& ZNVS::ins() {
static ZNVS s_ins;
return s_ins;
}
void ZNVS::initialize(int32_t flash_sector) { zsimple_flash_init(flash_sector); }
bool ZNVS::alloc_config(const char* key, size_t datalen) { return alloc_config(key, nullptr, datalen); }
bool ZNVS::alloc_config(const char* key, uint8_t* __, 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);
memset(m_cfgcache->data, 0, 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() {
ZLOGI(TAG, "flush config to flash");
zsimple_flash_write((uint8_t*)m_cfgcache, m_cfgcachesize);
ZLOGI(TAG, "flush config to flash done");
}