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 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
9cece7dbb6
commit
13e2827344
@@ -31,6 +31,7 @@ class TelemetryFrame {
|
|||||||
required this.hasFix,
|
required this.hasFix,
|
||||||
required this.numSat,
|
required this.numSat,
|
||||||
required this.altitudeM,
|
required this.altitudeM,
|
||||||
|
required this.gpsAltitudeM,
|
||||||
required this.speedMs,
|
required this.speedMs,
|
||||||
required this.headingDeg,
|
required this.headingDeg,
|
||||||
required this.armed,
|
required this.armed,
|
||||||
@@ -60,6 +61,12 @@ class TelemetryFrame {
|
|||||||
/// MspNavMode-/estAlt-Doku in msp_telemetry_codec.dart) - keine absolute
|
/// MspNavMode-/estAlt-Doku in msp_telemetry_codec.dart) - keine absolute
|
||||||
/// Hoehe ueber Meeresspiegel.
|
/// Hoehe ueber Meeresspiegel.
|
||||||
final double altitudeM;
|
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;
|
final double speedMs;
|
||||||
|
|
||||||
/// Kurs ueber Grund in Grad (0 = Norden, im Uhrzeigersinn) - dreht den
|
/// Kurs ueber Grund in Grad (0 = Norden, im Uhrzeigersinn) - dreht den
|
||||||
|
|||||||
@@ -104,6 +104,11 @@ class MockFlightControllerLink implements FlightControllerLink {
|
|||||||
hasFix: true,
|
hasFix: true,
|
||||||
numSat: 12,
|
numSat: 12,
|
||||||
altitudeM: 120,
|
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,
|
speedMs: 18,
|
||||||
headingDeg: _heading,
|
headingDeg: _heading,
|
||||||
armed: _armed,
|
armed: _armed,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ class MspGpsReading {
|
|||||||
required this.numSat,
|
required this.numSat,
|
||||||
required this.lat,
|
required this.lat,
|
||||||
required this.lon,
|
required this.lon,
|
||||||
|
required this.altitudeM,
|
||||||
required this.speedMs,
|
required this.speedMs,
|
||||||
required this.headingDeg,
|
required this.headingDeg,
|
||||||
required this.hdop,
|
required this.hdop,
|
||||||
@@ -19,6 +20,11 @@ class MspGpsReading {
|
|||||||
final int numSat;
|
final int numSat;
|
||||||
final double lat;
|
final double lat;
|
||||||
final double lon;
|
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;
|
final double speedMs;
|
||||||
|
|
||||||
/// Kurs ueber Grund in Grad (0 = Norden, im Uhrzeigersinn), aus
|
/// Kurs ueber Grund in Grad (0 = Norden, im Uhrzeigersinn), aus
|
||||||
@@ -43,6 +49,7 @@ MspGpsReading parseMspRawGps(Uint8List payload) {
|
|||||||
numSat: data.getUint8(1),
|
numSat: data.getUint8(1),
|
||||||
lat: data.getInt32(2, Endian.little) / 1e7,
|
lat: data.getInt32(2, Endian.little) / 1e7,
|
||||||
lon: data.getInt32(6, 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,
|
speedMs: data.getUint16(12, Endian.little) / 100.0,
|
||||||
headingDeg: data.getUint16(14, Endian.little) / 10.0,
|
headingDeg: data.getUint16(14, Endian.little) / 10.0,
|
||||||
hdop: data.getUint16(16, Endian.little) / 100.0,
|
hdop: data.getUint16(16, Endian.little) / 100.0,
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ class MspTelemetryPoller {
|
|||||||
hasFix: gps.hasFix,
|
hasFix: gps.hasFix,
|
||||||
numSat: gps.numSat,
|
numSat: gps.numSat,
|
||||||
altitudeM: altitudeM,
|
altitudeM: altitudeM,
|
||||||
|
gpsAltitudeM: gps.altitudeM,
|
||||||
speedMs: gps.speedMs,
|
speedMs: gps.speedMs,
|
||||||
headingDeg: gps.headingDeg,
|
headingDeg: gps.headingDeg,
|
||||||
armed: _armed,
|
armed: _armed,
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ class _DroneStatusMessagesPanelState extends ConsumerState<DroneStatusMessagesPa
|
|||||||
: '—',
|
: '—',
|
||||||
),
|
),
|
||||||
_statusRow('Heading', frame != null ? '${frame.headingDeg.round()}°' : '—'),
|
_statusRow('Heading', frame != null ? '${frame.headingDeg.round()}°' : '—'),
|
||||||
_statusRow('Altitude', frame != null ? '${frame.altitudeM.toStringAsFixed(0)} m' : '—'),
|
_statusRow('Altitude', _formatAltitude(frame)),
|
||||||
_statusRow('Speed', frame != null ? '${frame.speedMs.toStringAsFixed(1)} m/s' : '—'),
|
_statusRow('Speed', frame != null ? '${frame.speedMs.toStringAsFixed(1)} m/s' : '—'),
|
||||||
// Ans Ende der Liste (Doku: "ans ende der liste noch die
|
// Ans Ende der Liste (Doku: "ans ende der liste noch die
|
||||||
// steig/sinkrate hinzufuegen") - bildet mit "Speed" das letzte
|
// steig/sinkrate hinzufuegen") - bildet mit "Speed" das letzte
|
||||||
@@ -347,6 +347,18 @@ class _DroneStatusMessagesPanelState extends ConsumerState<DroneStatusMessagesPa
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rohe GPS-Hoehe im selben Feld wie die barometrisch/GPS-fusionierte
|
||||||
|
// Schaetzung (Doku: "GPS Höhe auch anzeigen im gleichen Feld wie die
|
||||||
|
// normale Höhe") statt einer eigenen Kachel - nur bei hasFix angehaengt,
|
||||||
|
// da die GPS-Hoehe ohne Fix bedeutungslos/veraltet ist (analog zu GPS
|
||||||
|
// coordinates/HDOP oben).
|
||||||
|
String _formatAltitude(TelemetryFrame? frame) {
|
||||||
|
if (frame == null) return '—';
|
||||||
|
final estimated = '${frame.altitudeM.toStringAsFixed(0)} m';
|
||||||
|
if (!frame.hasFix) return estimated;
|
||||||
|
return '$estimated (GPS ${frame.gpsAltitudeM.toStringAsFixed(0)} m)';
|
||||||
|
}
|
||||||
|
|
||||||
String _formatTemperatures(TelemetryFrame? frame) {
|
String _formatTemperatures(TelemetryFrame? frame) {
|
||||||
if (frame == null) return '—';
|
if (frame == null) return '—';
|
||||||
return frame.temperaturesC.map((t) => t == null ? '—' : '${t.round()}°').join(' / ');
|
return frame.temperaturesC.map((t) => t == null ? '—' : '${t.round()}°').join(' / ');
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ TelemetryFrame _frame({
|
|||||||
hasFix: hasFix,
|
hasFix: hasFix,
|
||||||
numSat: numSat,
|
numSat: numSat,
|
||||||
altitudeM: 100,
|
altitudeM: 100,
|
||||||
|
gpsAltitudeM: 100,
|
||||||
speedMs: 15,
|
speedMs: 15,
|
||||||
headingDeg: 0,
|
headingDeg: 0,
|
||||||
armed: true,
|
armed: true,
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import 'package:dmc_app/transport/msp/msp_telemetry_codec.dart';
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
group('parseMspRawGps', () {
|
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,
|
// 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).
|
// ungenutzt), hdop=120 (/100 = 1.2).
|
||||||
final data = ByteData(18);
|
final data = ByteData(18);
|
||||||
data.setUint8(0, 2);
|
data.setUint8(0, 2);
|
||||||
@@ -28,6 +28,7 @@ void main() {
|
|||||||
expect(reading.numSat, 9);
|
expect(reading.numSat, 9);
|
||||||
expect(reading.lat, closeTo(52.52, 1e-9));
|
expect(reading.lat, closeTo(52.52, 1e-9));
|
||||||
expect(reading.lon, closeTo(13.405, 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.speedMs, closeTo(12.34, 1e-9));
|
||||||
expect(reading.headingDeg, closeTo(90.0, 1e-9));
|
expect(reading.headingDeg, closeTo(90.0, 1e-9));
|
||||||
expect(reading.hdop, closeTo(1.2, 1e-9));
|
expect(reading.hdop, closeTo(1.2, 1e-9));
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ TelemetryFrame _frame({bool hasFix = true, int numSat = 10}) => TelemetryFrame(
|
|||||||
hasFix: hasFix,
|
hasFix: hasFix,
|
||||||
numSat: numSat,
|
numSat: numSat,
|
||||||
altitudeM: 100,
|
altitudeM: 100,
|
||||||
|
gpsAltitudeM: 100,
|
||||||
speedMs: 15,
|
speedMs: 15,
|
||||||
headingDeg: 0,
|
headingDeg: 0,
|
||||||
armed: false,
|
armed: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user