import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../domain/telemetry/drone_event.dart'; import '../../transport/flight_controller_link.dart'; import 'telemetry_provider.dart'; /// Fuehrt das Ereignis-Log fuer den neuen Warnings-Tab (Doku: /// "log von kritischen ereignissen mit time stamp") - beobachtet /// [telemetryProvider] dauerhaft (bewusst KEIN autoDispose, siehe /// telemetry_provider.dart-Doku zur analogen Begruendung bei /// flightControllerLinkProvider), damit ein Ereignis auch dann protokolliert /// wird, wenn die Warnings-Ansicht selbst gerade nicht geoeffnet ist. /// Beginnt zu beobachten, sobald irgendein Widget diesen Provider erstmals /// liest (siehe FlyScreen) - vor diesem Zeitpunkt liegende Ereignisse /// erscheinen nicht im Log, das ist fuer ein Live-Log erwartbar. class DroneEventLogNotifier extends Notifier> { TelemetryFrame? _previousFrame; bool _hadData = false; @override List build() { ref.listen>(telemetryProvider, (previous, next) { next.when( data: (frame) { final events = detectDroneEvents( previous: _previousFrame, current: frame, now: DateTime.now(), ); _previousFrame = frame; _hadData = true; if (events.isNotEmpty) { state = [...events.reversed, ...state]; } }, error: (error, stackTrace) { // Nur melden, wenn zuvor bereits Frames flossen - sonst wuerde // schon das (normale) Ausbleiben der allerersten Verbindung als // "Connection lost" auftauchen. if (_hadData) { state = [ DroneEvent( timestamp: DateTime.now(), message: 'Connection lost', severity: DroneEventSeverity.critical, ), ...state, ]; } _previousFrame = null; _hadData = false; }, loading: () {}, ); }); return []; } void clear() => state = []; } final droneEventLogProvider = NotifierProvider>( DroneEventLogNotifier.new);