import '../../transport/flight_controller_link.dart'; /// Schweregrad eines Eintrags im Ereignis-Log (Doku: "log von kritischen /// ereignissen mit time stamp ... connection lost, battery low/critical, /// fail safe mode activated"). enum DroneEventSeverity { warning, critical } /// Ein einzelner Log-Eintrag mit Zeitstempel (Doku: "Warnings Tab ... log /// von kritischen Ereignissen mit time stamp"). class DroneEvent { const DroneEvent({ required this.timestamp, required this.message, required this.severity, }); final DateTime timestamp; final String message; final DroneEventSeverity 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" gehoert NICHT hierher, da es keinen /// [current]-Frame gibt, wenn die Verbindung abreisst - das wird auf /// Provider-Ebene aus dem Stream-Fehler abgeleitet (siehe /// drone_event_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 detectDroneEvents({ required TelemetryFrame? previous, required TelemetryFrame current, required DateTime now, }) { final events = []; if (previous != null && previous.batteryPercent > 20 && current.batteryPercent <= 20) { events.add(DroneEvent( timestamp: now, message: 'Battery critical (${current.batteryPercent}%)', severity: DroneEventSeverity.critical, )); } else if (previous != null && previous.batteryPercent > 30 && current.batteryPercent <= 30) { events.add(DroneEvent( timestamp: now, message: 'Battery low (${current.batteryPercent}%)', severity: DroneEventSeverity.warning, )); } const navModeEmergency = 15; if (previous != null && previous.navMode != navModeEmergency && current.navMode == navModeEmergency) { events.add(DroneEvent( timestamp: now, message: 'Failsafe mode activated', severity: DroneEventSeverity.critical, )); } return events; }