diff --git a/examples/typescript/package.json b/examples/typescript/package.json index 1b17df5..30e8c90 100644 --- a/examples/typescript/package.json +++ b/examples/typescript/package.json @@ -5,7 +5,7 @@ "source": "src/index.html", "scripts": { "genDocs": "cd ../.. && npm run genDocs && mkdir -p examples/typescript/dist && cp -r docs examples/typescript/dist && cd examples/typescript", - "dev": "npm run genDocs && parcel src/index.html", + "dev": "npm run clean && npm run genDocs && parcel src/index.html", "build": "npm run clean && npm run genDocs && parcel build src/index.html --no-optimize --public-url ./", "clean": "rimraf dist .parcel-cache", "test": "echo \"Error: no test specified\" && exit 1" diff --git a/examples/typescript/src/index.html b/examples/typescript/src/index.html index 6f0cbf7..82d4080 100644 --- a/examples/typescript/src/index.html +++ b/examples/typescript/src/index.html @@ -36,6 +36,8 @@

Program

+

+ @@ -68,6 +70,13 @@

Program

Console

+ + + +

diff --git a/examples/typescript/src/index.ts b/examples/typescript/src/index.ts index 4e695ac..8ce1ea8 100644 --- a/examples/typescript/src/index.ts +++ b/examples/typescript/src/index.ts @@ -1,4 +1,5 @@ const baudrates = document.getElementById("baudrates") as HTMLSelectElement; +const consoleBaudrates = document.getElementById("consoleBaudrates") as HTMLSelectElement; const connectButton = document.getElementById("connectButton") as HTMLButtonElement; const traceButton = document.getElementById("copyTraceButton") as HTMLButtonElement; const disconnectButton = document.getElementById("disconnectButton") as HTMLButtonElement; @@ -13,6 +14,7 @@ const terminal = document.getElementById("terminal"); const programDiv = document.getElementById("program"); const consoleDiv = document.getElementById("console"); const lblBaudrate = document.getElementById("lblBaudrate"); +const lblConsoleBaudrate = document.getElementById("lblConsoleBaudrate"); const lblConsoleFor = document.getElementById("lblConsoleFor"); const lblConnTo = document.getElementById("lblConnTo"); const table = document.getElementById("fileTable") as HTMLTableElement; @@ -38,6 +40,7 @@ disconnectButton.style.display = "none"; traceButton.style.display = "none"; eraseButton.style.display = "none"; consoleStopButton.style.display = "none"; +resetButton.style.display = "none"; filesDiv.style.display = "none"; /** @@ -119,14 +122,11 @@ traceButton.onclick = async () => { }; resetButton.onclick = async () => { - if (device === null) { - device = await navigator.serial.requestPort({}); - transport = new Transport(device, true); + if (transport) { + await transport.setDTR(false); + await new Promise((resolve) => setTimeout(resolve, 100)); + await transport.setDTR(true); } - - await transport.setDTR(false); - await new Promise((resolve) => setTimeout(resolve, 100)); - await transport.setDTR(true); }; eraseButton.onclick = async () => { @@ -212,8 +212,10 @@ function cleanUp() { disconnectButton.onclick = async () => { if (transport) await transport.disconnect(); - term.clear(); + term.reset(); + lblBaudrate.style.display = "initial"; baudrates.style.display = "initial"; + consoleBaudrates.style.display = "initial"; connectButton.style.display = "initial"; disconnectButton.style.display = "none"; traceButton.style.display = "none"; @@ -232,11 +234,14 @@ consoleStartButton.onclick = async () => { transport = new Transport(device, true); } lblConsoleFor.style.display = "block"; + lblConsoleBaudrate.style.display = "none"; + consoleBaudrates.style.display = "none"; consoleStartButton.style.display = "none"; consoleStopButton.style.display = "initial"; + resetButton.style.display = "initial"; programDiv.style.display = "none"; - await transport.connect(); + await transport.connect(parseInt(consoleBaudrates.value)); isConsoleClosed = false; while (true && !isConsoleClosed) { @@ -252,12 +257,19 @@ consoleStartButton.onclick = async () => { consoleStopButton.onclick = async () => { isConsoleClosed = true; - await transport.disconnect(); - await transport.waitForUnlock(1500); - term.clear(); + if (transport) { + await transport.disconnect(); + await transport.waitForUnlock(1500); + } + term.reset(); + lblConsoleBaudrate.style.display = "initial"; + consoleBaudrates.style.display = "initial"; consoleStartButton.style.display = "initial"; consoleStopButton.style.display = "none"; + resetButton.style.display = "none"; + lblConsoleFor.style.display = "none"; programDiv.style.display = "initial"; + cleanUp(); }; /** diff --git a/src/webserial.ts b/src/webserial.ts index 3548d73..bdd321b 100644 --- a/src/webserial.ts +++ b/src/webserial.ts @@ -62,6 +62,7 @@ class Transport { public baudrate = 0; private traceLog = ""; private lastTraceTime = Date.now(); + private reader: ReadableStreamDefaultReader | undefined; constructor(public device: SerialPort, public tracing = false, enableSlipReader = true) { this.slipReaderEnabled = enableSlipReader; @@ -259,15 +260,17 @@ class Transport { return this.leftOver; } - const reader = this.device.readable.getReader(); + this.reader = this.device.readable.getReader(); try { if (timeout > 0) { - t = setTimeout(function () { - reader.cancel(); + t = setTimeout(() => { + if (this.reader) { + this.reader.cancel(); + } }, timeout); } do { - const { value, done } = await reader.read(); + const { value, done } = await this.reader.read(); if (done) { this.leftOver = packet; throw new Error("Timeout"); @@ -279,7 +282,7 @@ class Transport { if (timeout > 0) { clearTimeout(t); } - reader.releaseLock(); + this.reader.releaseLock(); } if (this.tracing) { @@ -312,17 +315,19 @@ class Transport { if (!this.device.readable) { return this.leftOver; } - const reader = this.device.readable.getReader(); + this.reader = this.device.readable.getReader(); let t; try { if (timeout > 0) { - t = setTimeout(function () { - reader.cancel(); + t = setTimeout(() => { + if (this.reader) { + this.reader.cancel(); + } }, timeout); } - const { value, done } = await reader.read(); + const { value, done } = await this.reader.read(); if (done) { - throw new Error("Timeout"); + return value; } if (this.tracing) { console.log("Raw Read bytes"); @@ -333,7 +338,7 @@ class Transport { if (timeout > 0) { clearTimeout(t); } - reader.releaseLock(); + this.reader.releaseLock(); } } @@ -401,7 +406,11 @@ class Transport { * Disconnect from serial device by running SerialPort.close() after streams unlock. */ async disconnect() { + if (this.device.readable?.locked) { + await this.reader?.cancel(); + } await this.waitForUnlock(400); + this.reader = undefined; await this.device.close(); } }