wifi connection established by app, process socket binding, primary os connection untouched

This commit is contained in:
Constantin Leue
2026-07-31 15:25:45 +02:00
parent 222d8743fb
commit 3b3451b8a2
16 changed files with 1188 additions and 89 deletions
@@ -15,6 +15,7 @@ final wifiTransportProvider = Provider<UdpTransport>((ref) {
final transport = UdpTransport(
getHost: settingsRepo.loadConnectionWifiHost,
getPort: settingsRepo.loadConnectionWifiPort,
getSsidPrefix: settingsRepo.loadConnectionWifiSsidPrefix,
);
ref.onDispose(transport.dispose);
return transport;
@@ -96,6 +97,7 @@ class WifiConnectionLogNotifier
StreamSubscription<LinkState>? _stateSub;
StreamSubscription<void>? _dataSub;
int _packetCount = 0;
String? _lastLoggedPeer;
int get packetCount => _packetCount;
@@ -105,8 +107,9 @@ class WifiConnectionLogNotifier
_stateSub?.cancel();
_dataSub?.cancel();
_packetCount = 0;
_lastLoggedPeer = null;
_stateSub = transport.state.listen(_onStateChanged);
_dataSub = transport.incoming.listen((_) => _packetCount++);
_dataSub = transport.incoming.listen((_) => _onPacket(transport));
ref.onDispose(() {
_stateSub?.cancel();
_dataSub?.cancel();
@@ -114,18 +117,38 @@ class WifiConnectionLogNotifier
return const [];
}
void _onPacket(UdpTransport transport) {
_packetCount++;
// Gegenstelle wird aus dem ersten eingehenden Paket gelernt (Doku
// Kommunikationsschicht v2, Abschnitt 3/9) - nur beim ersten Mal bzw.
// bei Aenderung protokollieren, nicht pro Paket.
final peer = transport.peerDescription;
if (peer != null && peer != _lastLoggedPeer) {
_lastLoggedPeer = peer;
_append('Peer learned: $peer');
}
}
void _onStateChanged(LinkState linkState) {
final transport = ref.read(wifiTransportProvider);
final message = switch (linkState) {
LinkState.disconnected => 'Disconnected',
LinkState.connecting => 'Connecting...',
LinkState.connected => 'Listening on port ${transport.boundPort}',
LinkState.connecting => 'Requesting mLRS network...',
LinkState.connected =>
'Network available, listening on port ${transport.boundPort}'
' (STA concurrency: ${_formatStaConcurrency(transport.staConcurrencySupported)})',
LinkState.error => 'Error: '
'${transport.lastErrorMessage ?? transport.lastErrorReason?.name ?? 'unknown'}',
};
_append(message);
}
String _formatStaConcurrency(bool? supported) => switch (supported) {
true => 'supported',
false => 'not supported',
null => 'unknown',
};
void _append(String message) {
final entry = WifiConnectionLogEntry(DateTime.now(), message);
final next = [...state, entry];