From 13e2827344766cb40d29ff1fba1d2a74e11beeef Mon Sep 17 00:00:00 2001 From: Constantin Leue <77660791+Consti3D@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:06:48 +0200 Subject: [PATCH] Drone Status Menue: rohe GPS-Hoehe im Altitude-Feld ergaenzt MSP_RAW_GPS liefert bereits eine eigene Hoehe (gpsSol.llh.alt, Offset 10, u16 Meter) - bislang ungenutzt/uebersprungen. Jetzt als eigenes Feld (MspGpsReading.altitudeM -> TelemetryFrame.gpsAltitudeM) geparst und im selben "Altitude"-Feld wie die bisherige barometrisch/GPS-fusionierte Schaetzung angezeigt ("120 m (GPS 119 m)"), statt einer eigenen Kachel - nur bei vorhandenem Fix angehaengt, analog zur bestehenden hasFix-Handhabung bei GPS coordinates/HDOP. Co-Authored-By: Claude Sonnet 5 --- app/lib/transport/flight_controller_link.dart | 7 +++++++ .../mock/mock_flight_controller_link.dart | 5 +++++ app/lib/transport/msp/msp_telemetry_codec.dart | 7 +++++++ app/lib/transport/msp/msp_telemetry_poller.dart | 1 + .../ui/widgets/drone_status_messages_panel.dart | 14 +++++++++++++- app/test/domain/system_message_test.dart | 1 + .../transport/msp/msp_telemetry_codec_test.dart | 5 +++-- .../system_message_log_provider_test.dart | 1 + 8 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/lib/transport/flight_controller_link.dart b/app/lib/transport/flight_controller_link.dart index e122690..247b945 100644 --- a/app/lib/transport/flight_controller_link.dart +++ b/app/lib/transport/flight_controller_link.dart @@ -31,6 +31,7 @@ class TelemetryFrame { required this.hasFix, required this.numSat, required this.altitudeM, + required this.gpsAltitudeM, required this.speedMs, required this.headingDeg, required this.armed, @@ -60,6 +61,12 @@ class TelemetryFrame { /// MspNavMode-/estAlt-Doku in msp_telemetry_codec.dart) - keine absolute /// Hoehe ueber Meeresspiegel. final double altitudeM; + + /// Rohe GPS-Hoehe (`MspGpsReading.altitudeM` in msp_telemetry_codec.dart, + /// `MSP_RAW_GPS`) statt der barometrisch/GPS-fusionierten Schaetzung + /// oben - nur bei [hasFix] aussagekraeftig, typischerweise etwas + /// verrauschter als [altitudeM]. + final double gpsAltitudeM; final double speedMs; /// Kurs ueber Grund in Grad (0 = Norden, im Uhrzeigersinn) - dreht den diff --git a/app/lib/transport/mock/mock_flight_controller_link.dart b/app/lib/transport/mock/mock_flight_controller_link.dart index 2d1cf6e..a792c8c 100644 --- a/app/lib/transport/mock/mock_flight_controller_link.dart +++ b/app/lib/transport/mock/mock_flight_controller_link.dart @@ -104,6 +104,11 @@ class MockFlightControllerLink implements FlightControllerLink { hasFix: true, numSat: 12, altitudeM: 120, + // Leicht abweichend von altitudeM statt identisch (Doku: rohe + // GPS-Hoehe ist typischerweise etwas verrauschter als die + // barometrisch/GPS-fusionierte Schaetzung), damit im UI sichtbar + // wird, dass es sich um zwei unterschiedliche Werte handelt. + gpsAltitudeM: 120 + math.sin(_tickCount * 0.11) * 4, speedMs: 18, headingDeg: _heading, armed: _armed, diff --git a/app/lib/transport/msp/msp_telemetry_codec.dart b/app/lib/transport/msp/msp_telemetry_codec.dart index 602368d..7139093 100644 --- a/app/lib/transport/msp/msp_telemetry_codec.dart +++ b/app/lib/transport/msp/msp_telemetry_codec.dart @@ -9,6 +9,7 @@ class MspGpsReading { required this.numSat, required this.lat, required this.lon, + required this.altitudeM, required this.speedMs, required this.headingDeg, required this.hdop, @@ -19,6 +20,11 @@ class MspGpsReading { final int numSat; final double lat; final double lon; + + /// Rohe GPS-Hoehe (`gpsSol.llh.alt`, bereits in ganzen Metern) - anders + /// als die barometrisch/GPS-fusionierte Schaetzung aus `MSP_ALTITUDE` + /// (siehe [parseMspAltitudeMeters]), typischerweise etwas verrauschter. + final double altitudeM; final double speedMs; /// Kurs ueber Grund in Grad (0 = Norden, im Uhrzeigersinn), aus @@ -43,6 +49,7 @@ MspGpsReading parseMspRawGps(Uint8List payload) { numSat: data.getUint8(1), lat: data.getInt32(2, Endian.little) / 1e7, lon: data.getInt32(6, Endian.little) / 1e7, + altitudeM: data.getUint16(10, Endian.little).toDouble(), speedMs: data.getUint16(12, Endian.little) / 100.0, headingDeg: data.getUint16(14, Endian.little) / 10.0, hdop: data.getUint16(16, Endian.little) / 100.0, diff --git a/app/lib/transport/msp/msp_telemetry_poller.dart b/app/lib/transport/msp/msp_telemetry_poller.dart index 2237950..5078f10 100644 --- a/app/lib/transport/msp/msp_telemetry_poller.dart +++ b/app/lib/transport/msp/msp_telemetry_poller.dart @@ -112,6 +112,7 @@ class MspTelemetryPoller { hasFix: gps.hasFix, numSat: gps.numSat, altitudeM: altitudeM, + gpsAltitudeM: gps.altitudeM, speedMs: gps.speedMs, headingDeg: gps.headingDeg, armed: _armed, diff --git a/app/lib/ui/widgets/drone_status_messages_panel.dart b/app/lib/ui/widgets/drone_status_messages_panel.dart index 006ffe4..13b0141 100644 --- a/app/lib/ui/widgets/drone_status_messages_panel.dart +++ b/app/lib/ui/widgets/drone_status_messages_panel.dart @@ -185,7 +185,7 @@ class _DroneStatusMessagesPanelState extends ConsumerState t == null ? '—' : '${t.round()}°').join(' / '); diff --git a/app/test/domain/system_message_test.dart b/app/test/domain/system_message_test.dart index 49773a6..a1ce588 100644 --- a/app/test/domain/system_message_test.dart +++ b/app/test/domain/system_message_test.dart @@ -15,6 +15,7 @@ TelemetryFrame _frame({ hasFix: hasFix, numSat: numSat, altitudeM: 100, + gpsAltitudeM: 100, speedMs: 15, headingDeg: 0, armed: true, diff --git a/app/test/transport/msp/msp_telemetry_codec_test.dart b/app/test/transport/msp/msp_telemetry_codec_test.dart index d83fa0b..761f0ec 100644 --- a/app/test/transport/msp/msp_telemetry_codec_test.dart +++ b/app/test/transport/msp/msp_telemetry_codec_test.dart @@ -7,9 +7,9 @@ import 'package:dmc_app/transport/msp/msp_telemetry_codec.dart'; void main() { group('parseMspRawGps', () { - test('parst fixType, numSat, lat/lon (1e-7 deg), Speed (cm/s) und HDOP', () { + test('parst fixType, numSat, lat/lon (1e-7 deg), Hoehe, Speed (cm/s) und HDOP', () { // fixType=2, numSat=9, lat=52.5200000 deg, lon=13.4050000 deg, - // alt=100m (ungenutzt), groundSpeed=1234 cm/s, groundCourse=900 (0.1deg, + // alt=100m, groundSpeed=1234 cm/s, groundCourse=900 (0.1deg, // ungenutzt), hdop=120 (/100 = 1.2). final data = ByteData(18); data.setUint8(0, 2); @@ -28,6 +28,7 @@ void main() { expect(reading.numSat, 9); expect(reading.lat, closeTo(52.52, 1e-9)); expect(reading.lon, closeTo(13.405, 1e-9)); + expect(reading.altitudeM, closeTo(100, 1e-9)); expect(reading.speedMs, closeTo(12.34, 1e-9)); expect(reading.headingDeg, closeTo(90.0, 1e-9)); expect(reading.hdop, closeTo(1.2, 1e-9)); diff --git a/app/test/ui/providers/system_message_log_provider_test.dart b/app/test/ui/providers/system_message_log_provider_test.dart index 467d76c..aa72b4b 100644 --- a/app/test/ui/providers/system_message_log_provider_test.dart +++ b/app/test/ui/providers/system_message_log_provider_test.dart @@ -16,6 +16,7 @@ TelemetryFrame _frame({bool hasFix = true, int numSat = 10}) => TelemetryFrame( hasFix: hasFix, numSat: numSat, altitudeM: 100, + gpsAltitudeM: 100, speedMs: 15, headingDeg: 0, armed: false,