diff --git a/docs/static/experiments/bluetoothPartialFlashing.png b/docs/static/experiments/bluetoothPartialFlashing.png new file mode 100644 index 00000000..6e99d685 Binary files /dev/null and b/docs/static/experiments/bluetoothPartialFlashing.png differ diff --git a/editor/extension.ts b/editor/extension.ts index 5de0b89e..4f570743 100644 --- a/editor/extension.ts +++ b/editor/extension.ts @@ -531,31 +531,27 @@ namespace pxt.editor { }) } - export function deployCoreAsync(resp: pxtc.CompileResult, d: pxt.commands.DeployOptions = {}): Promise { - const saveHexAsync = () => { - return pxt.commands.saveOnlyAsync(resp); - }; - return Promise.resolve() - .then(() => { - const isUwp = !!(window as any).Windows; - if (isUwp) { - // Go straight to flashing + function uwpDeployCoreAsync(resp: pxtc.CompileResult, d: pxt.commands.DeployOptions = {}): Promise { + // Go straight to flashing + return flashAsync(resp, d); + } + + function deployCoreAsync(resp: pxtc.CompileResult, d: pxt.commands.DeployOptions = {}): Promise { + return pxt.usb.isPairedAsync() + .then(isPaired => { + if (isPaired) { + // Already paired from earlier in the session or from previous session return flashAsync(resp, d); } - if (!pxt.usb.isEnabled) { - return saveHexAsync(); - } - return pxt.usb.isPairedAsync() - .then((isPaired) => { - if (isPaired) { - // Already paired from earlier in the session or from previous session - return flashAsync(resp, d); - } - // No device paired, prompt user - return saveHexAsync(); - }); - }) + // try bluetooth if device is paired + if (pxt.webBluetooth.isPaired()) + return pxt.webBluetooth.flashAsync(resp, d) + .catch(e => pxt.commands.saveOnlyAsync(resp)); + + // No device paired, prompt user + return pxt.commands.saveOnlyAsync(resp); + }); } /** @@ -820,7 +816,10 @@ namespace pxt.editor { subclassCode: 0x03 }]) - if (canHID()) + const isUwp = !!(window as any).Windows; + if (isUwp) + pxt.commands.deployCoreAsync = uwpDeployCoreAsync; + else if (canHID() || pxt.webBluetooth.hasPartialFlash()) pxt.commands.deployCoreAsync = deployCoreAsync; res.blocklyPatch = patchBlocks; diff --git a/libs/core/pxt.json b/libs/core/pxt.json index cca2f32f..273db610 100644 --- a/libs/core/pxt.json +++ b/libs/core/pxt.json @@ -72,7 +72,7 @@ "microbit-dal": { "bluetooth": { "open": 1, - "pairing_mode": 0, + "pairing_mode": null, "whitelist": 0, "security_level": null } @@ -98,7 +98,7 @@ "microbit-dal": { "bluetooth": { "open": 0, - "pairing_mode": 1, + "pairing_mode": null, "whitelist": 1, "security_level": "SECURITY_MODE_ENCRYPTION_WITH_MITM" } diff --git a/package.json b/package.json index 543c05e1..fcd36f1d 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,11 @@ "@types/bluebird": "2.0.33", "@types/jquery": "3.2.16", "@types/marked": "0.3.0", - "@types/node": "8.0.53" + "@types/node": "8.0.53", + "@types/web-bluetooth": "0.0.4" }, "dependencies": { "pxt-common-packages": "0.24.2", - "pxt-core": "4.1.28" + "pxt-core": "4.1.30" } } diff --git a/pxtarget.json b/pxtarget.json index 29b3f709..bcac50c6 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -275,7 +275,8 @@ "allowPackageExtensions", "instructions", "debugger", - "bluetoothUartConsole" + "bluetoothUartConsole", + "bluetoothPartialFlashing" ], "bluetoothUartFilters": [{ "namePrefix": "BBC micro:bit"