From b0a41a240a96ae3a2a31ad5bc47f1e9d44ddca39 Mon Sep 17 00:00:00 2001 From: nicoboy Date: Sat, 1 Aug 2026 17:35:19 +0200 Subject: [PATCH] Ajoute le serveur web IHM (point d'acces WiFi AlimHT) Dashboard telemetrie temps reel + controle HT/PWM1/PWM2, sur le point d'acces WiFi AlimHT (mode AP, pas de dependance a un reseau local). Puissance TX reduite pour eviter un brownout au demarrage radio sur une alimentation USB limite. Mise a jour visuelle immediate au clic sur les boutons plutot que d'attendre le prochain rafraichissement periodique. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01StKu9rqrsdz8CAVt1XMxon --- include/config.h | 6 ++- src/web_ui.cpp | 107 +++++++++++++++++++++++++++++++++++++++++++++-- src/web_ui.h | 5 +-- 3 files changed, 109 insertions(+), 9 deletions(-) diff --git a/include/config.h b/include/config.h index 60d1d11..63b97f1 100644 --- a/include/config.h +++ b/include/config.h @@ -20,5 +20,7 @@ // TMS320 emet reellement des trames $T,...*XX sur l'UART. #define TMS_DUMMY_MODE true -// WiFi/serveur web de l'IHM : a definir une fois l'affichage OLED valide -// (connexion STA au reseau local, SSID/mot de passe a fournir). +// WiFi/serveur web de l'IHM : l'ESP32 cree son propre point d'acces +// (mode AP), pas de dependance a un reseau local existant. +#define WIFI_AP_SSID "AlimHT" +#define WIFI_AP_PASSWORD "Milou1234" diff --git a/src/web_ui.cpp b/src/web_ui.cpp index 1f322b5..f7e193f 100644 --- a/src/web_ui.cpp +++ b/src/web_ui.cpp @@ -1,11 +1,110 @@ #include "web_ui.h" -// TODO : serveur web IHM, connexion WiFi en mode STA au reseau local -// (SSID/mot de passe a definir), une fois l'affichage OLED valide. +#include +#include +#include + +#include "config.h" +#include "tms_link.h" namespace WebUi { -void begin() {} -void poll() {} +namespace { + +WebServer server(80); + +const char INDEX_HTML[] PROGMEM = R"html( +AlimHT + + +

AlimHT

+

Liaison TMS320 : ?

+
+ + + +
+
+ + +)html"; + +void handleRoot() { server.send_P(200, "text/html", INDEX_HTML); } + +void handleState() { + const Telemetry &t = TmsLink::telemetry(); + const CommandState &cmd = TmsLink::command(); + char buf[400]; + snprintf(buf, sizeof(buf), + "{\"link\":%s,\"vin\":%.2f,\"iin\":%.2f,\"iout\":%.2f," + "\"v1\":%.2f,\"i1\":%.2f,\"t1\":%.2f," + "\"vout\":%.2f,\"i2\":%.2f,\"t2\":%.2f," + "\"ht\":%s,\"pwm1\":%s,\"pwm2\":%s}", + TmsLink::linkOk() ? "true" : "false", t.vin, t.iin, t.iout, t.v1, t.i1, t.t1, + t.vout, t.i2, t.t2, cmd.ht ? "true" : "false", cmd.pwm1 ? "true" : "false", + cmd.pwm2 ? "true" : "false"); + server.send(200, "application/json", buf); +} + +void handleCommand() { + CommandState cmd; + cmd.ht = server.arg("ht") == "1"; + cmd.pwm1 = server.arg("pwm1") == "1"; + cmd.pwm2 = server.arg("pwm2") == "1"; + TmsLink::setCommand(cmd); + server.send(200, "text/plain", "OK"); +} + +} // namespace + +void begin() { + // Pic de courant limite au demarrage radio : reduit le risque de + // brownout sur une alimentation USB limite. + WiFi.mode(WIFI_AP); + WiFi.setTxPower(WIFI_POWER_2dBm); + WiFi.softAP(WIFI_AP_SSID, WIFI_AP_PASSWORD); + + server.on("/", HTTP_GET, handleRoot); + server.on("/api/state", HTTP_GET, handleState); + server.on("/api/command", HTTP_POST, handleCommand); + server.begin(); +} + +void poll() { server.handleClient(); } } // namespace WebUi diff --git a/src/web_ui.h b/src/web_ui.h index e3d8958..d0dc8ea 100644 --- a/src/web_ui.h +++ b/src/web_ui.h @@ -1,8 +1,7 @@ #pragma once -// Stub pour l'instant : la priorite est de valider l'affichage OLED avec -// la simulation TMS320 avant de brancher le serveur web (qui devra se -// connecter au reseau local, en mode STA, avec des identifiants a fournir). +// Serveur web de l'IHM : l'ESP32 cree son propre point d'acces WiFi +// (voir config.h) et sert un dashboard + controles HT/PWM1/PWM2. namespace WebUi {