// // flash: nonvolatile k/v storage // #include #include #include "nvs_flash.h" #include "flash.h" #include // Private variables static nvs_handle_t my_handle; static const char *TAG = "flash"; // Initialize flash storage void flash_init(void) { // Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); } // Write k/v to flash void flash_write(char* key, int32_t val) { ESP_LOGI(TAG, "Writing keyval %s => %ld", key, val); // Open handle esp_err_t err = nvs_open("storage", NVS_READWRITE, &my_handle); if (err != ESP_OK) { ESP_LOGI(TAG, "Error (%s) opening NVS handle!\n", esp_err_to_name(err)); } else { // Write err = nvs_set_i32(my_handle, key, val); if(err != ESP_OK) ESP_LOGI(TAG, "Failed!\n"); err = nvs_commit(my_handle); if(err != ESP_OK) ESP_LOGI(TAG, "Failed!\n"); // Close nvs_close(my_handle); } } // Read k/v from flash int32_t flash_read(char* key) { int32_t val = -1; // value will default to -1 if not set // Open ESP_LOGI(TAG, "Reading keyval %s", key); esp_err_t err = nvs_open("storage", NVS_READONLY, &my_handle); if (err != ESP_OK) { ESP_LOGI(TAG, "Error (%s) opening NVS handle!\n", esp_err_to_name(err)); } else { // Read err = nvs_get_i32(my_handle, key, &val); switch (err) { case ESP_OK: ESP_LOGI(TAG, "Read value %ld\n", val); break; case ESP_ERR_NVS_NOT_FOUND: ESP_LOGI(TAG, "The value is not initialized yet!\n"); break; default : ESP_LOGI(TAG, "Error (%s) reading!\n", esp_err_to_name(err)); } // Close nvs_close(my_handle); } return val; }