• v0.1.0-beta.5 4511346eb7

    Ghost released this 2026-05-28 21:14:14 +02:00 | 2 commits to main since this release

    Added

    • Settings-Übersicht als Button-Raster: 7 Kategorien als 2-Spalten-Kacheln statt flacher Liste (ScreenSettings.cpp_buildOverviewGrid())
    • ScreenLauncher::showDeferred(): LVGL-sichere Navigation zurück zum Launcher aus Event-Callbacks (nutzt lv_async_call() — verhindert LoadProhibited-Absturz wenn lv_scr_load() während Event-Dispatch aufgerufen würde)
    • BLE-Companion: MeshCore-App kann sich per Bluetooth andocken (Nordic NUS UUID 6E400001-…); BTCompanionService kann ohne Neustart aktiviert/deaktiviert werden
    • ops::text::sanitize() (src/utils/TextUtils.h/cpp): kopiert UTF-8-Text und ersetzt 3-Byte-Sonderzeichen (typografische Anführungszeichen U+2018/201C, Gedankenstriche U+2013/2014, Ellipse U+2026) durch ASCII-Äquivalente; Umlaute (U+00A0-00FF) werden unverändert durchgereicht
    • scripts/gen_latin_fonts.sh: Skript zur Generierung erweiterter LVGL-Montserrat-Schriftdateien mit Latin-1-Supplement via lv_font_conv (für zukünftige volle Unicode-Unterstützung)
    • scripts/download_tiles.py komplett überarbeitet: konfigurierbarer Tile-Server (--server osm-de/maptiler/stadia), optionaler --api-key, Retry mit Backoff, 429-Header-Auswertung, klare 403-Fehlermeldung mit Lösungshinweis
    • WiFi-Integration: optionale WLAN-Konnektivität für NTP-Zeitsync
      • Config: neue Felder wifiEnabled, wifiSsid[33], wifiPsk[64] (persistiert via NVS + SD JSON)
      • WifiMgr: State-Machine (OFF → CONNECTING → WAIT_NTP → CONNECTED); Retry alle 60 s; NTP-Resync alle 6 h via configTime() + time(nullptr)
      • MeshService::setCurrentTime(): übergibt NTP-Epoch an ESP32RTCClock
      • ScreenSettings: WiFi-Einstellungsdialog (SSID-Textarea, PSK-Textarea mit Passwort-Modus, Enable-Toggle, Save/Cancel)
      • main.cpp: WifiMgr::init() in setup(), WifiMgr::tick() in loop()
    • Hashtag-Kanalpräfix: Channel-Namen im Home-Screen werden jetzt mit # dargestellt (#channel-name statt channel-name)

    Fixed

    • Absturz: lv_scr_load() aus LVGL-Event-Callbacks — alle Screens (ScreenHome, ScreenSettings, ScreenHeard, ScreenMap, ScreenPower, ScreenSignal, ScreenFinder, ScreenTrace, ScreenContacts, ScreenRepeaters, ScreenMP3Player, ScreenTerminal, ScreenPlaceholder): direkte ScreenLauncher::show()-Aufrufe in Event-Callbacks durch ScreenLauncher::showDeferred() ersetzt
    • BLE-Gerätename OPSOPS-0001: BTCompanionService::init() übergab "OPS" als Prefix → SerialBLEInterface::begin() hängte ihn vor den Callsign → doppelter Prefix. Fix: leerer Prefix "", Gerätename ist direkt der Callsign
    • BLE-PIN: Standardwert 123456 → 0 (Just-Works-Pairing); MITM-Modus bleibt in SerialBLEInterface hardkodiert (MeshCore-Submodul, read-only)
    • Notification-Popup zeigt ? — Emoji und Sonderzeichen:
      • _showNotifyPopup() in UIScreen.cpp: emojiFont() statt plain Montserrat; ops::text::sanitize() ersetzt 3-Byte-Sonderzeichen
      • ScreenHome::_addBubble(): emojiFont() für msgLbl
    • emojiFont() Memory-Leak (src/ui/Emoji.cpp): lv_imgfont_create() wurde bei jedem Bubble-Aufbau neu aufgerufen (500–1000 Bytes pro Nachricht verloren). Fix: statischer Cache nach line_height (max 8 Slots), Font-Objekte werden einmal angelegt und wiederverwendet
    • Tile-Download 403-Fehler (scripts/download_tiles.py): tile.openstreetmap.org blockiert Bulk-Downloads per Policy. Fix: deutscher OSM-Spiegel als Standard, konfigurierbarer Server mit API-Key-Unterstützung; User-Agent von "Saitama" auf "OpenMeshOS" korrigiert
    • strcpy(buf, "--") Compiler-Warnungen in ScreenPlaceholder.cpp — durch snprintf() ersetzt
    • Config SD-Priorität: config::init() lud bisher NVS zuerst (blob) — nach Firmware-Update ohne Struct-Größenänderung wurde dadurch veraltete NVS-Version geladen statt aktueller SD-JSON. SD ist jetzt primär (wie Contacts/Repeaters)
    • MapEngine: mapTileDir Config-Feld hatte keinen Effekt — init() nimmt jetzt den Pfad als Parameter, tileExists()/readTile() verwenden ihn statt hartkodiertem /ops/maps/
    • Config: Default mapTileDir von /map auf /ops/maps korrigiert
    • ScreenMap._build(): PSRAM-Leak bei fehlgeschlagener Puffer-Allokierung behoben; _screen wird korrekt gelöscht und auf nullptr gesetzt damit show() erneut versuchen kann
    • ScreenMap.navigate(): Breiten-Panning verwendete lineare degPerPx-Näherung statt inverser Mercator-Formel — korrigiert durch Umrechnung in Kachel-Y-Raum und zurück
    • ScreenTrace._lookupNodeName(): Toter Code (fehlerhafte Pointer-Arithmetik, immer offset 0) entfernt; nur die korrekte Hex-Formatierungsschleife verbleibt
    • CLAUDE.md: Trackball-Pin-Tabelle korrigiert — DOWN=GPIO15, LEFT=GPIO1, RIGHT=GPIO2 (vorher vertauscht)
    • MapEngine.h: Kommentar in hasTileDir() korrigiert (/maps//ops/maps/)
    • MeshService.cpp — MeshCore vollständig verdrahtet:
      • OPSBoard::getMCUTemperature(): temperatureRead() (ESP32-S3 interne Temperatur)
      • OPSBoard::reboot(): ESP.restart() explizit überschrieben
      • OPSMesh::tickGpsSync(): GPS→RTC-Zeitsync alle 30 s, nur vorwärts (gleiche Guard wie BLE-Companion); UTC-Datum via Board::gpsDateTime(), Epoch via eigenem _utcToEpoch() (kein timegm() auf ESP32)
      • MeshService::tick() ruft tickGpsSync() auf
    • Config.cpp: screenOffMin und notifySoundChoice JSON-Fallback verwendet jetzt s_cfg-Wert statt hartkodierter 0 — konsistent mit allen anderen Feldern
    • MeshService.h: MAX_TRACE_HOPS = 64 Konstante eingeführt; snrs[]/hashes[] Arrays und der Receiver-Guard in onTraceRecv() verwenden sie statt magischer Zahl 64
    • Projektname: alle Copyright-Header, Runtime-Strings und Kommentare von "Saitama" auf "OpenMeshOS" umgestellt — ScreenBoot zeigt jetzt "OpenMeshOS", Terminal-Begrüßung und Log-Ausgaben ebenfalls; Board.cpp/Board.h (read-only) ausgenommen

    Changed

    • SRAM-Optimierung — ~56 KB nach PSRAM verschoben (EXT_RAM_BSS_ATTR):
      • Contact s_contacts[50] 7.800 B, Repeater s_reps[50] 7.600 B
      • MsgEntry s_history[30] 8.370 B, TraceTarget s_targets[100] 3.700 B, Dropdown-Buffer 4.000 B
      • DiscoverEntry s_results[20] 1.460 B
      • MP3-Dateilisten _filePaths/Names[64] 12.288 B
      • Sound-Synthesepuffer (Ping/Pluck/Clear/Whoosh) 9.600 B
      • ScreenTerminal lsbuf[1024] + [512] 1.536 B
    • Config SD-Primär: Ladereihenfolge in config::init() geändert: SD JSON → NVS-Blob → Legacy-NVS-Keys → Defaults (entspricht Contacts/Repeaters-Muster)
    • Contacts, Repeaters, Routes: bereits SD-primär (seit beta.4); Config schließt jetzt auf
    • Settings-Übersicht: flache Liste → 2-Spalten-Kacheln (7 Kategorien)
    • OPS_HAS_BUILTIN_GPS-Flag in platformio.ini dokumentiert: auf =0 setzen spart ~800 Bytes SRAM + ~4 KB Flash
    • README: Original-Verweis auf Saitama by 868-Meshbot oben eingefügt
    • README: Projektname durchgängig auf "OpenMeshOS" umgestellt
    • README: Clone-URL auf dieses Repository korrigiert
    • README: Version auf 0.1.0-beta.4 aktualisiert
    • README: Nicht-existierende Keyboard.h/cpp aus Projektstruktur entfernt
    • ROADMAP: Version und LVGL-Version korrigiert, Config-Speicher-Beschreibung angepasst
    • ARCHITECTURE: LVGL-Version (9→8.3), Memory-Map-Label, Config-Storage-Tabelle korrigiert
    • CLAUDE.md: Projektname, Version und Lizenz-Header-Konvention auf OpenMeshOS aktualisiert
    • VERSIONING.md: Projektname und Versionsreferenzen aktualisiert
    • docs/TODO.md: Fehleranalyse hinzugefügt, behobene Punkte als erledigt markiert

    Fixed

    • Dokumentations-Inkonsistenzen: LVGL 9 → 8.3 (ARCHITECTURE, ROADMAP)
    • Dokumentations-Inkonsistenzen: Config-Storage SPIFFS → NVS+SD (ARCHITECTURE, ROADMAP)
    • Memory-Map-Eintrag 0xC90000 falsch als "SD card FS" beschriftet
    Downloads