130 lines
3.2 KiB
C
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";
|
|
}
|
|
}
|