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.

166 lines
5.9 KiB

2 years ago
  1. #if 0
  2. #include "znvs.hpp"
  3. #include <string.h>
  4. #include "sdk\components\flash\zsimple_flash.hpp"
  5. #define TAG "config"
  6. #ifdef IFLYTOP_NVS_CONFIG_MAX_ITEM_NUM
  7. using namespace iflytop;
  8. using namespace std;
  9. #define MARK_S 0x123456
  10. #define MARK_E 0x87654321
  11. #define GET_CFG(typename) \
  12. cfg_t* cfg = get_cfg(key); \
  13. if (cfg == nullptr || cfg->type != kcfg_type_##typename) { \
  14. allocate_cfg(key, kcfg_type_##typename, (uint8_t*)&default_val, sizeof(default_val)); \
  15. cfg = get_cfg(key); \
  16. } \
  17. return *(typename*)cfg->val;
  18. #define SET_CFG(typename) \
  19. cfg_t* cfg = get_cfg(key); \
  20. if (cfg == nullptr || cfg->type != kcfg_type_##typename) { \
  21. allocate_cfg(key, kcfg_type_##typename, (uint8_t*)&val, sizeof(val)); \
  22. cfg = get_cfg(key); \
  23. } else { \
  24. *(typename*)cfg->val = val; \
  25. flush(); \
  26. }
  27. ZNVS& ZNVS::ins() {
  28. static ZNVS instance;
  29. return instance;
  30. }
  31. void ZNVS::initialize() {
  32. zsimple_flash_init(IFLYTOP_NVS_CONFIG_FLASH_SECTOR);
  33. zsimple_flash_read((uint8_t*)&m_cfg, sizeof(m_cfg));
  34. if (m_cfg.config_start != MARK_S || m_cfg.config_end != MARK_E) {
  35. ZLOGW(TAG, "config uninitialized, initialize it");
  36. memset(&m_cfg, 0, sizeof(m_cfg));
  37. m_cfg.config_start = MARK_S;
  38. m_cfg.config_end = MARK_E;
  39. zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg));
  40. } else {
  41. ZLOGI(TAG, "config initialized");
  42. }
  43. }
  44. void ZNVS::factory_reset() {
  45. memset(&m_cfg, 0, sizeof(m_cfg));
  46. m_cfg.config_start = MARK_S;
  47. m_cfg.config_end = MARK_E;
  48. zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg));
  49. }
  50. ZNVS::cfg_t* ZNVS::get_cfg(const char* key) {
  51. for (int i = 0; i < IFLYTOP_NVS_CONFIG_MAX_ITEM_NUM; i++) {
  52. if (strcmp(m_cfg.cfgs[i].key, key) == 0) {
  53. return &m_cfg.cfgs[i];
  54. }
  55. }
  56. return nullptr;
  57. }
  58. void ZNVS::allocate_cfg(const char* key, type_t type, uint8_t* default_val, uint8_t len) {
  59. cfg_t* cfg = get_cfg(key);
  60. for (int i = 0; i < IFLYTOP_NVS_CONFIG_MAX_ITEM_NUM; i++) {
  61. if (m_cfg.cfgs[i].is_initialed == false) {
  62. cfg = &m_cfg.cfgs[i];
  63. strcpy(cfg->key, key);
  64. cfg->is_initialed = true;
  65. cfg->type = (uint8_t)type;
  66. memcpy(cfg->val, default_val, len);
  67. #if 0
  68. /**
  69. * @brief ˢflash
  70. *
  71. * TODO:ŻĴҪÿζˢflash
  72. */
  73. zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg));
  74. #endif
  75. break;
  76. }
  77. }
  78. }
  79. ZNVS::cfg_t* ZNVS::get_and_create_cfg(const char* key, type_t type, uint8_t* default_val, uint8_t len) {
  80. cfg_t* cfg = get_cfg(key);
  81. if (cfg == nullptr) {
  82. allocate_cfg(key, type, default_val, len);
  83. cfg = get_cfg(key);
  84. }
  85. return cfg;
  86. }
  87. void ZNVS::dumpcfg() {
  88. ZLOGI(TAG, "=================dump nvs config ==================");
  89. ZLOGI(TAG, "=");
  90. for (int i = 0; i < IFLYTOP_NVS_CONFIG_MAX_ITEM_NUM; i++) {
  91. if (m_cfg.cfgs[i].is_initialed) {
  92. dumpcfg(&m_cfg.cfgs[i]);
  93. }
  94. }
  95. ZLOGI(TAG, "=============");
  96. }
  97. void ZNVS::dumpcfg(cfg_t* cfg) {
  98. if (!cfg->is_initialed) return;
  99. switch (cfg->type) {
  100. case kcfg_type_int8_t:
  101. ZLOGI(TAG, "= %s val:%d", cfg->key, *(int8_t*)cfg->val);
  102. break;
  103. case kcfg_type_int16_t:
  104. ZLOGI(TAG, "= %s val:%d", cfg->key, *(int16_t*)cfg->val);
  105. break;
  106. case kcfg_type_int32_t:
  107. ZLOGI(TAG, "= %s val:%d", cfg->key, *(int32_t*)cfg->val);
  108. break;
  109. case kcfg_type_uint8_t:
  110. ZLOGI(TAG, "= %s val:%u", cfg->key, *(int8_t*)cfg->val);
  111. break;
  112. case kcfg_type_uint16_t:
  113. ZLOGI(TAG, "= %s val:%u", cfg->key, *(int16_t*)cfg->val);
  114. break;
  115. case kcfg_type_uint32_t:
  116. ZLOGI(TAG, "= %s val:%u", cfg->key, *(int32_t*)cfg->val);
  117. break;
  118. case kcfg_type_float:
  119. ZLOGI(TAG, "= %s val:%f", cfg->key, *(float*)cfg->val);
  120. break;
  121. case kcfg_type_bool:
  122. ZLOGI(TAG, "= %s val:%d", cfg->key, *(bool*)cfg->val);
  123. break;
  124. default:
  125. ZLOGI(TAG, "= %s val:unknow type", cfg->key);
  126. break;
  127. }
  128. return;
  129. }
  130. int8_t ZNVS::get_config_int8(const char* key, int8_t default_val) { GET_CFG(int8_t); }
  131. void ZNVS::set_config_int8(const char* key, int8_t val) { SET_CFG(int8_t); }
  132. uint8_t ZNVS::get_config_uint8(const char* key, uint8_t default_val) { GET_CFG(uint8_t); }
  133. void ZNVS::set_config_uint8(const char* key, uint8_t val) { SET_CFG(uint8_t); }
  134. int16_t ZNVS::get_config_int16(const char* key, int16_t default_val) { GET_CFG(int16_t); }
  135. void ZNVS::set_config_int16(const char* key, int16_t val) { SET_CFG(int16_t); }
  136. uint16_t ZNVS::get_config_uint16(const char* key, uint16_t default_val) { GET_CFG(uint16_t); }
  137. void ZNVS::set_config_uint16(const char* key, uint16_t val) { SET_CFG(uint16_t); }
  138. int32_t ZNVS::get_config_int32(const char* key, int32_t default_val) { GET_CFG(int32_t); }
  139. void ZNVS::set_config_int32(const char* key, int32_t val) { SET_CFG(int32_t); }
  140. uint32_t ZNVS::get_config_uint32(const char* key, uint32_t default_val) { GET_CFG(uint32_t); }
  141. void ZNVS::set_config_uint32(const char* key, uint32_t val) { SET_CFG(uint32_t); }
  142. float ZNVS::get_config_float(const char* key, float default_val) { GET_CFG(float); }
  143. void ZNVS::set_config_float(const char* key, float val) { SET_CFG(float); }
  144. bool ZNVS::get_config_bool(const char* key, bool default_val) { GET_CFG(bool); }
  145. void ZNVS::set_config_bool(const char* key, bool val) { SET_CFG(bool); }
  146. void ZNVS::flush() { zsimple_flash_write((uint8_t*)&m_cfg, sizeof(m_cfg)); }
  147. #endif
  148. #endif