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
@@ -43,7 +43,16 @@ Timer _startFakeFlightController(
d.setUint32(9, 1 << 2, Endian.little); // ARMED
payload = d.buffer.asUint8List();
case MspCommands.navStatus:
payload = Uint8List.fromList([0, 0, 0, 3, 0, 0, 0]); // WP #3 aktiv
// mode=3 (Nav/Waypoint), state=5 (WP_ENROUTE), WP #3 aktiv.
payload = Uint8List.fromList([3, 5, 0, 3, 0, 0, 0]);
case MspCommands.inavAnalog:
final d = ByteData(24);
d.setUint8(21, 77); // Batterie-Prozent
payload = d.buffer.asUint8List();
case MspCommands.inavLinkStats:
final d = ByteData(3);
d.setUint8(1, 88); // Linkqualitaet %
payload = d.buffer.asUint8List();
default:
payload = Uint8List(0);
}
@@ -65,7 +74,10 @@ void main() {
final link = MspFlightControllerLink(transport: transport);
await link.connect();
final frame = await link.subscribeTelemetry().first;
// Armed/Akku/Link/Flugmodus/aktiver Wegpunkt werden nur jeden dritten
// Zyklus aufgefrischt (siehe MspTelemetryPoller._statusEveryNCycles) -
// erst ab dem dritten emittierten Frame garantiert befuellt.
final frame = await link.subscribeTelemetry().skip(2).first;
expect(frame.lat, closeTo(52.52, 1e-6));
expect(frame.lon, closeTo(13.405, 1e-6));
@@ -74,6 +86,9 @@ void main() {
expect(frame.altitudeM, closeTo(50.0, 1e-6));
expect(frame.speedMs, closeTo(5.0, 1e-6));
expect(frame.headingDeg, closeTo(270.0, 1e-6));
expect(frame.batteryPercent, 77);
expect(frame.linkQuality, 88);
expect(frame.flightMode, 'Waypoint mission (en route to WP)');
await link.disconnect();
responder.cancel();
@@ -94,4 +94,48 @@ void main() {
expect(parseMspNavStatusActiveWaypoint(navStatusPayload(5)), 5);
});
});
group('parseMspNavMode/MspNavMode.formatted', () {
Uint8List navStatusPayload(int mode, int state) {
return Uint8List.fromList([mode, state, 0, 0, 0, 0, 0]);
}
test('mode 0 (None) ohne state', () {
final nav = parseMspNavMode(navStatusPayload(0, 0));
expect(nav.mode, 0);
expect(nav.state, 0);
expect(nav.formatted, 'Idle');
});
test('mode 3 (Nav/Waypoint) + state 5 (WP_ENROUTE)', () {
final nav = parseMspNavMode(navStatusPayload(3, 5));
expect(nav.formatted, 'Waypoint mission (en route to WP)');
});
test('mode 2 (RTH) + state 15 (RTH_CLIMB)', () {
final nav = parseMspNavMode(navStatusPayload(2, 15));
expect(nav.formatted, 'Return to home (climbing)');
});
test('unbekannter mode faellt auf Nummer zurueck', () {
final nav = parseMspNavMode(navStatusPayload(7, 0));
expect(nav.formatted, 'Unknown (7)');
});
});
group('parseMspInavAnalogBatteryPercent', () {
test('liest Batterie-Prozent an Offset 21', () {
final payload = Uint8List(24);
payload[21] = 42;
expect(parseMspInavAnalogBatteryPercent(payload), 42);
});
});
group('parseMspLinkQuality', () {
test('liest Linkqualitaet an Offset 1', () {
final payload = Uint8List(3);
payload[1] = 87;
expect(parseMspLinkQuality(payload), 87);
});
});
}