Drohnen-Status-Pille zeigt bei Verbindungsverlust rot/disconnected statt eingefrorener Werte

Waehrend eines Verbindungsverlusts frieren die TelemetryFrame-Werte
bewusst ein (telemetryProvider.value bleibt auf dem letzten Stand, siehe
vorherigen Commit) - die Fusszeilen-Pille im Fly-Modus hat daraus bislang
weiterhin den zuletzt bekannten (ggf. laengst veralteten) Zustand
abgeleitet, statt den Verbindungsverlust selbst widerzuspiegeln.

- domain/telemetry/drone_status.dart: neuer DroneState.disconnected,
  computeDroneStatus() bekommt einen neuen Parameter `connected` - hat
  Vorrang vor allem anderen (auch vor Emergency) und uebersteuert
  connectionQuality auf rot. positionQuality bleibt bewusst unveraendert
  (folgt weiterhin den eingefrorenen Werten) - laut Anfrage sollen nur
  Drohnen-Icon und Verbindungsqualitaet, nicht die Positionsqualitaet, rot
  erzwungen werden.
- fly_screen.dart: `connected: !telemetryAsync.hasError` statt der
  bisherigen Ableitung aus einzelnen Telemetriewerten.
- bottom_stats_bar.dart: neues Label/Farbe ("disconnected", rot) fuer den
  neuen Zustand in der Drohnen-Status-Pille.

Auf dem Pixel_10a-Emulator verifiziert: WiFi-Verbindungsart (noch nie
verbunden) zeigt bereits korrekt rotes Papierflieger-Icon, rote
Verbindungsqualitaet, rotes Satelliten-Icon und "disconnected" in rot;
Mock-Verbindung zeigt unveraendert normal gruen "ready".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Constantin Leue
2026-08-06 17:38:55 +02:00
co-authored by Claude Sonnet 5
parent e5c87fba5f
commit 46e51b3920
4 changed files with 111 additions and 12 deletions
+29 -9
View File
@@ -4,8 +4,13 @@ enum SignalLevel { green, yellow, red }
/// Zustand der Drohne fuer das Papierflieger-Icon in der Drohnen-Status-
/// Pille (Doku: "drone state: papierflieger icon mit farbcodierung ... mit
/// text wie (idle, ready, armed, waypoint, error)").
enum DroneState { idle, ready, armed, waypoint, error }
/// text wie (idle, ready, armed, waypoint, error)"). [disconnected] deckt
/// den Fall ab, dass der Telemetrie-Strom selbst gerade fehlerhaft ist
/// (Doku: "Statuspille ... muss eine rote Drohne, eine rote
/// Verbindungsqualität und den Status text in rot disconnected anzeigen"),
/// im Unterschied zu den anderen Zustaenden, die aus (ggf. eingefrorenen,
/// siehe computeDroneStatus) Telemetriewerten abgeleitet werden.
enum DroneState { idle, ready, armed, waypoint, disconnected, error }
/// Kombiniertes Ergebnis aus [computeDroneStatus] - die drei Elemente der
/// Fly-Modus-Drohnen-Pille (Doku: "connection quality", "position quality",
@@ -49,12 +54,15 @@ SignalLevel _positionQuality({
}
/// Zustand aus Armed-Status, GPS-Fix und dem rohen Navigationsmodus
/// (`MW_GPS_MODE_*`, siehe TelemetryFrame.navMode) - Emergency (15) hat
/// Vorrang vor allem anderen, "waypoint" nur solange tatsaechlich armed und
/// im Waypoint-Missionsmodus (3) navigiert wird, "ready" markiert lediglich
/// einen vorhandenen GPS-Fix im disarmed-Zustand (kein zusaetzlicher
/// Qualitaets-Gate durch Positionsqualitaet - Nutzerentscheidung).
/// (`MW_GPS_MODE_*`, siehe TelemetryFrame.navMode) - [connected] hat
/// Vorrang vor allem anderen (kein Telemetrie-Strom heisst, keiner der
/// anderen Werte ist aktuell), danach Emergency (15), "waypoint" nur
/// solange tatsaechlich armed und im Waypoint-Missionsmodus (3) navigiert
/// wird, "ready" markiert lediglich einen vorhandenen GPS-Fix im
/// disarmed-Zustand (kein zusaetzlicher Qualitaets-Gate durch
/// Positionsqualitaet - Nutzerentscheidung).
DroneState _droneState({
required bool connected,
required bool armed,
required bool hasFix,
required int navMode,
@@ -62,6 +70,7 @@ DroneState _droneState({
const navModeEmergency = 15;
const navModeWaypointMission = 3;
if (!connected) return DroneState.disconnected;
if (navMode == navModeEmergency) return DroneState.error;
if (armed && navMode == navModeWaypointMission) return DroneState.waypoint;
if (armed) return DroneState.armed;
@@ -72,7 +81,16 @@ DroneState _droneState({
/// Reine Ableitung aus einem [TelemetryFrame] (siehe transport/
/// flight_controller_link.dart) - kein MSP-/Protokollwissen, nur die
/// bereits normalisierten Felder.
///
/// [connected] spiegelt, ob der Telemetrie-Strom gerade tatsaechlich Daten
/// liefert (z.B. `!telemetryProvider.hasError`, siehe fly_screen.dart) -
/// getrennt von den einzelnen Telemetriewerten, weil diese bei einem
/// Verbindungsverlust bewusst auf ihrem letzten Stand "einfrieren" (Doku:
/// "im Drone Detail Menü ist es okay, dass die Daten einfrieren"), die
/// Statuspille aber trotzdem ehrlich "disconnected" anzeigen soll statt
/// den zuletzt bekannten (ggf. laengst veralteten) Zustand fortzuschreiben.
DroneStatus computeDroneStatus({
required bool connected,
required bool armed,
required bool hasFix,
required int numSat,
@@ -82,8 +100,10 @@ DroneStatus computeDroneStatus({
required int navMode,
}) {
return DroneStatus(
connectionQuality: _connectionQuality(linkQuality: linkQuality, snrDb: snrDb),
connectionQuality: connected
? _connectionQuality(linkQuality: linkQuality, snrDb: snrDb)
: SignalLevel.red,
positionQuality: _positionQuality(hasFix: hasFix, numSat: numSat, hdop: hdop),
state: _droneState(armed: armed, hasFix: hasFix, navMode: navMode),
state: _droneState(connected: connected, armed: armed, hasFix: hasFix, navMode: navMode),
);
}