diff --git a/CHANGELOG.md b/CHANGELOG.md index 306a416..80f9ef9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,13 @@ CHANGELOG +## v0.0.7d (30.08.2026) ++ Firmware-Version als Build-Tag im Code und im Webinterface eingebaut ++ WLAN-Name für Segelflug- und Winden-Module angepasst (`Telemetry-` bzw. `Telemetry-Winch`) ++ Webinterface zeigt aktuell geladene Firmware-Version an ++ Speichern der Einstellungen springt nach dem Speichern auf die Startseite mit Erfolg/Fehlerstatus zurück ++ Captive-Portal / DNS-Weiterleitung für das Webinterface ergänzt ++ Access Point bleibt nur 5 Minuten nach PowerOn aktiv, wenn kein Client verbunden ist, und wird dann automatisch deaktiviert ++ AutoBuild und Release-Prozess für Versionsnamen, Prüfsummen und Release-Artefakte korrigiert + ## v0.0.7c (28.08.2026) + korrektur AutoBuild (Checksum) diff --git a/extra_script.py b/extra_script.py index 5c66bd8..9b6661f 100644 --- a/extra_script.py +++ b/extra_script.py @@ -3,8 +3,10 @@ Import("env") # Access to global construction environment build_tag = env['PIOENV'] -version_tag = os.getenv("FIRMWARE_VERSION") +version_tag = os.getenv("FIRMWARE_VERSION", "dev").strip() +# CPPDEFINES ensures the macro expands to a valid C string literal instead of a bare identifier. +env.Append(CPPDEFINES=[('FIRMWARE_VERSION', f'\\"{version_tag}\\"')]) env.Replace(PROGNAME="firmware_%s_%s" % (build_tag, version_tag)) # include toolchain paths diff --git a/lib/webinterface/webinterface.cpp b/lib/webinterface/webinterface.cpp index 11b0428..1dbe0bc 100644 --- a/lib/webinterface/webinterface.cpp +++ b/lib/webinterface/webinterface.cpp @@ -1,9 +1,11 @@ #include "webinterface.h" #include +#include #include #include #include #include +#include namespace { @@ -13,22 +15,57 @@ constexpr char default_callsign[] = "D1234"; constexpr int default_min_speed = 80; constexpr int default_max_speed = 150; constexpr unsigned int default_active_time_seconds = 90; +constexpr unsigned long access_point_timeout_ms = 5UL * 60UL * 1000UL; +constexpr char telemetry_ap_prefix[] = "Telemetry-"; String default_access_point_name() { #ifdef DEVICE_SAILPLANE - return String("Sailplane-") + default_callsign; + return String(telemetry_ap_prefix) + default_callsign; #else - return "Winde-Telemetry"; + return String(telemetry_ap_prefix) + "Winch"; #endif } +String generated_access_point_name(const String &callsign) +{ +#ifdef DEVICE_SAILPLANE + String safe_callsign = callsign; + if (safe_callsign.length() == 0) + safe_callsign = default_callsign; + return String(telemetry_ap_prefix) + safe_callsign; +#else + return String(telemetry_ap_prefix) + "Winch"; +#endif +} + +String url_encode(const String &value) +{ + String encoded; + encoded.reserve(value.length() * 3); + for (unsigned int i = 0; i < value.length(); ++i) + { + const char c = value.charAt(i); + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || c == '.' || c == '~') + encoded += c; + else + { + char buffer[4]; + snprintf(buffer, sizeof(buffer), "%%%02X", static_cast(c)); + encoded += buffer; + } + } + return encoded; +} + WebServer server(80); +DNSServer dns_server; Preferences preferences; TelemetrySettings *active_settings = nullptr; bool restart_after_update = false; bool update_failed = false; bool access_point_restart_pending = false; +unsigned long access_point_started_ms = 0UL; String html_escape(const String &value) { @@ -41,6 +78,13 @@ String html_escape(const String &value) return escaped; } +void redirect_to_root(const String &message, bool success) +{ + String location = String("/?status=") + (success ? "success" : "error") + "&msg=" + url_encode(message); + server.sendHeader("Location", location, true); + server.send(303, "text/plain; charset=utf-8", ""); +} + void send_page(const String &message = String()) { String page; @@ -51,15 +95,19 @@ void send_page(const String &message = String()) "body{font-family:sans-serif;max-width:38rem;margin:2rem auto;padding:0 1rem}" "label{display:block;margin-top:1rem}input{box-sizing:border-box;width:100%;padding:.6rem;font-size:1rem}" "button{margin-top:1rem;padding:.65rem 1rem;font-size:1rem}" - ".msg{padding:.6rem;background:#e5f4e8}small{color:#555}" + ".msg{padding:.6rem;background:#e5f4e8}.error{padding:.6rem;background:#fbe5e5}small{color:#555}" "

Winden-Telemetry

"); if (message.length() > 0) { - page += F("

"); + page += F("

"); page += html_escape(message); page += F("

"); } - page += F("
" + page += F("

Firmware: "); + page += html_escape(firmware_version_string()); + page += F("

" "