MQTT-Display-LaserCutter/test_sketches/test_web_server.cpp

121 lines
3.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// =============================================================================
// test_web_server.cpp Phase 7: WebServer Verifikation
// Projekt: MQTT-Display LaserCutter
//
// Testet:
// GET / Statusseite im Browser
// GET /config Konfigurationsformular laden + Werte aendern
// POST /config Werte in NVS speichern, nach Neustart pruefen
// POST /reset Gesamtzeit zuruecksetzen per Browser-Button
// GET /update ElegantOTA erreichbar (Firmware-Upload)
//
// Hardware:
// - Taste GPIO 4 (als Laser-Signal-Simulator)
// - BOOT-Taste GPIO 0 (3 s = Gesamtzeit loeschen)
//
// Verwendung:
// 1. Flashen: pio run -e test-web --target upload
// 2. Monitor: pio device monitor -e test-web
// 3. IP-Adresse aus Serial Monitor ablesen
// 4. Browser: http://<IP>/
// -> Statusseite mit Session, Gesamtzeit, MQTT-Status
// 5. Browser: http://<IP>/config
// -> Formular: Broker, Port, User, PW, Gratiszeit, Polaritaet aendern
// -> Nach Speichern: NVS pruefen (Neustart + Serial)
// 6. "Gesamtzeit loeschen"-Button auf Statusseite testen
// 7. Browser: http://<IP>/update -> ElegantOTA-Seite erreichbar
// =============================================================================
#include <Arduino.h>
#include "config.h"
#include "settings.h"
#include "wifi_connector.h"
#include "display_manager.h"
#include "laser_tracker.h"
#include "mqtt_client.h"
#include "web_server.h"
// BOOT-Taste
static const int BOOT_BTN = 0;
static uint32_t bootPressMs = 0;
// Status-Druck alle 10 Sekunden
static uint32_t lastStatusMs = 0;
void setup() {
Serial.begin(SERIAL_BAUD_RATE);
delay(500);
settings.begin();
LOG_I("TEST-WEB", "=== Phase 7 WebServer Test gestartet ===");
settings.printToSerial();
display.begin();
display.showWifiError(false);
display.showMqttError(false);
display.showLaserTime(0.0f);
display.showIdle();
laserTracker.begin();
wifiConnector.begin();
wifiConnector.printToSerial();
mqttClient.begin();
webServer.begin();
pinMode(BOOT_BTN, INPUT);
LOG_I("TEST-WEB", "Setup abgeschlossen");
LOG_I("TEST-WEB", "Browser: http://%s/", WiFi.localIP().toString().c_str());
}
void loop() {
laserTracker.loop();
wifiConnector.loop();
mqttClient.loop();
// MQTT: Session-Publish nur wenn Netto-Zeit vorhanden (kein GRATIS-only Burst)
if (laserTracker.consumeBurstEnd()) {
int lastBurst = laserTracker.getLastBurstSeconds();
if (lastBurst > 0) {
mqttClient.publishSession(lastBurst, settings.get().gratisSeconds);
}
}
// Display
display.showLaserTime((float)laserTracker.getSessionMinutes());
int countdown = laserTracker.getCountdownRemaining();
if (laserTracker.isActive() && countdown > 0) {
display.showCountdown(countdown);
} else {
display.showIdle();
}
display.update();
// BOOT-Taste (GPIO 0): 3 s halten -> Gesamtzeit loeschen
if (digitalRead(BOOT_BTN) == LOW) {
if (bootPressMs == 0) bootPressMs = millis();
if (millis() - bootPressMs >= 3000) {
LOG_I("TEST-WEB", "BOOT 3s: resetTotal()");
laserTracker.resetTotal();
bootPressMs = 0;
}
} else {
bootPressMs = 0;
}
// Periodischer Status-Druck
if (millis() - lastStatusMs >= 10000) {
lastStatusMs = millis();
LOG_I("TEST-WEB", "--- Status (10s-Tick) ---");
LOG_I("TEST-WEB", "Session: %d min | Total: %.2f min | MQTT: %s",
laserTracker.getSessionMinutes(),
laserTracker.getTotalMinutes(),
mqttClient.isConnected() ? "verbunden" : "getrennt");
LOG_I("TEST-WEB", "URL: http://%s/", WiFi.localIP().toString().c_str());
}
delay(50);
}