From 528f2816ca5b1c53fef5c7ba191550ebfa059d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Thu, 7 Aug 2025 12:25:14 +0200 Subject: [PATCH] wifi, server --- src/main.cpp | 7 ++-- src/mode.h | 8 +++++ src/mode/Mode.h | 1 - src/mode/ModeTimer.h | 56 ++++++++++++++++++++++++----- src/server.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++++ src/server.h | 10 ++++++ src/wifi.cpp | 50 ++++++++++++++++++++++++++ src/wifi.h | 6 ++++ 8 files changed, 212 insertions(+), 11 deletions(-) create mode 100644 src/mode.h create mode 100644 src/server.cpp create mode 100644 src/server.h create mode 100644 src/wifi.cpp create mode 100644 src/wifi.h diff --git a/src/main.cpp b/src/main.cpp index 43450df..a71aa3c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ -#include #include "Button.h" +#include "server.h" +#include "wifi.h" #include "mode/Mode.h" #include "mode/ModeTimer.h" @@ -16,18 +17,20 @@ ModeTimer mode; Button button(23, buttonCallback); void setup() { - WiFi.disconnect(); delay(500); Serial.begin(115200); Serial.println("\n\n\nStartup!"); + beepSetup(); display.setup(); mode.init(); + serverSetup(); } void loop() { stepMode(); readConsole(); + wifiLoop(); } void stepMode() { diff --git a/src/mode.h b/src/mode.h new file mode 100644 index 0000000..a33cdc2 --- /dev/null +++ b/src/mode.h @@ -0,0 +1,8 @@ +#ifndef MODE2_H +#define MODE2_H + +#include "mode/ModeTimer.h" + +extern ModeTimer mode; + +#endif diff --git a/src/mode/Mode.h b/src/mode/Mode.h index 8a3b474..e38a716 100644 --- a/src/mode/Mode.h +++ b/src/mode/Mode.h @@ -2,7 +2,6 @@ #define MODE_H #include -#include #include "Display.h" diff --git a/src/mode/ModeTimer.h b/src/mode/ModeTimer.h index 2fd7717..a04bf03 100644 --- a/src/mode/ModeTimer.h +++ b/src/mode/ModeTimer.h @@ -1,6 +1,8 @@ #ifndef MODE_TIMER_H #define MODE_TIMER_H +#include + #include "beep.h" #include "Mode.h" #include "Rest.h" @@ -10,6 +12,38 @@ enum Stage { FIRST_HALF, SECOND_HALF, LAST_MINUTE, FINALE }; +inline uint32_t getTimerConfig(const char *name, const uint32_t fallback) { + Preferences preferences; + preferences.begin("Timer", true); + const auto configMillis = preferences.getULong(name, fallback); + preferences.end(); + return configMillis; +} + +inline void setTimerConfig(const char *name, const uint32_t configMillis) { + Preferences preferences; + preferences.begin("Timer", false); + preferences.putULong(name, configMillis); + preferences.end(); + Serial.printf("CONFIG SET: %s.%s = %d\n", "Timer", name, configMillis); +} + +inline uint32_t getTimerConfigCountdown() { + return getTimerConfig("countdown", 6 * 60 * 1000); +} + +inline uint32_t getTimerConfigYellow() { + return getTimerConfig("yellow", 3 * 60 * 1000); +} + +inline uint32_t getTimerConfigOrange() { + return getTimerConfig("orange", 1 * 60 * 1000); +} + +inline uint32_t getTimerConfigRed() { + return getTimerConfig("red", 10 * 1000); +} + class ModeTimer final : public Mode { Timer countdown; @@ -20,6 +54,12 @@ class ModeTimer final : public Mode { Timer beep; + uint32_t yellow = 3 * 60 * 1000; + + uint32_t orange = 1 * 60 * 1000; + + uint32_t red = 10 * 1000; + bool dirty = true; bool dirtyPrint = true; @@ -52,11 +92,6 @@ public: void init() override { Serial.printf("Mode INIT: %s\n", name); - Preferences preferences; - preferences.begin("Timer", true); - const auto configMillis = preferences.getULong("configMillis", 40 * 1000); - preferences.end(); - beepSet(false); countdown.stop(); @@ -64,6 +99,10 @@ public: pause.stop(); beep.stop(); + const auto configMillis = getTimerConfigCountdown(); + yellow = getTimerConfigYellow(); + orange = getTimerConfigOrange(); + red = getTimerConfigRed(); countdown.countConfig(configMillis, 1); flash.countConfig(100, 19); beep.countConfig(200, 1); @@ -87,6 +126,7 @@ public: return; } if (!countdown.isRunning()) { + init(); countdown.start(); } else { pause.toggle(); @@ -143,13 +183,13 @@ private: void drawTime(Display &display) { Color color = RED; Stage stage = FINALE; - if (rest.millisTotal > countdown.getConfigMillis() / 2) { + if (rest.millisTotal > yellow) { color = WHITE; stage = FIRST_HALF; - } else if (rest.millisTotal > 15 * 1000) { + } else if (rest.millisTotal > orange) { color = YELLOW; stage = SECOND_HALF; - } else if (rest.millisTotal > 10 * 1000) { + } else if (rest.millisTotal > red) { color = ORANGE; stage = LAST_MINUTE; } diff --git a/src/server.cpp b/src/server.cpp new file mode 100644 index 0000000..3833f8a --- /dev/null +++ b/src/server.cpp @@ -0,0 +1,85 @@ +#include "server.h" +#include "mode.h" + +WebServer server; + +constexpr auto MAX_SECONDS = 10 * 366 * 24 * 60 * 60L; + +void serverIndex() { + const auto html = R"( + + + + MatrixDisplay2022 + + + +

