diff --git a/src/WebUI.cpp b/src/WebUI.cpp
new file mode 100644
index 0000000..9a4b779
--- /dev/null
+++ b/src/WebUI.cpp
@@ -0,0 +1,202 @@
+#include "WebUI.h"
+
+static const String appName{"7SegDisplay-XL"};
+static const char _HEAD[] PROGMEM = "
";
+static const char _PORTAL_OPTIONS[] PROGMEM = "
";
+static const char _ITEM[] PROGMEM = "
";
+static const char _FORM_START[] PROGMEM = "
";
+static const char _SAVE_PERM_BUTTON[] PROGMEM = "
";
+static const char _CONFIG_BUTTON[] PROGMEM = "
";
+static const char _VSPACE[] PROGMEM = "
";
+static const char _SAVED[] PROGMEM = "
Credentials Saved
Trying to connect ESP to network.
If it fails reconnect to AP to try again
";
+static const char _END[] PROGMEM = "
";
+
+void WebUI::appConfig() {
+ String page = FPSTR(_HEAD);
+ String input;
+ String value;
+ int ivalue;
+
+ page.replace("{v}", "7Seg Config");
+ page += FPSTR(_SCRIPT);
+ page += FPSTR(_STYLE);
+ //page += _customHeadElement;
+ page += FPSTR(_HEAD_END);
+ page += String(F("sendHeader("Content-Length", String(page.length()));
+ server->send(200, "text/html", page);
+}
+
+void WebUI::appConfigSave(void) {
+ String page = FPSTR(_HEAD);
+
+ page.replace("{v}", "7Seg Config");
+ page += FPSTR(_SCRIPT);
+ page += FPSTR(_STYLE);
+ page += FPSTR(_HEAD_END);
+ page += String(F(""));
+ page += appName;
+ page += String(F("
"));
+
+ debug.out(server->args(), DEBUG_MED_INFO); debug.outln(" arguments", DEBUG_MED_INFO);
+ for (int i=0; iargs(); ++i) {
+ debug.out(server->argName(i), DEBUG_MAX_INFO);
+ debug.out(": ", DEBUG_MAX_INFO);
+ debug.outln(server->arg(i), DEBUG_MAX_INFO);
+ }
+ if (server->hasArg("n")) {
+ String clockName = server->arg("n");
+ config.setString("listenToClock", clockName);
+ fastclock.setListenToClock(clockName);
+ page += F("Set fastclock to listen to clock with name ");
+ page += clockName;
+ page += F(".
");
+ }
+ if (server->hasArg("b")) {
+ int brightness = server->arg("b").toInt();
+ sevenSegmentClock.setBrightness(brightness);
+ config.setInt("brightness", brightness);
+ page += F("Set brightness to ");
+ page += server->arg("b");
+ page += F(".
");
+ }
+ if (server->hasArg("c")) {
+ String colorName = server->arg("c");
+ SevenSegmentClock::Color colorHandle = sevenSegmentClock.getColorHandleByName(server->arg("c"));
+ sevenSegmentClock.setColor(colorHandle);
+ config.setString("clockColor", colorName);
+ page += F("Set color to ");
+ page += server->arg("c");
+ page += F(".
");
+ }
+ if (server->hasArg("m")) {
+ debug.out("setting clock mode to ", DEBUG_MAX_INFO); debug.outln(server->arg("m"), DEBUG_MAX_INFO);
+ page += F("Set clock mode to ");
+ page += server->arg("m");
+ page += F(".
");
+ if (server->arg("m").equals("real")) config.setString("appMode", MODE_REALCLOCK);
+ else if (server->arg("m").equals("fast")) config.setString("appMode", MODE_FASTCLOCK);
+ else if (server->arg("m").equals("demo")) config.setString("appMode", MODE_DEMO);
+ else {
+ debug.outln("ERROR: Unknown application mode, going into demo mode", DEBUG_ERROR);
+ config.setString("appMode", MODE_DEMO);
+ page += F("ERROR: Unknown clockmode, using default: demo.
");
+ }
+ }
+ if (server->hasArg("utc")) {
+ page += F("Set real clock offset to ");
+ int timeOffset;
+ if (server->arg("utc").equals("")) {
+ page += "120";
+ timeOffset = 120;
+ } else {
+ page += server->arg("utc");
+ timeOffset = server->arg("utc").toInt();
+ }
+ config.setInt("utcTimeOffsetMinutes", timeOffset);
+ timeClient.setTimeOffset(timeOffset * 60);
+ page += F(" minutes.
");
+ }
+ page += String(F("Configuration updated.
"));
+ page += FPSTR(_CONFIG_BUTTON);
+ page += FPSTR(_SAVE_PERM_BUTTON);
+ page += FPSTR(_END);
+ server->sendHeader("Content-Length", String(page.length()));
+ server->send(200, "text/html", page);
+}
+
+void WebUI::appConfigSavePermanent(void) {
+ String page = FPSTR(_HEAD);
+
+ page.replace("{v}", "7Seg Config");
+ page += FPSTR(_SCRIPT);
+ page += FPSTR(_STYLE);
+ page += FPSTR(_HEAD_END);
+ page += String(F(""));
+ page += appName;
+ page += String(F("
"));
+
+ debug.outln("Writing configs to save them permanently", DEBUG_MAX_INFO);
+ config.writeAllConfigs();
+ page += String(F("Configuration permanently saved.
"));
+ page += FPSTR(_CONFIG_BUTTON);
+ page += FPSTR(_END);
+ server->sendHeader("Content-Length", String(page.length()));
+ server->send(200, "text/html", page);
+}
diff --git a/src/WebUI.h b/src/WebUI.h
new file mode 100644
index 0000000..402c33b
--- /dev/null
+++ b/src/WebUI.h
@@ -0,0 +1,44 @@
+#ifndef _webui_included
+#define _webui_included
+
+#include "app.h"
+#include
+#include
+#include "DjDebug.h"
+#include "DjConfig.h"
+#include "SevenSegmentClock.h"
+#include "ClockClient.h"
+
+class WebUI {
+public:
+ WebUI(Debug& _debug, Config& _config, NTPClient& _timeClient, ClockClient& _fastclock, SevenSegmentClock& _sevenSegmentClock):
+ debug(_debug), config(_config), timeClient(_timeClient), fastclock(_fastclock), sevenSegmentClock(_sevenSegmentClock) {
+ debug.outln(F("WebUI constructor called"));
+ };
+ void begin(void) {
+ server = new ESP8266WebServer(80);
+ server->on("/config", std::bind(&WebUI::appConfig, this));
+ server->on("/configSave", std::bind(&WebUI::appConfigSave, this));
+ server->on("/configSavePermanent", std::bind(&WebUI::appConfigSavePermanent, this));
+ //server->on("/config", HTTP_GET, appConfig);
+ //server->on("/configSave", HTTP_GET, appConfigSave);
+ //server->on("/configSavePermanent", HTTP_GET, appConfigSavePermanent);
+
+ server->begin();
+ };
+ void loop(void) {
+ server->handleClient();
+ };
+ void appConfig();
+ void appConfigSave();
+ void appConfigSavePermanent();
+private:
+ Debug& debug;
+ Config& config;
+ NTPClient& timeClient;
+ ClockClient& fastclock;
+ SevenSegmentClock& sevenSegmentClock;
+ ESP8266WebServer *server;
+};
+
+#endif
diff --git a/src/app.h b/src/app.h
new file mode 100644
index 0000000..d2875f7
--- /dev/null
+++ b/src/app.h
@@ -0,0 +1,10 @@
+#ifndef _app_included
+#define _app_included
+
+#include
+
+#define MODE_DEMO "Demo"
+#define MODE_REALCLOCK "Realclock"
+#define MODE_FASTCLOCK "Fastclock"
+
+#endif
diff --git a/src/main.cpp b/src/main.cpp
index e9b51a5..c8ecb16 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,4 +1,4 @@
-#include
+#include "app.h"
#include //this needs to be first, or it all crashes and burns...
#include
#include //https://github.com/esp8266/Arduino
@@ -6,7 +6,7 @@
//needed for library
#include
-#include
+//#include
#include
#include
@@ -16,6 +16,7 @@
#include "SevenSegmentClock.h"
#include "DjDebug.h"
#include "ClockClient.h"
+#include "WebUI.h"
// NTP
WiFiUDP ntpUDP;
@@ -24,9 +25,6 @@ WiFiUDP ntpUDP;
// update interval (in milliseconds, can be changed using setUpdateInterval() ).
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 7200, 60000);
-#define MODE_DEMO "Demo"
-#define MODE_REALCLOCK "Realclock"
-#define MODE_FASTCLOCK "Fastclock"
static const char *appName = "FastclockClient7Seg";
const char * const PROGMEM mainConfig[] = {
@@ -42,7 +40,8 @@ Config config(debug);
ClockClient fastclock(debug, config);
SevenSegmentClock sevenSegmentClock(debug, config);
ClockClient fastclockClient(debug, config);
-ESP8266WebServer *server;
+//ESP8266WebServer *server;
+WebUI *webUI;
//flag for saving data
bool shouldSaveConfig = false;
@@ -88,209 +87,7 @@ void setupWifiConnection() {
debug.out("subnet: ", DEBUG_MAX_INFO); debug.outln(WiFi.subnetMask(), DEBUG_MAX_INFO);
}
-const char _HEAD[] PROGMEM = "{v}";
-const char _STYLE[] PROGMEM = "";
-const char _SCRIPT[] PROGMEM = "";
-const char _HEAD_END[] PROGMEM = "";
-const char _PORTAL_OPTIONS[] PROGMEM = "
";
-const char _ITEM[] PROGMEM = "
";
-const char _FORM_START[] PROGMEM = "
";
-const char _SAVE_PERM_BUTTON[] PROGMEM = "
";
-const char _CONFIG_BUTTON[] PROGMEM = "
";
-const char _VSPACE[] PROGMEM = "
";
-const char _SAVED[] PROGMEM = "
Credentials Saved
Trying to connect ESP to network.
If it fails reconnect to AP to try again
";
-const char _END[] PROGMEM = "
";
-void appConfig() {
- String page = FPSTR(_HEAD);
- String input;
- String value;
- int ivalue;
-
- page.replace("{v}", "7Seg Config");
- page += FPSTR(_SCRIPT);
- page += FPSTR(_STYLE);
- //page += _customHeadElement;
- page += FPSTR(_HEAD_END);
- page += String(F(""));
- page += appName;
- page += String(F("
"));
- page += String(F("Clock Options
"));
- //page += FPSTR(_PORTAL_OPTIONS);
- page += FPSTR(_FORM_START);
- page += FPSTR(_FORM_CLOCKMODE_HEADLINE);
- input = FPSTR(_FORM_CLOCKMODE_DEMO);
- input.replace("{check}", (config.getString("appMode").equals("Demo")) ? "checked" : "");
- page += input;
- input = FPSTR(_FORM_CLOCKMODE_REAL);
- input.replace("{check}", (config.getString("appMode").equals("Realclock")) ? "checked" : "");
- page += input;
- input = FPSTR(_FORM_CLOCKMODE_FAST);
- input.replace("{check}", (config.getString("appMode").equals("Fastclock")) ? "checked" : "");
- page += input;
- page += FPSTR(_VSPACE);
- page += FPSTR(_FORM_UTC_OFFSET);
- page += FPSTR(_VSPACE);
- input = FPSTR(_FORM_CLOCKNAME);
- value = config.getString("listenToClock");
- input.replace("{n}", value);
- page += input;
- page += FPSTR(_FORM_CLOCKSFOUND_START);
- String *knownClocks = fastclock.getKnownClocks();
- for (int i=0; isendHeader("Content-Length", String(page.length()));
- server->send(200, "text/html", page);
-}
-
-void setRealClockTimeOffset(int offsetInMinutes) {
- timeClient.setTimeOffset(offsetInMinutes * 60);
-}
-
-void appConfigSave() {
- String page = FPSTR(_HEAD);
-
- page.replace("{v}", "7Seg Config");
- page += FPSTR(_SCRIPT);
- page += FPSTR(_STYLE);
- page += FPSTR(_HEAD_END);
- page += String(F(""));
- page += appName;
- page += String(F("
"));
-
- debug.out(server->args(), DEBUG_MED_INFO); debug.outln(" arguments", DEBUG_MED_INFO);
- for (int i=0; iargs(); ++i) {
- debug.out(server->argName(i), DEBUG_MAX_INFO);
- debug.out(": ", DEBUG_MAX_INFO);
- debug.outln(server->arg(i), DEBUG_MAX_INFO);
- }
- if (server->hasArg("n")) {
- String clockName = server->arg("n");
- config.setString("listenToClock", clockName);
- fastclock.setListenToClock(clockName);
- page += F("Set fastclock to listen to clock with name ");
- page += clockName;
- page += F(".
");
- }
- if (server->hasArg("b")) {
- int brightness = server->arg("b").toInt();
- sevenSegmentClock.setBrightness(brightness);
- config.setInt("brightness", brightness);
- page += F("Set brightness to ");
- page += server->arg("b");
- page += F(".
");
- }
- if (server->hasArg("c")) {
- String colorName = server->arg("c");
- SevenSegmentClock::Color colorHandle = sevenSegmentClock.getColorHandleByName(server->arg("c"));
- sevenSegmentClock.setColor(colorHandle);
- config.setString("clockColor", colorName);
- page += F("Set color to ");
- page += server->arg("c");
- page += F(".
");
- }
- if (server->hasArg("m")) {
- debug.out("setting clock mode to ", DEBUG_MAX_INFO); debug.outln(server->arg("m"), DEBUG_MAX_INFO);
- page += F("Set clock mode to ");
- page += server->arg("m");
- page += F(".
");
- if (server->arg("m").equals("real")) config.setString("appMode", MODE_REALCLOCK);
- else if (server->arg("m").equals("fast")) config.setString("appMode", MODE_FASTCLOCK);
- else if (server->arg("m").equals("demo")) config.setString("appMode", MODE_DEMO);
- else {
- debug.outln("ERROR: Unknown application mode, going into demo mode", DEBUG_ERROR);
- config.setString("appMode", MODE_DEMO);
- page += F("ERROR: Unknown clockmode, using default: demo.
");
- }
- }
- if (server->hasArg("utc")) {
- page += F("Set real clock offset to ");
- int timeOffset;
- if (server->arg("utc").equals("")) {
- page += "120";
- timeOffset = 120;
- } else {
- page += server->arg("utc");
- timeOffset = server->arg("utc").toInt();
- }
- config.setInt("utcTimeOffsetMinutes", timeOffset);
- setRealClockTimeOffset(timeOffset);
- page += F(" minutes.
");
- }
- page += String(F("Configuration updated.
"));
- page += FPSTR(_CONFIG_BUTTON);
- page += FPSTR(_SAVE_PERM_BUTTON);
- page += FPSTR(_END);
- server->sendHeader("Content-Length", String(page.length()));
- server->send(200, "text/html", page);
-}
-
-void appConfigSavePermanent() {
- String page = FPSTR(_HEAD);
-
- page.replace("{v}", "7Seg Config");
- page += FPSTR(_SCRIPT);
- page += FPSTR(_STYLE);
- page += FPSTR(_HEAD_END);
- page += String(F(""));
- page += appName;
- page += String(F("
"));
-
- debug.outln("Writing configs to save them permanently", DEBUG_MAX_INFO);
- config.writeAllConfigs();
- page += String(F("Configuration permanently saved.
"));
- page += FPSTR(_CONFIG_BUTTON);
- page += FPSTR(_END);
- server->sendHeader("Content-Length", String(page.length()));
- server->send(200, "text/html", page);
-}
void setup() {
debug.out(F("Starting *** "), DEBUG_MAX_INFO); debug.outln(appName, DEBUG_MAX_INFO);
@@ -321,8 +118,7 @@ void setup() {
debug.out(F(" Clock listen port: "), DEBUG_MAX_INFO); debug.outln(config.getString("listenPort"), DEBUG_MAX_INFO);
debug.out(F(" Real time UTC offset: "), DEBUG_MAX_INFO); debug.outln(config.getString("utcTimeOffsetMinutes"), DEBUG_MAX_INFO);
- setRealClockTimeOffset(config.getInt("utcTimeOffsetMinutes"));
-
+ timeClient.setTimeOffset(config.getInt("utcTimeOffsetMinutes") * 60);
debug.outln(F("Starting fastclock ..."), DEBUG_MAX_INFO);
fastclock.begin();
@@ -332,12 +128,9 @@ void setup() {
sevenSegmentClock.setColor(sevenSegmentClock.getColorHandleByName(config.getString("clockColor")));
// setting up web server for clock configuration
- server = new ESP8266WebServer(80);
- server->on("/config", HTTP_GET, appConfig);
- server->on("/configSave", HTTP_GET, appConfigSave);
- server->on("/configSavePermanent", HTTP_GET, appConfigSavePermanent);
-
- server->begin();
+ //server = new ESP8266WebServer(80);
+ webUI = new WebUI(debug, config, timeClient, fastclock, sevenSegmentClock);
+ webUI->begin();
}
int hours = 0, minutes = 0;
@@ -364,5 +157,5 @@ void loop() {
} else { debug.outln("ERROR: Unknown appMode found.", DEBUG_ERROR); }
sevenSegmentClock.displayUpdate();
- server->handleClient();
+ webUI->loop();
}