Skip to content

Commit 745d8de

Browse files
author
Ernesto Castellotti
authored
Convert sendImageMtd and XYMini to SerialReadWrite (#230)
1 parent b8a15df commit 745d8de

File tree

3 files changed

+57
-80
lines changed

3 files changed

+57
-80
lines changed

assets/js/rootLantiq.js

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -161,35 +161,18 @@ async function changeBaudrate(port, newBaudrate, currBaudrate, outputErrorCallba
161161
}
162162

163163
async function sendImageMtd(port, data, baudRate, outputErrorCallback, progressCallback) {
164-
let reader,writer, readableStreamClosed, writerStreamClosed;
164+
const serial = new SerialReadWrite(port, baudRate);
165165

166166
try {
167-
({ reader, writer, readableStreamClosed, writerStreamClosed } = await openPortLineBreak(port, baudRate));
168-
await writer.write(`loady 0x${LOAD_ADDR}\n`);
167+
await serial.writeString(`loady 0x${LOAD_ADDR}\n`);
169168
await delay(1000);
170-
await closePortLineBreak(port, reader, writer, readableStreamClosed, writerStreamClosed); /* XYMini needs reopen the port */
171-
} catch (err) {
172-
outputErrorCallback(`Error: ${err.message}`);
173-
await closePortLineBreak(port, reader, writer, readableStreamClosed, writerStreamClosed);
174-
return false;
175-
}
176-
177-
try {
178-
await port.open({ baudRate: baudRate });
179-
reader = port.readable.getReader();
180-
writer = port.writable.getWriter();
181-
182-
await sendXYMini(reader, writer, data, baudRate, progressCallback);
183-
await reader.cancel();
184-
await writer.close();
185-
await port.close();
169+
await sendXYMini(serial, data, progressCallback);
186170
return true;
187171
} catch (err) {
188-
await reader.cancel();
189-
await writer.close();
190-
await port.close();
191172
outputErrorCallback(`Error: ${err.message}`);
192173
return false;
174+
} finally {
175+
await serial.closePort();
193176
}
194177
}
195178

assets/js/serialUtil.js

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,6 @@ function delay(ms) {
22
return new Promise(resolve => setTimeout(resolve, ms));
33
}
44

5-
class LineBreakTransformer {
6-
constructor() {
7-
this.chunks = "";
8-
}
9-
10-
transform(chunk, controller) {
11-
this.chunks += chunk;
12-
const lines = this.chunks.split("\n");
13-
this.chunks = lines.pop();
14-
lines.forEach((line) => controller.enqueue(line));
15-
}
16-
17-
flush(controller) {
18-
controller.enqueue(this.chunks);
19-
}
20-
}
21-
225
class SerialReadWrite {
236
constructor(port, baudrate) {
247
this.port = port;
@@ -36,6 +19,47 @@ class SerialReadWrite {
3619
await this.port.close();
3720
}
3821

22+
async readBytes(retryError = 5, errorNum = 0) {
23+
let reader = undefined;
24+
25+
if (this.isPortOpen === false) {
26+
await this.openPort();
27+
this.isPortOpen = true;
28+
}
29+
30+
try {
31+
if (reader === undefined) {
32+
reader = this.port.readable.getReader();
33+
}
34+
35+
const promiseResult = await reader.read();
36+
37+
if (promiseResult === undefined) {
38+
return undefined;
39+
}
40+
41+
return promiseResult.value;
42+
} catch (e) {
43+
if (e instanceof DOMException &&
44+
(e.name === "BreakError" || e.name === "FramingError" || e.name === "ParityError")) {
45+
console.log(e);
46+
47+
if (errorNum > retryError) {
48+
throw e;
49+
}
50+
51+
return await this.readBytes(retryError, errorNum++);
52+
} else {
53+
throw e;
54+
}
55+
} finally {
56+
if (reader) {
57+
reader.releaseLock();
58+
reader = undefined;
59+
}
60+
}
61+
}
62+
3963
async readLine(readCallback, timeout = undefined) {
4064
let reader = undefined;
4165
let extraChunk = "";
@@ -90,7 +114,7 @@ class SerialReadWrite {
90114
}
91115
}
92116

93-
async writeString(str) {
117+
async writeBytes(bytes) {
94118
let writer = undefined;
95119

96120
if (this.isPortOpen === false) {
@@ -103,46 +127,16 @@ class SerialReadWrite {
103127
writer = this.port.writable.getWriter();
104128
}
105129

106-
writer.write(this.textEncoder.encode(str));
130+
writer.write(bytes);
107131
} finally {
108132
if (writer) {
109133
writer.releaseLock();
110134
writer = undefined;
111135
}
112136
}
113137
}
114-
}
115-
116-
async function openPortLineBreak(port, baudRate) {
117-
await port.open({ baudRate: baudRate });
118-
const textDecoder = new TextDecoderStream();
119-
const readableStreamClosed = port.readable.pipeTo(textDecoder.writable);
120-
const reader = await textDecoder.readable.pipeThrough(new TransformStream(new LineBreakTransformer())).getReader();
121-
const textEncoderStream = new TextEncoderStream();
122-
const writerStreamClosed = textEncoderStream.readable.pipeTo(port.writable);
123-
const writer = await textEncoderStream.writable.getWriter();
124-
125-
return { reader, writer, readableStreamClosed, writerStreamClosed };
126-
}
127-
128-
async function closePortLineBreak(port, reader, writer, readableStreamClosed, writerStreamClosed) {
129-
if (reader) {
130-
reader.cancel();
131-
}
132-
133-
if (readableStreamClosed) {
134-
await readableStreamClosed.catch(() => { /* Ignore the error */ });
135-
}
136138

137-
if (writer) {
138-
writer.close();
139-
}
140-
141-
if (writerStreamClosed) {
142-
await writerStreamClosed;
143-
}
144-
145-
if (port) {
146-
await port.close();
139+
async writeString(str) {
140+
await this.writeBytes(this.textEncoder.encode(str));
147141
}
148142
}

assets/js/xymini.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ function crc16(data) {
4949
return crc;
5050
}
5151

52-
async function detectXYMini(reader) {
52+
async function detectXYMini(serial) {
5353
const textDecoder = new TextDecoder();
5454

5555
while (true) {
56-
const { value, done } = await reader.read();
56+
const value = await serial.readBytes();
5757

5858
if (value[0] == XYMINI_1K_MAGIC) {
5959
console.log("XYMini: detected");
@@ -91,14 +91,14 @@ function generateXYMiniBlock(blockId, payload) {
9191
return buf;
9292
}
9393

94-
async function sendXYMini(portReader, portWriter, data, baudRate = 115200, progressCallback) {
94+
async function sendXYMini(serial, data, progressCallback) {
9595
let blockId = 1;
9696
let size = data.length;
9797
let i = 0;
9898
let nakN = 0;
9999
let wrongCharN = 0;
100100

101-
await detectXYMini(portReader);
101+
await detectXYMini(serial);
102102

103103
while(true) {
104104
const payloadSize = Math.min(PAYLOAD_LEN, size);
@@ -107,12 +107,12 @@ async function sendXYMini(portReader, portWriter, data, baudRate = 115200, progr
107107
const payload = data.slice(i, payloadSize + i);
108108

109109
const block = generateXYMiniBlock(blockId, payload);
110-
await portWriter.write(block);
110+
await serial.writeBytes(block);
111111
} else {
112-
portWriter.write(new Uint8Array([EOF]));
112+
serial.writeBytes(new Uint8Array([EOF]));
113113
}
114114

115-
const { value, done } = await portReader.read();
115+
const value = await serial.readBytes();
116116

117117
if (value[0] == ACK) {
118118
if (!size) {

0 commit comments

Comments
 (0)