drone status menue with status and critical event log implemented

This commit is contained in:
Constantin Leue
2026-08-04 23:15:56 +02:00
parent 75736793f2
commit 8e4df2d0d3
15 changed files with 571 additions and 24 deletions
@@ -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);