diff --git a/package.json b/package.json index fd27addc..45dd7e02 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@blockly/field-bitmap": "^4.0.13", "@blockly/workspace-backpack": "^5.3.3", "@fortawesome/fontawesome-free": "^6.1.1", - "@leaphy-robotics/avrdude-webassembly": "^1.6.0", + "@leaphy-robotics/avrdude-webassembly": "^1.6.1", "@leaphy-robotics/dfu-util-wasm": "1.0.2", "@leaphy-robotics/leaphy-blocks": "2.0.3", "@leaphy-robotics/picotool-wasm": "1.0.2", diff --git a/src/app/services/arduino-uploader/protocols/avrdude/index.ts b/src/app/services/arduino-uploader/protocols/avrdude/index.ts index 4d9b496a..a27a4385 100644 --- a/src/app/services/arduino-uploader/protocols/avrdude/index.ts +++ b/src/app/services/arduino-uploader/protocols/avrdude/index.ts @@ -56,15 +56,33 @@ export default class Avrdude extends BaseProtocol { this.port.ondisconnect = resolve; }); - + const oldConsoleError = console.error; + const workerErrorPromise = new Promise((resolve) => { + console.error = (...data) => { + if (data[1].name == "ExitStatus") { + resolve({ type: "worker-error" }); + } else { + oldConsoleError(...data); + resolve({ type: "error" }); + } + }; + }); const startAvrdude = avrdude.cwrap("startAvrdude", "number", [ "string", ]); - let race = await Promise.race([disconnectPromise, startAvrdude(args)]); - // if the winner is the disconnect promise, then the port was disconnected and we should stop the other promise + let race = await Promise.race([ + disconnectPromise, + startAvrdude(args), + workerErrorPromise, + ]); + console.error = oldConsoleError; if (race.type) { - race = -2; + if (race.type == "worker-error") { + race = -3; + } else { + race = -2; + } } if (window["writeStream"]) window["writeStream"].releaseLock(); @@ -78,11 +96,16 @@ export default class Avrdude extends BaseProtocol { if (race != 0) { if (race == -2) { throw new Error("Port disconnected"); + } else if (race == -3) { + throw new Error("Worker error"); } throw new Error("Avrdude failed"); } await this.port.open({ baudRate: 115200 }); this.uploadState.statusMessage = "UPDATE_COMPLETE"; + + // if the winner is the disconnect promise, then the port was disconnected and we should stop the other promise + return; } } diff --git a/yarn.lock b/yarn.lock index d5ce1109..770a5019 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1829,10 +1829,10 @@ resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== -"@leaphy-robotics/avrdude-webassembly@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@leaphy-robotics/avrdude-webassembly/-/avrdude-webassembly-1.6.0.tgz#79f2cb12b1acc9da9b8aaf3fbdc47b9d24206bc9" - integrity sha512-/vyom0nTJ7J1/wYfp9ZdsziDIg9i5WuqxGQNssslMeecvePcUWwjkkzHhneplsmH3rcK9Ug1q6KCb+nas1U42Q== +"@leaphy-robotics/avrdude-webassembly@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@leaphy-robotics/avrdude-webassembly/-/avrdude-webassembly-1.6.1.tgz#78a9e58748130034e4443db09fbdd7870868acea" + integrity sha512-RJZVa6GN8KUC02IQkUQgMeIIjqLF9XzMSselYA3WdUQT67QriLbScd5uKiuCgHpjjzmI/FEIfKF9XSgCmuz+yg== dependencies: "@leaphy-robotics/webusb-ftdi" "^1.0.0"