Files
tarrot/main/settings.c
2026-06-23 06:03:19 -07:00

130 lines
3.2 KiB
C

#include "settings.h"
#include "esp_log.h"
#include "nvs.h"
#include "nvs_flash.h"
static const char *TAG = "settings";
static const char *NVS_NAMESPACE = "tarot";
static tarot_settings_t s_settings;
void settings_set_defaults(tarot_settings_t *settings)
{
if (settings == NULL) {
return;
}
settings->reversed_cards_enabled = true;
settings->save_readings_enabled = false;
settings->brightness = 80;
settings->theme = TAROT_THEME_DARK;
settings->selected_spread = TAROT_SPREAD_8_CARD;
}
esp_err_t settings_init(void)
{
nvs_handle_t handle;
esp_err_t err;
uint8_t value = 0;
settings_set_defaults(&s_settings);
err = nvs_open(NVS_NAMESPACE, NVS_READONLY, &handle);
if (err == ESP_ERR_NVS_NOT_FOUND) {
ESP_LOGI(TAG, "No saved settings; using defaults");
return settings_save(&s_settings);
}
if (err != ESP_OK) {
ESP_LOGE(TAG, "nvs_open failed: %s", esp_err_to_name(err));
return err;
}
if (nvs_get_u8(handle, "reversed", &value) == ESP_OK) {
s_settings.reversed_cards_enabled = value != 0;
}
if (nvs_get_u8(handle, "save_read", &value) == ESP_OK) {
s_settings.save_readings_enabled = value != 0;
}
if (nvs_get_u8(handle, "bright", &value) == ESP_OK) {
s_settings.brightness = value <= 100 ? value : 100;
}
if (nvs_get_u8(handle, "theme", &value) == ESP_OK && value <= TAROT_THEME_MYSTIC) {
s_settings.theme = (tarot_theme_t)value;
}
if (nvs_get_u8(handle, "spread", &value) == ESP_OK) {
s_settings.selected_spread = value == TAROT_SPREAD_3_CARD ? TAROT_SPREAD_3_CARD : TAROT_SPREAD_8_CARD;
}
nvs_close(handle);
return ESP_OK;
}
tarot_settings_t settings_get(void)
{
return s_settings;
}
esp_err_t settings_save(const tarot_settings_t *settings)
{
nvs_handle_t handle;
esp_err_t err;
if (settings == NULL) {
return ESP_ERR_INVALID_ARG;
}
err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &handle);
if (err != ESP_OK) {
ESP_LOGE(TAG, "nvs_open write failed: %s", esp_err_to_name(err));
return err;
}
err = nvs_set_u8(handle, "reversed", settings->reversed_cards_enabled ? 1 : 0);
if (err != ESP_OK) {
goto fail;
}
err = nvs_set_u8(handle, "save_read", settings->save_readings_enabled ? 1 : 0);
if (err != ESP_OK) {
goto fail;
}
err = nvs_set_u8(handle, "bright", settings->brightness);
if (err != ESP_OK) {
goto fail;
}
err = nvs_set_u8(handle, "theme", (uint8_t)settings->theme);
if (err != ESP_OK) {
goto fail;
}
err = nvs_set_u8(handle, "spread", (uint8_t)settings->selected_spread);
if (err != ESP_OK) {
goto fail;
}
err = nvs_commit(handle);
if (err != ESP_OK) {
goto fail;
}
s_settings = *settings;
nvs_close(handle);
return ESP_OK;
fail:
ESP_LOGE(TAG, "settings_save failed: %s", esp_err_to_name(err));
nvs_close(handle);
return err;
}
const char *settings_theme_name(tarot_theme_t theme)
{
switch (theme) {
case TAROT_THEME_LIGHT:
return "Light";
case TAROT_THEME_MYSTIC:
return "Mystic";
case TAROT_THEME_DARK:
default:
return "Dark";
}
}