drone status pill in footer for fly mode implemented. footer layout and sizes homogenized

This commit is contained in:
Constantin Leue
2026-08-04 15:47:53 +02:00
parent f2f2953642
commit 1a17fe5b36
12 changed files with 585 additions and 28 deletions
+180
View File
@@ -0,0 +1,180 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:dmc_app/domain/telemetry/drone_status.dart';
void main() {
group('computeDroneStatus - connectionQuality', () {
test('gruen bei LQ >=70% und SNR >=0dB', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 70,
snrDb: 0,
navMode: 0,
);
expect(status.connectionQuality, SignalLevel.green);
});
test('gelb bei LQ >=70% aber SNR <0dB (Rauschen trotz guter LQ)', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 90,
snrDb: -1,
navMode: 0,
);
expect(status.connectionQuality, SignalLevel.yellow);
});
test('gelb bei LQ zwischen 50% und 70%', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 60,
snrDb: 5,
navMode: 0,
);
expect(status.connectionQuality, SignalLevel.yellow);
});
test('rot bei LQ <50%', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 20,
snrDb: 10,
navMode: 0,
);
expect(status.connectionQuality, SignalLevel.red);
});
});
group('computeDroneStatus - positionQuality', () {
test('gruen bei >=8 Satelliten und HDOP <2.0', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 9,
hdop: 1.5,
linkQuality: 80,
snrDb: 5,
navMode: 0,
);
expect(status.positionQuality, SignalLevel.green);
});
test('gelb bei >=6 Satelliten und HDOP <5.0, aber nicht gruen-Schwelle', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 6,
hdop: 3.0,
linkQuality: 80,
snrDb: 5,
navMode: 0,
);
expect(status.positionQuality, SignalLevel.yellow);
});
test('rot ohne GPS-Fix, unabhaengig von Satelliten/HDOP', () {
final status = computeDroneStatus(
armed: false,
hasFix: false,
numSat: 12,
hdop: 0.5,
linkQuality: 80,
snrDb: 5,
navMode: 0,
);
expect(status.positionQuality, SignalLevel.red);
});
test('rot bei wenigen Satelliten trotz Fix', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 3,
hdop: 8.0,
linkQuality: 80,
snrDb: 5,
navMode: 0,
);
expect(status.positionQuality, SignalLevel.red);
});
});
group('computeDroneStatus - state', () {
test('error hat Vorrang, sobald navMode Emergency (15) ist', () {
final status = computeDroneStatus(
armed: true,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 80,
snrDb: 5,
navMode: 15,
);
expect(status.state, DroneState.error);
});
test('waypoint, wenn armed und navMode Waypoint mission (3)', () {
final status = computeDroneStatus(
armed: true,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 80,
snrDb: 5,
navMode: 3,
);
expect(status.state, DroneState.waypoint);
});
test('armed, wenn armed aber kein Waypoint-Modus (z.B. Hold)', () {
final status = computeDroneStatus(
armed: true,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 80,
snrDb: 5,
navMode: 1,
);
expect(status.state, DroneState.armed);
});
test('ready, wenn nicht armed aber GPS-Fix vorhanden', () {
final status = computeDroneStatus(
armed: false,
hasFix: true,
numSat: 10,
hdop: 1.0,
linkQuality: 80,
snrDb: 5,
navMode: 0,
);
expect(status.state, DroneState.ready);
});
test('idle, wenn nicht armed und kein GPS-Fix', () {
final status = computeDroneStatus(
armed: false,
hasFix: false,
numSat: 0,
hdop: 99.99,
linkQuality: 80,
snrDb: 5,
navMode: 0,
);
expect(status.state, DroneState.idle);
});
});
}