Skip to content

v1.5.0 — Auswertung+Diagramm, Hindernisse-Fix, Update-Fix, Wettkampfgebiet

Choose a tag to compare

@Lukas5x5 Lukas5x5 released this 14 Jun 12:55

Auswertung bleibt nach Tab-Wechsel erhalten + Pilot-Entwicklungs-Diagramm

Zwei Verbesserungen im Result-Tab:

  1. Letzte Auswertung bleibt sichtbar: Bisher war der ausgewertete Stand weg, sobald man den Tab/das Panel verließ und wieder öffnete — man musste neu auswerten. Jetzt wird die zuletzt geladene Auswertung (Tasks + Ergebnisse) lokal pro Meisterschaft gespeichert und beim Wiederöffnen sofort angezeigt. Mit „Neu auswerten" holst du weiterhin frische Daten.

  2. Entwicklungs-Diagramm pro Pilot: Klick auf einen Piloten in der Rangliste öffnet ein Diagramm seines Verlaufs über die Meisterschaft — umschaltbar zwischen:

    • Platz pro Task (zeigt, ob er konstant vorne war oder schwankte; Platz 1 oben),
    • Punkte pro Task (in welchen Tasks er stark/schwach war),
    • Gesamt-Verlauf (kumulierte Punkte über die Tasks).
      Darunter Statistik: bester/schlechtester/durchschnittlicher Platz und eine Konstanz-Bewertung (sehr konstant / konstant / schwankend / stark schwankend) basierend auf der Streuung der Platzierungen.
    • An jedem Datenpunkt steht der konkrete Wert (Platz bzw. Punkte) direkt dran, plus mehrere Y-Achsen-Markierungen — so liest man pro Task den genauen Platz ab.

„Stand aktualisieren" lädt jetzt auch neu aus

Der Button im Result-Tab heißt jetzt „Neu auswerten & Stand aktualisieren": Er holt frische Daten von WatchMeFly und setzt den gespeicherten Vergleichsstand auf diesen frischen Stand (statt nur den bereits angezeigten Stand zu speichern).

Auswertung speichern + Änderungen beim Neu-Auswerten anzeigen

Neu im Result-Tab (WatchMeFly-Auswertung): Du kannst den ausgewerteten Stand pro Meisterschaft speichern und beim erneuten Auswerten sehen, was sich geändert hat — inkl. Grund.

