import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../transport/connection_type.dart'; import '../../transport/flight_controller_link.dart'; import '../../transport/mock/mock_flight_controller_link.dart'; import '../../transport/msp/msp_flight_controller_link.dart'; import 'connection_settings_provider.dart'; import 'wifi_connection_provider.dart'; /// FlightControllerLink fuer den Fly-Modus (Doku 3.1): bei WLAN als /// gewaehlter Verbindungsart ein echter MSP-Link ueber den UDP-Transport, /// sonst (Bluetooth/5G/USB, oder solange die Einstellungen noch nicht /// geladen sind) weiterhin der Mock fuer UI-Entwicklung ohne Hardware - /// Bluetooth ist auf der eingesetzten mLRS-Bruecke ohnehin nicht moeglich /// (Doku Kommunikationsschicht v2, Abschnitt 1), 5G/USB sind noch nicht /// umgesetzt. /// /// connectionType wird bewusst per ref.read() einmalig beim Eintritt in den /// Fly-Modus gelesen, nicht reaktiv beobachtet - sonst wuerde jede /// Einstellungsaenderung waehrend des Flugs (z.B. Tippen im /// SSID-Praefix-Feld, das ueberall im Settings-Screen ein /// `ref.invalidate(connectionSettingsProvider)` ausloest) einen Neuaufbau /// dieses Providers samt Trennen/Neuverbinden des Transports ausloesen. /// /// autoDispose: verbindet erst, wenn der Fly-Screen tatsaechlich beobachtet /// wird, und trennt sich wieder (Doku Abschnitt 8: "Verlassen des /// Fly-Modus gibt den Netz-Request frei"), sobald niemand mehr zuhoert /// (z.B. Rueckkehr in den Plan-Modus) statt endlos im Hintergrund /// weiterzulaufen. final flightControllerLinkProvider = Provider.autoDispose((ref) { final connectionType = ref.read(connectionSettingsProvider).value?.connectionType; final FlightControllerLink link = connectionType == ConnectionType.wifi ? MspFlightControllerLink(transport: ref.watch(wifiTransportProvider)) : MockFlightControllerLink(); ref.onDispose(link.disconnect); return link; }); /// Live-Telemetrie des verbundenen Flightcontrollers (Doku 3.4). connect() /// wird beim ersten Abonnenten ausgeloest - MockFlightControllerLink /// verlangt das vor subscribeTelemetry(). final telemetryProvider = StreamProvider.autoDispose((ref) async* { final link = ref.watch(flightControllerLinkProvider); await link.connect(); yield* link.subscribeTelemetry(); });