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 = "{v}"; +static const char _STYLE[] PROGMEM = ""; +static const char _SCRIPT[] PROGMEM = ""; +static const char _HEAD_END[] PROGMEM = "
"; +static const char _PORTAL_OPTIONS[] PROGMEM = "



"; +static const char _ITEM[] PROGMEM = "
{v} {r}%
"; +static const char _FORM_START[] PROGMEM = "
"; +static const char _FORM_CLOCKNAME[] PROGMEM = "
"; +static const char _FORM_CLOCKSFOUND_START[] PROGMEM = "Fastclocks seen:

"; +static const char _FORM_CLOCKMODE_HEADLINE[] PROGMEM = "
Clock mode:
"; +static const char _FORM_CLOCKMODE_DEMO[] PROGMEM = "
"; +static const char _FORM_CLOCKMODE_REAL[] PROGMEM = "
"; +static const char _FORM_CLOCKMODE_FAST[] PROGMEM = "
"; +static const char _FORM_UTC_OFFSET[] PROGMEM = "
"; +static const char _FORM_PARAM[] PROGMEM = "
"; +static const char _FORM_COLOR_HEADLINE[] PROGMEM = "
Display color:
"; +static const char _FORM_COLOR_template[] PROGMEM = "
"; +static const char _FORM_BRIGHTNESS[] PROGMEM = "
"; +static const char _FORM_FASTCLOCK_INFO[] PROGMEM = "
Number of fastclocks found: {nfc}

"; +static const char _FORM_END[] 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("

")); + 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 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 = "
{v} {r}%
"; -const char _FORM_START[] PROGMEM = "
"; -const char _FORM_CLOCKNAME[] PROGMEM = "
"; -const char _FORM_CLOCKSFOUND_START[] PROGMEM = "Fastclocks seen:
    "; -const char _FORM_CLOCKSFOUND_ITEM[] PROGMEM = "
  • {fc}
  • "; -const char _FORM_CLOCKSFOUND_END[] PROGMEM = "

"; -const char _FORM_CLOCKMODE_HEADLINE[] PROGMEM = "
Clock mode:
"; -const char _FORM_CLOCKMODE_DEMO[] PROGMEM = "
"; -const char _FORM_CLOCKMODE_REAL[] PROGMEM = "
"; -const char _FORM_CLOCKMODE_FAST[] PROGMEM = "
"; -const char _FORM_UTC_OFFSET[] PROGMEM = "
"; -const char _FORM_PARAM[] PROGMEM = "
"; -const char _FORM_COLOR_HEADLINE[] PROGMEM = "
Display color:
"; -const char _FORM_COLOR_template[] PROGMEM = "
"; -const char _FORM_BRIGHTNESS[] PROGMEM = "
"; -const char _FORM_FASTCLOCK_INFO[] PROGMEM = "
Number of fastclocks found: {nfc}

"; -const char _FORM_END[] 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(); }