Skip to content

Commit 31bd1c0

Browse files
committed
WebSerial improvements (correctly shut down on disconnect so we don't hog the port)
1 parent a155e58 commit 31bd1c0

File tree

1 file changed

+29
-22
lines changed

1 file changed

+29
-22
lines changed

Diff for: core/serial_web_serial.js

+29-22
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636

3737
var serialPort;
3838
var serialPortReader;
39-
var connectionDisconnectCallback;
4039

4140
function init() {
4241
Espruino.Core.Config.add("WEB_SERIAL", {
@@ -101,8 +100,8 @@
101100
Espruino.Core.Status.setStatus("Connecting to serial port");
102101
serialPort = port;
103102
var br = parseInt(Espruino.Config.BAUD_RATE);
104-
return port.open({
105-
baudrate: br/*old*/,
103+
return port.open({
104+
baudrate: br/*old*/,
106105
baudRate: br/*new*/,
107106
dataBits: 8, databits: 8,
108107
stopBits: 1, stopbits: 8,
@@ -114,22 +113,35 @@
114113
serialPortReader = serialPort.readable.getReader();
115114
serialPortReader.read().then(function ({ value, done }) {
116115
serialPortReader.releaseLock();
116+
serialPortReader = undefined;
117117
if (value) {
118118
receiveCallback(value.buffer);
119119
}
120120
if (done) {
121-
disconnectCallback();
121+
console.log("Serial> serialPortReader done");
122+
if (serialPort) {
123+
console.log("Serial> serialPort.close()");
124+
serialPort.close();
125+
serialPort = undefined;
126+
if (disconnectCallback) disconnectCallback();
127+
disconnectCallback = undefined;
128+
}
122129
} else {
123130
readLoop();
124131
}
125-
}).catch(function() {
126-
serialPortReader.releaseLock();
127-
console.log("Serial> serialPortReader cancelled");
132+
}).catch(function(e) {
133+
serialPortReader.releaseLock();
134+
console.log("Serial> serialPortReader rejected", e);
128135
});
129136
}
130137
serialPort.addEventListener("disconnect", (event) => {
131-
console.log("Serial> Port disconnected");
132-
disconnectCallback();
138+
console.log("Serial> Port disconnected", event);
139+
if (serialPort) {
140+
serialPort.close();
141+
serialPort = undefined;
142+
}
143+
if (disconnectCallback) disconnectCallback();
144+
disconnectCallback = undefined;
133145
});
134146
readLoop();
135147
Espruino.Core.Status.setStatus("Serial connected. Receiving data...");
@@ -139,22 +151,17 @@
139151
openCallback({ portName : getSerialDeviceInfo(serialPort).path });
140152
}).catch(function(error) {
141153
console.log('Serial> ERROR: ' + error);
142-
disconnectCallback();
154+
pairedDevices = pairedDevices.filter(dev=>getSerialDeviceInfo(dev).path != path); // error connecting, remove from paired devices
155+
if (disconnectCallback) disconnectCallback();
156+
disconnectCallback = undefined;
143157
});
144158
}
145159

146160
function closeSerial() {
147-
if (serialPort) {
148-
serialPortReader.cancel().then(function() {
149-
serialPort.close();
150-
serialPort = undefined;
151-
serialPortReader = undefined;
152-
});
153-
}
154-
if (connectionDisconnectCallback) {
155-
connectionDisconnectCallback();
156-
connectionDisconnectCallback = undefined;
157-
}
161+
if (serialPortReader)
162+
serialPortReader.cancel();
163+
/* serialPortReader will handle tidying up
164+
and calling disconnect */
158165
}
159166

160167
function writeSerial(data, callback) {
@@ -166,7 +173,7 @@
166173
writer.releaseLock();
167174
console.log('Serial> SEND ERROR: ' + error);
168175
closeSerial();
169-
});
176+
});
170177
}
171178

172179
// ----------------------------------------------------------

0 commit comments

Comments
 (0)