From 163fd5044ac4ca0bbbc556fec2ae69da78e8512b Mon Sep 17 00:00:00 2001 From: Paul Kendall Date: Thu, 14 Jul 2022 19:43:17 +1200 Subject: [PATCH] Process leftover data first in read I there was a partial packet left over and it was greater than min_data then the serial port was not read so the packet could never finish. --- webserial.js | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/webserial.js b/webserial.js index 5ac3bf6..d162fd0 100644 --- a/webserial.js +++ b/webserial.js @@ -108,29 +108,36 @@ class Transport { let t; let packet = this.left_over; this.left_over = new Uint8Array(0); - if (packet.length < min_data) { - const reader = this.device.readable.getReader(); - try { - if (timeout > 0) { - t = setTimeout(function() { - reader.cancel(); - }, timeout); - } - do { - const {value, done} = await reader.read(); - if (done) { - this.left_over = packet; - throw new TimeoutError("Timeout"); - } - var p = new Uint8Array(this._appendBuffer(packet.buffer, value.buffer)); - packet = p; - } while (packet.length < min_data); - } finally { - if (timeout > 0) { - clearTimeout(t); - } - reader.releaseLock(); + if (this.slip_reader_enabled) { + const val_final = this.slip_reader(packet); + if (val_final.length > 0) { + return val_final; } + packet = this.left_over; + this.left_over = new Uint8Array(0); + } + + const reader = this.device.readable.getReader(); + try { + if (timeout > 0) { + t = setTimeout(function() { + reader.cancel(); + }, timeout); + } + do { + const {value, done} = await reader.read(); + if (done) { + this.left_over = packet; + throw new TimeoutError("Timeout"); + } + var p = new Uint8Array(this._appendBuffer(packet.buffer, value.buffer)); + packet = p; + } while (packet.length < min_data); + } finally { + if (timeout > 0) { + clearTimeout(t); + } + reader.releaseLock(); } if (this.slip_reader_enabled) { return this.slip_reader(packet);