sendAndRead method
Send bytes and collect response until quiet or timeout.
Implementation
Future<Uint8List> sendAndRead({required List<int> request, Duration timeout = const Duration(seconds: 1), Duration quietWindow = const Duration(milliseconds: 150)}) async {
if (!_inner.isOpen) throw StateError('Port not open');
// ensure listening
startListening();
final completer = Completer<Uint8List>();
final acc = <int>[];
Timer? quiet;
late StreamSubscription sub;
void finish() async {
if (!completer.isCompleted) completer.complete(Uint8List.fromList(acc));
await sub.cancel();
quiet?.cancel();
}
// Listen to payloads only (from _onBytes)
sub = onData.listen((e) {
acc.addAll(e.bytes);
quiet?.cancel();
quiet = Timer(quietWindow, finish);
});
final hard = Timer(timeout, finish);
final ok = await writeAll(request);
if (!ok) {
hard.cancel();
await sub.cancel();
return Uint8List(0);
}
final res = await completer.future;
hard.cancel();
return res;
}