import '../../transport/flight_controller_link.dart'; /// Schweregrad eines Eintrags im System-Messages-Log (Doku: "log von /// kritischen ereignissen mit time stamp ... connection lost, battery /// low/critical, fail safe mode activated", erweitert um allgemeine /// Systemmeldungen wie Verbindungsauf-/-abbau, GPS-Fix, Verbindungsart- /// Wechsel und Missionsuebertragung). [info] ist fuer Meldungen ohne /// Alarmcharakter - reine Statusinformation, kein Warn-/Fehlerzustand. enum SystemMessageSeverity { info, warning, critical } /// Ein einzelner Log-Eintrag mit Zeitstempel (Doku: "System Messages Tab /// ... log von kritischen Ereignissen mit time stamp"). class SystemMessage { const SystemMessage({ required this.timestamp, required this.message, required this.severity, }); final DateTime timestamp; final String message; final SystemMessageSeverity severity; } /// Erkennt Uebergaenge zwischen zwei aufeinanderfolgenden Telemetrie-Frames, /// die einen Log-Eintrag wert sind - flankengetriggert (nur beim /// Ueberschreiten einer Schwelle, nicht bei jedem Frame, solange der /// Zustand anhaelt). "Connection lost"/"Connected" gehoeren NICHT hierher, /// da es dafuer keine zwei [TelemetryFrame]s zum Vergleichen gibt (die /// Verbindung selbst liefert ja gerade keinen/wieder einen Frame) - das wird /// auf Provider-Ebene aus dem AsyncValue-Zustand von telemetryProvider /// abgeleitet (siehe system_message_log_provider.dart). /// /// Batterie-Schwellen identisch zu den Ampelfarben der BatteryIndicatorBar /// (20%/30%) - dieselbe Semantik, nur zusaetzlich protokolliert statt nur /// angezeigt. "kritisch" hat Vorrang: wird beim selben Uebergang sowohl die /// 30%- als auch die 20%-Schwelle unterschritten (z.B. Ladestand sackt in /// einem Zyklus von 35% auf 15%), wird nur der kritische Eintrag erzeugt. List detectSystemMessages({ required TelemetryFrame? previous, required TelemetryFrame current, required DateTime now, }) { final events = []; if (previous != null && previous.batteryPercent > 20 && current.batteryPercent <= 20) { events.add(SystemMessage( timestamp: now, message: 'Battery critical (${current.batteryPercent}%)', severity: SystemMessageSeverity.critical, )); } else if (previous != null && previous.batteryPercent > 30 && current.batteryPercent <= 30) { events.add(SystemMessage( timestamp: now, message: 'Battery low (${current.batteryPercent}%)', severity: SystemMessageSeverity.warning, )); } const navModeEmergency = 15; if (previous != null && previous.navMode != navModeEmergency && current.navMode == navModeEmergency) { events.add(SystemMessage( timestamp: now, message: 'Failsafe mode activated', severity: SystemMessageSeverity.critical, )); } if (previous != null && !previous.hasFix && current.hasFix) { events.add(SystemMessage( timestamp: now, message: 'GPS fix acquired (${current.numSat} satellites)', severity: SystemMessageSeverity.info, )); } return events; }