• v0.1.0-beta.17 2c0b4263dc

    Ghost released this 2026-06-04 12:34:27 +02:00 | 30 commits to main since this release


    Downloads
  • v0.1.0-beta.15 addac61e77

    Ghost released this 2026-06-04 11:47:48 +02:00 | 36 commits to main since this release


    Downloads
  • v0.1.0-beta.14 efe3c8ddcf

    Ghost released this 2026-06-04 11:33:10 +02:00 | 38 commits to main since this release


    Downloads
  • v0.1.0-beta.13 71f22ef0a1

    Ghost released this 2026-06-04 11:15:40 +02:00 | 40 commits to main since this release

    Reverted

    • BLE-Scan-Fix (beta.12): _clearBonds() + sofortiges _ble.enable() in init() rückgängig gemacht — Gerät war im Scan weiterhin nicht sichtbar; Original-Verhalten (enable() via startCompanionInterface()) funktioniert korrekt
    Downloads
  • v0.1.0-beta.12 6b2c1a79a6

    Ghost released this 2026-06-04 10:41:06 +02:00 | 42 commits to main since this release

    ⚠ Wichtig! Diese Version löscht beim ersten BT-Start alle gespeicherten BLE-Bond-Keys aus dem NVS (stale MITM-Bonds von alter Firmware). Auf Android/iOS vor dem Pairing: Gerät in BT-Einstellungen entfernen/vergessen damit kein veralteter Bond-Cache stört.

    Added

    • Status-Leiste: BT-Icon + Peer-Anzahl (ScreenLauncher): BT-Icon grau/blau/grün nach Zustand; Peer-Zähler ⟳N aktualisiert bei jeder peerSerial-Änderung

    Fixed

    • BLE nicht sichtbar (Issue #4): BTCompanionService::init() rief enable() erst auf wenn startCompanionInterface() aufgerufen wurde — bei Race-Condition nie. Fix: enable() direkt in init() nach begin(). _clearBonds() löscht stale MITM-Bond-Keys aus NVS (nach BLEDevice::init() — vorher crash)
    • _clearBonds() Reihenfolge: esp_ble_*-Aufrufe vor BLEDevice::init() crashen den Stack — Aufruf nach begin() verschoben
    • esp_ble_remove_bond_device Typ-Fehler: &list[i].bd_addrlist[i].bd_addr (uint8_t[6] zerfällt zu uint8_t*)
    • CI release.yml: Release-API-Calls auf FORGEJO_INTERNAL umgestellt (curl exit 7 / Hairpin-NAT)
    Downloads
  • v0.1.0-beta.11 f226b53d85

    Ghost released this 2026-06-04 10:22:06 +02:00 | 44 commits to main since this release


    Downloads
  • v0.1.0-beta.10 7f39332b50

    Ghost released this 2026-06-04 10:07:59 +02:00 | 47 commits to main since this release

    Added

    • Status-Leiste: BT-Icon + Peer-Anzahl (Issue #5): _btLbl (grau=aus, blau=aktiv, grün=verbunden) und _peerLbl (⟳N, grau bei 0 Peers, weiß ab 1) im Launcher-Header; refreshBT() + refreshPeer() in ScreenLauncher; Peer-Update bei jeder peerSerial-Änderung, BT im 60s-Zyklus
    • BLE Android 12+ Fix (Issue #4): pre_build.py patcht SerialBLEInterface.cpp beim Build — ESP_LE_AUTH_REQ_SC_MITM_BONDESP_LE_AUTH_BOND, GATT-Permissions MITM → ENCRYPTED; Submodul bleibt git-sauber
    • MeshCore-Submodul: c940ea5add18d68 (3 CI-only Commits upstream, kein API-Bruch)
    • CI: Zweiter Runner-Server: runner/docker-compose.yml, setup.sh, act_runner_config.yaml für eigenständigen Forgejo-Runner auf separatem LAN-Rechner
    • patches/meshcore-ble-no-mitm.patch: Patch-Referenzdatei für den pre_build.py BLE-Fix

    Fixed

    • CI Hairpin-NAT: build-firmware.yml und release.yml nutzen jetzt FORGEJO_INTERNAL=http://192.168.11.12:3000 für alle git-Clone- und curl-API-Operationen; externe Domain vom Docker-Job-Container aus nicht erreichbar
    • CI Release-Upload (curl exit 7): Release-Erstellung und Asset-Upload in beiden Workflows auf interne IP umgestellt
    • CI Clone: --depth=1 --shallow-submodules für schnellere und zuverlässigere Checkouts
    Downloads
  • v0.1.0-beta.9 5a74450997

    Ghost released this 2026-06-04 09:59:11 +02:00 | 49 commits to main since this release


    Downloads
  • v0.1.0-beta.6 fe09bb463a

    Ghost released this 2026-05-28 21:33:07 +02:00 | 64 commits to main since this release


    Downloads
  • v0.1.0-beta.5 4511346eb7

    Ghost released this 2026-05-28 21:14:14 +02:00 | 66 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