import 'dart:typed_data'; import 'package:flutter_test/flutter_test.dart'; import 'package:dmc_app/transport/msp/msp_telemetry_codec.dart'; void main() { group('parseMspRawGps', () { test('parst fixType, numSat, lat/lon (1e-7 deg) und Speed (cm/s)', () { // fixType=2, numSat=9, lat=52.5200000 deg, lon=13.4050000 deg, // alt=100m (ungenutzt), groundSpeed=1234 cm/s, groundCourse=900 (0.1deg, // ungenutzt), hdop=120 (ungenutzt). final data = ByteData(18); data.setUint8(0, 2); data.setUint8(1, 9); data.setInt32(2, 525200000, Endian.little); data.setInt32(6, 134050000, Endian.little); data.setUint16(10, 100, Endian.little); data.setUint16(12, 1234, Endian.little); data.setUint16(14, 900, Endian.little); data.setUint16(16, 120, Endian.little); final reading = parseMspRawGps(data.buffer.asUint8List()); expect(reading.fixType, 2); expect(reading.hasFix, isTrue); expect(reading.numSat, 9); expect(reading.lat, closeTo(52.52, 1e-9)); expect(reading.lon, closeTo(13.405, 1e-9)); expect(reading.speedMs, closeTo(12.34, 1e-9)); }); test('fixType 0 bedeutet kein Fix', () { final data = ByteData(18); final reading = parseMspRawGps(data.buffer.asUint8List()); expect(reading.hasFix, isFalse); }); }); group('parseMspAltitudeMeters', () { test('estAlt in cm wird zu Metern (auch negativ moeglich)', () { final data = ByteData(10); data.setInt32(0, 1234, Endian.little); // 12.34 m data.setInt16(4, -50, Endian.little); data.setInt32(6, 1200, Endian.little); expect( parseMspAltitudeMeters(data.buffer.asUint8List()), closeTo(12.34, 1e-9), ); }); test('negative Hoehe (unter Startpunkt)', () { final data = ByteData(10); data.setInt32(0, -250, Endian.little); // -2.5 m expect( parseMspAltitudeMeters(data.buffer.asUint8List()), closeTo(-2.5, 1e-9), ); }); }); group('parseMspInavStatusArmed', () { Uint8List statusPayload(int armingFlags) { final data = ByteData(22); data.setUint32(9, armingFlags, Endian.little); return data.buffer.asUint8List(); } test('ARMED-Bit (1<<2) gesetzt', () { expect(parseMspInavStatusArmed(statusPayload(1 << 2)), isTrue); }); test('nur andere Bits gesetzt, ARMED-Bit fehlt', () { expect(parseMspInavStatusArmed(statusPayload(1 << 3)), isFalse); }); test('keine Flags gesetzt', () { expect(parseMspInavStatusArmed(statusPayload(0)), isFalse); }); }); group('parseMspNavStatusActiveWaypoint', () { Uint8List navStatusPayload(int activeWpNumber) { return Uint8List.fromList([0, 0, 0, activeWpNumber, 0, 0, 0]); } test('activeWpNumber 0 bedeutet keine aktive Mission', () { expect(parseMspNavStatusActiveWaypoint(navStatusPayload(0)), isNull); }); test('activeWpNumber > 0 wird durchgereicht', () { expect(parseMspNavStatusActiveWaypoint(navStatusPayload(5)), 5); }); }); }