import '../app_mode/app_mode_cubit.dart'; import '../domain/waypoint/flat_waypoint_list.dart'; import '../transport/flight_controller_link.dart'; /// Geworfen von [MissionSyncService.syncAndUpload], wenn /// [FlightControllerLink.verifyMission] nach einem Upload false liefert. class MissionVerificationException implements Exception { const MissionVerificationException(this.message); final String message; @override String toString() => 'MissionVerificationException: $message'; } /// Orchestriert Connect -> Verify -> Upload -> Ready-to-Fly und erzwingt das /// Ready-to-Fly-Gate (Architektur-Doku 3.3 / 4.5). class MissionSyncService { MissionSyncService(this._link, this._appMode); final FlightControllerLink _link; final AppModeCubit _appMode; /// Wirft [MissionVerificationException], wenn der Flightcontroller die /// Mission nach dem Upload nicht als vollstaendig/gueltig bestaetigt /// (Doku 2.2/4.5) - der Aufrufer zeigt das dem Nutzer an, das /// Ready-to-Fly-Gate bleibt in diesem Fall zurecht geschlossen /// (missionVerified bleibt false). Future syncAndUpload(FlatWaypointList mission) async { await _link.connect(); // uploadMission() der jeweiligen FlightControllerLink-Implementierung // verweigert den Upload selbst, falls die Drohne armed ist (Doku 4.5) - // dieser Service verlaesst sich bewusst nicht zusaetzlich auf einen // eigenen Telemetrie-Vorab-Check, um keine zwei Wahrheitsquellen zu haben. await _link.uploadMission(mission); _appMode.missionUploadConfirmed(); if (!await _link.verifyMission(mission)) { throw const MissionVerificationException( 'Flightcontroller did not confirm the uploaded mission', ); } _appMode.missionVerifiedConfirmed(); } }