Files
dmc/app/lib/domain/telemetry/telemetry_field_status.dart
T

90 lines
3.0 KiB
Dart

import '../mission/drone_profile.dart';
import 'drone_status.dart';
/// Ampel-Farbcodierung je einzelnem Telemetriefeld im Drohnen-Status-Menue
/// (Doku: "drone status felder im menue auch farblich kodieren") - anders
/// als [computeDroneStatus] (das Verbindungs-/Positionsqualitaet je zu einem
/// kombinierten Signal fuer die Fusszeilen-Pille zusammenfasst) bewertet
/// dies jedes Feld einzeln anhand der Schwellwerte im aktiven [DroneProfile].
class TelemetryFieldStatus {
const TelemetryFieldStatus({
required this.numSat,
required this.hdop,
required this.currentA,
required this.batteryVoltage,
required this.rxQuality,
required this.rxSnr,
});
final SignalLevel numSat;
final SignalLevel hdop;
final SignalLevel currentA;
final SignalLevel batteryVoltage;
final SignalLevel rxQuality;
final SignalLevel rxSnr;
}
/// Fuer Felder, bei denen ein HOHER Wert gut ist (Satelliten, RX-Qualitaet/
/// -SNR): rot unterhalb [redMin], gruen ab [greenMin], dazwischen gelb.
SignalLevel _levelHigherIsBetter(double value, double greenMin, double redMin) {
if (value < redMin) return SignalLevel.red;
if (value < greenMin) return SignalLevel.yellow;
return SignalLevel.green;
}
/// Fuer Felder, bei denen ein NIEDRIGER Wert gut ist (HDOP): rot oberhalb
/// [redMax], gruen bis [greenMax], dazwischen gelb.
SignalLevel _levelLowerIsBetter(double value, double greenMax, double redMax) {
if (value > redMax) return SignalLevel.red;
if (value > greenMax) return SignalLevel.yellow;
return SignalLevel.green;
}
/// Reine Ableitung aus normalisierten Telemetriewerten + den
/// Ampel-Schwellwerten des aktiven Drohnenprofils - kein MSP-/
/// Protokollwissen, siehe computeDroneStatus-Doku.
TelemetryFieldStatus computeTelemetryFieldStatus({
required int numSat,
required bool hasFix,
required double hdop,
required double currentA,
required double batteryVoltage,
required int linkQuality,
required int snrDb,
required DroneProfile profile,
}) {
return TelemetryFieldStatus(
numSat: _levelHigherIsBetter(
numSat.toDouble(),
profile.gpsSatGreenMin,
profile.gpsSatRedMin,
),
// Ohne Fix ist der HDOP-Wert bedeutungslos/veraltet (siehe Anzeige in
// drone_status_warnings_panel.dart, die dafuer bereits '—' zeigt) - dann
// unabhaengig vom Zahlenwert rot statt eines irrefuehrend guten Signals.
hdop: hasFix
? _levelLowerIsBetter(hdop, profile.hdopGreenMax, profile.hdopRedMax)
: SignalLevel.red,
currentA: _levelLowerIsBetter(
currentA,
profile.currentGreenMaxA,
profile.currentRedMaxA,
),
batteryVoltage: _levelHigherIsBetter(
batteryVoltage,
profile.batteryVoltageGreenMinV,
profile.batteryVoltageRedMinV,
),
rxQuality: _levelHigherIsBetter(
linkQuality.toDouble(),
profile.rxQualityGreenMin,
profile.rxQualityRedMin,
),
rxSnr: _levelHigherIsBetter(
snrDb.toDouble(),
profile.rxSnrGreenMinDb,
profile.rxSnrRedMinDb,
),
);
}