66 lines
1.6 KiB
C++
66 lines
1.6 KiB
C++
#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;
|
|
};
|