nvs_utilities.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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_default(nvs_type_t type, const char *key, void * default_value, size_t blob_size) {
  97. void * current_value = get_nvs_value_alloc(type, key);
  98. if(current_value == NULL && default_value != NULL){
  99. if(type == NVS_TYPE_BLOB && blob_size == 0){
  100. ESP_LOGE(TAG,"Unable to store default value for BLOB object' blob size was not specified");
  101. return NULL;
  102. }
  103. else {
  104. esp_err_t err = store_nvs_value_len(type, key, default_value, blob_size);
  105. if(err!=ESP_OK){
  106. ESP_LOGE(TAG,"Unable to store default nvs value. Error: %s",esp_err_to_name(err));
  107. return NULL;
  108. }
  109. }
  110. }
  111. if(current_value == NULL){
  112. current_value = get_nvs_value_alloc(type, key);
  113. }
  114. return current_value;
  115. }
  116. void * get_nvs_value_alloc(nvs_type_t type, const char *key) {
  117. nvs_handle nvs;
  118. esp_err_t err;
  119. void * value=NULL;
  120. err = nvs_open(current_namespace, NVS_READONLY, &nvs);
  121. if (err != ESP_OK) {
  122. ESP_LOGE(TAG,"Could not open the nvs storage.");
  123. return NULL;
  124. }
  125. if (type == NVS_TYPE_I8) {
  126. value=malloc(sizeof(int8_t));
  127. err = nvs_get_i8(nvs, key, (int8_t *) value);
  128. } else if (type == NVS_TYPE_U8) {
  129. value=malloc(sizeof(uint8_t));
  130. err = nvs_get_u8(nvs, key, (uint8_t *) value);
  131. } else if (type == NVS_TYPE_I16) {
  132. value=malloc(sizeof(int16_t));
  133. err = nvs_get_i16(nvs, key, (int16_t *) value);
  134. } else if (type == NVS_TYPE_U16) {
  135. value=malloc(sizeof(uint16_t));
  136. err = nvs_get_u16(nvs, key, (uint16_t *) value);
  137. } else if (type == NVS_TYPE_I32) {
  138. value=malloc(sizeof(int32_t));
  139. err = nvs_get_i32(nvs, key, (int32_t *) value);
  140. } else if (type == NVS_TYPE_U32) {
  141. value=malloc(sizeof(uint32_t));
  142. err = nvs_get_u32(nvs, key, (uint32_t *) value);
  143. } else if (type == NVS_TYPE_I64) {
  144. value=malloc(sizeof(int64_t));
  145. err = nvs_get_i64(nvs, key, (int64_t *) value);
  146. } else if (type == NVS_TYPE_U64) {
  147. value=malloc(sizeof(uint64_t));
  148. err = nvs_get_u64(nvs, key, (uint64_t *) value);
  149. } else if (type == NVS_TYPE_STR) {
  150. size_t len=0;
  151. err = nvs_get_str(nvs, key, NULL, &len);
  152. if (err == ESP_OK) {
  153. value=malloc(len);
  154. err = nvs_get_str(nvs, key, value, &len);
  155. }
  156. } else if (type == NVS_TYPE_BLOB) {
  157. size_t len;
  158. err = nvs_get_blob(nvs, key, NULL, &len);
  159. if (err == ESP_OK) {
  160. value=malloc(len+1);
  161. err = nvs_get_blob(nvs, key, value, &len);
  162. }
  163. }
  164. if(err!=ESP_OK){
  165. ESP_LOGD(TAG,"Value not found for key %s",key);
  166. if(value!=NULL)
  167. free(value);
  168. value=NULL;
  169. }
  170. nvs_close(nvs);
  171. return value;
  172. }
  173. esp_err_t get_nvs_value(nvs_type_t type, const char *key, void*value, const uint8_t buf_size) {
  174. nvs_handle nvs;
  175. esp_err_t err;
  176. err = nvs_open(current_namespace, NVS_READONLY, &nvs);
  177. if (err != ESP_OK) {
  178. return err;
  179. }
  180. if (type == NVS_TYPE_I8) {
  181. err = nvs_get_i8(nvs, key, (int8_t *) value);
  182. } else if (type == NVS_TYPE_U8) {
  183. err = nvs_get_u8(nvs, key, (uint8_t *) value);
  184. } else if (type == NVS_TYPE_I16) {
  185. err = nvs_get_i16(nvs, key, (int16_t *) value);
  186. } else if (type == NVS_TYPE_U16) {
  187. err = nvs_get_u16(nvs, key, (uint16_t *) value);
  188. } else if (type == NVS_TYPE_I32) {
  189. err = nvs_get_i32(nvs, key, (int32_t *) value);
  190. } else if (type == NVS_TYPE_U32) {
  191. err = nvs_get_u32(nvs, key, (uint32_t *) value);
  192. } else if (type == NVS_TYPE_I64) {
  193. err = nvs_get_i64(nvs, key, (int64_t *) value);
  194. } else if (type == NVS_TYPE_U64) {
  195. err = nvs_get_u64(nvs, key, (uint64_t *) value);
  196. } else if (type == NVS_TYPE_STR) {
  197. size_t len;
  198. if ((err = nvs_get_str(nvs, key, NULL, &len)) == ESP_OK) {
  199. if (len > buf_size) {
  200. //ESP_LOGE("Error reading value for %s. Buffer size: %d, Value Length: %d", key, buf_size, len);
  201. err = ESP_FAIL;
  202. } else {
  203. err = nvs_get_str(nvs, key, value, &len);
  204. }
  205. }
  206. } else if (type == NVS_TYPE_BLOB) {
  207. size_t len;
  208. if ((err = nvs_get_blob(nvs, key, NULL, &len)) == ESP_OK) {
  209. if (len > buf_size) {
  210. //ESP_LOGE("Error reading value for %s. Buffer size: %d, Value Length: %d",
  211. // key, buf_size, len);
  212. err = ESP_FAIL;
  213. } else {
  214. err = nvs_get_blob(nvs, key, value, &len);
  215. }
  216. }
  217. }
  218. nvs_close(nvs);
  219. return err;
  220. }
  221. esp_err_t erase_nvs(const char *key)
  222. {
  223. nvs_handle nvs;
  224. esp_err_t err = nvs_open(current_namespace, NVS_READWRITE, &nvs);
  225. if (err == ESP_OK) {
  226. err = nvs_erase_key(nvs, key);
  227. if (err == ESP_OK) {
  228. err = nvs_commit(nvs);
  229. if (err == ESP_OK) {
  230. ESP_LOGI(TAG, "Value with key '%s' erased", key);
  231. }
  232. }
  233. nvs_close(nvs);
  234. }
  235. return err;
  236. }