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();
}
}