src.nth.io/

summaryrefslogtreecommitdiff
path: root/main/nvs_config.c
blob: 8ba2078b489b18ae1c70441f5ce0a16d0d84dd08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "nvs_config.h"

#include <string.h>

#include "esp_log.h"
#include "nvs.h"
#include "nvs_flash.h"

#include "viewport_state.h"

static const char *TAG = "nvs_config";
static const char *NS  = "viewport";

static const char *K_VIEWPORT = "viewport";
static const char *K_SCRYPTED = "scrypted";
static const char *K_IDLE_MS  = "idle_ms";
static const char *K_ORIENT   = "orient";    // 0 = portrait, 1 = landscape
static const char *K_BRIGHT   = "bright";

esp_err_t nvs_config_load(void)
{
    nvs_handle_t h;
    esp_err_t err = nvs_open(NS, NVS_READONLY, &h);
    if (err == ESP_ERR_NVS_NOT_FOUND) {
        ESP_LOGI(TAG, "no saved config — first boot");
        return ESP_OK;
    }
    if (err != ESP_OK) return err;

    viewport_state_lock();
    viewport_state_t *st = viewport_state_get();

    size_t len = sizeof(st->viewport_name);
    err = nvs_get_str(h, K_VIEWPORT, st->viewport_name, &len);
    if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) goto done;

    len = sizeof(st->scrypted_url);
    err = nvs_get_str(h, K_SCRYPTED, st->scrypted_url, &len);
    if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) goto done;

    uint32_t u32 = 0;
    err = nvs_get_u32(h, K_IDLE_MS, &u32);
    if (err == ESP_OK) st->idle_timeout_ms = u32;
    else if (err != ESP_ERR_NVS_NOT_FOUND) goto done;

    uint8_t u8 = 0;
    err = nvs_get_u8(h, K_ORIENT, &u8);
    if (err == ESP_OK) {
        st->orientation = (u8 == 1) ? VIEWPORT_ORIENTATION_LANDSCAPE
                                    : VIEWPORT_ORIENTATION_PORTRAIT;
    } else if (err != ESP_ERR_NVS_NOT_FOUND) {
        goto done;
    }

    err = nvs_get_u8(h, K_BRIGHT, &u8);
    if (err == ESP_OK) st->brightness = u8;
    else if (err != ESP_ERR_NVS_NOT_FOUND) goto done;

    err = ESP_OK;

    // "Configured" = a scrypted URL has been registered. viewport_name
    // always has a value (MAC-derived default seeded in viewport_state_init).
    st->configured = (st->scrypted_url[0] != '\0');
    ESP_LOGI(TAG, "loaded config: viewport=%s scrypted=%s "
                  "idle_ms=%u orient=%s bright=%u (%s)",
             st->viewport_name,
             st->scrypted_url[0] ? st->scrypted_url : "(none)",
             (unsigned)st->idle_timeout_ms,
             st->orientation == VIEWPORT_ORIENTATION_LANDSCAPE
                 ? "landscape" : "portrait",
             st->brightness,
             st->configured ? "configured" : "no scrypted URL");

done:
    viewport_state_unlock();
    nvs_close(h);
    return err;
}

esp_err_t nvs_config_save(void)
{
    nvs_handle_t h;
    esp_err_t err = nvs_open(NS, NVS_READWRITE, &h);
    if (err != ESP_OK) return err;

    viewport_state_lock();
    viewport_state_t *st = viewport_state_get();

    if ((err = nvs_set_str(h, K_VIEWPORT, st->viewport_name)) != ESP_OK) goto done;
    if ((err = nvs_set_str(h, K_SCRYPTED, st->scrypted_url))  != ESP_OK) goto done;
    if ((err = nvs_set_u32(h, K_IDLE_MS,  st->idle_timeout_ms)) != ESP_OK) goto done;
    if ((err = nvs_set_u8 (h, K_ORIENT,
                          (st->orientation == VIEWPORT_ORIENTATION_LANDSCAPE)
                              ? 1 : 0)) != ESP_OK) goto done;
    if ((err = nvs_set_u8 (h, K_BRIGHT,   st->brightness))     != ESP_OK) goto done;

    err = nvs_commit(h);

done:
    viewport_state_unlock();
    nvs_close(h);
    return err;
}