89 lines
2.5 KiB
C
89 lines
2.5 KiB
C
#include <string.h>
|
|
#include "esp_log.h"
|
|
#include "nvs_flash.h"
|
|
#include "nvs.h"
|
|
#include "eeprom_virtual.h"
|
|
|
|
static const char *TAG = "EEPROM_VIRTUAL";
|
|
static nvs_handle_t s_nvs;
|
|
|
|
|
|
/**
|
|
* @brief Inicializa o “EEPROM virtual” (usa partição NVS)
|
|
*/
|
|
esp_err_t eeprom_virtual_init(void)
|
|
{
|
|
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();
|
|
}
|
|
if (ret != ESP_OK) {
|
|
ESP_LOGE(TAG, "❌ Falha ao inicializar NVS (%s)", esp_err_to_name(ret));
|
|
return ret;
|
|
}
|
|
|
|
ret = nvs_open("storage", NVS_READWRITE, &s_nvs);
|
|
if (ret != ESP_OK) {
|
|
ESP_LOGE(TAG, "❌ Erro ao abrir namespace NVS: %s", esp_err_to_name(ret));
|
|
return ret;
|
|
}
|
|
|
|
ESP_LOGI(TAG, "✅ EEPROM virtual pronta (namespace 'storage')");
|
|
return ESP_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Guarda dados binários na NVS
|
|
*/
|
|
esp_err_t eeprom_virtual_write_bin(const char *key, const void *data, size_t len)
|
|
{
|
|
if (!key || !data || len == 0) return ESP_ERR_INVALID_ARG;
|
|
esp_err_t ret = nvs_set_blob(s_nvs, key, data, len);
|
|
if (ret == ESP_OK) {
|
|
ret = nvs_commit(s_nvs);
|
|
ESP_LOGI(TAG, "💾 Gravado '%s' (%d bytes)", key, (int)len);
|
|
} else {
|
|
ESP_LOGE(TAG, "❌ Falha ao gravar '%s' (%s)", key, esp_err_to_name(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Lê dados binários da NVS
|
|
*/
|
|
esp_err_t eeprom_virtual_read_bin(const char *key, void *buf, size_t *len)
|
|
{
|
|
if (!key || !buf || !len) return ESP_ERR_INVALID_ARG;
|
|
esp_err_t ret = nvs_get_blob(s_nvs, key, buf, len);
|
|
if (ret == ESP_OK)
|
|
ESP_LOGI(TAG, "📖 Lido '%s' (%d bytes)", key, (int)*len);
|
|
else if (ret == ESP_ERR_NVS_NOT_FOUND)
|
|
ESP_LOGW(TAG, "⚠️ Chave '%s' não encontrada", key);
|
|
else
|
|
ESP_LOGE(TAG, "❌ Erro ao ler '%s' (%s)", key, esp_err_to_name(ret));
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Apaga uma chave da EEPROM virtual
|
|
*/
|
|
esp_err_t eeprom_virtual_erase_key(const char *key)
|
|
{
|
|
esp_err_t ret = nvs_erase_key(s_nvs, key);
|
|
if (ret == ESP_OK) nvs_commit(s_nvs);
|
|
ESP_LOGI(TAG, "🧹 Apagado '%s' (%s)", key, esp_err_to_name(ret));
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Apaga todo o conteúdo da EEPROM virtual
|
|
*/
|
|
esp_err_t eeprom_virtual_erase_all(void)
|
|
{
|
|
esp_err_t ret = nvs_erase_all(s_nvs);
|
|
if (ret == ESP_OK) nvs_commit(s_nvs);
|
|
ESP_LOGW(TAG, "🧨 EEPROM virtual limpa (%s)", esp_err_to_name(ret));
|
|
return ret;
|
|
}
|