nvs_utilities.c 6.7 KB

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