FR-015: - publishHeartbeat() nach Display-Toggle, Session-Reset und Reboot-CMD - publishHeartbeat() von private nach public (mqtt_client.h) - Heartbeat-Intervall 60s -> 10s (config.h) - HA Discovery Switch: state_on/state_off ergaenzt (mqtt_client.cpp) FR-016: - Neuer WebSocket-Endpunkt /status-ws (AsyncWebSocket) - sendStatusWs() am Ende von publishHeartbeat() -> alle Ausloeser abgedeckt - Statusseite: DOM-Updates via WebSocket, kein location.reload() mehr - Config-Seite: Reboot-Button live deaktiviert wenn Laser aktiv - Alle Action-Buttons auf fetch() umgestellt (Reboot, WLAN-Reset, Laufzeit-Reset) - Display-Button: blau+gelb wenn an, grau+grau wenn aus
63 lines
2.2 KiB
C++
63 lines
2.2 KiB
C++
#pragma once
|
||
|
||
// =============================================================================
|
||
// web_server.h – HTTP-Webinterface für Statusanzeige und Konfiguration
|
||
// Projekt: MQTT-Display LaserCutter
|
||
//
|
||
// Basierend auf ESPAsyncWebServer (non-blocking, Task-safe).
|
||
//
|
||
// Routen:
|
||
// GET / – Statusseite (Session, Gesamtzeit, WLAN/MQTT-Status)
|
||
// GET /config – Konfigurationsformular (MQTT, Gratiszeit, Polarität)
|
||
// POST /config – Konfiguration speichern (NVS via SettingsManager)
|
||
// POST /reset – Gesamtzeit zurücksetzen (laserTracker.resetTotal())
|
||
// GET /update – OTA-Update-Seite (ElegantOTA)
|
||
// POST /update – Firmware-Upload (ElegantOTA)
|
||
// GET /log – Web-Log-Console (WebSocket-Empfänger)
|
||
// WS /log-ws – WebSocket-Endpunkt für Live-Log-Streaming
|
||
//
|
||
// Verwendung:
|
||
// webServer.begin(); // einmalig in setup(), nach WiFi-Connect
|
||
// // kein loop() nötig – ESPAsyncWebServer ist vollständig async
|
||
// =============================================================================
|
||
|
||
#include <Arduino.h>
|
||
|
||
// Forward-Declarations: ESPAsyncWebServer.h nur in web_server.cpp einbinden
|
||
// (verhindert HTTP_GET/POST-Enum-Konflikt mit WiFiManager in main.cpp)
|
||
class AsyncWebServer;
|
||
class AsyncWebServerRequest;
|
||
class AsyncWebSocket;
|
||
|
||
class WebServerManager {
|
||
public:
|
||
WebServerManager();
|
||
|
||
// Routen registrieren und Server starten (einmalig nach WiFi-Connect)
|
||
void begin();
|
||
|
||
// ArduinoOTA verarbeiten – in jedem loop()-Durchlauf aufrufen
|
||
void loop();
|
||
|
||
// WebSocket: Status-JSON an alle /status-ws Clients pushen
|
||
void sendStatusWs();
|
||
|
||
private:
|
||
AsyncWebServer* _server; // PIMPL: Pointer, full type only in web_server.cpp
|
||
AsyncWebSocket* _ws; // WebSocket-Endpunkt /log-ws
|
||
AsyncWebSocket* _statusWs; // WebSocket-Endpunkt /status-ws
|
||
|
||
void registerRoutes();
|
||
|
||
// HTTP-Basic-Auth pruefen; gibt false zurueck und sendet 401 wenn nicht autorisiert
|
||
bool requireAuth(AsyncWebServerRequest* request);
|
||
|
||
// HTML-Seiten als Strings aufbauen
|
||
String buildStatusPage();
|
||
String buildConfigPage();
|
||
String buildLogPage();
|
||
};
|
||
|
||
// Globale Instanz
|
||
extern WebServerManager webServer;
|