readUntilQuiet function

Future<Uint8List> readUntilQuiet(
  1. SerialPort port, {
  2. Duration timeout = const Duration(seconds: 2),
  3. Duration quiet = const Duration(milliseconds: 180),
})

Implementation

Future<Uint8List> readUntilQuiet(SerialPort port, {Duration timeout = const Duration(seconds: 2), Duration quiet = const Duration(milliseconds: 180)}) async {
  final reader = SerialPortReader(port);
  final out = <int>[];
  final done = Completer<Uint8List>();
  Timer? q;
  late StreamSubscription sub;

  void finish() async {
    if (!done.isCompleted) done.complete(Uint8List.fromList(out));
    await sub.cancel();
    q?.cancel();
  }

  final hard = Timer(timeout, finish);

  sub = reader.stream.listen(
    (chunk) {
      out.addAll(chunk);
      q?.cancel();
      q = Timer(quiet, finish);
    },
    onError: (_) => finish(),
    onDone: finish,
  );

  final res = await done.future;
  hard.cancel();
  return res;
}