-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsettings.h
120 lines (100 loc) · 3.43 KB
/
settings.h
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <EEPROM.h>
#ifndef SETTINGS_H
#define SETTINGS_H
#define EEPROM_WIFI_SIZE 512
#define EEPROM_MAGIC "NtPc"
#define EEPROM_MAGIC_OFFSET 0
#define EEPROM_MAGIC_LENGTH 4
#define EEPROM_SSID_OFFSET EEPROM_MAGIC_OFFSET + EEPROM_MAGIC_LENGTH
#define EEPROM_SSID_LENGTH 32
#define EEPROM_PSK_OFFSET EEPROM_SSID_OFFSET + EEPROM_SSID_LENGTH
#define EEPROM_PSK_LENGTH 64
#define EEPROM_TZ_OFFSET EEPROM_PSK_OFFSET + EEPROM_PSK_LENGTH
#define EEPROM_TIMESERVER_OFFSET EEPROM_TZ_OFFSET + 1
#define EEPROM_TIMESERVER_LENGTH 32
#define EEPROM_INTERVAL_OFFSET EEPROM_TIMESERVER_OFFSET + EEPROM_TIMESERVER_LENGTH
#define EEPROM_INTERVAL_LENGTH 2
#define EEPROM_NAME_OFFSET EEPROM_INTERVAL_OFFSET + EEPROM_INTERVAL_LENGTH
#define EEPROM_NAME_LENGTH 32
#define DEFAULT_TIMESERVER "time.nist.gov"
#define MINIMUM_INTERVAL 60
#define CLOCK_NAME "ESP-CLOCK"
#define WIFI_AP_NAME CLOCK_NAME
class Settings {
public:
Settings() {};
void Load() {
char buffer[EEPROM_WIFI_SIZE];
EEPROM.begin(EEPROM_WIFI_SIZE);
for (int i = 0 ; i < EEPROM_WIFI_SIZE ; i++) {
buffer[i] = EEPROM.read(i);
}
EEPROM.end();
// Verify magic;
String magic;
for (int i = EEPROM_MAGIC_OFFSET ; i < EEPROM_MAGIC_OFFSET+EEPROM_MAGIC_LENGTH ; i++) {
magic += buffer[i];
}
if (magic != EEPROM_MAGIC) {
return;
}
// Read SSID
ssid = "";
for (int i = EEPROM_SSID_OFFSET ; i < EEPROM_SSID_OFFSET+EEPROM_SSID_LENGTH ; i++) {
if (buffer[i]) ssid += buffer[i];
}
// Read PSK
psk = "";
for (int i = EEPROM_PSK_OFFSET ; i < EEPROM_PSK_OFFSET+EEPROM_PSK_LENGTH ; i++) {
if (buffer[i]) psk += buffer[i];
}
timezone = long(buffer[EEPROM_TZ_OFFSET]);
strncpy(timeserver, &buffer[EEPROM_TIMESERVER_OFFSET], EEPROM_TIMESERVER_LENGTH);
if (strlen(timeserver) < 1) {
strcpy(timeserver, DEFAULT_TIMESERVER);
}
interval = time_t(buffer[EEPROM_INTERVAL_OFFSET]) << 8;
interval |= buffer[EEPROM_INTERVAL_OFFSET+1];
if (interval < MINIMUM_INTERVAL) {
interval = MINIMUM_INTERVAL;
}
// Clock name.
name = "";
for (int i = EEPROM_NAME_OFFSET ; i < EEPROM_NAME_OFFSET+EEPROM_NAME_LENGTH ; i++) {
if (buffer[i]) name += buffer[i];
}
}
void Save() {
unsigned char buffer[EEPROM_WIFI_SIZE];
memset(buffer, 0, EEPROM_WIFI_SIZE);
// Copy magic to buffer;
strncpy((char *)buffer, EEPROM_MAGIC, EEPROM_MAGIC_LENGTH);
// Copy SSID to buffer;
ssid.getBytes(&buffer[EEPROM_SSID_OFFSET], EEPROM_SSID_LENGTH, 0);
// Copy PSK to buffer.
psk.getBytes(&buffer[EEPROM_PSK_OFFSET], EEPROM_PSK_LENGTH, 0);
// Copy timezone.
buffer[EEPROM_TZ_OFFSET] = timezone;
// Copy timeserver.
strncpy((char *)&buffer[EEPROM_TIMESERVER_OFFSET], (char *)timeserver, EEPROM_TIMESERVER_LENGTH);
// Copy interval.
buffer[EEPROM_INTERVAL_OFFSET] = interval >> 8;
buffer[EEPROM_INTERVAL_OFFSET+1] = interval & 0xff;
// Copy clock name.
name.getBytes(&buffer[EEPROM_NAME_OFFSET], EEPROM_NAME_LENGTH, 0);
// Write to EEPROM.
EEPROM.begin(EEPROM_WIFI_SIZE);
for (int i = 0 ; i < EEPROM_WIFI_SIZE ; i++) {
EEPROM.write(i, buffer[i]);
}
EEPROM.end();
}
String ssid;
String psk;
long timezone;
char timeserver[64];
int interval;
String name;
};
Settings settings;
#endif