diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index 135299e..aad2c71 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -995,9 +995,37 @@ class MeshCoreConnector extends ChangeNotifier { await _tcpFrameSubscription?.cancel(); _tcpFrameSubscription = null; await _tcpManager.connect(host: host, port: port); + final isTcpConnectCancelled = + _activeTransport != MeshCoreTransportType.tcp || + _state != MeshCoreConnectionState.connecting || + !_tcpManager.isConnected; + if (isTcpConnectCancelled) { + _appDebugLogService?.warn( + 'connectTcp aborted before handshake: state=$_state transport=$_activeTransport connected=${_tcpManager.isConnected}', + tag: 'TCP', + ); + if (_tcpManager.isConnected) { + await _tcpManager.disconnect(); + } + return; + } notifyListeners(); await Future.delayed(const Duration(milliseconds: 200)); + final isTcpConnectCancelledAfterDelay = + _activeTransport != MeshCoreTransportType.tcp || + _state != MeshCoreConnectionState.connecting || + !_tcpManager.isConnected; + if (isTcpConnectCancelledAfterDelay) { + _appDebugLogService?.warn( + 'connectTcp aborted after connect delay: state=$_state transport=$_activeTransport connected=${_tcpManager.isConnected}', + tag: 'TCP', + ); + if (_tcpManager.isConnected) { + await _tcpManager.disconnect(); + } + return; + } _tcpFrameSubscription = _tcpManager.frameStream.listen( _handleFrame, onError: (error, stackTrace) { @@ -1031,6 +1059,16 @@ class MeshCoreConnector extends ChangeNotifier { await syncTime(); } catch (error) { _appDebugLogService?.error('TCP connection error: $error', tag: 'TCP'); + final tcpConnectNoLongerActive = + _activeTransport != MeshCoreTransportType.tcp || + _state != MeshCoreConnectionState.connecting; + if (tcpConnectNoLongerActive) { + _appDebugLogService?.info( + 'Ignoring late TCP connect error after cancellation/switch: state=$_state transport=$_activeTransport', + tag: 'TCP', + ); + return; + } await disconnect(manual: false); rethrow; } diff --git a/lib/screens/usb_screen.dart b/lib/screens/usb_screen.dart index 0cc9007..2f2713a 100644 --- a/lib/screens/usb_screen.dart +++ b/lib/screens/usb_screen.dart @@ -108,10 +108,7 @@ class _UsbScreenState extends State { bottomNavigationBar: Consumer( builder: (context, connector, child) { final isLoading = _isLoadingPorts; - final showBle = - PlatformInfo.isWeb || - PlatformInfo.isAndroid || - PlatformInfo.isIOS; + final showBle = true; final showTcp = !PlatformInfo.isWeb; return SafeArea(