So funktioniert es:

  • Nach dem Auswerten gibt es den Button „⭳ Auswertung speichern" — speichert den aktuellen Stand (Rangliste) pro Meisterschaft und Ansicht (Aktuell / Official). Daneben steht „Gespeicherter Stand: …".
  • Bei „Neu auswerten" werden die frischen Daten gegen den gespeicherten Stand verglichen. Hat sich etwas geändert, erscheint:
    • oben eine Zusammenfassung der Änderungen,
    • in der Ergebnisliste neben jedem betroffenen Piloten ein farbiges Badge (z.B. „▲ 5.→3. +30 Pkt" grün für Verbesserung, rot für Verschlechterung, blau für neu/raus),
    • und darunter der Grund („warum") — z.B. „Task 3: +30 Pkt", „Strafe entfernt", „Task 4: DNF", oder „Verschiebung durch andere Piloten".
  • Pilot wird NEU in der Wertung oder fällt RAUS → wird ebenfalls markiert.
  • Mit „⭳ Stand aktualisieren" setzt du den gespeicherten Stand auf den aktuellen (die Änderungen verschwinden dann, bis sich wieder etwas ändert).

Technik: Der WatchMeFly-Parser liest jetzt zusätzlich die Spalten Penalty(T), Penalty(C) und Notes mit, um den Grund einer Änderung zu bestimmen. Der gespeicherte Stand liegt lokal pro Meisterschaft (überlebt Neustarts dank des Storage-Fixes). Pro Ansicht (Aktuell/Official) wird ein eigener Stand gehalten.

Fix: Gespeicherte Daten verschwanden im Dev-Modus bei jedem Start

Behebt die Ursache mehrerer „verschwindet nach Neustart"-Probleme (WatchMeFly-Code, Wettkampfgebiet, Sperrgebiete). Im Entwicklungsmodus löschte die App bei jedem Start den kompletten Browser-Speicher (localStorage und IndexedDB). Dadurch gingen alle lokal gespeicherten Daten beim Neustart verloren.

Fix: Im Dev-Modus wird jetzt nur noch der Code-/HTTP-Cache geleert (gegen veraltete Build-Artefakte), aber localStorage und IndexedDB bleiben erhalten. WatchMeFly-Code, Wettkampfgebiet, Sperrgebiete usw. überstehen jetzt auch beim Entwickeln den Neustart. (In der installierten App war dieser Lösch-Block ohnehin nie aktiv.)

WatchMeFly-Code bleibt pro Meisterschaft gespeichert

Der eingegebene WatchMeFly-Link wird weiterhin pro Meisterschaft gespeichert (jede Meisterschaft hat ihren eigenen) und bleibt dank des obigen Fixes dauerhaft erhalten. Zusätzlich: Wird der Code bewusst geleert, taucht er beim nächsten Öffnen nicht mehr auf.

Luftfahrthindernisse laden zuverlässig + schnell (Logik von der Lite-App übernommen)

Behebt das Problem, dass Hochspannungsleitungen/Windräder oft gar nicht luden. Die Lade-Logik wurde durch die bewährte, schnelle Variante aus der NTA-Mobile-Lite-App ersetzt.

Was neu ist:

  • 3 Overpass-Server im Wechsel (statt nur einem): Ist overpass-api.de überlastet, wird sofort der nächste Server probiert — kein Hängen mehr.
  • Hartes Timeout (20 s) pro Anfrage: Ein hängender Request blockiert nicht mehr alle weiteren Ladevorgänge.
  • Leichtere Abfrage (out geom): Die Geometrie kommt direkt in einem Rutsch statt in zwei schweren Phasen — deutlich weniger Daten, viel schneller.
  • Tile-basiertes Laden mit Cache: Die Karte ist in 0,5°-Kacheln aufgeteilt. Bereits geladene Kacheln erscheinen sofort (lokaler Cache, 30 Tage), nur fehlende werden im Hintergrund nachgeladen.
  • Optionaler geteilter Cloud-Cache: Ist die Tabelle obstacle_tiles in Supabase vorhanden, profitieren alle Nutzer voneinander (erste Ladung pro Gebiet füllt den Cache, danach für alle sofort). Fehlt die Tabelle, läuft alles trotzdem über Server-Pool + lokalen Cache — kein Fehler.

Die Spannungs-Farbgebung (380/220/110/20 kV, Niederspannung) und die Windrad-Tooltips bleiben unverändert.

Fix: Automatisches Update lädt herunter, installiert aber nicht

Behebt das wiederkehrende Problem, dass das Update heruntergeladen, der Installer danach aber nicht gestartet wurde.

Ursachen + Fixes:

  • Installer-Start unzuverlässig: Der Installer wurde per child_process.spawn({detached}) gestartet — das startet GUI-Installer auf Windows oft nicht zuverlässig. Neu: Start über shell.openPath() (wie ein Doppelklick im Explorer, inkl. UAC-Dialog).
  • Falsche Beenden-Reihenfolge: Die App beendete sich mit app.quit(), was durch hängende Fenster-Handler blockiert werden konnte — dann lief die App weiter und blockierte den Installer. Neu: Installer starten → Erfolg melden → App nach kurzem Vorlauf hart beenden (app.exit), damit der NSIS-Installer freie Bahn hat.
  • Unzuverlässige Datei-Prüfung: Der X_OK-Check (auf Windows bedeutungslos) konnte fälschlich fehlschlagen. Entfernt — es wird nur noch Lesbarkeit geprüft.
  • Stille Downloads kaputter Dateien: Lieferte der Server statt der .exe eine kleine HTML-Fehlerseite/leere Datei (abgelaufener Link, 404 nach Redirect), wurde diese als „Installer" gestartet und tat nichts. Neu: Die heruntergeladene Datei wird geprüft (mindestens 1 MB und gültige .exe mit „MZ"-Signatur). Schlägt das fehl, gibt es eine klare Fehlermeldung statt eines stillen Nicht-Installierens — und das UI öffnet den Download im Browser als Fallback.
  • Diagnose: Der Update-Vorgang schreibt jetzt ein Protokoll in update-log.txt (im App-Daten-Ordner), damit künftige Probleme nachvollziehbar sind.

Donut: Top-3-Optionen mit Live-Preview

Neue Funktion analog zum ConeNavigator: nach dem Berechnen werden bis zu 3 verschiedene Donut-Lösungen angezeigt — der Pilot kann zwischen ihnen wählen bevor er deklariert.

Diversitäts-Filter sorgt dafür dass die Optionen wirklich unterschiedlich sind:

  • Donut-Richtung > 30° anders, oder
  • altA / altB > 150m anders

Wenn alle Kandidaten zu ähnlich sind, werden weniger als 3 Optionen angeboten.

UI-Flow:

  1. "Berechnen" klicken → Worker liefert Top-3-Liste
  2. Im Panel erscheint neuer Block "ALTERNATIVE OPTIONEN (3)" mit klickbaren Karten
  3. Jede Karte zeigt: altA ⇌ altB (Höhen) + Strecke + Pendel-Zahl + Zeit
  4. Klick → Live-Preview auf der Karte (Pfad, Marker, Kegel werden umgeschaltet)
  5. Mit gewählter Option auf "ZIEL DEKLARIEREN" klicken

Implementierung:

  • donutCalculator.ts → neue Export-Funktion calculateDonutTopN(input, n=3), calculateDonut wird Wrapper
  • Phase 1 + 2 sammeln jetzt ALLE Kandidaten in einer sortierten Liste
  • Phase 3 (Rate-Optimierung) wird nun pro Top-N-Kandidat ausgeführt
  • Worker-API erweitert um topN-Parameter und results-Array (Backward-kompat: result enthält weiterhin Top-1)
  • DonutPanel: neuer State allOptions[] + selectedOptionIdx, Option-Picker-Karten vor dem Deklarier-Button

Auto-Outdoor-Modus beim Takeoff/Recording-Stop

Neue Option in den Einstellungen unter "Aufzeichnung" → unter dem Sensibilitäts-Slider erscheint ein Schalter "Outdoor-Modus automatisch beim Takeoff" (sichtbar nur wenn Auto-Takeoff-Erkennung aktiv ist).

Verhalten wenn aktiviert:

  • Sobald die Auto-Takeoff-Erkennung anschlägt und das Recording automatisch startet, wird der Outdoor-Modus (hochkontrastige Anzeige für Sonnenlicht) eingeschaltet — Pilot muss nicht manuell daran denken
  • Sobald die Aufzeichnung endet (egal ob manuell beendet, "Beenden" oder Auto-Save), wird der Outdoor-Modus wieder ausgeschaltet — bei Bodenbetrieb (Briefing, Tasksheet-Import) sieht man wieder das normale Dark-Theme

Setting: settings.autoOutdoorModeOnTakeoff (default false — opt-in damit der Modus beim Update niemanden überrascht).

Tool-Panels: Touch-Scroll innerhalb scrollbarer Bereiche + Position bleibt nach Neustart

Zwei Verbesserungen am Drag-/Scroll-Verhalten der Tool-Panels:

1. Touch-Scroll vs. Panel-Drag-Konflikt behoben. Im ConeNavigator (und allen anderen Panels mit scrollbaren Bereichen) kam es zu folgendem Bug: wenn man in der Optionen-Karten-Liste mit dem Finger scrollen wollte, wurde stattdessen das gesamte Panel verschoben. Ursache: der Drag-Handler intercepted alle Touch/Mouse-Events, ohne zu prüfen ob der Touch in einem scrollbaren Container begann.

Fix: Neuer Helper isInScrollableArea(target) in NavigationPanel.tsx. Crawled vom Touch-Target bis zum Root und prüft jedes Element auf:

  • CSS-Klasse no-drag (manueller Override für UI-Elemente die niemals draggen sollen)
  • overflow-y: auto oder scroll UND tatsächlich scrollbar (scrollHeight > clientHeight)

Falls ein scrollbarer Container gefunden wird, wird das Drag NICHT gestartet — der Inhalt scrollt normal. Wirkt für alle Tool-Panels: Donut, Elbow, WindNav, Ang, LandRun, ConeNav.

2. Tool-Panel-Positionen + LiveTeamPanel-Position bleiben nach App-Neustart erhalten. Bisher wurden die Drag-Positionen nur in lokalem useState gehalten → bei jedem Reload sprangen die Panels zurück in die Mitte. Jetzt persistiert in localStorage:

  • nta-tool-panel-positions → pro Tool gespeicherte Position (Donut, Elbow, etc.)
  • nta-live-team-panel-pos → LiveTeamPanel-Position

Beim Mount wird die gespeicherte Position aus localStorage geladen, bei jeder Drag-Bewegung neu geschrieben.

ConeNavigator (PDG/FON): Mehrere Tasks parallel vor-deklarieren

Problem: Vor dem Start wollen viele Piloten alle ihre Tasks gleich vor-deklarieren (z.B. 1 PDG + 2 FON). Bisher gab's im ConeNavigator nur einen einzigen Slot für die Deklaration — sobald du den zweiten Task berechnet hast, war die PDG-Deklaration weg, und du konntest nicht mehr dorthin zurückspringen.

Ursache: Die Deklaration wurde nur im coneDeclared-Store-State gehalten (singular, globaler State), nicht im Task selbst.

Lösung: Cone-Deklaration wird jetzt pro Task gespeichert:

  • Neues optionales Feld task.coneDeclaration: { lat, lon, altitude, turnLayer } im Task-Type
  • Beim Berechnen+Deklarieren wird die Cone-Deklaration zusätzlich in den parent Task geschrieben
  • Beim Wechsel des selektierten Goals lädt das Panel automatisch die zugehörige Cone-Deklaration aus dem Task (falls vorhanden) — Live-Korrektur startet sofort wieder für den neuen Punkt
  • Wenn das neue Goal noch keine Deklaration hat, wird die Anzeige geleert (kein "Geist" vom vorherigen Task)
  • Reset löscht zusätzlich die Task-gespeicherte Deklaration

Praktischer Workflow:

  1. PDG-Goal auswählen → Cone berechnen → Deklarieren → ✓ gespeichert
  2. FON1-Goal auswählen → Panel zeigt leer (oder die FON1-Deklaration wenn schon vorhanden) → Berechnen → Deklarieren
  3. FON2-Goal auswählen → analog
  4. Zurück zum PDG: einfach PDG-Goal auswählen → Panel zeigt sofort den PDG-Cone-Punkt + Live-Korrektur

Die Deklaration überlebt App-Restarts (Tasks werden persistiert), das Goal selbst ist bereits zum berechneten Punkt verschoben — Karte zeigt also auch ohne aktive Auswahl alle vor-deklarierten Ziele korrekt.

Distanz-Warnung global, nicht mehr pro PZ

Geändert: Die „Keine Warnungen für dieses Sperrgebiet"-Checkbox im PZ-Zeichnen-Dialog ist entfernt. Die Distanz-/Annäherungswarnung wird jetzt zentral in Einstellungen → Sperrgebiete ein-/ausgeschaltet (Schalter „Distanz-/Annäherungswarnung aktivieren") und gilt für alle Sperrgebiete.

