#pragma once #include "io/io.h" #include "freertos/FreeRTOS.h" #include "nvs.h" class NVSStorageHandler : public KVStorageHandler { public: NVSStorageHandler( const char* name_space ); ~NVSStorageHandler() override; void init(const EventGroupHandle_t& system_event_group) override; void put(const char* const& key, const char* const& value) override; char* get(const char* const& key) const override; esp_err_t process_all(KeyValueProcessor processor, void* arg) const override; esp_err_t process_filtered(const char* const& key_prefix, KeyValueProcessor processor, void* arg) const override; esp_err_t process_filtered(FilterFunc filter_func, KeyValueProcessor processor, void* arg) const override; void remove(const char* const& key) override; private: NVSIteratorGuard create_iterator() const; nvs_handle_t nvsHandle = 0; const char* name_space; }; struct NVSIteratorGuard { public: ~NVSIteratorGuard() { if (iterator) { nvs_release_iterator(iterator); } } const nvs_iterator_t const& get_iterator() const { return iterator; } void advance_iter() { if (iterator) { // advance the iterator and update the internal state esp_err_t err = nvs_entry_next(&iterator); if (err != ESP_OK) { error = err; iterator = nullptr; } } } esp_err_t get_error() const { return error; } bool is_valid() const { return iterator != nullptr && error == ESP_OK; } friend class NVSStorageHandler; private: NVSIteratorGuard(nvs_iterator_t it , esp_err_t err ) : iterator(it), error(err) { } nvs_iterator_t iterator; esp_err_t error; };