From e634563cdd6b5cd50c13d21229f2c05dde2b7548 Mon Sep 17 00:00:00 2001 From: Robin Cerny Date: Mon, 19 Jan 2026 13:27:01 +0100 Subject: [PATCH] added webui to the ESP32, for now contains only UDP port settings and some placeholders --- .../analog_system_monitor_arduino.ino | 196 +++++++++++++++++- 1 file changed, 193 insertions(+), 3 deletions(-) diff --git a/analog_system_monitor_arduino/analog_system_monitor_arduino.ino b/analog_system_monitor_arduino/analog_system_monitor_arduino.ino index 6dc8971..664e2b6 100644 --- a/analog_system_monitor_arduino/analog_system_monitor_arduino.ino +++ b/analog_system_monitor_arduino/analog_system_monitor_arduino.ino @@ -3,6 +3,21 @@ #include #include +// ------------------------------- +// ESPUI + AsyncWebServer +// ------------------------------- +#include +#include +#include + +// ------------------------------- +// Preferences +// ------------------------------- +#include +Preferences prefs; + +AsyncWebServer server(80); + // ------------------------------- // Firmware version // ------------------------------- @@ -12,7 +27,8 @@ const char* FIRMWARE_VERSION = "V2.4_UDP_LEDC_WM_SLEW"; // UDP // ------------------------------- WiFiUDP udp; -const int listenPort = 12345; // Must match PC config.json +const int listenPort = 12345; // default / legacy constant +int udpPort = 12345; // runtime port, loaded from Preferences // ------------------------------- // PWM setup (LEDC, ESP32 Core 3.x) @@ -92,6 +108,11 @@ unsigned long lastPacketTime = 0; const unsigned long watchdogTimeout = 5000; // 5 seconds unsigned long lastFadeTime = 0; +// ------------------------------- +// ESPUI controls +// ------------------------------- +uint16_t portInput; // ID of the UDP port Number control + // ------------------------------- // Calibration interpolation // ------------------------------- @@ -151,11 +172,180 @@ void setup() { Serial.print("IP: "); Serial.println(WiFi.localIP()); - udp.begin(listenPort); + // Preferences: load UDP port (default = listenPort) + prefs.begin("analogmon", false); + udpPort = prefs.getInt("udpPort", listenPort); + + // Start UDP with runtime port + udp.begin(udpPort); Serial.print("Listening on UDP port "); - Serial.println(listenPort); + Serial.println(udpPort); lastPacketTime = millis(); + + // ------------------------------- + // ESPUI Web Interface + // ------------------------------- + ESPUI.setVerbosity(Verbosity::Verbose); + + // Create tabs + uint16_t tabSettings = ESPUI.addControl(ControlType::Tab, "Settings", "Settings"); + uint16_t tabLighting = ESPUI.addControl(ControlType::Tab, "Lighting", "Lighting"); + uint16_t tabCalibration = ESPUI.addControl(ControlType::Tab, "Calibration", "Calibration"); + + // Restart button callback + auto restartCallback = [](Control *sender, int type) { + ESP.restart(); + }; + + // Port input callback + auto portInputCallback = [](Control *sender, int type) { + Serial.print("Port input changed to: "); + Serial.println(sender->value); + }; + + // Save & Apply callback + auto savePortCallback = [](Control *sender, int type) { + if (type != B_UP) return; // Prevent double-trigger + + Control* c = ESPUI.getControl(portInput); + int newPort = c->value.toInt(); + + if (newPort < 1024 || newPort > 65535) { + Serial.println("Invalid port (1024–65535)"); + return; + } + + prefs.putInt("udpPort", newPort); + udpPort = newPort; + + udp.stop(); + udp.begin(udpPort); + + Serial.print("New UDP port applied: "); + Serial.println(udpPort); + + ESPUI.updateControlValue(portInput, String(newPort)); + }; + + // ------------------------------------------------------ + // Row simulation: Port input + Save button + // ------------------------------------------------------ + + // UDP Port Number input (shared label) + portInput = ESPUI.addControl( + ControlType::Number, + "UDP Port", + String(udpPort), + ControlColor::Peterriver, + tabSettings, + portInputCallback + ); + + // Save & Apply button (same label) + ESPUI.addControl( + ControlType::Button, + "UDP Port", + "Save & Apply", + ControlColor::Emerald, + tabSettings, + savePortCallback + ); + + // Separator line + ESPUI.addControl( + ControlType::Separator, + "", + "", + ControlColor::None, + tabSettings + ); + + // Restart button at the bottom + ESPUI.addControl( + ControlType::Button, + "Restart ESP32", + "Restart", + ControlColor::Alizarin, + tabSettings, + restartCallback + ); + + // Lighting tab placeholder + ESPUI.addControl( + ControlType::Label, + "Lighting Placeholder", + "Coming soon...", + ControlColor::Emerald, + tabLighting + ); + + ESPUI.addControl( + ControlType::Separator, + "CH0 (CPU Load)", + "", + ControlColor::None, + tabCalibration + ); + + ESPUI.addControl( + ControlType::Separator, + "CH1 (CPU Temp)", + "", + ControlColor::None, + tabCalibration + ); + + ESPUI.addControl( + ControlType::Separator, + "CH2 (RAM Usage)", + "", + ControlColor::None, + tabCalibration + ); + + ESPUI.addControl( + ControlType::Separator, + "CH3 (GPU Load)", + "", + ControlColor::None, + tabCalibration + ); + + ESPUI.addControl( + ControlType::Separator, + "CH4 (GPU Temp)", + "", + ControlColor::None, + tabCalibration + ); + + ESPUI.addControl( + ControlType::Separator, + "CH5 (VRAM Usage)", + "", + ControlColor::None, + tabCalibration + ); + + ESPUI.addControl( + ControlType::Separator, + "CH6 (Reserved 6)", + "", + ControlColor::None, + tabCalibration + ); + + ESPUI.addControl( + ControlType::Separator, + "CH7 (Reserved 7)", + "", + ControlColor::None, + tabCalibration + ); + + // Start ESPUI + ESPUI.begin("Analog Monitor UI"); } // -------------------------------