nvs_utilities.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #include "nvs_utilities.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "esp_system.h"
  5. #include "esp_log.h"
  6. #include "esp_console.h"
  7. #include "esp_vfs_dev.h"
  8. #include "driver/uart.h"
  9. #include "linenoise/linenoise.h"
  10. #include "argtable3/argtable3.h"
  11. #include "cmd_decl.h"
  12. #include "esp_vfs_fat.h"
  13. #include "nvs.h"
  14. #include "nvs_flash.h"
  15. const char current_namespace[] = "config";
  16. const char settings_partition[] = "settings";
  17. static const char * TAG = "platform_esp32";
  18. bool isNameValid(char * key){
  19. bool bFound=false;
  20. nvs_handle nvs;
  21. esp_err_t err;
  22. int8_t val=0;
  23. err = nvs_open(current_namespace, NVS_READONLY, &nvs);
  24. if (err != ESP_OK) {
  25. ESP_LOGE(TAG,"Error opening nvs storage for namespace %s",current_namespace);
  26. return false;
  27. }
  28. err = nvs_get_i8(nvs, key, &val);
  29. if(err==ESP_OK || err== ESP_ERR_NVS_INVALID_LENGTH){
  30. bFound=true;
  31. }
  32. else {
  33. ESP_LOGD(TAG,"Search for key %s in namespace %s returned %#08X",key,current_namespace,err);
  34. }
  35. // nvs_iterator_t it = nvs_entry_find(NVS_DEFAULT_PART_NAME, current_namespace, NVS_TYPE_ANY);
  36. // while (it != NULL) {
  37. // nvs_entry_info_t info;
  38. // nvs_entry_info(it, &info);
  39. // it = nvs_entry_next(it);
  40. // if(!strcmp(info.key,key)){
  41. // bFound=true;
  42. // }
  43. // printf("key '%s', type '%d' \n", info.key, info.type);
  44. // };
  45. // // Note: no need to release iterator obtained from nvs_entry_find function when
  46. // // nvs_entry_find or nvs_entry_next function return NULL, indicating no other
  47. // // element for specified criteria was found.
  48. nvs_close(nvs);
  49. return bFound;
  50. }
  51. esp_err_t store_nvs_value(nvs_type_t type, const char *key, void * data) {
  52. if (type == NVS_TYPE_BLOB)
  53. return ESP_ERR_NVS_TYPE_MISMATCH;
  54. return store_nvs_value_len(type, key, data,0);
  55. }
  56. esp_err_t store_nvs_value_len(nvs_type_t type, const char *key, void * data,
  57. size_t data_len) {
  58. esp_err_t err;
  59. nvs_handle nvs;
  60. if (type == NVS_TYPE_ANY) {
  61. return ESP_ERR_NVS_TYPE_MISMATCH;
  62. }
  63. err = nvs_open(current_namespace, NVS_READWRITE, &nvs);
  64. if (err != ESP_OK) {
  65. return err;
  66. }
  67. if (type == NVS_TYPE_I8) {
  68. err = nvs_set_i8(nvs, key, *(int8_t *) data);
  69. } else if (type == NVS_TYPE_U8) {
  70. err = nvs_set_u8(nvs, key, *(uint8_t *) data);
  71. } else if (type == NVS_TYPE_I16) {
  72. err = nvs_set_i16(nvs, key, *(int16_t *) data);
  73. } else if (type == NVS_TYPE_U16) {
  74. err = nvs_set_u16(nvs, key, *(uint16_t *) data);
  75. } else if (type == NVS_TYPE_I32) {
  76. err = nvs_set_i32(nvs, key, *(int32_t *) data);
  77. } else if (type == NVS_TYPE_U32) {
  78. err = nvs_set_u32(nvs, key, *(uint32_t *) data);
  79. } else if (type == NVS_TYPE_I64) {
  80. err = nvs_set_i64(nvs, key, *(int64_t *) data);
  81. } else if (type == NVS_TYPE_U64) {
  82. err = nvs_set_u64(nvs, key, *(uint64_t *) data);
  83. } else if (type == NVS_TYPE_STR) {
  84. err = nvs_set_str(nvs, key, data);
  85. } else if (type == NVS_TYPE_BLOB) {
  86. err = nvs_set_blob(nvs, key, (void *) data, data_len);
  87. }
  88. if (err == ESP_OK) {
  89. err = nvs_commit(nvs);
  90. if (err == ESP_OK) {
  91. ESP_LOGI(TAG, "Value stored under key '%s'", key);
  92. }
  93. }
  94. nvs_close(nvs);
  95. return err;
  96. }
  97. void nvs_value_set_default(nvs_type_t type, const char *key, void * default_value, size_t blob_size) {
  98. free(get_nvs_value_alloc_default(type, key, default_value, blob_size));
  99. }
  100. void * get_nvs_value_alloc_default(nvs_type_t type, const char *key, void * default_value, size_t blob_size) {
  101. void * current_value = get_nvs_value_alloc(type, key);
  102. if(current_value == NULL && default_value != NULL){
  103. if(type == NVS_TYPE_BLOB && blob_size == 0){
  104. ESP_LOGE(TAG,"Unable to store default value for BLOB object' blob size was not specified");
  105. return NULL;
  106. }
  107. else {
  108. esp_err_t err = store_nvs_value_len(type, key, default_value, blob_size);
  109. if(err!=ESP_OK){
  110. ESP_LOGE(TAG,"Unable to store default nvs value for key %s. Error: %s", key,esp_err_to_name(err));
  111. return NULL;
  112. }
  113. else{
  114. ESP_LOGI(TAG,"Stored new default value for key %s", key);
  115. }
  116. }
  117. }
  118. if(current_value == NULL){
  119. current_value = get_nvs_value_alloc(type, key);
  120. }
  121. return current_value;
  122. }
  123. void * get_nvs_value_alloc(nvs_type_t type, const char *key) {
  124. nvs_handle nvs;
  125. esp_err_t err;
  126. void * value=NULL;
  127. err = nvs_open(current_namespace, NVS_READONLY, &nvs);
  128. if (err != ESP_OK) {
  129. ESP_LOGE(TAG,"Could not open the nvs storage.");
  130. return NULL;
  131. }
  132. if (type == NVS_TYPE_I8) {
  133. value=malloc(sizeof(int8_t));
  134. err = nvs_get_i8(nvs, key, (int8_t *) value);
  135. } else if (type == NVS_TYPE_U8) {
  136. value=malloc(sizeof(uint8_t));
  137. err = nvs_get_u8(nvs, key, (uint8_t *) value);
  138. } else if (type == NVS_TYPE_I16) {
  139. value=malloc(sizeof(int16_t));
  140. err = nvs_get_i16(nvs, key, (int16_t *) value);
  141. } else if (type == NVS_TYPE_U16) {
  142. value=malloc(sizeof(uint16_t));
  143. err = nvs_get_u16(nvs, key, (uint16_t *) value);
  144. } else if (type == NVS_TYPE_I32) {
  145. value=malloc(sizeof(int32_t));
  146. err = nvs_get_i32(nvs, key, (int32_t *) value);
  147. } else if (type == NVS_TYPE_U32) {
  148. value=malloc(sizeof(uint32_t));
  149. err = nvs_get_u32(nvs, key, (uint32_t *) value);
  150. } else if (type == NVS_TYPE_I64) {
  151. value=malloc(sizeof(int64_t));
  152. err = nvs_get_i64(nvs, key, (int64_t *) value);
  153. } else if (type == NVS_TYPE_U64) {
  154. value=malloc(sizeof(uint64_t));
  155. err = nvs_get_u64(nvs, key, (uint64_t *) value);
  156. } else if (type == NVS_TYPE_STR) {
  157. size_t len=0;
  158. err = nvs_get_str(nvs, key, NULL, &len);
  159. if (err == ESP_OK) {
  160. value=malloc(len);
  161. err = nvs_get_str(nvs, key, value, &len);
  162. }
  163. } else if (type == NVS_TYPE_BLOB) {
  164. size_t len;
  165. err = nvs_get_blob(nvs, key, NULL, &len);
  166. if (err == ESP_OK) {
  167. value=malloc(len+1);
  168. err = nvs_get_blob(nvs, key, value, &len);
  169. }
  170. }
  171. if(err!=ESP_OK){
  172. ESP_LOGD(TAG,"Value not found for key %s",key);
  173. if(value!=NULL)
  174. free(value);
  175. value=NULL;
  176. }
  177. nvs_close(nvs);
  178. return value;
  179. }
  180. esp_err_t get_nvs_value(nvs_type_t type, const char *key, void*value, const uint8_t buf_size) {
  181. nvs_handle nvs;
  182. esp_err_t err;
  183. err = nvs_open(current_namespace, NVS_READONLY, &nvs);
  184. if (err != ESP_OK) {
  185. return err;
  186. }
  187. if (type == NVS_TYPE_I8) {
  188. err = nvs_get_i8(nvs, key, (int8_t *) value);
  189. } else if (type == NVS_TYPE_U8) {
  190. err = nvs_get_u8(nvs, key, (uint8_t *) value);
  191. } else if (type == NVS_TYPE_I16) {
  192. err = nvs_get_i16(nvs, key, (int16_t *) value);
  193. } else if (type == NVS_TYPE_U16) {
  194. err = nvs_get_u16(nvs, key, (uint16_t *) value);
  195. } else if (type == NVS_TYPE_I32) {
  196. err = nvs_get_i32(nvs, key, (int32_t *) value);
  197. } else if (type == NVS_TYPE_U32) {
  198. err = nvs_get_u32(nvs, key, (uint32_t *) value);
  199. } else if (type == NVS_TYPE_I64) {
  200. err = nvs_get_i64(nvs, key, (int64_t *) value);
  201. } else if (type == NVS_TYPE_U64) {
  202. err = nvs_get_u64(nvs, key, (uint64_t *) value);
  203. } else if (type == NVS_TYPE_STR) {
  204. size_t len;
  205. if ((err = nvs_get_str(nvs, key, NULL, &len)) == ESP_OK) {
  206. if (len > buf_size) {
  207. //ESP_LOGE("Error reading value for %s. Buffer size: %d, Value Length: %d", key, buf_size, len);
  208. err = ESP_FAIL;
  209. } else {
  210. err = nvs_get_str(nvs, key, value, &len);
  211. }
  212. }
  213. } else if (type == NVS_TYPE_BLOB) {
  214. size_t len;
  215. if ((err = nvs_get_blob(nvs, key, NULL, &len)) == ESP_OK) {
  216. if (len > buf_size) {
  217. //ESP_LOGE("Error reading value for %s. Buffer size: %d, Value Length: %d",
  218. // key, buf_size, len);
  219. err = ESP_FAIL;
  220. } else {
  221. err = nvs_get_blob(nvs, key, value, &len);
  222. }
  223. }
  224. }
  225. nvs_close(nvs);
  226. return err;
  227. }
  228. esp_err_t erase_nvs(const char *key)
  229. {
  230. nvs_handle nvs;
  231. esp_err_t err = nvs_open(current_namespace, NVS_READWRITE, &nvs);
  232. if (err == ESP_OK) {
  233. err = nvs_erase_key(nvs, key);
  234. if (err == ESP_OK) {
  235. err = nvs_commit(nvs);
  236. if (err == ESP_OK) {
  237. ESP_LOGI(TAG, "Value with key '%s' erased", key);
  238. }
  239. }
  240. nvs_close(nvs);
  241. }
  242. return err;
  243. }