Skip to content

Commit 6a76e31

Browse files
committed
refactor settings
1 parent 6f33525 commit 6a76e31

File tree

3 files changed

+151
-169
lines changed

3 files changed

+151
-169
lines changed

esp8266-ledclock/esp8266-ledclock.ino

Lines changed: 23 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,32 @@
99
#include <WiFiClient.h>
1010
#include <ESP8266WebServer.h>
1111

12+
#include "settings.h"
1213
#include "mainPage.h"
1314

14-
#define CLOCK_NAME "ESP-CLOCK"
15-
#define WIFI_AP_NAME CLOCK_NAME
16-
1715
#define SETUP_PIN 3
1816

1917
#define MODE_SETUP 0
2018
#define MODE_CLOCK 1
2119
int clockMode;
22-
time_t syncInterval = 3600;
2320

2421
ESP8266WebServer server (80);
2522

26-
String clockName = "";
27-
String w_ssid;
28-
String w_psk;
2923
String httpUpdateResponse;
30-
long timezone;
31-
IPAddress timeServer(129, 6, 15, 28);
24+
3225
time_t prevDisplay = 0;
3326

3427
void handleRoot() {
3528
String s = MAIN_page;
36-
s.replace("@@SSID@@", w_ssid);
37-
s.replace("@@PSK@@", w_psk);
38-
s.replace("@@TZ@@", String(timezone));
29+
s.replace("@@SSID@@", settings.ssid);
30+
s.replace("@@PSK@@", settings.psk);
31+
s.replace("@@TZ@@", String(settings.timezone));
3932
s.replace("@@HOUR@@", String(hour()));
4033
s.replace("@@MIN@@", String(minute()));
41-
s.replace("@@NTPSRV@@", ipToString(timeServer));
42-
s.replace("@@NTPINT@@", String(syncInterval));
34+
s.replace("@@NTPSRV@@", settings.timeserver);
35+
s.replace("@@NTPINT@@", String(settings.interval));
4336
s.replace("@@SYNCSTATUS@@", timeStatus() == timeSet ? "OK" : "Overdue");
44-
s.replace("@@CLOCKNAME@@", clockName);
37+
s.replace("@@CLOCKNAME@@", settings.name);
4538
s.replace("@@UPDATERESPONSE@@", httpUpdateResponse);
4639
httpUpdateResponse = "";
4740
server.send(200, "text/html", s);
@@ -51,31 +44,34 @@ void handleForm() {
5144
String update_wifi = server.arg("update_wifi");
5245
String t_ssid = server.arg("ssid");
5346
String t_psk = server.arg("psk");
54-
timeServer = parseIP(server.arg("ntpsrv"));
47+
String t_timeserver = server.arg("ntpsrv");
48+
t_timeserver.toCharArray(settings.timeserver, EEPROM_TIMESERVER_LENGTH, 0);
5549
if (update_wifi == "1") {
56-
w_ssid = t_ssid;
57-
w_psk = t_psk;
50+
settings.ssid = t_ssid;
51+
settings.psk = t_psk;
5852
}
5953
String tz = server.arg("timezone");
6054

6155
if (tz.length()) {
62-
timezone = tz.toInt();
56+
settings.timezone = tz.toInt();
6357
}
6458

6559
time_t newTime = getNtpTime();
6660
if (newTime) {
6761
setTime(newTime);
6862
}
6963
String syncInt = server.arg("ntpint");
70-
syncInterval = syncInt.toInt();
64+
settings.interval = syncInt.toInt();
65+
66+
settings.name = server.arg("clockname");
67+
settings.name.replace("+", " ");
7168

72-
clockName = server.arg("clockname");
7369
httpUpdateResponse = "The configuration was updated.";
7470

7571
server.sendHeader("Location", "/");
7672
server.send(302, "text/plain", "Moved");
7773

78-
saveSettings();
74+
settings.Save();
7975
if (update_wifi == "1") {
8076
delay(500);
8177
setupWiFi();
@@ -107,11 +103,11 @@ void loop() {
107103
}
108104

109105
void setupWiFi() {
110-
readSettings();
106+
settings.Load();
111107
// Wait up to 5s for GPIO0 to go low to enter AP/setup mode.
112108
displayBusy(0);
113109
while (millis() < 5000) {
114-
if (digitalRead(SETUP_PIN) == 0 || !w_ssid.length()) {
110+
if (digitalRead(SETUP_PIN) == 0 || !settings.ssid.length()) {
115111
stopDisplayBusy();
116112
return setupAP();
117113
}
@@ -121,103 +117,6 @@ void setupWiFi() {
121117
setupSTA();
122118
}
123119

124-
#define EEPROM_WIFI_SIZE 512
125-
#define EEPROM_MAGIC "NtPc"
126-
#define EEPROM_MAGIC_OFFSET 0
127-
#define EEPROM_MAGIC_LENGTH 4
128-
#define EEPROM_SSID_OFFSET EEPROM_MAGIC_OFFSET + EEPROM_MAGIC_LENGTH
129-
#define EEPROM_SSID_LENGTH 32
130-
#define EEPROM_PSK_OFFSET EEPROM_SSID_OFFSET + EEPROM_SSID_LENGTH
131-
#define EEPROM_PSK_LENGTH 64
132-
#define EEPROM_TZ_OFFSET EEPROM_PSK_OFFSET + EEPROM_PSK_LENGTH
133-
#define EEPROM_TIMESERVER_OFFSET EEPROM_TZ_OFFSET + 1
134-
#define EEPROM_TIMESERVER_LENGTH 4
135-
#define EEPROM_INTERVAL_OFFSET EEPROM_TIMESERVER_OFFSET + EEPROM_TIMESERVER_LENGTH
136-
#define EEPROM_INTERVAL_LENGTH 2
137-
#define EEPROM_NAME_OFFSET EEPROM_INTERVAL_OFFSET + EEPROM_INTERVAL_LENGTH
138-
#define EEPROM_NAME_LENGTH 32
139-
140-
void readSettings() {
141-
EEPROM.begin(EEPROM_WIFI_SIZE);
142-
// Read the magic header and validate it.
143-
String magic;
144-
for (int i = 0 ; i < EEPROM_MAGIC_LENGTH ; i++) {
145-
magic += char(EEPROM.read(EEPROM_MAGIC_OFFSET + i));
146-
}
147-
if (magic != EEPROM_MAGIC) return; // Invalid settings.
148-
w_ssid = "";
149-
w_psk = "";
150-
for (int i = EEPROM_SSID_OFFSET ; i < EEPROM_SSID_LENGTH ; i++) {
151-
char c = char(EEPROM.read(i));
152-
if (c) {
153-
w_ssid += c;
154-
}
155-
}
156-
for (int i = EEPROM_PSK_OFFSET ; i < EEPROM_PSK_LENGTH ; i++) {
157-
char c = char(EEPROM.read(i));
158-
if (c) {
159-
w_psk += c;
160-
}
161-
}
162-
timezone = long(EEPROM.read(EEPROM_TZ_OFFSET));
163-
uint32_t ntpAddr;
164-
ntpAddr = EEPROM.read(EEPROM_TIMESERVER_OFFSET) << 24;
165-
ntpAddr |= uint32_t(EEPROM.read(EEPROM_TIMESERVER_OFFSET+1)) << 16;
166-
ntpAddr |= uint32_t(EEPROM.read(EEPROM_TIMESERVER_OFFSET+2)) << 8;
167-
ntpAddr |= uint32_t(EEPROM.read(EEPROM_TIMESERVER_OFFSET+3));
168-
if (ntpAddr > 0) {
169-
timeServer = IPAddress(ntpAddr);
170-
}
171-
syncInterval;
172-
syncInterval = time_t(EEPROM.read(EEPROM_INTERVAL_OFFSET)) << 8;
173-
syncInterval |= EEPROM.read(EEPROM_INTERVAL_OFFSET+1);
174-
175-
clockName = "";
176-
for (int i = 0 ; i < EEPROM_NAME_LENGTH ; i++) {
177-
char c = EEPROM.read(EEPROM_NAME_OFFSET + i);
178-
if (c) {
179-
clockName += c;
180-
}
181-
}
182-
clockName.replace("+", " ");
183-
EEPROM.end();
184-
}
185-
186-
void saveSettings() {
187-
EEPROM.begin(EEPROM_WIFI_SIZE);
188-
// Zero the eeprom.
189-
for (int i = 0 ; i < EEPROM_WIFI_SIZE ; i++) {
190-
EEPROM.write(i, 0);
191-
}
192-
// Write the magic header.
193-
for (int i = 0 ; i < EEPROM_MAGIC_LENGTH ; i++) {
194-
EEPROM.write(EEPROM_MAGIC_OFFSET + i, EEPROM_MAGIC[i]);
195-
}
196-
// Write the SSID.
197-
for (int i = 0 ; i < w_ssid.length() ; i++) {
198-
EEPROM.write(i + EEPROM_SSID_OFFSET, w_ssid.charAt(i));
199-
}
200-
// Write the PSK.
201-
for (int i = 0 ; i < w_psk.length() ; i++) {
202-
EEPROM.write(i + EEPROM_PSK_OFFSET, w_psk.charAt(i));
203-
}
204-
// Write the TZ offset.
205-
EEPROM.write(EEPROM_TZ_OFFSET, timezone);
206-
// Write the timeserver IP.
207-
EEPROM.write(EEPROM_TIMESERVER_OFFSET, timeServer >> 24);
208-
EEPROM.write(EEPROM_TIMESERVER_OFFSET+1, (timeServer >> 16) & 0xff);
209-
EEPROM.write(EEPROM_TIMESERVER_OFFSET+2, (timeServer >> 8) & 0xff);
210-
EEPROM.write(EEPROM_TIMESERVER_OFFSET+3, timeServer & 0xff);
211-
// Write the interval.
212-
EEPROM.write(EEPROM_INTERVAL_OFFSET, (syncInterval >> 8) & 0xff);
213-
EEPROM.write(EEPROM_INTERVAL_OFFSET+1, syncInterval & 0xff);
214-
// Write the clock name.
215-
for (int i = 0 ; i < clockName.length() ; i++) {
216-
EEPROM.write(EEPROM_NAME_OFFSET + i, clockName.charAt(i));
217-
}
218-
EEPROM.end();
219-
}
220-
221120
void setupSTA()
222121
{
223122
char ssid[32];
@@ -228,9 +127,9 @@ void setupSTA()
228127

229128
clockMode = MODE_CLOCK;
230129
WiFi.mode(WIFI_STA);
231-
w_ssid.toCharArray(ssid, 32);
232-
w_psk.toCharArray(psk, 64);
233-
if (w_psk.length()) {
130+
settings.ssid.toCharArray(ssid, 32);
131+
settings.psk.toCharArray(psk, 64);
132+
if (settings.psk.length()) {
234133
WiFi.begin(ssid, psk);
235134
} else {
236135
WiFi.begin(ssid);

esp8266-ledclock/ntp.ino

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,9 @@ byte sendBuffer[] = {
99
0xEC, // Clock precision.
1010
0x0, 0x0, 0x0, 0x0}; // Reference ...
1111

12-
String ipToString(IPAddress ip) {
13-
uint32_t addr = ip;
14-
String ret;
15-
ret = String(addr & 0xff) + "." + String(addr >> 8 & 0xff) + "." + String(addr >> 16 & 0xff) + "." + String(addr >> 24);
16-
return ret;
17-
}
18-
19-
IPAddress parseIP(String ipaddr) {
20-
// charArray of ipaddr.
21-
char ip[16];
22-
uint32_t address = 0;
23-
int o = 0;
24-
char octet[3];
25-
char digits = 0; // per octet.
26-
if (ipaddr.length() > 16) goto badIP;
27-
ipaddr.toCharArray(ip, 16);
28-
for (int i = 0 ; ip[i] != '\0' ; i++) {
29-
if (ip[i] == '.') {
30-
uint8_t oct = atoi(octet);
31-
if (digits < 1 || digits > 3 || oct > 0xff) {
32-
goto badIP;
33-
}
34-
address |= oct << (8 * o);
35-
if (o++ > 2) goto badIP;
36-
memset(octet, 0, 4); digits = 0;
37-
} else if (ip[i] < '0' || ip[i] > '9' || digits > 2) {
38-
goto badIP;
39-
} else {
40-
octet[digits++] = ip[i];
41-
}
42-
}
43-
address |= atoi(octet) << 24;
44-
return IPAddress(address);
45-
badIP:
46-
return IPAddress(0, 0, 0, 0);
47-
}
48-
4912
void setupTime() {
5013
setSyncProvider(getNtpTime);
51-
setSyncInterval(syncInterval);
14+
setSyncInterval(settings.interval);
5215
}
5316

5417
time_t getNtpTime()
@@ -57,7 +20,7 @@ time_t getNtpTime()
5720
udp.begin(localPort);
5821
while (udp.parsePacket() > 0) ; // discard any previously received packets
5922
for (int i = 0 ; i < 5 ; i++) { // 5 retries.
60-
sendNTPpacket(&udp, timeServer);
23+
sendNTPpacket(&udp);
6124
uint32_t beginWait = millis();
6225
while (millis() - beginWait < 1500) {
6326
if (udp.parsePacket()) {
@@ -67,21 +30,21 @@ time_t getNtpTime()
6730
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
6831
unsigned long secSince1900 = highWord << 16 | lowWord;
6932
udp.flush();
70-
return secSince1900 - 2208988800UL + timezone * SECS_PER_HOUR;
33+
return secSince1900 - 2208988800UL + settings.timezone * SECS_PER_HOUR;
7134
}
7235
delay(10);
7336
}
7437
}
7538
return 0; // return 0 if unable to get the time
7639
}
7740

78-
79-
void sendNTPpacket(WiFiUDP *u, IPAddress &address) {
41+
void sendNTPpacket(WiFiUDP *u) {
8042
// Zeroise the buffer.
8143
memset(packetBuffer, 0, NTP_PACKET_SIZE);
8244
memcpy(packetBuffer, sendBuffer, 16);
8345

84-
u->beginPacket(address, 123); // Port 123.
85-
u->write(packetBuffer, NTP_PACKET_SIZE);
86-
u->endPacket();
46+
if (u->beginPacket(settings.timeserver, 123)) {
47+
u->write(packetBuffer, NTP_PACKET_SIZE);
48+
u->endPacket();
49+
}
8750
}

0 commit comments

Comments
 (0)