Repository navigation
Expand file tree
/
Copy pathsettings.cpp
More file actions
50 lines (44 loc) · 1.69 KB
/
Copy pathsettings.cpp
File metadata and controls
50 lines (44 loc) · 1.69 KB
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
#include "settings.h"
#include "config.h"
#include "i18n.h"
#include <ESP_EEPROM.h>
Settings cfg;
static const uint32_t CFG_MAGIC = 0x48444331; // "HDC1"
// EEPROM layout lock: lang was borrowed from the tail of portalOk, so neither the struct size nor any field
// offset may change, otherwise configs on older devices are treated as invalid
static_assert(sizeof(Settings) == 660, "Settings layout changed: old EEPROM contents would be discarded");
static uint32_t crc32(const uint8_t* p, size_t n) {
uint32_t c = 0xFFFFFFFF;
while (n--) { c ^= *p++; for (int i = 0; i < 8; i++) c = (c >> 1) ^ (0xEDB88320 & -(c & 1)); }
return ~c;
}
void settingsDefaults() {
memset(&cfg, 0, sizeof(cfg));
cfg.magic = CFG_MAGIC;
strcpy(cfg.serverUrl, "http://192.168.1.100:8090");
cfg.tlsMode = TLS_INSECURE;
cfg.pollMinutes = 5;
cfg.nightStartHour = 0;
cfg.nightEndHour = 6;
cfg.nightPollMinutes = 30;
cfg.nightTopbar = 1;
cfg.batShowPercent = 1;
cfg.rotation = EPD_ROTATION;
cfg.lang = LANG_ZH;
strcpy(cfg.portalFields, "username,password");
}
void settingsLoad() {
EEPROM.begin(sizeof(Settings));
EEPROM.get(0, cfg);
bool ok = cfg.magic == CFG_MAGIC && cfg.crc == crc32((const uint8_t*)&cfg, sizeof(cfg) - 4);
if (!ok) { LOG("settings: invalid, using defaults"); settingsDefaults(); }
if (cfg.lang > LANG_EN) cfg.lang = LANG_ZH; // in EEPROM written by old firmware this byte may hold portalOk's content
}
void settingsSave() {
cfg.magic = CFG_MAGIC;
cfg.crc = crc32((const uint8_t*)&cfg, sizeof(cfg) - 4);
EEPROM.put(0, cfg);
bool ok = EEPROM.commit();
LOG("settings: saved %s", ok ? "ok" : "FAILED");
}
bool settingsUrlIsHttps() { return strncmp(cfg.serverUrl, "https://", 8) == 0; }