#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"; } }