47 lines
2.3 KiB
Dart
47 lines
2.3 KiB
Dart
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<FlightControllerLink>((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<TelemetryFrame>((ref) async* {
|
|
final link = ref.watch(flightControllerLinkProvider);
|
|
await link.connect();
|
|
yield* link.subscribeTelemetry();
|
|
});
|