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.

90 lines
2.6 KiB

1 year ago
  1. #include "znvs.hpp"
  2. #include <string.h>
  3. #include "zsimple_flash.hpp"
  4. using namespace iflytop;
  5. using namespace std;
  6. #define TAG "ZNVS"
  7. #define MARK_S 0x12345678
  8. #define MARK_E 0x87654321
  9. ZNVS& ZNVS::ins() {
  10. static ZNVS s_ins;
  11. return s_ins;
  12. }
  13. void ZNVS::initialize(int32_t flash_sector) { zsimple_flash_init(flash_sector); }
  14. bool ZNVS::alloc_config(const char* key, size_t datalen) { return alloc_config(key, nullptr, datalen); }
  15. bool ZNVS::alloc_config(const char* key, uint8_t* __, size_t datalen) {
  16. ZASSERT(m_index_num < ZARRAY_SIZE(m_index));
  17. m_index[m_index_num].name = key;
  18. m_index[m_index_num].len = datalen;
  19. // m_index[m_index_num].defaultval = data;
  20. m_index_num++;
  21. return true;
  22. }
  23. bool ZNVS::init_config() {
  24. int configtotallen = 0;
  25. for (int i = 0; i < m_index_num; i++) {
  26. configtotallen += m_index[i].len;
  27. }
  28. configtotallen = configtotallen + sizeof(config_t) /*head*/ + 4 /*tail*/;
  29. m_cfgcache = (config_t*)malloc(configtotallen);
  30. ZASSERT(m_cfgcache);
  31. m_cfgcachesize = configtotallen;
  32. zsimple_flash_read((uint8_t*)m_cfgcache, m_cfgcachesize);
  33. if (m_cfgcache->config_start != MARK_S || m_cfgcache->data_size != (m_cfgcachesize - sizeof(config_t))) {
  34. ZLOGW(TAG, "config uninitialized, initialize it");
  35. memset(m_cfgcache, 0, m_cfgcachesize);
  36. m_cfgcache->config_start = MARK_S;
  37. m_cfgcache->data_size = m_cfgcachesize - sizeof(config_t);
  38. flush_all_to_configcache();
  39. zsimple_flash_write((uint8_t*)m_cfgcache, m_cfgcachesize);
  40. } else {
  41. ZLOGI(TAG, "config initialized successfully");
  42. }
  43. inited = true;
  44. return true;
  45. }
  46. void ZNVS::flush_all_to_configcache() {
  47. for (int i = 0; i < m_index_num; i++) {
  48. // memcpy(m_cfgcache->data, m_index[i].defaultval, m_index[i].len);
  49. memset(m_cfgcache->data, 0, m_index[i].len);
  50. }
  51. }
  52. bool ZNVS::get_config(const char* key, uint8_t* data, size_t len) {
  53. ZASSERT(inited);
  54. int dataoffset = 0;
  55. for (int i = 0; i < m_index_num; i++) {
  56. if (strcmp(m_index[i].name, key) == 0) {
  57. ZASSERT(len == m_index[i].len);
  58. memcpy(data, m_cfgcache->data + dataoffset, m_index[i].len);
  59. return true;
  60. }
  61. dataoffset += m_index[i].len;
  62. }
  63. return false;
  64. }
  65. bool ZNVS::set_config(const char* key, uint8_t* data, size_t len) {
  66. ZASSERT(inited);
  67. int dataoffset = 0;
  68. for (int i = 0; i < m_index_num; i++) {
  69. if (strcmp(m_index[i].name, key) == 0) {
  70. memcpy(m_cfgcache->data + dataoffset, data, len);
  71. return true;
  72. }
  73. dataoffset += m_index[i].len;
  74. }
  75. return false;
  76. }
  77. void ZNVS::flush() {
  78. ZLOGI(TAG, "flush config to flash");
  79. zsimple_flash_write((uint8_t*)m_cfgcache, m_cfgcachesize);
  80. ZLOGI(TAG, "flush config to flash done");
  81. }