better flow + handle unclosed connection (#921)

* better flow + handle unclosed connection

* more checks
This commit is contained in:
Peli de Halleux 2019-09-27 09:16:27 -07:00 committed by GitHub
parent d1f11059db
commit b28b5cb6b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 11 deletions

View File

@ -65,9 +65,12 @@ class WebSerialPackageIO implements pxt.HF2.PacketIO {
} }
async readSerialAsync() { async readSerialAsync() {
if (this._reader) return;
this._reader = this.port.readable.getReader(); this._reader = this.port.readable.getReader();
let buffer: Uint8Array; let buffer: Uint8Array;
while (!!this._reader) { const reader = this._reader;
while (reader === this._reader) { // will change if we recycle the connection
const { done, value } = await this._reader.read() const { done, value } = await this._reader.read()
if (!buffer) buffer = value; if (!buffer) buffer = value;
else { // concat else { // concat
@ -112,8 +115,18 @@ class WebSerialPackageIO implements pxt.HF2.PacketIO {
throw new Error(lf("error on brick ({0})", msg)) throw new Error(lf("error on brick ({0})", msg))
} }
private close() {
if (this.port.readable) {// it's open
this.port.close();
this._reader = undefined;
this._writer = undefined;
}
}
async reconnectAsync(): Promise<void> { async reconnectAsync(): Promise<void> {
if (!this._reader) { if (!this.port.readable) {
this._reader = undefined;
this._writer = undefined;
await this.port.open(this.options); await this.port.open(this.options);
this.readSerialAsync(); this.readSerialAsync();
} }
@ -121,9 +134,7 @@ class WebSerialPackageIO implements pxt.HF2.PacketIO {
} }
async disconnectAsync(): Promise<void> { async disconnectAsync(): Promise<void> {
this.port.close(); this.close();
this._reader = undefined;
this._writer = undefined;
return Promise.resolve(); return Promise.resolve();
} }
@ -157,7 +168,7 @@ export function initAsync(): Promise<void> {
useHID = true; useHID = true;
} }
if(WebSerialPackageIO.isSupported()) if (WebSerialPackageIO.isSupported())
pxt.tickEvent("bluetooth.supported"); pxt.tickEvent("bluetooth.supported");
return Promise.resolve(); return Promise.resolve();
@ -171,6 +182,8 @@ export function enableWebSerial() {
initPromise = undefined; initPromise = undefined;
useWebSerial = WebSerialPackageIO.isSupported(); useWebSerial = WebSerialPackageIO.isSupported();
useHID = useWebSerial; useHID = useWebSerial;
if (useWebSerial)
initHidAsync().done();
} }
let initPromise: Promise<Ev3Wrapper> let initPromise: Promise<Ev3Wrapper>
@ -185,7 +198,7 @@ function initHidAsync() { // needs to run within a click handler
useHID = false; useHID = false;
useWebSerial = false; useWebSerial = false;
// cleanup // cleanup
let p = ev3 ? ev3.disconnectAsync().catch(e => {}) : Promise.resolve(); let p = ev3 ? ev3.disconnectAsync().catch(e => { }) : Promise.resolve();
return p.then(() => Promise.reject(err)) return p.then(() => Promise.reject(err))
}) })
} else { } else {

View File

@ -80,7 +80,6 @@ pxt.editor.initExtensionsAsync = function (opts: pxt.editor.ExtensionOptions): P
className: "bluetooth focused", className: "bluetooth focused",
onclick: () => { onclick: () => {
pxt.tickEvent("bluetooth.enable"); pxt.tickEvent("bluetooth.enable");
enableWebSerial();
confirmAsync({ confirmAsync({
header: lf("Bluetooth enabled"), header: lf("Bluetooth enabled"),
hasCloseIcon: true, hasCloseIcon: true,
@ -93,7 +92,7 @@ pxt.editor.initExtensionsAsync = function (opts: pxt.editor.ExtensionOptions): P
}], }],
htmlBody: ` htmlBody: `
<p> <p>
${lf("Please download again to send your code to the EV3 over Bluetooth.")} ${lf("Download again to send your code to the EV3 over Bluetooth. Make sure to stop your program!")}
</p> </p>
<p> <p>
${lf("You will be prompted to select a serial port.")} ${lf("You will be prompted to select a serial port.")}
@ -101,6 +100,8 @@ ${lf("On Windows, look for 'Standard Serial over Bluetooth link'.")}
${lf("If you have paired multiple EV3, you might have to try out multiple ports until you find the correct one.")} ${lf("If you have paired multiple EV3, you might have to try out multiple ports until you find the correct one.")}
</p> </p>
` `
}).then(() => {
enableWebSerial();
}) })
} }
} : undefined, downloadAgain ? { } : undefined, downloadAgain ? {

View File

@ -310,7 +310,7 @@ void cUiUpdatePower(void)
// TODO? for now assume touch // TODO? for now assume touch
sensorInfo.devType = DAL.DEVICE_TYPE_TOUCH sensorInfo.devType = DAL.DEVICE_TYPE_TOUCH
} else if (newConn == DAL.CONN_NONE || newConn == 0) { } else if (newConn == DAL.CONN_NONE || newConn == 0) {
control.dmesg(`disconnect at port ${sensorInfo.port}`) //control.dmesg(`disconnect at port ${sensorInfo.port}`)
} else { } else {
control.dmesg(`unknown connection type: ${newConn} at ${sensorInfo.port}`) control.dmesg(`unknown connection type: ${newConn} at ${sensorInfo.port}`)
} }
@ -328,7 +328,7 @@ void cUiUpdatePower(void)
if (numChanged == 0 && nonActivated == 0) if (numChanged == 0 && nonActivated == 0)
return return
control.dmesg(`updating sensor status`) //control.dmesg(`updating sensor status`)
nonActivated = 0; nonActivated = 0;
for (const sensorInfo of sensorInfos) { for (const sensorInfo of sensorInfos) {
if (sensorInfo.devType == DAL.DEVICE_TYPE_IIC_UNKNOWN) { if (sensorInfo.devType == DAL.DEVICE_TYPE_IIC_UNKNOWN) {