kv_flash.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #ifndef __KV_FLASH_H
  2. #define __KV_FLASH_H
  3. #include "stm32l4xx_hal.h"
  4. #include <stdint.h>
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. // ------------------- 基本参数配置 -------------------
  9. #define DB_FLASH_SIZE 2048 // 每个数据库大小
  10. #define DB_FLASH_PAGE_SIZE 2048 // 单页大小
  11. #define KV_MAX_KEY_LEN 32
  12. #define KV_MAX_VAL_LEN 64
  13. #define KV_ITEM_MAX_LEN (KV_MAX_KEY_LEN + KV_MAX_VAL_LEN + 2)
  14. // ------------------- 数据库 ID 枚举 -------------------
  15. typedef enum {
  16. DB_ID_SYSTEM = 0,
  17. DB_ID_CALIB,
  18. DB_ID_SNAPSHOT,
  19. DB_ID_MAX
  20. } KV_DB_ID;
  21. // ------------------- 键值映射表结构 -------------------
  22. typedef struct {
  23. const char* key;
  24. KV_DB_ID db_id;
  25. } KV_KeyMap;
  26. typedef struct {
  27. uint8_t db_id;
  28. const char *kv_str; // 直接存成 "key=value"
  29. } InitEntry;
  30. // ------------------- key字段宏定义 -------------------
  31. // SystemConfig 相关字段
  32. #define KV_KEY_MAC "mac"
  33. #define KV_KEY_ROLE "role"
  34. #define KV_KEY_CONSOLE "console"
  35. #define KV_KEY_ADDR "addr"
  36. #define KV_KEY_BAUDRATE "baudrate"
  37. #define KV_KEY_VERSION "version"
  38. // CalibrationParams 相关字段
  39. #define KV_KEY_ROD_VOL0 "rod_vol0"
  40. #define KV_KEY_ROD_VOL1 "rod_vol1"
  41. #define KV_KEY_ROD_VOL2 "rod_vol2"
  42. #define KV_KEY_ROD_VOL3 "rod_vol3"
  43. #define KV_KEY_ROD_VOL4 "rod_vol4"
  44. #define KV_KEY_ROD_VOL5 "rod_vol5"
  45. #define KV_KEY_ROD_VOL6 "rod_vol6"
  46. #define KV_KEY_OIL_CAP0 "oil_cap0"
  47. #define KV_KEY_OIL_CAP1 "oil_cap1"
  48. #define KV_KEY_OIL_CAP2 "oil_cap2"
  49. #define KV_KEY_OIL_CAP3 "oil_cap3"
  50. #define KV_KEY_OIL_CAP4 "oil_cap4"
  51. #define KV_KEY_OIL_CAP5 "oil_cap5"
  52. #define KV_KEY_OIL_CAP6 "oil_cap6"
  53. #define KV_KEY_OIL_CAP7 "oil_cap7"
  54. #define KV_KEY_OIL_CAP8 "oil_cap8"
  55. #define KV_KEY_OIL_CAP9 "oil_cap9"
  56. #define KV_KEY_OIL_CAP10 "oil_cap10"
  57. #define KV_KEY_RES_VOL0 "res_vol0"
  58. #define KV_KEY_RES_VOL1 "res_vol1"
  59. #define KV_KEY_RES_VOL2 "res_vol2"
  60. #define KV_KEY_RES_VOL3 "res_vol3"
  61. #define KV_KEY_RES_VOL4 "res_vol4"
  62. #define KV_KEY_RES_VOL5 "res_vol5"
  63. #define KV_KEY_RES_CAP0 "res_cap0"
  64. #define KV_KEY_RES_CAP1 "res_cap1"
  65. #define KV_KEY_RES_CAP2 "res_cap2"
  66. #define KV_KEY_RES_CAP3 "res_cap3"
  67. #define KV_KEY_RES_CAP4 "res_cap4"
  68. #define KV_KEY_RES_CAP5 "res_cap5"
  69. #define KV_KEY_ROD_VOL_OFFSET "rod_vol_offset"
  70. #define KV_KEY_ROD_DIALOG "rod_dialog"
  71. #define KV_KEY_ROD_COL_TIME "rod_coltime"
  72. #define KV_KEY_OIL_PARA_INDU "oil_para_indu"
  73. #define KV_KEY_OIL_PARA_CAP "oil_para_cap"
  74. #define KV_KEY_OIL_CAP_OFFSET "oil_cap_offset"
  75. #define KV_KEY_OIL_DIALOG "oil_dialog"
  76. #define KV_KEY_OIL_COL_TIME "rod_oil_coltime"
  77. #define KV_KEY_RES_PARA_INDU "res_para_indu"
  78. #define KV_KEY_RES_PARA_CAP "res_para_cap"
  79. #define KV_KEY_RES_CAP_OFFSET "res_cap_offset"
  80. #define KV_KEY_RES_VOL_OFFSET "res_vol_offset"
  81. #define KV_KEY_RES_CAP_DIALOG "res_cap_dialog"
  82. #define KV_KEY_RES_VOL_DIALOG "res_vol_dialog"
  83. #define KV_KEY_RES_CAP_COL_TIME "res_oil_cap_coltime"
  84. #define KV_KEY_RES_VOL_COL_TIME "res_oil_vol_coltime"
  85. #define KV_KEY_TEMP_VOL_OFFSET "temp_vol_offset"
  86. #define KV_KEY_TEMP_DIALOG "temp_dialog"
  87. #define KV_KEY_TEMP_COL_TIME "temp_coltime"
  88. // SnapshotInfo 相关字段
  89. #define KV_KEY_IAP_LOAD "iapLoadStatus"
  90. #define KV_KEY_IAP_SIZE "iapsize"
  91. #define KV_KEY_IAP_MD5 "iapmd5"
  92. #define KV_KEY_IAP_SUBCODE "subcode"
  93. #define KV_KEY_UPDATE_OK "update_ok"
  94. #define KV_KEY_UPDATE_ERR "update_err"
  95. #define KV_KEY_UBOOTBACK "ubootback"
  96. /*
  97. **iapLoadStatus定义如下:
  98. 值0:APP1区运行;
  99. 值300:下载完成,即已完成IAP缓存区的新装载(下一步在bootloader中需将其拷贝至APP2区);
  100. 值2:APP2区运行
  101. */
  102. /*
  103. **ubootback定义如下:
  104. 值400:检测到APP2区内程序无效,置上此值,并将IAP装载状态值置0(自动恢复到APP1区);
  105. 值401:检测到APP2区文件完整性校验错误,置上此值,并将IAP装载状态值置0(自动恢复到APP1区);
  106. 值1:因接收到命令,需要恢复到APP1区运行;
  107. 值0:IAP装载状态设置为2时,会将此状态值置0;
  108. */
  109. // ------------------- 接口函数 -------------------
  110. #ifdef __cplusplus
  111. extern "C" {
  112. #endif
  113. /**
  114. * @brief 读取整个数据库内容(原始字符串)
  115. * @param id 数据库ID
  116. * @param buf 存储缓冲区
  117. * @param buf_len 缓冲区大小(建议2048)
  118. * @return 实际读取字节数,失败返回0
  119. */
  120. uint16_t DB_Dump(uint8_t id, char *buf, uint16_t buf_len);
  121. /**
  122. * @brief 保存整个数据库内容(字符串)
  123. * @param id 数据库ID
  124. * @param buf 要保存的内容(##key1=val1##key2=val2##)
  125. * @param len 内容长度(不超过2048)
  126. * @return 1成功,0失败
  127. */
  128. uint8_t DB_Save(uint8_t id, const char *buf, uint16_t len);
  129. /**
  130. * @brief 写入或删除某个键值对(增删改)
  131. * @param id 数据库ID
  132. * @param kv_str 形如"key=val",val为空表示删除该key
  133. * @return 1成功,0失败
  134. */
  135. uint8_t SaveKvCache(uint8_t id, const char *kv_str);
  136. size_t get_db_used_len(uint8_t db_id);
  137. void DB_InitAllConfigs(void);
  138. void handle_mac_set_cmd(const char *buf); // 处理 ###::{"mac":"112233445566"} 设置设备SN号也就是MAC号
  139. void handle_cfg_set_cmd(const char *buf); // 入口函数_cfg_set
  140. void handle_cfg_setx_cmd(const char *buf); // 入口函数_cfg_setx
  141. void handle_cfg_get_cmd(const char *buf); // 入口函数_cfg_get
  142. void handle_fileid_cmd(const char *buf); // 入口函数 --fileid=X,0 读取库存信息
  143. void handle_clear_fileid_cmd(const char *buf); // 入口函数 --clear_fileid=X 清除内部配置库
  144. int parse_cfg_set_cmd(const char *buf, uint8_t *db_id, char *key, size_t key_sz, char *val, size_t val_sz); // 解析
  145. int parse_cfg_setx_cmd(const char *buf, uint8_t *db_id, char *key, size_t key_sz, char *val, size_t val_sz); // 解析
  146. void handle_cfg_set_common(uint8_t db_id, const char *key, const char *value); // 通用处理函数
  147. void sync_JsRoot_field(const char *key, const char *value); // 更新缓存结构体
  148. void KV_HandleQuery(uint8_t db_id, const char* key);
  149. void KV_HandleUpdate(uint8_t db_id, const char* key, const char* value);
  150. void KV_HandleDelete(uint8_t db_id, const char* key);
  151. void KV_HandleInsert(uint8_t db_id, const char* key, const char* value);
  152. void DB_SaveUInt(uint8_t dbId, const char *key, uint32_t value); // 存入 uint32_t 型到数据库
  153. void DB_SaveChar(uint8_t db_id, const char *key, const char *value); // 存入 char 型到数据库
  154. void DB_SaveInt(uint8_t dbId, const char *key, int32_t value); // 存入 int32_t 型到数据库
  155. void DB_SaveFloat(uint8_t dbId, const char *key, float value); // 存入 float 型到数据库
  156. uint8_t pickup_string_from_key(uint8_t id, const char *key, char *val_out, uint8_t max_len); // 读取某个键的字符串值
  157. uint8_t pickup_int_from_key(uint8_t id, const char *key, int *val_out); // 读取某个键的整数值
  158. uint8_t pickup_uint32_from_key(uint8_t id, const char *key, uint32_t *val_out); // 从数据库提取 uint32_t 类型
  159. uint8_t pickup_long_from_key(uint8_t id, const char *key, long *val_out); // 从数据库提取 long 类型
  160. void DB_Load_All(void);
  161. uint8_t pickup_string_from_cache(uint8_t id, const char *key, char *val_out, uint8_t max_len);
  162. uint8_t pickup_int_from_cache(uint8_t id, const char *key, int *val_out);
  163. uint8_t pickup_uint32_from_cache(uint8_t id, const char *key, uint32_t *val_out);
  164. uint8_t pickup_long_from_cache(uint8_t id, const char *key, long *val_out);
  165. void DB_Dump_to_JsRoot(void);
  166. void DB_SyncAllToJsRoot(void);
  167. void DB_Debug_Print_All(void);
  168. void DB__Dump_IAP_LOAD(void);
  169. #ifdef __cplusplus
  170. }
  171. #endif
  172. #endif // __KV_FLASH_H