drone status menue with status and critical event log implemented
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user