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
+26 -6
View File
@@ -186,8 +186,7 @@ class UsbSerialService {
}
void dispose() {
unawaited(disconnect());
unawaited(_frameController.close());
unawaited(disconnect().whenComplete(_closeFrameController));
}
void _handleSerialData(FlSerialEventArgs event) {
@@ -197,7 +196,7 @@ class UsbSerialService {
_ingestRawBytes(Uint8List.fromList(bytes));
}
} catch (error, stack) {
_frameController.addError(error, stack);
_addFrameError(error, stack);
}
}
@@ -210,13 +209,13 @@ class UsbSerialService {
_ingestRawBytes(data.buffer.asUint8List());
return;
}
_frameController.addError(
_addFrameError(
StateError('Unexpected Android USB event payload: ${data.runtimeType}'),
);
}
void _handleSerialError(Object error, [StackTrace? stackTrace]) {
_frameController.addError(error, stackTrace);
_addFrameError(error, stackTrace);
}
void _handleSerialDone() {
@@ -231,10 +230,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');