65 lines
2.2 KiB
Dart
65 lines
2.2 KiB
Dart
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<List<DroneEvent>> {
|
|
TelemetryFrame? _previousFrame;
|
|
bool _hadData = false;
|
|
|
|
@override
|
|
List<DroneEvent> build() {
|
|
ref.listen<AsyncValue<TelemetryFrame>>(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, List<DroneEvent>>(
|
|
DroneEventLogNotifier.new);
|