UI improvements for telemetry debugging

This commit is contained in:
Constantin Leue
2026-08-02 20:21:21 +02:00
parent 6cfb82bd77
commit f42d997d4c
7 changed files with 272 additions and 190 deletions
@@ -34,6 +34,18 @@ class MlrsNetworkLost extends MlrsNetworkEvent {
const MlrsNetworkLost();
}
/// Die SSID des verbundenen Netzes wurde (nachtraeglich) ermittelt. Android
/// liefert `WifiInfo`/SSID bei `WifiNetworkSpecifier`-Netzen haeufig noch
/// nicht synchron im `onAvailable`-Callback, sondern erst kurz danach ueber
/// `NetworkCallback.onCapabilitiesChanged` (bekannter Android-Stolperstein,
/// siehe MlrsNetworkPlugin.kt) - deshalb ein eigenes, spaeter eintreffendes
/// Ereignis statt eines Felds auf [MlrsNetworkAvailable].
class MlrsNetworkSsidUpdated extends MlrsNetworkEvent {
const MlrsNetworkSsidUpdated(this.ssid);
final String ssid;
}
/// Ein per [MlrsNetworkController.openSocket] nativ gebundener UDP-Socket
/// erfolgreich geoeffnet. [boundPort] ist der tatsaechlich gebundene Port;
/// [fallbackFromPort] ist gesetzt, wenn der urspruenglich gewuenschte Port
@@ -150,6 +162,7 @@ class MethodChannelMlrsNetworkController implements MlrsNetworkController {
gatewayAddress: map['gatewayAddress'] as String?,
ssid: map['ssid'] as String?,
),
'ssid' => MlrsNetworkSsidUpdated(map['ssid']! as String),
'lost' => const MlrsNetworkLost(),
_ => const MlrsNetworkUnavailable(),
};
+39 -14
View File
@@ -52,6 +52,7 @@ class UdpTransport implements LinkTransport {
final _incomingController = StreamController<Uint8List>.broadcast();
final _stateController = StreamController<LinkState>.broadcast();
final _ssidController = StreamController<String?>.broadcast();
StreamSubscription<MlrsSocketPacket>? _packetSub;
StreamSubscription<MlrsNetworkEvent>? _networkLossSub;
@@ -99,6 +100,12 @@ class UdpTransport implements LinkTransport {
/// angefragt werden koennen.
String? get connectedSsid => _connectedSsid;
/// Reaktive Aenderungen von [connectedSsid] - liefert erneut ein Ereignis,
/// wenn Android die SSID nachtraeglich meldet (siehe [_onNetworkEvent]),
/// da die Zustandsmaschine dafuer kein neues [LinkState] durchlaeuft und
/// die UI sonst nicht mitbekommt, dass sich der Wert geaendert hat.
Stream<String?> get connectedSsidChanges => _ssidController.stream;
@override
Future<void> connect() async {
// Idempotent: mehrere Aufrufer koennen unabhaengig voneinander "sorg
@@ -143,6 +150,7 @@ class UdpTransport implements LinkTransport {
_networkLossSub = _networkController.events.listen(_onNetworkEvent);
_connectedSsid = available.ssid;
_ssidController.add(_connectedSsid);
if (available.ssid != null) {
await _rememberSsid(available.ssid!);
}
@@ -196,21 +204,36 @@ class UdpTransport implements LinkTransport {
}
void _onNetworkEvent(MlrsNetworkEvent event) {
if (event is! MlrsNetworkLost) return;
_networkLossSub?.cancel();
_networkLossSub = null;
_packetSub?.cancel();
_packetSub = null;
_boundPort = null;
_connectedSsid = null;
if (_socketOpen) {
_socketOpen = false;
unawaited(_networkController.closeSocket());
switch (event) {
case MlrsNetworkSsidUpdated():
// Android liefert WifiInfo/SSID fuer WifiNetworkSpecifier-Netze oft
// erst nach onAvailable() nach (siehe MlrsNetworkPlugin.kt) - hier
// nachtragen und merken, statt auf das schon vergangene erste
// Ereignis in connect() angewiesen zu sein.
_connectedSsid = event.ssid;
_ssidController.add(_connectedSsid);
unawaited(_rememberSsid(event.ssid));
case MlrsNetworkLost():
_networkLossSub?.cancel();
_networkLossSub = null;
_packetSub?.cancel();
_packetSub = null;
_boundPort = null;
_connectedSsid = null;
_ssidController.add(null);
if (_socketOpen) {
_socketOpen = false;
unawaited(_networkController.closeSocket());
}
_setError(
LinkErrorReason.networkLost,
'The mLRS WiFi network was lost.',
);
case MlrsNetworkAvailable() || MlrsNetworkUnavailable():
// Wird hier nicht erwartet - diese Ereignisse werden nur waehrend
// des initialen connect() ueber firstEvent ausgewertet (siehe oben).
break;
}
_setError(
LinkErrorReason.networkLost,
'The mLRS WiFi network was lost.',
);
}
void _onPacket(MlrsSocketPacket packet) {
@@ -227,6 +250,7 @@ class UdpTransport implements LinkTransport {
_packetSub = null;
_boundPort = null;
_connectedSsid = null;
_ssidController.add(null);
if (_socketOpen) {
_socketOpen = false;
await _networkController.closeSocket();
@@ -265,6 +289,7 @@ class UdpTransport implements LinkTransport {
_networkController.dispose();
_incomingController.close();
_stateController.close();
_ssidController.close();
}
void _setError(LinkErrorReason reason, String message) {