Refactor USB connection handling to use scheduled closure and improve error management in USB services

This commit is contained in:
just_stuff_tm
2026-03-02 04:11:52 -05:00
committed by just-stuff-tm
parent 4b24506310
commit dcad5c586d
4 changed files with 81 additions and 24 deletions
+25 -5
View File
@@ -160,8 +160,7 @@ class UsbSerialService {
}
void dispose() {
unawaited(disconnect());
unawaited(_frameController.close());
unawaited(disconnect().whenComplete(_closeFrameController));
}
Future<List<JSObject>> _getAuthorizedPorts() async {
@@ -285,12 +284,12 @@ class UsbSerialService {
}
} catch (error, stackTrace) {
if (_status == UsbSerialStatus.connected) {
_frameController.addError(error, stackTrace);
_addFrameError(error, stackTrace);
}
} finally {
_releaseLock(reader);
if (_status == UsbSerialStatus.connected && identical(reader, _reader)) {
_frameController.addError(StateError('USB serial connection closed'));
_addFrameError(StateError('USB serial connection closed'));
}
}
}
@@ -402,10 +401,31 @@ class UsbSerialService {
);
continue;
}
_frameController.add(packet.payload);
_addFrame(packet.payload);
}
}
void _addFrame(Uint8List payload) {
if (_frameController.isClosed) {
return;
}
_frameController.add(payload);
}
void _addFrameError(Object error, [StackTrace? stackTrace]) {
if (_frameController.isClosed) {
return;
}
_frameController.addError(error, stackTrace);
}
Future<void> _closeFrameController() async {
if (_frameController.isClosed) {
return;
}
await _frameController.close();
}
void _logFrameSummary(String prefix, Uint8List bytes) {
if (bytes.isEmpty) {
debugPrint('$prefix len=0');