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.

163 lines
5.9 KiB

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