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. /// /// [hasData] ist false, solange noch gar kein Telemetrie-Frame vorliegt /// (Doku: "Felder auch anzeigen koennen, bevor Daten empfangen wurden") - /// erzwingt dann fuer ALLE Felder rot, unabhaengig von den uebergebenen /// Platzhalterwerten. Ohne das wuerde z.B. "Current draw" (ein Feld, bei dem /// ein NIEDRIGER Wert gut ist) mit dem neutralen Platzhalter 0 faelschlich /// gruen erscheinen ("sehr niedriger Verbrauch" statt "keine Daten") - anders /// als bei den "hoeher ist besser"-Feldern, wo ein 0/negativer Platzhalter /// zufaellig schon unter der Rot-Schwelle liegt. 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, bool hasData = true, }) { if (!hasData) { return const TelemetryFieldStatus( numSat: SignalLevel.red, hdop: SignalLevel.red, currentA: SignalLevel.red, batteryVoltage: SignalLevel.red, rxQuality: SignalLevel.red, rxSnr: SignalLevel.red, ); } 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, ), ); }