This commit is contained in:
just_stuff_tm
2026-03-03 16:44:13 -05:00
committed by just-stuff-tm
parent 367e47bb1e
commit 524558c511
11 changed files with 79 additions and 72 deletions
+8 -2
View File
@@ -748,7 +748,10 @@ class MeshCoreConnector extends ChangeNotifier {
try { try {
await FlutterBluePlus.stopScan(); await FlutterBluePlus.stopScan();
} catch (e) { } catch (e) {
debugPrint('[FBP] stopScan error in startScan (ignored): $e'); _appDebugLogService?.warn(
'stopScan error in startScan (ignored): $e',
tag: 'BLE Scan',
);
} }
} }
await _scanSubscription?.cancel(); await _scanSubscription?.cancel();
@@ -808,7 +811,10 @@ class MeshCoreConnector extends ChangeNotifier {
try { try {
await FlutterBluePlus.stopScan(); await FlutterBluePlus.stopScan();
} catch (e) { } catch (e) {
debugPrint('[FBP] stopScan error (ignored): $e'); _appDebugLogService?.warn(
'stopScan error (ignored): $e',
tag: 'BLE Scan',
);
} }
} }
await _scanSubscription?.cancel(); await _scanSubscription?.cancel();
+1 -1
View File
@@ -1809,7 +1809,7 @@
"usbScreenEmptyState": "Няма открити USB устройства. Включете едно и опитайте отново.", "usbScreenEmptyState": "Няма открити USB устройства. Включете едно и опитайте отново.",
"usbErrorPermissionDenied": "Не беше разрешено достъпът през USB.", "usbErrorPermissionDenied": "Не беше разрешено достъпът през USB.",
"usbErrorDeviceMissing": "Избраното USB устройство вече не е налично.", "usbErrorDeviceMissing": "Избраното USB устройство вече не е налично.",
"usbErrorInvalidPort": "Изберете валитно USB устройство.", "usbErrorInvalidPort": "Изберете валидно USB устройство.",
"usbErrorBusy": "Друг мол за свързване през USB вече е в процес на изпълнение.", "usbErrorBusy": "Друг мол за свързване през USB вече е в процес на изпълнение.",
"usbErrorNotConnected": "Няма свързано USB устройство.", "usbErrorNotConnected": "Няма свързано USB устройство.",
"usbErrorOpenFailed": "Не успях да отворя избраното USB устройство.", "usbErrorOpenFailed": "Не успях да отворя избраното USB устройство.",
+12 -12
View File
@@ -190,20 +190,20 @@
"appSettings_language": "Language", "appSettings_language": "Language",
"appSettings_languageSystem": "System default", "appSettings_languageSystem": "System default",
"appSettings_languageEn": "English", "appSettings_languageEn": "English",
"appSettings_languageFr": "Français", "appSettings_languageFr": "Français",
"appSettings_languageEs": "Español", "appSettings_languageEs": "Español",
"appSettings_languageDe": "Deutsch", "appSettings_languageDe": "Deutsch",
"appSettings_languagePl": "Polski", "appSettings_languagePl": "Polski",
"appSettings_languageSl": "Slovenščina", "appSettings_languageSl": "Slovenščina",
"appSettings_languagePt": "Português", "appSettings_languagePt": "Português",
"appSettings_languageIt": "Italiano", "appSettings_languageIt": "Italiano",
"appSettings_languageZh": "中文", "appSettings_languageZh": "中文",
"appSettings_languageSv": "Svenska", "appSettings_languageSv": "Svenska",
"appSettings_languageNl": "Nederlands", "appSettings_languageNl": "Nederlands",
"appSettings_languageSk": "Slovenčina", "appSettings_languageSk": "Slovenčina",
"appSettings_languageBg": "Български", "appSettings_languageBg": "Български",
"appSettings_languageRu": "Русский", "appSettings_languageRu": "Русский",
"appSettings_languageUk": "Українська", "appSettings_languageUk": "Українська",
"appSettings_enableMessageTracing": "Enable Message Tracing", "appSettings_enableMessageTracing": "Enable Message Tracing",
"appSettings_enableMessageTracingSubtitle": "Show detailed routing and timing metadata for messages", "appSettings_enableMessageTracingSubtitle": "Show detailed routing and timing metadata for messages",
"appSettings_notifications": "Notifications", "appSettings_notifications": "Notifications",
@@ -1351,7 +1351,7 @@
} }
} }
}, },
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F", "telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
"@telemetry_temperatureValue": { "@telemetry_temperatureValue": {
"placeholders": { "placeholders": {
"celsius": { "celsius": {
@@ -1401,7 +1401,7 @@
"channelPath_repeatsLabel": "Repeats", "channelPath_repeatsLabel": "Repeats",
"channelPath_pathLabel": "Path {index}", "channelPath_pathLabel": "Path {index}",
"channelPath_observedLabel": "Observed", "channelPath_observedLabel": "Observed",
"channelPath_observedPathTitle": "Observed path {index} • {hops}", "channelPath_observedPathTitle": "Observed path {index} {hops}",
"@channelPath_observedPathTitle": { "@channelPath_observedPathTitle": {
"placeholders": { "placeholders": {
"index": { "index": {
@@ -1476,7 +1476,7 @@
}, },
"channelPath_pathLabelTitle": "Path", "channelPath_pathLabelTitle": "Path",
"channelPath_observedPathHeader": "Observed Path", "channelPath_observedPathHeader": "Observed Path",
"channelPath_selectedPathLabel": "{label} • {prefixes}", "channelPath_selectedPathLabel": "{label} {prefixes}",
"@channelPath_selectedPathLabel": { "@channelPath_selectedPathLabel": {
"placeholders": { "placeholders": {
"label": { "label": {
+12 -12
View File
@@ -1015,13 +1015,13 @@ abstract class AppLocalizations {
/// No description provided for @appSettings_languageFr. /// No description provided for @appSettings_languageFr.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Français'** /// **'Français'**
String get appSettings_languageFr; String get appSettings_languageFr;
/// No description provided for @appSettings_languageEs. /// No description provided for @appSettings_languageEs.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Español'** /// **'Español'**
String get appSettings_languageEs; String get appSettings_languageEs;
/// No description provided for @appSettings_languageDe. /// No description provided for @appSettings_languageDe.
@@ -1039,13 +1039,13 @@ abstract class AppLocalizations {
/// No description provided for @appSettings_languageSl. /// No description provided for @appSettings_languageSl.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Slovenščina'** /// **'Slovenščina'**
String get appSettings_languageSl; String get appSettings_languageSl;
/// No description provided for @appSettings_languagePt. /// No description provided for @appSettings_languagePt.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Português'** /// **'Português'**
String get appSettings_languagePt; String get appSettings_languagePt;
/// No description provided for @appSettings_languageIt. /// No description provided for @appSettings_languageIt.
@@ -1057,7 +1057,7 @@ abstract class AppLocalizations {
/// No description provided for @appSettings_languageZh. /// No description provided for @appSettings_languageZh.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'中文'** /// **'中文'**
String get appSettings_languageZh; String get appSettings_languageZh;
/// No description provided for @appSettings_languageSv. /// No description provided for @appSettings_languageSv.
@@ -1075,25 +1075,25 @@ abstract class AppLocalizations {
/// No description provided for @appSettings_languageSk. /// No description provided for @appSettings_languageSk.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Slovenčina'** /// **'Slovenčina'**
String get appSettings_languageSk; String get appSettings_languageSk;
/// No description provided for @appSettings_languageBg. /// No description provided for @appSettings_languageBg.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Български'** /// **'Български'**
String get appSettings_languageBg; String get appSettings_languageBg;
/// No description provided for @appSettings_languageRu. /// No description provided for @appSettings_languageRu.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Русский'** /// **'Русский'**
String get appSettings_languageRu; String get appSettings_languageRu;
/// No description provided for @appSettings_languageUk. /// No description provided for @appSettings_languageUk.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Українська'** /// **'Українська'**
String get appSettings_languageUk; String get appSettings_languageUk;
/// No description provided for @appSettings_enableMessageTracing. /// No description provided for @appSettings_enableMessageTracing.
@@ -4409,7 +4409,7 @@ abstract class AppLocalizations {
/// No description provided for @telemetry_temperatureValue. /// No description provided for @telemetry_temperatureValue.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'{celsius}°C / {fahrenheit}°F'** /// **'{celsius}°C / {fahrenheit}°F'**
String telemetry_temperatureValue(String celsius, String fahrenheit); String telemetry_temperatureValue(String celsius, String fahrenheit);
/// No description provided for @neighbors_receivedData. /// No description provided for @neighbors_receivedData.
@@ -4523,7 +4523,7 @@ abstract class AppLocalizations {
/// No description provided for @channelPath_observedPathTitle. /// No description provided for @channelPath_observedPathTitle.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Observed path {index} • {hops}'** /// **'Observed path {index} {hops}'**
String channelPath_observedPathTitle(int index, String hops); String channelPath_observedPathTitle(int index, String hops);
/// No description provided for @channelPath_noLocationData. /// No description provided for @channelPath_noLocationData.
@@ -4607,7 +4607,7 @@ abstract class AppLocalizations {
/// No description provided for @channelPath_selectedPathLabel. /// No description provided for @channelPath_selectedPathLabel.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'{label} • {prefixes}'** /// **'{label} {prefixes}'**
String channelPath_selectedPathLabel(String label, String prefixes); String channelPath_selectedPathLabel(String label, String prefixes);
/// No description provided for @channelPath_noHopDetailsAvailable. /// No description provided for @channelPath_noHopDetailsAvailable.
+1 -1
View File
@@ -140,7 +140,7 @@ class AppLocalizationsBg extends AppLocalizations {
'Избраното USB устройство вече не е налично.'; 'Избраното USB устройство вече не е налично.';
@override @override
String get usbErrorInvalidPort => 'Изберете валитно USB устройство.'; String get usbErrorInvalidPort => 'Изберете валидно USB устройство.';
@override @override
String get usbErrorBusy => String get usbErrorBusy =>
+12 -12
View File
@@ -489,10 +489,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get appSettings_languageEn => 'English'; String get appSettings_languageEn => 'English';
@override @override
String get appSettings_languageFr => 'Français'; String get appSettings_languageFr => 'Français';
@override @override
String get appSettings_languageEs => 'Español'; String get appSettings_languageEs => 'Español';
@override @override
String get appSettings_languageDe => 'Deutsch'; String get appSettings_languageDe => 'Deutsch';
@@ -501,16 +501,16 @@ class AppLocalizationsEn extends AppLocalizations {
String get appSettings_languagePl => 'Polski'; String get appSettings_languagePl => 'Polski';
@override @override
String get appSettings_languageSl => 'Slovenščina'; String get appSettings_languageSl => 'Slovenščina';
@override @override
String get appSettings_languagePt => 'Português'; String get appSettings_languagePt => 'Português';
@override @override
String get appSettings_languageIt => 'Italiano'; String get appSettings_languageIt => 'Italiano';
@override @override
String get appSettings_languageZh => '中文'; String get appSettings_languageZh => '中文';
@override @override
String get appSettings_languageSv => 'Svenska'; String get appSettings_languageSv => 'Svenska';
@@ -519,16 +519,16 @@ class AppLocalizationsEn extends AppLocalizations {
String get appSettings_languageNl => 'Nederlands'; String get appSettings_languageNl => 'Nederlands';
@override @override
String get appSettings_languageSk => 'Slovenčina'; String get appSettings_languageSk => 'Slovenčina';
@override @override
String get appSettings_languageBg => 'Български'; String get appSettings_languageBg => 'Български';
@override @override
String get appSettings_languageRu => 'Русский'; String get appSettings_languageRu => 'Русский';
@override @override
String get appSettings_languageUk => 'Українська'; String get appSettings_languageUk => 'Українська';
@override @override
String get appSettings_enableMessageTracing => 'Enable Message Tracing'; String get appSettings_enableMessageTracing => 'Enable Message Tracing';
@@ -2465,7 +2465,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String telemetry_temperatureValue(String celsius, String fahrenheit) { String telemetry_temperatureValue(String celsius, String fahrenheit) {
return '$celsius°C / $fahrenheit°F'; return '$celsius°C / $fahrenheit°F';
} }
@override @override
@@ -2533,7 +2533,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String channelPath_observedPathTitle(int index, String hops) { String channelPath_observedPathTitle(int index, String hops) {
return 'Observed path $index • $hops'; return 'Observed path $index $hops';
} }
@override @override
@@ -2588,7 +2588,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String channelPath_selectedPathLabel(String label, String prefixes) { String channelPath_selectedPathLabel(String label, String prefixes) {
return '$label • $prefixes'; return '$label $prefixes';
} }
@override @override
+1 -1
View File
@@ -126,7 +126,7 @@ class AppLocalizationsSv extends AppLocalizations {
@override @override
String get usbScreenNote => String get usbScreenNote =>
'USB-seriell kommunikation är aktiv på stöderdade Android-enheter och skrivbordsplattformar.'; 'USB-seriell kommunikation är aktiv på stödda Android-enheter och skrivbordsplattformar.';
@override @override
String get usbScreenEmptyState => String get usbScreenEmptyState =>
+1 -1
View File
@@ -1802,7 +1802,7 @@
"contacts_searchFavorites": "Sök {number}{str} Favoriter...", "contacts_searchFavorites": "Sök {number}{str} Favoriter...",
"contacts_searchUsers": "Sök {number}{str} användare...", "contacts_searchUsers": "Sök {number}{str} användare...",
"contacts_searchRoomServers": "Sök {number}{str} Room-servrar...", "contacts_searchRoomServers": "Sök {number}{str} Room-servrar...",
"usbScreenNote": "USB-seriell kommunikation är aktiv på stöderdade Android-enheter och skrivbordsplattformar.", "usbScreenNote": "USB-seriell kommunikation är aktiv på stödda Android-enheter och skrivbordsplattformar.",
"usbScreenStatus": "Välj en USB-enhet", "usbScreenStatus": "Välj en USB-enhet",
"usbScreenSubtitle": "Välj en detekterad seriell enhet och anslut direkt till din MeshCore-nod.", "usbScreenSubtitle": "Välj en detekterad seriell enhet och anslut direkt till din MeshCore-nod.",
"usbScreenTitle": "Anslut via USB", "usbScreenTitle": "Anslut via USB",
+9 -6
View File
@@ -6,6 +6,7 @@ import 'package:provider/provider.dart';
import '../connector/meshcore_connector.dart'; import '../connector/meshcore_connector.dart';
import '../l10n/l10n.dart'; import '../l10n/l10n.dart';
import '../utils/app_logger.dart';
import '../widgets/adaptive_app_bar_title.dart'; import '../widgets/adaptive_app_bar_title.dart';
import '../widgets/device_tile.dart'; import '../widgets/device_tile.dart';
import 'contacts_screen.dart'; import 'contacts_screen.dart';
@@ -60,7 +61,7 @@ class _ScannerScreenState extends State<ScannerScreen> {
} }
}, },
onError: (Object e) { onError: (Object e) {
debugPrint("Scanner adapterState stream error: $e"); appLogger.warn('Adapter state stream error: $e', tag: 'ScannerScreen');
}, },
); );
} }
@@ -86,7 +87,7 @@ class _ScannerScreenState extends State<ScannerScreen> {
? IconButton( ? IconButton(
icon: const Icon(Icons.arrow_back), icon: const Icon(Icons.arrow_back),
onPressed: () { onPressed: () {
debugPrint('ScannerScreen: back button pressed'); appLogger.info('Back button pressed', tag: 'ScannerScreen');
Navigator.of(context).maybePop(); Navigator.of(context).maybePop();
}, },
) )
@@ -131,8 +132,9 @@ class _ScannerScreenState extends State<ScannerScreen> {
if (usbSupported) if (usbSupported)
FloatingActionButton.extended( FloatingActionButton.extended(
onPressed: () { onPressed: () {
debugPrint( appLogger.info(
'ScannerScreen: USB selected, opening UsbScreen', 'USB selected, opening UsbScreen',
tag: 'ScannerScreen',
); );
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const UsbScreen()), MaterialPageRoute(builder: (_) => const UsbScreen()),
@@ -153,8 +155,9 @@ class _ScannerScreenState extends State<ScannerScreen> {
} else { } else {
unawaited( unawaited(
connector.startScan().catchError((e) { connector.startScan().catchError((e) {
debugPrint( appLogger.warn(
"Scanner screen startScan error: $e", 'startScan error: $e',
tag: 'ScannerScreen',
); );
}), }),
); );
+21 -14
View File
@@ -8,6 +8,7 @@ import 'package:provider/provider.dart';
import '../connector/meshcore_connector.dart'; import '../connector/meshcore_connector.dart';
import '../connector/meshcore_connector_usb.dart'; import '../connector/meshcore_connector_usb.dart';
import '../l10n/l10n.dart'; import '../l10n/l10n.dart';
import '../utils/app_logger.dart';
import '../utils/platform_info.dart'; import '../utils/platform_info.dart';
import '../utils/usb_port_labels.dart'; import '../utils/usb_port_labels.dart';
import 'contacts_screen.dart'; import 'contacts_screen.dart';
@@ -109,7 +110,7 @@ class _UsbScreenState extends State<UsbScreen> {
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.arrow_back), icon: const Icon(Icons.arrow_back),
onPressed: () { onPressed: () {
debugPrint('UsbScreen: back button pressed'); appLogger.info('Back button pressed', tag: 'UsbScreen');
Navigator.of(context).maybePop(); Navigator.of(context).maybePop();
}, },
), ),
@@ -124,8 +125,9 @@ class _UsbScreenState extends State<UsbScreen> {
PlatformInfo.isIOS) PlatformInfo.isIOS)
TextButton.icon( TextButton.icon(
onPressed: () { onPressed: () {
debugPrint( appLogger.info(
'UsbScreen: Bluetooth selected, opening ScannerScreen', 'Bluetooth selected, opening ScannerScreen',
tag: 'UsbScreen',
); );
Navigator.of(context).pushReplacement( Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (_) => const ScannerScreen()), MaterialPageRoute(builder: (_) => const ScannerScreen()),
@@ -218,8 +220,9 @@ class _UsbScreenState extends State<UsbScreen> {
onPressed: _isLoadingPorts || _isConnecting onPressed: _isLoadingPorts || _isConnecting
? null ? null
: () { : () {
debugPrint( appLogger.info(
'UsbScreen: refresh ports pressed', 'Refresh ports pressed',
tag: 'UsbScreen',
); );
_loadPorts(); _loadPorts();
}, },
@@ -234,8 +237,9 @@ class _UsbScreenState extends State<UsbScreen> {
final rawPortName = normalizeUsbPortName( final rawPortName = normalizeUsbPortName(
_selectedPort!, _selectedPort!,
); );
debugPrint( appLogger.info(
'UsbScreen: connect pressed for $_selectedPort (raw: $rawPortName)', 'Connect pressed for $_selectedPort (raw: $rawPortName)',
tag: 'UsbScreen',
); );
_connectSelectedPort(); _connectSelectedPort();
} }
@@ -262,8 +266,9 @@ class _UsbScreenState extends State<UsbScreen> {
onPressed: _isLoadingPorts || _isConnecting onPressed: _isLoadingPorts || _isConnecting
? null ? null
: () { : () {
debugPrint( appLogger.info(
'UsbScreen: refresh ports pressed', 'Refresh ports pressed',
tag: 'UsbScreen',
); );
_loadPorts(); _loadPorts();
}, },
@@ -280,8 +285,9 @@ class _UsbScreenState extends State<UsbScreen> {
final rawPortName = normalizeUsbPortName( final rawPortName = normalizeUsbPortName(
_selectedPort!, _selectedPort!,
); );
debugPrint( appLogger.info(
'UsbScreen: connect pressed for $_selectedPort (raw: $rawPortName)', 'Connect pressed for $_selectedPort (raw: $rawPortName)',
tag: 'UsbScreen',
); );
_connectSelectedPort(); _connectSelectedPort();
} }
@@ -413,7 +419,7 @@ class _UsbScreenState extends State<UsbScreen> {
_selectedPort = port; _selectedPort = port;
_errorText = null; _errorText = null;
}); });
debugPrint('UsbScreen: selected port $port'); appLogger.info('Selected port $port', tag: 'UsbScreen');
}, },
leading: Icon( leading: Icon(
Icons.usb, Icons.usb,
@@ -511,8 +517,9 @@ class _UsbScreenState extends State<UsbScreen> {
try { try {
await _usbConnector.connect(portName: rawPortName); await _usbConnector.connect(portName: rawPortName);
} catch (error, stackTrace) { } catch (error, stackTrace) {
debugPrint( appLogger.error(
'UsbScreen: connect failed for $rawPortName: $error\n$stackTrace', 'Connect failed for $rawPortName: $error\n$stackTrace',
tag: 'UsbScreen',
); );
if (!mounted) return; if (!mounted) return;
setState(() { setState(() {
+1 -10
View File
@@ -135,7 +135,6 @@ class UsbSerialService {
} on PlatformException catch (error) { } on PlatformException catch (error) {
_status = UsbSerialStatus.disconnected; _status = UsbSerialStatus.disconnected;
final msg = error.message ?? error.code; final msg = error.message ?? error.code;
debugPrint('[USB Serial] Android connect failed: $msg');
_debugLogService?.error( _debugLogService?.error(
'Android connect failed: $msg', 'Android connect failed: $msg',
tag: 'USB Serial', tag: 'USB Serial',
@@ -180,7 +179,6 @@ class UsbSerialService {
if (openStatus != FlOpenStatus.open) { if (openStatus != FlOpenStatus.open) {
final msg = final msg =
'Failed to open USB port $candidate (status: $openStatus)'; 'Failed to open USB port $candidate (status: $openStatus)';
debugPrint('[USB Serial] $msg');
_debugLogService?.error(msg, tag: 'USB Serial'); _debugLogService?.error(msg, tag: 'USB Serial');
// Not a FlSerialException treat as terminal failure // Not a FlSerialException treat as terminal failure
_status = UsbSerialStatus.disconnected; _status = UsbSerialStatus.disconnected;
@@ -204,9 +202,6 @@ class UsbSerialService {
} on FlSerialException catch (error) { } on FlSerialException catch (error) {
// The native fl_open() already called fl_close() on failure // The native fl_open() already called fl_close() on failure
// internally, so no extra cleanup is needed here for this candidate. // internally, so no extra cleanup is needed here for this candidate.
debugPrint(
'[USB Serial] Failed to open $candidate: ${error.msg} (code ${error.error})',
);
_debugLogService?.warn( _debugLogService?.warn(
'Failed to open $candidate: ${error.msg} (code ${error.error})', 'Failed to open $candidate: ${error.msg} (code ${error.error})',
tag: 'USB Serial', tag: 'USB Serial',
@@ -215,11 +210,8 @@ class UsbSerialService {
// Try next candidate // Try next candidate
} catch (error, stackTrace) { } catch (error, stackTrace) {
_status = UsbSerialStatus.disconnected; _status = UsbSerialStatus.disconnected;
debugPrint(
'[USB Serial] Unexpected error opening $candidate: $error\n$stackTrace',
);
_debugLogService?.error( _debugLogService?.error(
'Unexpected error opening $candidate: $error', 'Unexpected error opening $candidate: $error\n$stackTrace',
tag: 'USB Serial', tag: 'USB Serial',
); );
rethrow; rethrow;
@@ -232,7 +224,6 @@ class UsbSerialService {
final msg = lastError != null final msg = lastError != null
? 'Failed to open USB port $primary: ${lastError.msg} (code ${lastError.error})' ? 'Failed to open USB port $primary: ${lastError.msg} (code ${lastError.error})'
: 'Failed to open USB port $primary'; : 'Failed to open USB port $primary';
debugPrint('[USB Serial] $msg');
_debugLogService?.error(msg, tag: 'USB Serial'); _debugLogService?.error(msg, tag: 'USB Serial');
throw StateError(msg); throw StateError(msg);
} }