#include "app.h" #include //this needs to be first, or it all crashes and burns... #include #include //https://github.com/esp8266/Arduino #include #include #include #include #include #include "DjDebug.h" #include "DjConfig.h" #include "SevenSegmentClock.h" #include "DjDebug.h" #include "ClockClient.h" #include "WebUI.h" #include "DjSimpleFS.h" // NTP WiFiUDP ntpUDP; // You can specify the time server pool and the offset (in seconds, can be // changed later with setTimeOffset() ). Additionaly you can specify the // update interval (in milliseconds, can be changed using setUpdateInterval() ). NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 7200, 60000); static const char *appName = "FastclockClient7Seg"; const char * const PROGMEM mainConfig[] = { "appMode:string:" MODE_DEMO, "utcTimeOffsetMinutes:int:120", "listenPort:int:2000", "clockColor:string:green", "brightness:int:20" }; Debug debug; Config config(debug); ClockClient fastclock(debug, config); SevenSegmentClock sevenSegmentClock(debug, config); ClockClient fastclockClient(debug, config); //ESP8266WebServer *server; WebUI *webUI; SimpleFS filesystem(debug); //flag for saving data bool shouldSaveConfig = false; //callback notifying us of the need to save config void saveConfigCallback () { debug.outln("Should save config", DEBUG_MAX_INFO); shouldSaveConfig = true; } void setupWifiConnection() { WiFiManager wifiManager; wifiManager.setSaveConfigCallback(saveConfigCallback); wifiManager.setConfigPortalTimeout(300); //set minimu quality of signal so it ignores AP's under that quality //defaults to 8% wifiManager.setMinimumSignalQuality(15); debug.outln("Starting autoConnect ...", DEBUG_MAX_INFO); //if (!wifiManager.autoConnect("FastclockClient7Seg", "password")) { //if (!wifiManager.autoConnect("fc7seg", "password")) { if (!wifiManager.autoConnect("fc7seg")) { debug.outln("failed to connect and hit timeout", DEBUG_WARNING); delay(3000); //reset and try again, or maybe put it to deep sleep ESP.reset(); delay(5000); } //if you get here you have connected to the WiFi debug.outln("connected...yeey :)", DEBUG_MAX_INFO); //save the custom parameters to FS if (shouldSaveConfig) { debug.outln("saving config ... NYI", DEBUG_MED_INFO); } debug.out("local ip: ", DEBUG_MAX_INFO); debug.outln(WiFi.localIP(), DEBUG_MAX_INFO); debug.out("gateway: ", DEBUG_MAX_INFO); debug.outln(WiFi.gatewayIP(), DEBUG_MAX_INFO); debug.out("subnet: ", DEBUG_MAX_INFO); debug.outln(WiFi.subnetMask(), DEBUG_MAX_INFO); } void setup() { debug.out(F("Starting *** "), DEBUG_MAX_INFO); debug.outln(appName, DEBUG_MAX_INFO); debug.out(F("Reset reason: "), DEBUG_MIN_INFO); debug.outln(ESP.getResetReason(), DEBUG_MIN_INFO); filesystem.begin(); config.begin("main.cfg", mainConfig, sizeof(mainConfig)/sizeof(mainConfig[0])); setupWifiConnection(); debug.outln(F("Starting NTP Client"), DEBUG_MAX_INFO); timeClient.begin(); timeClient.setTimeOffset(config.getInt("utcTimeOffsetMinutes") * 60); debug.outln(F("Have following configuration:"), DEBUG_MAX_INFO); debug.out(F(" App Mode: "), DEBUG_MAX_INFO); debug.outln(config.getString("appMode"), DEBUG_MAX_INFO); debug.out(F(" Clock color: "), DEBUG_MAX_INFO); debug.outln(config.getString("clockColor"), DEBUG_MAX_INFO); debug.out(F(" Brightness: "), DEBUG_MAX_INFO); debug.outln(config.getString("brightness"), DEBUG_MAX_INFO); 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); debug.outln(F("Starting fastclock ..."), DEBUG_MAX_INFO); fastclock.begin(); debug.outln(F("Starting 7-segment clock display ..."), DEBUG_MAX_INFO); sevenSegmentClock.begin(); sevenSegmentClock.setBrightness(config.getInt("brightness")); sevenSegmentClock.setColor(sevenSegmentClock.getColorHandleByName(config.getString("clockColor"))); // setting up web server for clock configuration; intentionally very late // as we need the web server during boot to be able to connect to/configure WiFi webUI = new WebUI(debug, config, timeClient, fastclock, sevenSegmentClock); webUI->begin(); } static int hours = 0, minutes = 0; static uint32_t nextUpdate_ms = 0; void loop() { timeClient.update(); fastclock.loop(); if (config.getString("appMode").equals(MODE_DEMO)) { if (millis() > nextUpdate_ms) { nextUpdate_ms = millis() + 1000; minutes++; if (minutes > 99) { minutes = 0; } if (minutes % 5 == 0) hours++; if (hours > 99) hours = 0; sevenSegmentClock.displayTime(hours, minutes); if (hours % 4 == 0) sevenSegmentClock.setBlinkMode(SevenSegmentClock::SeperatorBlinking); else sevenSegmentClock.setBlinkMode(SevenSegmentClock::NoBlinking); } } else if (config.getString("appMode").equals(MODE_REALCLOCK)) { sevenSegmentClock.setClockHalted(!fastclock.isActive()); sevenSegmentClock.setBlinkMode(SevenSegmentClock::NoBlinking); sevenSegmentClock.displayTime(timeClient.getHours(), timeClient.getMinutes()); } else if (config.getString("appMode").equals(MODE_FASTCLOCK)) { sevenSegmentClock.setClockHalted(!fastclock.isActive()); if (fastclock.isActive()) { sevenSegmentClock.setBlinkMode(SevenSegmentClock::NoBlinking); } else { sevenSegmentClock.setBlinkMode(SevenSegmentClock::DecimalPointColoredBlinking); } sevenSegmentClock.displayTime(fastclock.getClockHours(), fastclock.getClockMinutes()); } else { debug.outln(F("ERROR: Unknown appMode found."), DEBUG_ERROR); } sevenSegmentClock.displayUpdate(); webUI->loop(); filesystem.loop(); }