Im PZ-Dialog bleibt nur noch die Höhen-Warnung (pro Sperrgebiet, mit Slider „Max-Höhe / Von Boden"). Ein Hinweis im Dialog verweist auf den globalen Distanz-Schalter.

Technisch: Der globale Schalter pzWarningEnabled steuert jetzt nur noch die Distanz-/Annäherungswarnung. Die Höhen-Warnung pro PZ läuft unabhängig davon weiter (vorher hätte der Schalter auch die Höhenwarnungen mit abgeschaltet).

PZ zeichnen: Live-Vorschau (Radius + Deckkraft) + mehrere nacheinander

Neu beim Sperrgebiet-Zeichnen:

  • Live-Vorschau auf der Karte: Sobald du einen Radius eingibst, erscheint der Kreis sofort auf der Karte — in der gewählten Farbe und Deckkraft, noch bevor du speicherst. Beim Polygon (ab 3 Punkten, geschlossen) wird die Füllung mit der gewählten Deckkraft live angezeigt. Änderst du Farbe/Deckkraft/Radius, aktualisiert sich die Vorschau sofort.
  • Mehrere PZ hintereinander: Nach „Speichern & nächstes" wird das Sperrgebiet gespeichert + auf der Karte gezeichnet, und das Panel macht sich sofort fürs nächste bereit (Punkte/Felder geleert, Zeichenmodus bleibt aktiv). Du klickst einfach den nächsten Punkt — kein erneutes Öffnen nötig. Farbe und Deckkraft bleiben erhalten, damit man mehrere PZ im selben Stil schnell setzen kann.
  • Ein grünes „✓ gespeichert"-Band bestätigt jede gespeicherte PZ.
  • Neuer Button „Fertig — Zeichnen beenden" schließt den Modus, wenn du fertig bist.

PZ-Zeichnen-Dialog überarbeitet: aufgeräumter, Kreis als Standard, klarer Typ

Überarbeitet: Das Panel beim „PZ zeichnen" zeigt jetzt nur noch das Wichtigste direkt an — der Rest ist in aufklappbare Abschnitte gewandert. Alle bisherigen Funktionen bleiben erhalten.

Sichtbar auf einen Blick: Anleitung + Punktzähler (kombiniert), Name, Radius (bei Kreis), Farbe + Deckkraft, und der „Sperrgebiet speichern"-Button.

Aufklappbar (▼):

  • Koordinaten — Punkt per UTM-Koordinate hinzufügen (Zone/Band/East/North) und die Liste aller gesetzten Punkte einzeln bearbeiten (im eingestellten Grid-Format).
  • Form (nur bei Polygon) — Geschlossen / Offene Linie.
  • Höhe & Warnungen — Maximale Höhe, „Keine Warnungen", Höhen-Warnung (Max-Höhe / Von-Boden).

Kreis vs. Linie/Polygon jetzt eindeutig:

  • 1 Punkt = Kreis (Radius-Feld erscheint) — der Standardfall fürs normale Sperrgebiet.
  • Ab 2 Punkten = Linie/Polygon (Track/PLT) — kein Radius mehr; oben erscheint ein klares Typ-Badge („KREIS" / „PUNKT" / „LINIE / TRACK (n)" / „POLYGON (n)").
  • Behoben: Vorher konnte man auch bei 2 Punkten einen Radius eingeben, und 2 Punkte wurden fälschlich als Einzelpunkt gespeichert (zweiter Punkt ging verloren). Jetzt ist die Grenze sauber: genau 1 Punkt = Kreis, ab 2 = Linie/Polygon.

PZ-Import komplett neu: alle Sperrgebiete auf einen Blick statt einzeln durchklicken

Überarbeitet: Der Import von Sperrgebieten (PZ) zeigt jetzt alle PZ als Liste in einem Fenster, statt sie einzeln nacheinander durchzuklicken („1 von 40 → Weiter → …"). Alle Funktionen bleiben erhalten, die Bedienung ist deutlich schneller.

Neu:

  • Liste aller PZ mit Häkchen pro Eintrag — abwählen, was nicht importiert werden soll (standardmäßig alle an). „Alle auswählen/abwählen" oben.
  • Gemeinsame Einstellungen oben wirken auf alle ausgewählten PZ auf einen Klick: Schnellfarben (Rot/Gelb/Blau) + eigene Farbe, Deckkraft, „Höhe für alle", „Höhenwarnung AN/AUS".
  • Pro PZ kompakt: Häkchen, farbiger Punkt, Name (direkt editierbar) und Kurzinfo (Kreis/Punkt/Polygon, Punktzahl). Details über „▼ Details" aufklappbar:
    • Koordinaten bearbeiten (pro Polygon-Punkt) im eingestellten Grid-Format (4/4, 5/5, 6/6; Auto-Zone bei aktiver Karte)
    • Radius (bei Punkt/Kreis), Höhe
    • Polygon: Geschlossen / Offene Linie
    • eigene Farbe + Deckkraft
    • Höhenwarnung (an/aus, Max-Höhe/Von-Boden, Warn-Höhe)
  • Ein „X importieren"-Button für alle angehakten. Duplikat-Prüfung bleibt wie bisher (Dialog bei Namens-/Positions-Duplikaten).

Der alte Schritt-für-Schritt-Wizard (mit „Überspringen", „Weiter", „Für die nächsten N übernehmen") entfällt — seine Funktionen sind jetzt in der Liste + den gemeinsamen Einstellungen abgebildet.

Neu: Tasks an GPS-Gerät senden (Garmin, USB) — wie OziExplorer

Was es ist: Du kannst die Ziele deiner Aufgaben als Wegpunkte an ein Garmin-GPS senden (z.B. GPSMAP 60CSx), ähnlich wie „Send to GPS" in OziExplorer.

So benutzt du es:

  1. Öffne die Einstellungen → Tab „GPS-Gerät" → Button „An GPS senden".
  2. Es öffnet sich ein Dialog mit der Liste deiner Aufgaben — wähle aus, welche übertragen werden sollen (standardmäßig alle). Oben siehst du, wie viele Wegpunkte das ergibt.
  3. Stecke das Garmin per USB an und stelle es am Gerät auf USB-Massenspeicher (Setup → Schnittstelle). Der Dialog sucht automatisch nach angeschlossenen Laufwerken; ein erkanntes Garmin-Laufwerk (mit Garmin-Ordner) wird mit grünem „GARMIN"-Tag markiert und vorausgewählt. Mit „↻ Geräte suchen" kannst du erneut scannen.
  4. „An Garmin senden" schreibt die Ziele als GPX-Wegpunkte in den Ordner Garmin/GPX/ auf dem Gerät. Danach das Garmin abstecken/neu starten — die Wegpunkte erscheinen unter „Wegpunkte".

Pro Ziel ein Wegpunkt: Jedes Goal wird ein Wegpunkt, benannt nach Task-Nummer + Ziel (z.B. „T1-1"), mit Koordinate, Höhe und einem Kommentar (Task-Name + Zielradius). Es werden nur die Ziele übertragen — keine Routen oder Tracks.

Fallback ohne Gerät: Wird kein Garmin-Laufwerk erkannt (oder du willst die Datei woanders hin), gibt es „Als Datei speichern" — das legt eine .gpx-Datei ab, die du selbst auf das Gerät (in Garmin/GPX/) oder in OziExplorer/BaseCamp kopieren kannst.

Hinweis: Das direkte serielle „Send to GPS"-Protokoll (altes Garmin-Kabelprotokoll) wird nicht verwendet — der USB-Massenspeicher-Weg ist beim 60CSx und neueren Geräten zuverlässiger.

Neu: Wettkampfgebiet pro Meisterschaft — zeichnen + Warnung vor dem Verlassen

Was es ist: Oft ist das tatsächliche Wettbewerbsgebiet kleiner als die geladene Karte. Du kannst jetzt das echte Wettkampfgebiet als Polygon einzeichnen und wirst gewarnt, bevor du es verlässt.

So benutzt du es:

  1. Öffne die Meisterschaft → Tab „Karte". Unter dem „Karte einblenden"-Button gibt es einen neuen Bereich Wettkampfgebiet mit dem Button „✏️ Wettkampfgebiet zeichnen".
  2. Klick darauf → das Meisterschafts-Fenster schließt sich und du landest auf der Karte im Zeichenmodus. Klicke die Eckpunkte des Gebiets an (mindestens 3). Rechts oben zeigt ein Panel die gesetzten Punkte und erlaubt „↩ Letzten Punkt entfernen".
  3. Im Panel gibst du einen Namen und die Vorwarn-Distanz ein (Schnellwahl 0,5 / 1 / 2 / 5 km oder eigener Wert). Das ist die Distanz, ab der vor dem Rand gewarnt wird.
  4. Du wählst Linienfarbe (8 Presets + freie Farbwahl) und Linienstärke (1–10 px, mit Live-Vorschau).
  5. „Wettkampfgebiet speichern" → das Gebiet wird als Linie (Umriss, ohne Füllung, ohne Beschriftung) in der gewählten Farbe/Stärke auf der Karte gezeichnet und in der Meisterschaft gespeichert (taucht beim nächsten Mal automatisch wieder auf).

Warnungen während des Flugs:

  • Türkis/gelb „WETTKAMPFGEBIET ENDET — Rand in X km", sobald du innerhalb des Gebiets bist und der Rand näher als deine eingestellte Vorwarn-Distanz kommt.
  • Rot „WETTKAMPFGEBIET VERLASSEN! — X m außerhalb", sobald du den Rand überschreitest.
  • Mit Sound (nutzt dieselbe PZ-Warnton-Einstellung) und „OK"-Button zum Wegklicken. Die Warnung kommt erneut, wenn sich der Status ändert (z.B. von Annäherung zu Verlassen) oder du wieder rein und erneut raus fliegst.

Bearbeiten: Im selben Karte-Tab kannst du ein bestehendes Wettkampfgebiet „Bearbeiten" — die Eckpunkte werden geladen und du kannst sie direkt auf der Karte anpassen:

  • Punkt ziehen = verschieben
  • Doppelklick auf einen Punkt = löschen
  • Klick auf freie Karte = neuen Punkt hinzufügen
    „Löschen" entfernt das Gebiet wieder.

Speicherung: Das Wettkampfgebiet wird lokal pro Meisterschaft gespeichert (App-Storage, keine Cloud). Wechselst du zu einer anderen Meisterschaft und wieder zurück, ist das Gebiet der jeweiligen Meisterschaft wieder da.

Sperrgebiete (PZ) und Wettkampfgebiet: lokal, pro Meisterschaft (keine Cloud mehr)

Geändert: PZ und das Wettkampfgebiet werden nicht mehr in Supabase gespeichert oder von dort geladen. Beide leben jetzt ausschließlich lokal im App-Storage, getrennt pro Meisterschaft. Beim Wechsel der aktiven Meisterschaft wird der aktuelle Stand in die alte Meisterschaft gesichert und die Daten der neuen geladen — so bleibt pro Meisterschaft das jeweilige Wettkampfgebiet + die PZ erhalten, auch beim Hin- und Herwechseln.

Was dadurch wegfällt:

  • Das automatische Speichern/Laden der PZ in/aus der Cloud.
  • Der „Sperrgebiete laden?"-Dialog beim Einblenden einer Karte (Karte wird jetzt direkt ein-/ausgeblendet).
  • Der manuelle „Laden"-Button und der „Auto-Speichern aktiv"-Hinweis im PZ-Bereich.
  • Die „X PZ"-Anzeige pro Meisterschaft in der Liste und im Kopf.

Das Hinzufügen, Bearbeiten, Zeichnen, Importieren und Exportieren von PZ funktioniert unverändert. Das Live-Teilen von PZ mit der Crew (Team-Funktion über Realtime) bleibt bestehen.

Eckpunkte verschieben + pro Punkt eine Koordinate setzen (PZ UND Wettkampfgebiet)

Neu beim Bearbeiten/Zeichnen von Sperrgebieten und Wettkampfgebiet:

  • Eckpunkte auf der Karte verschieben — jeder gesetzte Punkt ist ein ziehbarer Marker. Punkt anfassen und an die neue Stelle ziehen (nicht mehr nur „letzten Punkt rückgängig").
  • Pro-Punkt-Koordinaten-Liste im jeweiligen Panel: für jeden Eckpunkt zwei Eingabefelder (East/North) in der eingestellten Präzision (4/4, 5/5 oder 6/6 — je nach Koordinaten-Format in den Settings). Wert ändern und mit ✓ (oder Enter/Verlassen des Feldes) übernehmen → der Punkt springt exakt auf die eingegebene Koordinate. ✕ löscht den Punkt. (Diese Liste gibt es jetzt auch im Wettkampfgebiet-Panel, nicht nur bei PZ.)
  • Das gerade bearbeitete PZ wird während des Bearbeitens ausgeblendet, damit nur die ziehbare Vorschau sichtbar ist.

Fix: Doppelklick setzte beim Zeichnen viele zusätzliche Punkte

Behebt: Beim Zeichnen von PZ/Wettkampfgebiet erzeugte ein Doppelklick (z.B. um einen Punkt zu löschen) stattdessen mehrere neue Punkte — Leaflet feuert bei einem Doppelklick zwei Einzelklick-Events, die beide einen Punkt setzten.

Fix: Zeichen-Klicks werden jetzt kurz entprellt (~0,28 s). Kommt in der Zeit ein zweiter Klick, wird er als Doppelklick gewertet und kein Punkt gesetzt. Ein Doppelklick nahe einem bestehenden Eckpunkt (≤ 50 m) löscht diesen Punkt — zuverlässig über die Karten-Ebene (vorher über den Marker, was im Custom-CRS-Setup nicht zuverlässig ankam). Nebeneffekt: Neue Punkte erscheinen einen kurzen Moment nach dem Klick (nötig zur Unterscheidung Einfach-/Doppelklick).

— Außerdem in 1.5.0 enthalten (zuvor als 1.4.9 ausgeliefert) —

WindNav: Live-IST-Vario + Fortschritts-Anzeige + Step-Erreicht-Feedback + Sofort-Recalc bei Wind-Änderung

Vier Verbesserungen am WindNav-Tool nach Erstflug-Test (Pilotin meldete: "JETZT TUN ändert sich nicht während ich sinke"):

  1. Δ-Höhe + ETA im JETZT-TUN-Block, jede Sekunde aktualisiert — vorher zeigte WindNav bei einer Anweisung wie "▼ SINKEN 1300 ft" konstant denselben Wert während des ganzen Sinkflugs (was technisch korrekt war — 1300 bleibt das Ziel — aber sich nach "eingefroren" anfühlte). Jetzt steht unter dem Aktions-Block live: "noch 600 ft · ETA ~3 min" mit Δft = |target - currentAlt| und ETA aus aktuellem Vario. Bei <25 ft Restdistanz wird stattdessen "✓ Soll-Höhe erreicht" angezeigt. Bei HALTEN-Steps zeigt's analog "noch 350 m · ETA ~2 min" mit Distanz live aus gpsData → goalPosition und Drift-ETA aus liveSpeed; bei <30 m Restdistanz "✓ AM ZIEL". So sieht der Pilot kontinuierlich wie weit er noch zu fahren bzw. zu driften hat.

Zusätzlich: Neue Live-Distanz-Box "JETZT ENTFERNT" oberhalb der bisherigen "PROGNOSE"-Box. Die obere zeigt die aktuelle Distanz zum Zielkreuz (jede Sekunde aus GPS aktualisiert), die untere die Prognose wo der gerade gerechnete Plan enden würde. Vorher gab es nur die Prognose, die alle 3 s aus dem Worker-Snapshot kam und im HALTEN-Modus statisch wirkte.

Sink/Steig-Vorwarnung mit Sekunden-Countdown. Bei einem HALTEN-Step, dem ein Höhenwechsel folgt (z.B. "halte 4 min, dann sinke auf 850 ft"), zeigt das Panel jetzt direkt unter "→ HALTEN" einen Countdown der lokal jede Sekunde runterläuft: "noch 457 m · dann in 3:47". Sobald der Countdown unter 30 s fällt, erscheint zusätzlich ein gelb pulsierender Vorwarnungs-Banner: "GLEICH ▼ SINKEN AUF 850 ft — in 23 s". Der Countdown läuft zwischen den 3 s-Worker-Ticks lokal weiter (Differenz zum letzten Worker-Snapshot-Zeitstempel) und resynchronisiert sich bei jedem neuen Plan. Vorher gab's nur ein statisches "noch ~4 min driften" das auf Minuten gerundet sichtbar hängen blieb, ohne Hinweis wann genau der Sink-Befehl kommt.

  1. IST-Vario aktualisiert sich jetzt jede Sekunde — vorher war der IST-Wert in der Soll/Ist-Box an den 5s-Worker-Tick gekoppelt; das hat sich angefühlt als ob die Anzeige einfriert. Jetzt kommt der IST-Wert direkt aus dem Baro-Store (≈1 Hz beim BLS) und die Korrektur-Message ("Mehr Brenner", "Höhe halten", "Sinkst statt zu steigen — Brenner!") wird live aus Soll+Ist abgeleitet, nicht aus dem alten Worker-Snapshot. So gibt's keine Anzeige-Lücke mehr zwischen Worker-Ticks.

  2. Step-Erreicht-Flash — wenn die aktuelle Höhe das Soll des laufenden Plan-Steps erreicht (±50 ft) UND das Vario passt (HALTEN: |vario|<0.4, STEIGEN: vario nicht stark negativ, SINKEN: vario nicht stark positiv), erscheint für 3 Sekunden ein grüner "✓ X ft ERREICHT — Nächster Schritt wird gerechnet…"-Hinweis im Panel. Der nächste 3-Sekunden-Tick rechnet dann automatisch den neuen JETZT-TUN-Step.

  3. Sofort-Recalc wenn sich die Wind-Schichten ändern (plus Stabilisierung) — vorher musste man bis zum nächsten 5 s-Tick warten, bis WindNav einen neu hinzugefügten Bodenwind oder eine importierte Sonde berücksichtigt. Jetzt erkennt das Panel jede Änderung am gefilterten Wind-Profil (Hash über Höhe/Richtung/Speed pro Schicht) und triggert sofort einen Worker-Recalc. Workflow: Crew misst Bodenwind → schickt's an Pilot → Pilot klickt "Übernehmen" → WindNav passt seine Strategie binnen <1 s an die neue Bodenschicht an.

    Wichtig: Direkt nach einer Wind-Änderung werden die nächsten 3 Live-Ticks (≈ 9 s) im vollen Such-Modus gefahren statt im Verfeinerungs-Modus. Hintergrund: der Verfeinerungs-Modus (800 Simulationen) findet bei größeren Wind-Änderungen den neuen optimalen Pfad oft nicht und würde den frisch berechneten Plan mit einer suboptimalen Verfeinerung des alten Plans überschreiben. Mit dem 9 s-Boost bleibt der neue Plan stabil. Der Drift-Anker wird beim Wind-Update ebenfalls zurückgesetzt, damit der HALTEN-Countdown nicht von der alten Schätzung übernommen wird.

Live-Sampler löscht keine manuellen Bodenwind-Schichten mehr

Behebt (Hauptursache hinter "WindNav springt nach Bodenwind-Übernahme zurück"): Beim Live-Sampling neuer Wind-Schichten im Flug entfernt der Sampler bisher alle Schichten im Toleranzbereich (halbes Setting-Intervall) um die aktuelle Pilot-Höhe — egal welche Quelle. Wenn der Pilot also einen Bodenwind von der Crew bei z.B. 714 m AGL übernommen hatte und dann durch eine Höhe nahe 714 m flog, killte der Live-Sampler die manuelle Schicht und ersetzte sie durch die aktuelle Live-Messung. WindNav rechnete daraufhin den nächsten Tick wieder ohne Bodenwind → "Plan springt zurück zur ursprünglichen Berechnung".

Fix: WindSource.Manual-Schichten werden vom Live-Sampler nie mehr automatisch gelöscht (gleicher Schutz wie bei der EXAKT-Match-Live-Schicht). Bodenwinde sind manuell bestätigte Crew-Messungen — sie haben Vorrang vor jeder Live-Messung in ihrer Höhe. Wenn man sie loswerden will, muss man sie explizit aus dem FlightWindsPanel löschen oder die Crew schickt einen neuen Bodenwind in der gleichen Höhe (Manual ersetzt Manual via exakter Höhen-Match).

Außerdem: Live-Loop-Frequenz von 5 s → 3 s erhöht (zackigerer Step-Wechsel), dafür aber im liveMode (≈400 ms Worker-Budget statt 1.5 s). Alle 15 s wird zusätzlich ein vollständiger Search-Tick gefahren um neue Strategien zu finden, die der lokalen Verfeinerung entgehen. CPU-Last bleibt gleich oder leicht niedriger.

Lite-App (Crew): Auto-Reconnect bei Funkloch — kein manuelles Neuladen mehr

Behebt: Wenn die Crew unterwegs (im Graben, Tunnel, dünnem 4G) das Internet kurz verlor, blieb die Lite-App in dem Zustand "verbunden, aber sendet nichts mehr". Der Pilot sah die Crew nicht mehr auf der Karte, und die Crew musste die Seite über den Refresh-Button neu laden, damit die Realtime-Verbindung wieder steht.

Fix (dreistufig):

  1. Browser-Online-Event triggert Force-Reconnect — sobald window.online feuert (Browser meldet "Netz ist wieder da"), werden alle Supabase-Realtime-Channels (positions / members / presence / tasks / messages / wind) sofort neu aufgebaut. Der bisherige Exponential-Backoff wird übersprungen — kein Warten bis zum nächsten geplanten Reconnect-Versuch. Mobile-Browser (besonders iOS Safari + Chrome Android) killen WebSockets aggressiv im Standby oder bei Netzwechsel; das wird damit zuverlässig abgefangen.

  2. visibilitychange triggert Reconnect wenn Tab > 60s im Standby war — Crew zieht das Handy aus der Tasche, App öffnet sich aus dem Schlaf, und falls die Verbindung zwischenzeitlich tot ist, wird sie sofort neu aufgebaut statt erst beim Watchdog-Timeout (90s).

  3. Position-Re-Publish + Tasks-Reload nach Reconnect — direkt nach erfolgreichem Reconnect wird die letzte bekannte Crew-Position erneut in die positions-Tabelle gepusht (Cache via setLastKnownSelfPos), damit der Pilot den Crew-Marker sofort wieder auf der Karte sieht — ohne auf das nächste GPS-Sample zu warten (kann je nach OS 10-30s dauern). Außerdem werden die Tasks des aktuell ausgewählten Piloten neu geladen, falls er offline Änderungen vorgenommen hat.

Lite-App: Connectivity-Banner unter dem Header

Neu: Sobald navigator.onLine === false oder der Realtime-Channel auf error springt, erscheint unter dem Header ein roter (offline) bzw. oranger (verbunden, aber Channel hängt) Banner mit blinkendem Punkt:

  • Offline (rot): "Keine Internet-Verbindung — der Pilot sieht dich aktuell nicht. Verbindung kommt automatisch zurück."
  • Channel-Error (orange): "Live-Verbindung unterbrochen — versuche reconnect..."

So weiß die Crew sofort woran sie ist und muss nicht raten warum der Pilot evtl. nicht reagiert. Der Banner verschwindet automatisch sobald die Verbindung wieder steht — ohne Klick.

Lite-App: Task-Auto-Refresh war schon da, jetzt verlässlich auch nach Reconnect

Bestätigt: Der tracker-tasks-${teamId}-Realtime-Channel lauscht bereits auf user_profiles-UPDATEs und ruft loadPilotTasks neu auf, wenn der ausgewählte Pilot seine Tasks ändert. Crew musste bisher den Piloten erneut antippen, wenn der Realtime-Channel zwischenzeitlich offline war. Mit dem neuen Force-Reconnect ist der Channel ab dem Moment des Comebacks wieder live, und der Pilot-Task-Reload wird direkt im Reconnect-Pfad nochmal explizit angestoßen.