#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 // 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;