From 5fa55ac67d38142c41202223cb3becf146d1bc5a Mon Sep 17 00:00:00 2001 From: Constantin Leue <77660791+Consti3D@users.noreply.github.com> Date: Wed, 5 Aug 2026 21:23:43 +0200 Subject: [PATCH] drone status menue: fixed empty display bug without active telemetry stream --- .../telemetry/telemetry_field_status.dart | 20 +++ .../widgets/drone_status_warnings_panel.dart | 115 +++++++++--------- 2 files changed, 78 insertions(+), 57 deletions(-) diff --git a/app/lib/domain/telemetry/telemetry_field_status.dart b/app/lib/domain/telemetry/telemetry_field_status.dart index 468baa1..97ae4b8 100644 --- a/app/lib/domain/telemetry/telemetry_field_status.dart +++ b/app/lib/domain/telemetry/telemetry_field_status.dart @@ -43,6 +43,15 @@ SignalLevel _levelLowerIsBetter(double value, double greenMax, double redMax) { /// Reine Ableitung aus normalisierten Telemetriewerten + den /// Ampel-Schwellwerten des aktiven Drohnenprofils - kein MSP-/ /// Protokollwissen, siehe computeDroneStatus-Doku. +/// +/// [hasData] ist false, solange noch gar kein Telemetrie-Frame vorliegt +/// (Doku: "Felder auch anzeigen koennen, bevor Daten empfangen wurden") - +/// erzwingt dann fuer ALLE Felder rot, unabhaengig von den uebergebenen +/// Platzhalterwerten. Ohne das wuerde z.B. "Current draw" (ein Feld, bei dem +/// ein NIEDRIGER Wert gut ist) mit dem neutralen Platzhalter 0 faelschlich +/// gruen erscheinen ("sehr niedriger Verbrauch" statt "keine Daten") - anders +/// als bei den "hoeher ist besser"-Feldern, wo ein 0/negativer Platzhalter +/// zufaellig schon unter der Rot-Schwelle liegt. TelemetryFieldStatus computeTelemetryFieldStatus({ required int numSat, required bool hasFix, @@ -52,7 +61,18 @@ TelemetryFieldStatus computeTelemetryFieldStatus({ required int linkQuality, required int snrDb, required DroneProfile profile, + bool hasData = true, }) { + if (!hasData) { + return const TelemetryFieldStatus( + numSat: SignalLevel.red, + hdop: SignalLevel.red, + currentA: SignalLevel.red, + batteryVoltage: SignalLevel.red, + rxQuality: SignalLevel.red, + rxSnr: SignalLevel.red, + ); + } return TelemetryFieldStatus( numSat: _levelHigherIsBetter( numSat.toDouble(), diff --git a/app/lib/ui/widgets/drone_status_warnings_panel.dart b/app/lib/ui/widgets/drone_status_warnings_panel.dart index 4494ad3..c28609e 100644 --- a/app/lib/ui/widgets/drone_status_warnings_panel.dart +++ b/app/lib/ui/widgets/drone_status_warnings_panel.dart @@ -110,65 +110,66 @@ class _DroneStatusWarningsPanelState extends ConsumerState const Center( - child: CircularProgressIndicator(color: Color(0xFF4D9DFF)), - ), - error: (err, st) => const Center( - child: Text('No telemetry', style: TextStyle(color: Colors.white60, fontSize: 15)), - ), + final fieldStatus = computeTelemetryFieldStatus( + numSat: frame?.numSat ?? 0, + hasFix: frame?.hasFix ?? false, + hdop: frame?.hdop ?? 99.0, + currentA: frame?.currentA ?? 0, + batteryVoltage: frame?.batteryVoltage ?? 0, + linkQuality: frame?.linkQuality ?? 0, + snrDb: frame?.snrDb ?? -99, + profile: droneProfile, + hasData: frame != null, + ); + return ListView( + padding: const EdgeInsets.all(16), + children: _statusGrid([ + // Farbcodierte Felder zuerst (Doku: "drone status felder im menue + // auch farblich kodieren", Schwellwerte je Drohnenprofil - siehe + // computeTelemetryFieldStatus), informelle Felder ohne Ampel- + // Bewertung (Koordinaten/Heading/Alt/Speed) danach. Je 2 Felder pro + // Zeile (Doku: "platz effizienter nutzen"). + _statusRow('GPS satellites', frame != null ? '${frame.numSat}' : '—', level: fieldStatus.numSat), + _statusRow( + 'GPS precision (HDOP)', + frame != null && frame.hasFix ? frame.hdop.toStringAsFixed(2) : '—', + level: fieldStatus.hdop, + ), + _statusRow( + 'Current draw', + frame != null ? '${frame.currentA.toStringAsFixed(1)} A' : '—', + level: fieldStatus.currentA, + ), + _statusRow( + 'Battery voltage', + frame != null ? '${frame.batteryVoltage.toStringAsFixed(2)} V' : '—', + level: fieldStatus.batteryVoltage, + ), + _statusRow('RX quality', frame != null ? '${frame.linkQuality}%' : '—', level: fieldStatus.rxQuality), + _statusRow('RX SNR', frame != null ? '${frame.snrDb} dB' : '—', level: fieldStatus.rxSnr), + _statusRow( + 'GPS coordinates', + frame != null && frame.hasFix + ? '${frame.lat.toStringAsFixed(6)}, ${frame.lon.toStringAsFixed(6)}' + : '—', + ), + _statusRow('Heading', frame != null ? '${frame.headingDeg.round()}°' : '—'), + _statusRow('Altitude', frame != null ? '${frame.altitudeM.toStringAsFixed(0)} m' : '—'), + _statusRow('Speed', frame != null ? '${frame.speedMs.toStringAsFixed(1)} m/s' : '—'), + ]), ); }