Einstellungen

+
+ + + + + +
Countdown: Sek.
Gelb: Sek.
Orange: Sek.
Rot: Sek.
+ +
+

Steuerung

+
+
+ + +)"; + char buffer[2000]; + snprintf( + buffer, sizeof buffer, html, + getTimerConfigCountdown() / 1000, MAX_SECONDS, + getTimerConfigYellow() / 1000, MAX_SECONDS, + getTimerConfigOrange() / 1000, MAX_SECONDS, + getTimerConfigRed() / 1000, MAX_SECONDS + ); + server.send(200, "text/html", buffer); +} + +void redirect() { + server.sendHeader("Location", "/"); + server.send(302, "text/plain", "redirecting..."); +} + +void serverTimerConfig2(const char *name) { + if (server.hasArg(name)) { + const auto seconds = max(1L, min(server.arg(name).toInt(), MAX_SECONDS)); + setTimerConfig(name, seconds * 1000); + } else { + Serial.printf("Missing parameter: %s\n", name); + } +} + +void serverTimerConfig() { + serverTimerConfig2("countdown"); + serverTimerConfig2("yellow"); + serverTimerConfig2("orange"); + serverTimerConfig2("red"); + redirect(); +} + +void serverTimerPause() { + mode.buttonOK(); + redirect(); +} + +void serverTimerReset() { + mode.buttonESC(); + redirect(); +} + +void serverSetup() { + server.on("", serverIndex); + server.on("/", serverIndex); + server.on("/timer/pause", serverTimerPause); + server.on("/timer/pause/", serverTimerPause); + server.on("/timer/reset", serverTimerReset); + server.on("/timer/reset/", serverTimerReset); + server.on("/timer/config", serverTimerConfig); + server.on("/timer/config/", serverTimerConfig); +} diff --git a/src/server.h b/src/server.h new file mode 100644 index 0000000..4637ab0 --- /dev/null +++ b/src/server.h @@ -0,0 +1,10 @@ +#ifndef SERVER_H +#define SERVER_H + +#include + +extern WebServer server; + +void serverSetup(); + +#endif diff --git a/src/wifi.cpp b/src/wifi.cpp new file mode 100644 index 0000000..91a93f1 --- /dev/null +++ b/src/wifi.cpp @@ -0,0 +1,50 @@ +#include "wifi.h" + +#include + +#include "server.h" + +#define WIFI_SSID "HappyNet" + +#define WIFI_PASS "1Grausame!Sackratte7" + +auto wifiConnected = false; + +auto wifiLastTry = 0UL; + +void wifiConnect() { + server.stop(); + + WiFi.disconnect(); + WiFi.enableAP(false); + WiFi.setAutoConnect(false); + WiFi.setAutoReconnect(false); + yield(); + + wifiLastTry = max(1UL, millis()); + WiFi.begin(WIFI_SSID, WIFI_PASS); + Serial.printf("WiFi connecting: %s\n", WIFI_SSID); + yield(); +} + +void wifiLoop() { + const auto connected = WiFi.localIP() != 0; + if (wifiConnected != connected) { + if (connected) { + Serial.printf("WiFi connected: ip=%s, ssid=%s\n", WiFi.localIP().toString().c_str(), WIFI_SSID); + configTzTime("CET-1CEST,M3.5.0,M10.5.0/3", WiFi.gatewayIP().toString().c_str()); + server.begin(); + } else { + Serial.println("WiFi DISCONNECTED"); + wifiConnect(); + } + wifiConnected = connected; + } else if (connected) { + server.handleClient(); + } else if (wifiLastTry == 0 || millis() - wifiLastTry > 10000) { + if (wifiLastTry != 0) { + Serial.println("WiFi TIMEOUT"); + } + wifiConnect(); + } +} diff --git a/src/wifi.h b/src/wifi.h new file mode 100644 index 0000000..1be50cd --- /dev/null +++ b/src/wifi.h @@ -0,0 +1,6 @@ +#ifndef WIFI_H +#define WIFI_H + +void wifiLoop(); + +#endif