refactor persistence manager from cpp to c
Some checks failed
ESP-IDF Build / build (esp32c6, release-v5.4) (push) Failing after 4m12s
ESP-IDF Build / build (esp32c6, release-v5.5) (push) Failing after 4m17s
ESP-IDF Build / build (esp32s3, release-v5.4) (push) Failing after 3m49s
ESP-IDF Build / build (esp32s3, release-v5.5) (push) Failing after 4m0s
Some checks failed
ESP-IDF Build / build (esp32c6, release-v5.4) (push) Failing after 4m12s
ESP-IDF Build / build (esp32c6, release-v5.5) (push) Failing after 4m17s
ESP-IDF Build / build (esp32s3, release-v5.4) (push) Failing after 3m49s
ESP-IDF Build / build (esp32s3, release-v5.5) (push) Failing after 4m0s
Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
@@ -1,279 +0,0 @@
|
||||
#include "hal_esp32/PersistenceManager.h"
|
||||
#include <cstring>
|
||||
#include <esp_log.h>
|
||||
|
||||
static const char *TAG = "PersistenceManager";
|
||||
|
||||
PersistenceManager::PersistenceManager(const std::string &nvs_namespace)
|
||||
: namespace_(nvs_namespace), initialized_(false)
|
||||
{
|
||||
Initialize();
|
||||
Load();
|
||||
}
|
||||
|
||||
PersistenceManager::~PersistenceManager()
|
||||
{
|
||||
Deinitialize();
|
||||
}
|
||||
|
||||
bool PersistenceManager::Initialize()
|
||||
{
|
||||
if (initialized_)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Open NVS handle
|
||||
esp_err_t err = nvs_open(namespace_.c_str(), NVS_READWRITE, &nvs_handle_);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to open NVS handle: %s", esp_err_to_name(err));
|
||||
return false;
|
||||
}
|
||||
|
||||
initialized_ = true;
|
||||
ESP_LOGI(TAG, "PersistenceManager initialized with namespace: %s", namespace_.c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
void PersistenceManager::Deinitialize()
|
||||
{
|
||||
if (initialized_)
|
||||
{
|
||||
nvs_close(nvs_handle_);
|
||||
initialized_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
bool PersistenceManager::EnsureInitialized() const
|
||||
{
|
||||
if (!initialized_)
|
||||
{
|
||||
ESP_LOGE(TAG, "PersistenceManager not initialized");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PersistenceManager::HasKey(const std::string &key) const
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return false;
|
||||
|
||||
size_t required_size = 0;
|
||||
esp_err_t err = nvs_get_blob(nvs_handle_, key.c_str(), nullptr, &required_size);
|
||||
return err == ESP_OK;
|
||||
}
|
||||
|
||||
void PersistenceManager::RemoveKey(const std::string &key)
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return;
|
||||
|
||||
esp_err_t err = nvs_erase_key(nvs_handle_, key.c_str());
|
||||
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to remove key '%s': %s", key.c_str(), esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void PersistenceManager::Clear()
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return;
|
||||
|
||||
esp_err_t err = nvs_erase_all(nvs_handle_);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to clear all keys: %s", esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
size_t PersistenceManager::GetKeyCount() const
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return 0;
|
||||
|
||||
nvs_iterator_t it = nullptr;
|
||||
esp_err_t err = nvs_entry_find(NVS_DEFAULT_PART_NAME, namespace_.c_str(), NVS_TYPE_ANY, &it);
|
||||
|
||||
if (err != ESP_OK || it == nullptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t count = 0;
|
||||
|
||||
while (it != nullptr)
|
||||
{
|
||||
count++;
|
||||
err = nvs_entry_next(&it);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
nvs_release_iterator(it);
|
||||
return count;
|
||||
}
|
||||
|
||||
bool PersistenceManager::Save()
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return false;
|
||||
|
||||
esp_err_t err = nvs_commit(nvs_handle_);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to commit NVS: %s", esp_err_to_name(err));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PersistenceManager::Load()
|
||||
{
|
||||
return EnsureInitialized();
|
||||
}
|
||||
|
||||
void PersistenceManager::SetValueImpl(const std::string &key, bool value)
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return;
|
||||
|
||||
uint8_t val = value ? 1 : 0;
|
||||
esp_err_t err = nvs_set_u8(nvs_handle_, key.c_str(), val);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set bool key '%s': %s", key.c_str(), esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void PersistenceManager::SetValueImpl(const std::string &key, int value)
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return;
|
||||
|
||||
esp_err_t err = nvs_set_i32(nvs_handle_, key.c_str(), value);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set int key '%s': %s", key.c_str(), esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void PersistenceManager::SetValueImpl(const std::string &key, float value)
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return;
|
||||
|
||||
esp_err_t err = nvs_set_blob(nvs_handle_, key.c_str(), &value, sizeof(float));
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set float key '%s': %s", key.c_str(), esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void PersistenceManager::SetValueImpl(const std::string &key, double value)
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return;
|
||||
|
||||
esp_err_t err = nvs_set_blob(nvs_handle_, key.c_str(), &value, sizeof(double));
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set double key '%s': %s", key.c_str(), esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void PersistenceManager::SetValueImpl(const std::string &key, const std::string &value)
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return;
|
||||
|
||||
esp_err_t err = nvs_set_str(nvs_handle_, key.c_str(), value.c_str());
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set string key '%s': %s", key.c_str(), esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
bool PersistenceManager::GetValueImpl(const std::string &key, bool defaultValue) const
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return defaultValue;
|
||||
|
||||
uint8_t value;
|
||||
esp_err_t err = nvs_get_u8(nvs_handle_, key.c_str(), &value);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
return value != 0;
|
||||
}
|
||||
|
||||
int PersistenceManager::GetValueImpl(const std::string &key, int defaultValue) const
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return defaultValue;
|
||||
|
||||
int32_t value;
|
||||
esp_err_t err = nvs_get_i32(nvs_handle_, key.c_str(), &value);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
return static_cast<int>(value);
|
||||
}
|
||||
|
||||
float PersistenceManager::GetValueImpl(const std::string &key, float defaultValue) const
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return defaultValue;
|
||||
|
||||
float value;
|
||||
size_t required_size = sizeof(float);
|
||||
esp_err_t err = nvs_get_blob(nvs_handle_, key.c_str(), &value, &required_size);
|
||||
if (err != ESP_OK || required_size != sizeof(float))
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
double PersistenceManager::GetValueImpl(const std::string &key, double defaultValue) const
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return defaultValue;
|
||||
|
||||
double value;
|
||||
size_t required_size = sizeof(double);
|
||||
esp_err_t err = nvs_get_blob(nvs_handle_, key.c_str(), &value, &required_size);
|
||||
if (err != ESP_OK || required_size != sizeof(double))
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
std::string PersistenceManager::GetValueImpl(const std::string &key, const std::string &defaultValue) const
|
||||
{
|
||||
if (!EnsureInitialized())
|
||||
return defaultValue;
|
||||
|
||||
size_t required_size = 0;
|
||||
esp_err_t err = nvs_get_str(nvs_handle_, key.c_str(), nullptr, &required_size);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
std::string value(required_size - 1, '\0'); // -1 for null terminator
|
||||
err = nvs_get_str(nvs_handle_, key.c_str(), value.data(), &required_size);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
#include "persistence_manager.h"
|
||||
#include <esp_log.h>
|
||||
#include <string.h>
|
||||
|
||||
#define TAG "persistence_manager"
|
||||
|
||||
void persistence_manager_init(persistence_manager_t *pm, const char *nvs_namespace)
|
||||
{
|
||||
if (!pm)
|
||||
return;
|
||||
strncpy(pm->nvs_namespace, nvs_namespace ? nvs_namespace : "config", sizeof(pm->nvs_namespace) - 1);
|
||||
pm->nvs_namespace[sizeof(pm->nvs_namespace) - 1] = '\0';
|
||||
pm->initialized = false;
|
||||
esp_err_t err = nvs_open(pm->nvs_namespace, NVS_READWRITE, &pm->nvs_handle);
|
||||
if (err == ESP_OK)
|
||||
{
|
||||
pm->initialized = true;
|
||||
ESP_LOGI(TAG, "Initialized with namespace: %s", pm->nvs_namespace);
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to open NVS handle: %s", esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void persistence_manager_deinit(persistence_manager_t *pm)
|
||||
{
|
||||
if (pm && pm->initialized)
|
||||
{
|
||||
nvs_close(pm->nvs_handle);
|
||||
pm->initialized = false;
|
||||
}
|
||||
}
|
||||
|
||||
bool persistence_manager_is_initialized(const persistence_manager_t *pm)
|
||||
{
|
||||
return pm && pm->initialized;
|
||||
}
|
||||
|
||||
bool persistence_manager_has_key(const persistence_manager_t *pm, const char *key)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return false;
|
||||
size_t required_size = 0;
|
||||
esp_err_t err = nvs_get_blob(pm->nvs_handle, key, NULL, &required_size);
|
||||
return err == ESP_OK;
|
||||
}
|
||||
|
||||
void persistence_manager_remove_key(persistence_manager_t *pm, const char *key)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return;
|
||||
esp_err_t err = nvs_erase_key(pm->nvs_handle, key);
|
||||
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to remove key '%s': %s", key, esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void persistence_manager_clear(persistence_manager_t *pm)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return;
|
||||
esp_err_t err = nvs_erase_all(pm->nvs_handle);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to clear all keys: %s", esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
size_t persistence_manager_get_key_count(const persistence_manager_t *pm)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return 0;
|
||||
nvs_iterator_t it = NULL;
|
||||
esp_err_t err = nvs_entry_find(NVS_DEFAULT_PART_NAME, pm->nvs_namespace, NVS_TYPE_ANY, &it);
|
||||
if (err != ESP_OK || it == NULL)
|
||||
return 0;
|
||||
size_t count = 0;
|
||||
while (it != NULL)
|
||||
{
|
||||
count++;
|
||||
err = nvs_entry_next(&it);
|
||||
if (err != ESP_OK)
|
||||
break;
|
||||
}
|
||||
nvs_release_iterator(it);
|
||||
return count;
|
||||
}
|
||||
|
||||
bool persistence_manager_save(persistence_manager_t *pm)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return false;
|
||||
esp_err_t err = nvs_commit(pm->nvs_handle);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to commit NVS: %s", esp_err_to_name(err));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool persistence_manager_load(persistence_manager_t *pm)
|
||||
{
|
||||
return persistence_manager_is_initialized(pm);
|
||||
}
|
||||
|
||||
void persistence_manager_set_bool(persistence_manager_t *pm, const char *key, bool value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return;
|
||||
uint8_t val = value ? 1 : 0;
|
||||
esp_err_t err = nvs_set_u8(pm->nvs_handle, key, val);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set bool key '%s': %s", key, esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void persistence_manager_set_int(persistence_manager_t *pm, const char *key, int32_t value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return;
|
||||
esp_err_t err = nvs_set_i32(pm->nvs_handle, key, value);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set int key '%s': %s", key, esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void persistence_manager_set_float(persistence_manager_t *pm, const char *key, float value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return;
|
||||
esp_err_t err = nvs_set_blob(pm->nvs_handle, key, &value, sizeof(float));
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set float key '%s': %s", key, esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void persistence_manager_set_double(persistence_manager_t *pm, const char *key, double value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return;
|
||||
esp_err_t err = nvs_set_blob(pm->nvs_handle, key, &value, sizeof(double));
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set double key '%s': %s", key, esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
void persistence_manager_set_string(persistence_manager_t *pm, const char *key, const char *value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return;
|
||||
esp_err_t err = nvs_set_str(pm->nvs_handle, key, value);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to set string key '%s': %s", key, esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
bool persistence_manager_get_bool(const persistence_manager_t *pm, const char *key, bool default_value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return default_value;
|
||||
uint8_t value;
|
||||
esp_err_t err = nvs_get_u8(pm->nvs_handle, key, &value);
|
||||
if (err != ESP_OK)
|
||||
return default_value;
|
||||
return value != 0;
|
||||
}
|
||||
|
||||
int32_t persistence_manager_get_int(const persistence_manager_t *pm, const char *key, int32_t default_value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return default_value;
|
||||
int32_t value;
|
||||
esp_err_t err = nvs_get_i32(pm->nvs_handle, key, &value);
|
||||
if (err != ESP_OK)
|
||||
return default_value;
|
||||
return value;
|
||||
}
|
||||
|
||||
float persistence_manager_get_float(const persistence_manager_t *pm, const char *key, float default_value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return default_value;
|
||||
float value;
|
||||
size_t required_size = sizeof(float);
|
||||
esp_err_t err = nvs_get_blob(pm->nvs_handle, key, &value, &required_size);
|
||||
if (err != ESP_OK || required_size != sizeof(float))
|
||||
return default_value;
|
||||
return value;
|
||||
}
|
||||
|
||||
double persistence_manager_get_double(const persistence_manager_t *pm, const char *key, double default_value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
return default_value;
|
||||
double value;
|
||||
size_t required_size = sizeof(double);
|
||||
esp_err_t err = nvs_get_blob(pm->nvs_handle, key, &value, &required_size);
|
||||
if (err != ESP_OK || required_size != sizeof(double))
|
||||
return default_value;
|
||||
return value;
|
||||
}
|
||||
|
||||
void persistence_manager_get_string(const persistence_manager_t *pm, const char *key, char *out_value, size_t max_len,
|
||||
const char *default_value)
|
||||
{
|
||||
if (!persistence_manager_is_initialized(pm))
|
||||
{
|
||||
strncpy(out_value, default_value, max_len - 1);
|
||||
out_value[max_len - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
size_t required_size = 0;
|
||||
esp_err_t err = nvs_get_str(pm->nvs_handle, key, NULL, &required_size);
|
||||
if (err != ESP_OK || required_size == 0 || required_size > max_len)
|
||||
{
|
||||
strncpy(out_value, default_value, max_len - 1);
|
||||
out_value[max_len - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
err = nvs_get_str(pm->nvs_handle, key, out_value, &required_size);
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
strncpy(out_value, default_value, max_len - 1);
|
||||
out_value[max_len - 1] = '\0';
|
||||
return;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user