diff --git a/demo/app.jsx b/demo/app.jsx index b4c59b1e..536b016f 100644 --- a/demo/app.jsx +++ b/demo/app.jsx @@ -44,6 +44,11 @@ const handleUpload = () => { daemon.uploadSerial(target, 'serial_mirror', { bin: HEX }); }; +const handleBootloaderMode = (e, port) => { + e.preventDefault(); + daemon.setBootloaderMode(port); +}; + const handleDownloadTool = e => { e.preventDefault(); const toolname = document.getElementById('toolname'); @@ -171,6 +176,8 @@ class App extends React.Component { open - this.handleClose(e, device.Name)}> close + - handleBootloaderMode(e, device.Name)}> + bootloader mode ); diff --git a/package-lock.json b/package-lock.json index ea509188..3574eaf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "arduino-create-agent-js-client", - "version": "2.1.9", + "version": "2.1.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9a5a69de..07f8713a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-create-agent-js-client", - "version": "2.1.9", + "version": "2.1.10", "description": "JS module providing discovery of the Arduino Create Plugin and communication with it", "main": "lib/index.js", "module": "es/index.js", diff --git a/src/daemon.js b/src/daemon.js index 448d5521..4e4c508b 100644 --- a/src/daemon.js +++ b/src/daemon.js @@ -18,8 +18,12 @@ * */ -import { Subject, BehaviorSubject, interval } from 'rxjs'; -import { takeUntil, filter, startWith, first, distinctUntilChanged } from 'rxjs/operators'; +import { + Subject, BehaviorSubject, interval, timer +} from 'rxjs'; +import { + takeUntil, filter, startWith, first, distinctUntilChanged +} from 'rxjs/operators'; const POLLING_INTERVAL = 1500; @@ -161,4 +165,16 @@ export default class Daemon { throw new Error('Stop Upload not supported on Chrome OS'); } } + + /** + * Set the board in bootloader mode. This is needed to bo 100% sure to receive the correct vid/pid from the board. + * To do that we just touch the port at 1200 bps and then close it. The sketch on the board will be erased. + * @param {String} port the port name + */ + setBootloaderMode(port) { + this.serialMonitorOpened.pipe(filter(open => open)).pipe(first()).subscribe(() => { + timer(1000).subscribe(() => this.closeSerialMonitor(port)); + }); + this.openSerialMonitor(port, 1200); + } }