add telemetry messages: rx link quality, battery percentage, flight mode, relative altitude

This commit is contained in:
Constantin Leue
2026-08-02 21:09:33 +02:00
parent 11f894919b
commit 35c4129eb7
9 changed files with 186 additions and 11 deletions
@@ -14,13 +14,11 @@ import 'msp_telemetry_codec.dart';
///
/// - Position/Lage/Hoehe (5-10 Hz): jeden Zyklus (`MSP_RAW_GPS` +
/// `MSP_ALTITUDE`).
/// - Status/Flugmodus (2 Hz): jeden [_statusEveryNCycles]-ten Zyklus
/// (`MSP2_INAV_STATUS` + `MSP_NAV_STATUS`).
///
/// Spannung/Strom (1 Hz laut Doku) fehlt hier bewusst noch - [TelemetryFrame]
/// hat aktuell keine Felder dafuer; sobald die UI das braucht, ist ein
/// dritter, noch selteners abgefragter Zweig (`MSP2_INAV_ANALOG`) trivial
/// ergaenzt.
/// - Status/Flugmodus/Akku/Link (2 Hz): jeden [_statusEveryNCycles]-ten
/// Zyklus (`MSP2_INAV_STATUS`, `MSP_NAV_STATUS`, `MSP2_INAV_ANALOG`,
/// `MSP2_INAV_GET_LINK_STATS`) - Flugmodus wird aus derselben
/// `MSP_NAV_STATUS`-Antwort gelesen wie der aktive Wegpunkt, keine
/// zusaetzliche Anfrage noetig.
///
/// Der Strom wird NICHT auf einen gueltigen GPS-Fix gegated - jeder Zyklus
/// emittiert ein [TelemetryFrame], auch ohne Fix (dann mit `hasFix: false`
@@ -40,6 +38,9 @@ class MspTelemetryPoller {
int _cycle = 0;
bool _armed = false;
int? _activeWaypointIndex;
int _batteryPercent = 0;
int _linkQuality = 0;
String _flightMode = 'Idle';
Stream<TelemetryFrame> get frames => _framesController.stream;
@@ -78,8 +79,14 @@ class MspTelemetryPoller {
_armed = parseMspInavStatusArmed(
await _client.request(MspCommands.inavStatus),
);
_activeWaypointIndex = parseMspNavStatusActiveWaypoint(
await _client.request(MspCommands.navStatus),
final navStatusPayload = await _client.request(MspCommands.navStatus);
_activeWaypointIndex = parseMspNavStatusActiveWaypoint(navStatusPayload);
_flightMode = parseMspNavMode(navStatusPayload).formatted;
_batteryPercent = parseMspInavAnalogBatteryPercent(
await _client.request(MspCommands.inavAnalog),
);
_linkQuality = parseMspLinkQuality(
await _client.request(MspCommands.inavLinkStats),
);
}
@@ -93,6 +100,9 @@ class MspTelemetryPoller {
speedMs: gps.speedMs,
headingDeg: gps.headingDeg,
armed: _armed,
batteryPercent: _batteryPercent,
linkQuality: _linkQuality,
flightMode: _flightMode,
activeWaypointIndex: _activeWaypointIndex,
));
}