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.
|
|
#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
|