@microbit/microbit-connection 0.9.0-apps.alpha.9 → 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -27
- package/build/cjs/async-util.d.ts +3 -1
- package/build/cjs/async-util.js +5 -1
- package/build/cjs/async-util.js.map +1 -1
- package/build/cjs/availability.js.map +1 -1
- package/build/cjs/bluetooth/ble-error.d.ts +10 -0
- package/build/cjs/bluetooth/ble-error.js +47 -0
- package/build/cjs/bluetooth/ble-error.js.map +1 -0
- package/build/cjs/bluetooth/connection.d.ts +378 -0
- package/build/cjs/bluetooth/connection.js +623 -0
- package/build/cjs/bluetooth/connection.js.map +1 -0
- package/build/cjs/bluetooth/device-bond-state.d.ts +14 -0
- package/build/cjs/bluetooth/device-bond-state.js +26 -0
- package/build/cjs/bluetooth/device-bond-state.js.map +1 -0
- package/build/cjs/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +36 -21
- package/build/cjs/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +174 -147
- package/build/cjs/bluetooth/device-wrapper.js.map +1 -0
- package/build/{esm → cjs/bluetooth}/flashing/flashing-full.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.js +6 -5
- package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -0
- package/build/cjs/bluetooth/flashing/flashing-makecode.d.ts +10 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.js +5 -2
- package/build/cjs/bluetooth/flashing/flashing-makecode.js.map +1 -0
- package/build/cjs/bluetooth/flashing/flashing-partial.d.ts +10 -0
- package/build/cjs/bluetooth/flashing/flashing-partial.js +145 -0
- package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -0
- package/build/cjs/bluetooth/flashing/flashing-v1.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.js +40 -14
- package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -0
- package/build/cjs/bluetooth/flashing/zip.js.map +1 -0
- package/build/cjs/bluetooth/index.d.ts +5 -0
- package/build/cjs/bluetooth/index.js +9 -0
- package/build/cjs/bluetooth/index.js.map +1 -0
- package/build/cjs/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +8 -0
- package/build/cjs/{bluetooth-profile.js → bluetooth/profile.js} +7 -1
- package/build/cjs/bluetooth/profile.js.map +1 -0
- package/build/cjs/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
- package/build/cjs/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +17 -12
- package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/button-service.d.ts +2 -3
- package/build/cjs/{button-service.js → bluetooth/services/button-service.js} +24 -14
- package/build/cjs/bluetooth/services/button-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/device-information-service.d.ts +1 -1
- package/build/cjs/bluetooth/services/device-information-service.js +29 -0
- package/build/cjs/bluetooth/services/device-information-service.js.map +1 -0
- package/build/cjs/{dfu-service.js → bluetooth/services/dfu-service.js} +2 -2
- package/build/cjs/bluetooth/services/dfu-service.js.map +1 -0
- package/build/cjs/bluetooth/services/event-service.d.ts +48 -0
- package/build/cjs/bluetooth/services/event-service.js +273 -0
- package/build/cjs/bluetooth/services/event-service.js.map +1 -0
- package/build/cjs/bluetooth/services/io-pin-service.d.ts +65 -0
- package/build/cjs/bluetooth/services/io-pin-service.js +173 -0
- package/build/cjs/bluetooth/services/io-pin-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/led-service.d.ts +2 -3
- package/build/cjs/{led-service.js → bluetooth/services/led-service.js} +10 -7
- package/build/cjs/bluetooth/services/led-service.js.map +1 -0
- package/build/cjs/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
- package/build/cjs/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +19 -14
- package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/partial-flashing-service.d.ts +1 -1
- package/build/cjs/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +8 -8
- package/build/cjs/bluetooth/services/partial-flashing-service.js.map +1 -0
- package/build/cjs/bluetooth/services/temperature-service.d.ts +14 -0
- package/build/cjs/bluetooth/services/temperature-service.js +80 -0
- package/build/cjs/bluetooth/services/temperature-service.js.map +1 -0
- package/build/cjs/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
- package/build/cjs/{uart-service.js → bluetooth/services/uart-service.js} +21 -9
- package/build/cjs/bluetooth/services/uart-service.js.map +1 -0
- package/build/cjs/board-id.d.ts +1 -1
- package/build/cjs/board-id.js.map +1 -1
- package/build/cjs/device.d.ts +191 -101
- package/build/cjs/device.js +47 -110
- package/build/cjs/device.js.map +1 -1
- package/build/cjs/events.d.ts +8 -108
- package/build/cjs/events.js +27 -88
- package/build/cjs/events.js.map +1 -1
- package/build/cjs/hex-util.d.ts +1 -0
- package/build/cjs/hex-util.js +15 -0
- package/build/cjs/hex-util.js.map +1 -0
- package/build/cjs/index.d.ts +8 -16
- package/build/cjs/index.js +9 -28
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/logging.js.map +1 -1
- package/build/cjs/microbit-events.d.ts +67 -0
- package/build/cjs/microbit-events.js +55 -0
- package/build/cjs/microbit-events.js.map +1 -0
- package/build/cjs/radio-bridge/connection.d.ts +52 -0
- package/build/cjs/{usb-radio-bridge.js → radio-bridge/connection.js} +84 -96
- package/build/cjs/radio-bridge/connection.js.map +1 -0
- package/build/cjs/radio-bridge/index.d.ts +4 -0
- package/build/cjs/radio-bridge/index.js +9 -0
- package/build/cjs/radio-bridge/index.js.map +1 -0
- package/build/cjs/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
- package/build/cjs/radio-bridge/serial-protocol.js.map +1 -0
- package/build/cjs/service-events.d.ts +92 -15
- package/build/cjs/service-events.js +6 -36
- package/build/cjs/service-events.js.map +1 -1
- package/build/{esm/hex-flash-data-source.d.ts → cjs/universal-hex/flash-data-source.d.ts} +1 -1
- package/build/cjs/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -3
- package/build/cjs/universal-hex/flash-data-source.js.map +1 -0
- package/build/cjs/universal-hex/index.d.ts +4 -0
- package/build/cjs/universal-hex/index.js +9 -0
- package/build/cjs/universal-hex/index.js.map +1 -0
- package/build/cjs/usb/arm-debug.d.ts +137 -0
- package/build/cjs/usb/arm-debug.js +414 -0
- package/build/cjs/usb/arm-debug.js.map +1 -0
- package/build/{esm → cjs/usb}/board-serial-info.d.ts +2 -1
- package/build/cjs/{board-serial-info.js → usb/board-serial-info.js} +10 -7
- package/build/cjs/usb/board-serial-info.js.map +1 -0
- package/build/cjs/usb/cdc-saturation.d.ts +36 -0
- package/build/cjs/usb/cdc-saturation.js +151 -0
- package/build/cjs/usb/cdc-saturation.js.map +1 -0
- package/build/cjs/usb/cmsis-dap.d.ts +113 -0
- package/build/cjs/usb/cmsis-dap.js +349 -0
- package/build/cjs/usb/cmsis-dap.js.map +1 -0
- package/build/cjs/usb/connection.d.ts +96 -0
- package/build/cjs/{usb.js → usb/connection.js} +257 -173
- package/build/cjs/usb/connection.js.map +1 -0
- package/build/cjs/usb/cortex-m.d.ts +72 -0
- package/build/cjs/usb/cortex-m.js +165 -0
- package/build/cjs/usb/cortex-m.js.map +1 -0
- package/build/cjs/usb/daplink.d.ts +69 -0
- package/build/cjs/usb/daplink.js +238 -0
- package/build/cjs/usb/daplink.js.map +1 -0
- package/build/cjs/usb/device-wrapper.d.ts +34 -0
- package/build/cjs/usb/device-wrapper.js +102 -0
- package/build/cjs/usb/device-wrapper.js.map +1 -0
- package/build/cjs/usb/index.d.ts +5 -0
- package/build/cjs/usb/index.js +10 -0
- package/build/cjs/usb/index.js.map +1 -0
- package/build/{esm/usb-partial-flashing-utils.d.ts → cjs/usb/partial-flashing-utils.d.ts} +6 -9
- package/build/cjs/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +6 -49
- package/build/cjs/usb/partial-flashing-utils.js.map +1 -0
- package/build/{esm/usb-partial-flashing.d.ts → cjs/usb/partial-flashing.d.ts} +37 -11
- package/build/cjs/{usb-partial-flashing.js → usb/partial-flashing.js} +170 -134
- package/build/cjs/usb/partial-flashing.js.map +1 -0
- package/build/cjs/usb/promise-queue.js.map +1 -0
- package/build/cjs/usb/serial-events.d.ts +16 -0
- package/build/cjs/{led.js → usb/serial-events.js} +1 -1
- package/build/cjs/usb/serial-events.js.map +1 -0
- package/build/cjs/usb/transport.d.ts +42 -0
- package/build/cjs/usb/transport.js +155 -0
- package/build/cjs/usb/transport.js.map +1 -0
- package/build/esm/async-util.d.ts +3 -1
- package/build/esm/async-util.js +5 -1
- package/build/esm/async-util.js.map +1 -1
- package/build/esm/availability.js.map +1 -1
- package/build/esm/bluetooth/ble-error.d.ts +10 -0
- package/build/esm/bluetooth/ble-error.js +42 -0
- package/build/esm/bluetooth/ble-error.js.map +1 -0
- package/build/esm/bluetooth/connection.d.ts +378 -0
- package/build/esm/bluetooth/connection.js +593 -0
- package/build/esm/bluetooth/connection.js.map +1 -0
- package/build/esm/bluetooth/device-bond-state.d.ts +14 -0
- package/build/esm/bluetooth/device-bond-state.js +22 -0
- package/build/esm/bluetooth/device-bond-state.js.map +1 -0
- package/build/esm/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +36 -21
- package/build/esm/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +172 -146
- package/build/esm/bluetooth/device-wrapper.js.map +1 -0
- package/build/{cjs → esm/bluetooth}/flashing/flashing-full.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/flashing-full.js +6 -5
- package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -0
- package/build/esm/bluetooth/flashing/flashing-makecode.d.ts +10 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.js +5 -2
- package/build/esm/bluetooth/flashing/flashing-makecode.js.map +1 -0
- package/build/esm/bluetooth/flashing/flashing-partial.d.ts +10 -0
- package/build/esm/bluetooth/flashing/flashing-partial.js +142 -0
- package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -0
- package/build/esm/bluetooth/flashing/flashing-v1.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.js +40 -14
- package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -0
- package/build/esm/bluetooth/flashing/zip.js.map +1 -0
- package/build/esm/bluetooth/index.d.ts +5 -0
- package/build/esm/bluetooth/index.js +5 -0
- package/build/esm/bluetooth/index.js.map +1 -0
- package/build/esm/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +8 -0
- package/build/esm/{bluetooth-profile.js → bluetooth/profile.js} +7 -1
- package/build/{cjs/bluetooth-profile.js.map → esm/bluetooth/profile.js.map} +1 -1
- package/build/esm/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
- package/build/esm/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +11 -6
- package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/button-service.d.ts +2 -3
- package/build/esm/{button-service.js → bluetooth/services/button-service.js} +20 -10
- package/build/esm/bluetooth/services/button-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/device-information-service.d.ts +1 -1
- package/build/esm/bluetooth/services/device-information-service.js +25 -0
- package/build/esm/bluetooth/services/device-information-service.js.map +1 -0
- package/build/esm/{dfu-service.js → bluetooth/services/dfu-service.js} +1 -1
- package/build/esm/bluetooth/services/dfu-service.js.map +1 -0
- package/build/esm/bluetooth/services/event-service.d.ts +48 -0
- package/build/esm/bluetooth/services/event-service.js +269 -0
- package/build/esm/bluetooth/services/event-service.js.map +1 -0
- package/build/esm/bluetooth/services/io-pin-service.d.ts +65 -0
- package/build/esm/bluetooth/services/io-pin-service.js +169 -0
- package/build/esm/bluetooth/services/io-pin-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/led-service.d.ts +2 -3
- package/build/esm/{led-service.js → bluetooth/services/led-service.js} +4 -1
- package/build/esm/bluetooth/services/led-service.js.map +1 -0
- package/build/esm/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
- package/build/esm/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +11 -6
- package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/partial-flashing-service.d.ts +1 -1
- package/build/esm/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +4 -4
- package/build/esm/bluetooth/services/partial-flashing-service.js.map +1 -0
- package/build/esm/bluetooth/services/temperature-service.d.ts +14 -0
- package/build/esm/bluetooth/services/temperature-service.js +76 -0
- package/build/esm/bluetooth/services/temperature-service.js.map +1 -0
- package/build/esm/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
- package/build/esm/{uart-service.js → bluetooth/services/uart-service.js} +18 -6
- package/build/esm/bluetooth/services/uart-service.js.map +1 -0
- package/build/esm/board-id.d.ts +1 -1
- package/build/esm/board-id.js.map +1 -1
- package/build/esm/device.d.ts +191 -101
- package/build/esm/device.js +45 -104
- package/build/esm/device.js.map +1 -1
- package/build/esm/events.d.ts +8 -108
- package/build/esm/events.js +26 -86
- package/build/esm/events.js.map +1 -1
- package/build/esm/hex-util.d.ts +1 -0
- package/build/esm/hex-util.js +11 -0
- package/build/esm/hex-util.js.map +1 -0
- package/build/esm/index.d.ts +8 -16
- package/build/esm/index.js +7 -11
- package/build/esm/index.js.map +1 -1
- package/build/esm/logging.js.map +1 -1
- package/build/esm/microbit-events.d.ts +67 -0
- package/build/esm/microbit-events.js +52 -0
- package/build/esm/microbit-events.js.map +1 -0
- package/build/esm/radio-bridge/connection.d.ts +52 -0
- package/build/esm/{usb-radio-bridge.js → radio-bridge/connection.js} +84 -96
- package/build/esm/radio-bridge/connection.js.map +1 -0
- package/build/esm/radio-bridge/index.d.ts +4 -0
- package/build/esm/radio-bridge/index.js +5 -0
- package/build/esm/radio-bridge/index.js.map +1 -0
- package/build/esm/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
- package/build/esm/radio-bridge/serial-protocol.js.map +1 -0
- package/build/esm/service-events.d.ts +92 -15
- package/build/esm/service-events.js +5 -34
- package/build/esm/service-events.js.map +1 -1
- package/build/{cjs/hex-flash-data-source.d.ts → esm/universal-hex/flash-data-source.d.ts} +1 -1
- package/build/esm/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -3
- package/build/esm/universal-hex/flash-data-source.js.map +1 -0
- package/build/esm/universal-hex/index.d.ts +4 -0
- package/build/esm/universal-hex/index.js +5 -0
- package/build/esm/universal-hex/index.js.map +1 -0
- package/build/esm/usb/arm-debug.d.ts +137 -0
- package/build/esm/usb/arm-debug.js +409 -0
- package/build/esm/usb/arm-debug.js.map +1 -0
- package/build/{cjs → esm/usb}/board-serial-info.d.ts +2 -1
- package/build/esm/{board-serial-info.js → usb/board-serial-info.js} +10 -7
- package/build/esm/usb/board-serial-info.js.map +1 -0
- package/build/esm/usb/cdc-saturation.d.ts +36 -0
- package/build/esm/usb/cdc-saturation.js +148 -0
- package/build/esm/usb/cdc-saturation.js.map +1 -0
- package/build/esm/usb/cmsis-dap.d.ts +113 -0
- package/build/esm/usb/cmsis-dap.js +342 -0
- package/build/esm/usb/cmsis-dap.js.map +1 -0
- package/build/esm/usb/connection.d.ts +96 -0
- package/build/esm/{usb.js → usb/connection.js} +253 -168
- package/build/esm/usb/connection.js.map +1 -0
- package/build/esm/usb/cortex-m.d.ts +72 -0
- package/build/esm/usb/cortex-m.js +161 -0
- package/build/esm/usb/cortex-m.js.map +1 -0
- package/build/esm/usb/daplink.d.ts +69 -0
- package/build/esm/usb/daplink.js +231 -0
- package/build/esm/usb/daplink.js.map +1 -0
- package/build/esm/usb/device-wrapper.d.ts +34 -0
- package/build/esm/usb/device-wrapper.js +98 -0
- package/build/esm/usb/device-wrapper.js.map +1 -0
- package/build/esm/usb/index.d.ts +5 -0
- package/build/esm/usb/index.js +5 -0
- package/build/esm/usb/index.js.map +1 -0
- package/build/{cjs/usb-partial-flashing-utils.d.ts → esm/usb/partial-flashing-utils.d.ts} +6 -9
- package/build/esm/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +4 -44
- package/build/esm/usb/partial-flashing-utils.js.map +1 -0
- package/build/{cjs/usb-partial-flashing.d.ts → esm/usb/partial-flashing.d.ts} +37 -11
- package/build/esm/{usb-partial-flashing.js → usb/partial-flashing.js} +169 -110
- package/build/esm/usb/partial-flashing.js.map +1 -0
- package/build/esm/usb/promise-queue.js.map +1 -0
- package/build/esm/usb/serial-events.d.ts +16 -0
- package/build/esm/usb/serial-events.js +2 -0
- package/build/esm/usb/serial-events.js.map +1 -0
- package/build/esm/usb/transport.d.ts +42 -0
- package/build/esm/usb/transport.js +151 -0
- package/build/esm/usb/transport.js.map +1 -0
- package/package.json +61 -14
- package/build/cjs/accelerometer-service.js.map +0 -1
- package/build/cjs/accelerometer.d.ts +0 -9
- package/build/cjs/accelerometer.js +0 -16
- package/build/cjs/accelerometer.js.map +0 -1
- package/build/cjs/bluetooth-device-wrapper.js.map +0 -1
- package/build/cjs/bluetooth.d.ts +0 -112
- package/build/cjs/bluetooth.js +0 -457
- package/build/cjs/bluetooth.js.map +0 -1
- package/build/cjs/board-serial-info.js.map +0 -1
- package/build/cjs/button-service.js.map +0 -1
- package/build/cjs/buttons.d.ts +0 -10
- package/build/cjs/buttons.js +0 -22
- package/build/cjs/buttons.js.map +0 -1
- package/build/cjs/constants.d.ts +0 -48
- package/build/cjs/constants.js +0 -73
- package/build/cjs/constants.js.map +0 -1
- package/build/cjs/device-information-service.js +0 -34
- package/build/cjs/device-information-service.js.map +0 -1
- package/build/cjs/dfu-service.js.map +0 -1
- package/build/cjs/flashing/flashing-full.js.map +0 -1
- package/build/cjs/flashing/flashing-makecode.d.ts +0 -6
- package/build/cjs/flashing/flashing-makecode.js.map +0 -1
- package/build/cjs/flashing/flashing-partial.d.ts +0 -9
- package/build/cjs/flashing/flashing-partial.js +0 -98
- package/build/cjs/flashing/flashing-partial.js.map +0 -1
- package/build/cjs/flashing/flashing-v1.js.map +0 -1
- package/build/cjs/flashing/nordic-dfu.js.map +0 -1
- package/build/cjs/flashing/zip.js.map +0 -1
- package/build/cjs/hex-flash-data-source.js.map +0 -1
- package/build/cjs/led-service.js.map +0 -1
- package/build/cjs/led.d.ts +0 -6
- package/build/cjs/led.js.map +0 -1
- package/build/cjs/magnetometer-service.js.map +0 -1
- package/build/cjs/magnetometer.d.ts +0 -9
- package/build/cjs/magnetometer.js +0 -16
- package/build/cjs/magnetometer.js.map +0 -1
- package/build/cjs/partial-flashing-service.js.map +0 -1
- package/build/cjs/promise-queue.js.map +0 -1
- package/build/cjs/serial-events.d.ts +0 -20
- package/build/cjs/serial-events.js +0 -69
- package/build/cjs/serial-events.js.map +0 -1
- package/build/cjs/setupTests.d.ts +0 -6
- package/build/cjs/setupTests.js.map +0 -1
- package/build/cjs/uart-service.js.map +0 -1
- package/build/cjs/uart.d.ts +0 -4
- package/build/cjs/uart.js +0 -16
- package/build/cjs/uart.js.map +0 -1
- package/build/cjs/usb-device-wrapper.d.ts +0 -47
- package/build/cjs/usb-device-wrapper.js +0 -437
- package/build/cjs/usb-device-wrapper.js.map +0 -1
- package/build/cjs/usb-partial-flashing-utils.js.map +0 -1
- package/build/cjs/usb-partial-flashing.js.map +0 -1
- package/build/cjs/usb-radio-bridge.d.ts +0 -24
- package/build/cjs/usb-radio-bridge.js.map +0 -1
- package/build/cjs/usb-serial-protocol.js.map +0 -1
- package/build/cjs/usb.d.ts +0 -66
- package/build/cjs/usb.js.map +0 -1
- package/build/esm/accelerometer-service.js.map +0 -1
- package/build/esm/accelerometer.d.ts +0 -9
- package/build/esm/accelerometer.js +0 -12
- package/build/esm/accelerometer.js.map +0 -1
- package/build/esm/bluetooth-device-wrapper.js.map +0 -1
- package/build/esm/bluetooth-profile.js.map +0 -1
- package/build/esm/bluetooth.d.ts +0 -112
- package/build/esm/bluetooth.js +0 -427
- package/build/esm/bluetooth.js.map +0 -1
- package/build/esm/board-serial-info.js.map +0 -1
- package/build/esm/button-service.js.map +0 -1
- package/build/esm/buttons.d.ts +0 -10
- package/build/esm/buttons.js +0 -18
- package/build/esm/buttons.js.map +0 -1
- package/build/esm/constants.d.ts +0 -48
- package/build/esm/constants.js +0 -70
- package/build/esm/constants.js.map +0 -1
- package/build/esm/device-information-service.js +0 -30
- package/build/esm/device-information-service.js.map +0 -1
- package/build/esm/dfu-service.js.map +0 -1
- package/build/esm/flashing/flashing-full.js.map +0 -1
- package/build/esm/flashing/flashing-makecode.d.ts +0 -6
- package/build/esm/flashing/flashing-makecode.js.map +0 -1
- package/build/esm/flashing/flashing-partial.d.ts +0 -9
- package/build/esm/flashing/flashing-partial.js +0 -95
- package/build/esm/flashing/flashing-partial.js.map +0 -1
- package/build/esm/flashing/flashing-v1.js.map +0 -1
- package/build/esm/flashing/nordic-dfu.js.map +0 -1
- package/build/esm/flashing/zip.js.map +0 -1
- package/build/esm/hex-flash-data-source.js.map +0 -1
- package/build/esm/led-service.js.map +0 -1
- package/build/esm/led.d.ts +0 -6
- package/build/esm/led.js +0 -2
- package/build/esm/led.js.map +0 -1
- package/build/esm/magnetometer-service.js.map +0 -1
- package/build/esm/magnetometer.d.ts +0 -9
- package/build/esm/magnetometer.js +0 -12
- package/build/esm/magnetometer.js.map +0 -1
- package/build/esm/partial-flashing-service.js.map +0 -1
- package/build/esm/promise-queue.js.map +0 -1
- package/build/esm/serial-events.d.ts +0 -20
- package/build/esm/serial-events.js +0 -61
- package/build/esm/serial-events.js.map +0 -1
- package/build/esm/setupTests.d.ts +0 -6
- package/build/esm/setupTests.js.map +0 -1
- package/build/esm/uart-service.js.map +0 -1
- package/build/esm/uart.d.ts +0 -4
- package/build/esm/uart.js +0 -12
- package/build/esm/uart.js.map +0 -1
- package/build/esm/usb-device-wrapper.d.ts +0 -47
- package/build/esm/usb-device-wrapper.js +0 -410
- package/build/esm/usb-device-wrapper.js.map +0 -1
- package/build/esm/usb-partial-flashing-utils.js.map +0 -1
- package/build/esm/usb-partial-flashing.js.map +0 -1
- package/build/esm/usb-radio-bridge.d.ts +0 -24
- package/build/esm/usb-radio-bridge.js.map +0 -1
- package/build/esm/usb-serial-protocol.js.map +0 -1
- package/build/esm/usb.d.ts +0 -66
- package/build/esm/usb.js.map +0 -1
- package/typedoc.json +0 -14
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.js +0 -0
- /package/build/cjs/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
- /package/build/cjs/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
- /package/build/cjs/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
- /package/build/cjs/{promise-queue.js → usb/promise-queue.js} +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.js +0 -0
- /package/build/esm/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
- /package/build/esm/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
- /package/build/esm/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
- /package/build/esm/{promise-queue.js → usb/promise-queue.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-service.js","sourceRoot":"","sources":["../../../../src/bluetooth/services/button-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAMxC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,OAAO,aAAa;IAGxB,YACU,QAAgB,EAChB,kBAA+C;QADvD;;;;mBAAQ,QAAQ;WAAQ;QACxB;;;;mBAAQ,kBAAkB;WAA6B;QAJzD;;;;mBAAO,OAAO,CAAC,MAAM,CAAC,EAAE;WAAC;IAKtB,CAAC;IAEJ,iBAAiB;QACf,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAuB;QAC9C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,gBAAgB,CAAC;YACtB,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,kBAAkB,CAChC,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,EAAE,EAC9C,CAAC,KAAK,EAAE,EAAE;wBACR,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAgB,CAAC;wBAC/C,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;4BAC5B,MAAM,EAAE,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;4BAC7C,KAAK;yBACN,CAAC,CAAC;oBACL,CAAC,CACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;wBACzC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;wBACrB,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAuB;QAC7C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,gBAAgB,CAAC;YACtB,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,iBAAiB,CAC/B,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,EAAE,CAC/C,CAAC;gBACJ,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;wBACzC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;wBACrB,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gCAAgC,CACtC,IAAyC;QAEzC,OAAO,IAAI,KAAK,gBAAgB;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAClC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BleClient } from "@capacitor-community/bluetooth-le";
|
|
2
|
+
import { profile } from "../profile.js";
|
|
3
|
+
export class DeviceInformationService {
|
|
4
|
+
constructor(deviceId) {
|
|
5
|
+
Object.defineProperty(this, "deviceId", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true,
|
|
9
|
+
value: deviceId
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
async getBoardVersion() {
|
|
13
|
+
const serviceMeta = profile.deviceInformation;
|
|
14
|
+
const modelNumberBytes = await BleClient.read(this.deviceId, serviceMeta.id, serviceMeta.characteristics.modelNumber.id);
|
|
15
|
+
const modelNumber = new TextDecoder().decode(modelNumberBytes);
|
|
16
|
+
if (modelNumber.toLowerCase() === "BBC micro:bit".toLowerCase()) {
|
|
17
|
+
return "V1";
|
|
18
|
+
}
|
|
19
|
+
if (modelNumber.toLowerCase().includes("BBC micro:bit v2".toLowerCase())) {
|
|
20
|
+
return "V2";
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`Unexpected model number: ${modelNumber}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=device-information-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-information-service.js","sourceRoot":"","sources":["../../../../src/bluetooth/services/device-information-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,wBAAwB;IACnC,YAAoB,QAAgB;QAAxB;;;;mBAAQ,QAAQ;WAAQ;IAAG,CAAC;IAExC,KAAK,CAAC,eAAe;QACnB,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAC9C,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,IAAI,CAC3C,IAAI,CAAC,QAAQ,EACb,WAAW,CAAC,EAAE,EACd,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAC3C,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BleClient, numbersToDataView, } from "@capacitor-community/bluetooth-le";
|
|
2
|
-
import { profile } from "
|
|
2
|
+
import { profile } from "../profile.js";
|
|
3
3
|
// This is the service that should be available on V1 after the reboot.
|
|
4
4
|
// We don't use it directly (the Nordic DFU library does) but we check it's there.
|
|
5
5
|
export const NORDIC_DFU_SERVICE = "00001530-1212-EFDE-1523-785FEABCD123";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfu-service.js","sourceRoot":"","sources":["../../../../src/bluetooth/services/dfu-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,iBAAiB,GAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,uEAAuE;AACvE,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG,sCAAsC,CAAC;AAEzE,MAAM,OAAO,UAAU;IACrB,YAAoB,QAAgB;QAAxB;;;;mBAAQ,QAAQ;WAAQ;IAAG,CAAC;IAExC;;OAEG;IACH,KAAK,CAAC,yBAAyB;QAC7B,MAAM,SAAS,CAAC,KAAK,CACnB,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,UAAU,CAAC,EAAE,EACrB,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,EAC7C,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAC1B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Service } from "../device-wrapper.js";
|
|
2
|
+
import { TypedServiceEvent, TypedServiceEventDispatcher } from "../../service-events.js";
|
|
3
|
+
import { BoardVersion } from "../../device.js";
|
|
4
|
+
export declare class EventService implements Service {
|
|
5
|
+
private deviceId;
|
|
6
|
+
private dispatchTypedEvent;
|
|
7
|
+
private getBoardVersion;
|
|
8
|
+
uuid: string;
|
|
9
|
+
private activeEventTypes;
|
|
10
|
+
/**
|
|
11
|
+
* Filters registered via named events (gestures, buttons), keyed as "source:value".
|
|
12
|
+
* Persists across reconnects so we can replay them.
|
|
13
|
+
*/
|
|
14
|
+
private namedRequirements;
|
|
15
|
+
/**
|
|
16
|
+
* Filters registered via explicit {@link subscribeToEvent} calls, keyed as "source:value".
|
|
17
|
+
* Only events matching these are dispatched as `microbitevent`.
|
|
18
|
+
* Persists across reconnects so we can replay them.
|
|
19
|
+
*/
|
|
20
|
+
private explicitSubscriptions;
|
|
21
|
+
/**
|
|
22
|
+
* Tracks which named event types contributed which filter keys,
|
|
23
|
+
* so we can clean up when a named event is stopped.
|
|
24
|
+
*/
|
|
25
|
+
private namedEventFilters;
|
|
26
|
+
constructor(deviceId: string, dispatchTypedEvent: TypedServiceEventDispatcher, getBoardVersion: () => BoardVersion | undefined);
|
|
27
|
+
getRelevantEvents(): TypedServiceEvent[];
|
|
28
|
+
startNotifications(type: TypedServiceEvent): Promise<void>;
|
|
29
|
+
stopNotifications(type: TypedServiceEvent): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Register interest in a specific micro:bit message bus event.
|
|
32
|
+
* Tells the micro:bit to forward matching message bus traffic over BLE.
|
|
33
|
+
* Matching events are dispatched as `microbitevent`.
|
|
34
|
+
* Use 0 as the value to match all events from a source.
|
|
35
|
+
*/
|
|
36
|
+
subscribeToEvent(source: number, value: number): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Send an event to the micro:bit's message bus.
|
|
39
|
+
*/
|
|
40
|
+
sendEvent(source: number, value: number): Promise<void>;
|
|
41
|
+
private handleNotification;
|
|
42
|
+
private demuxToNamedEvents;
|
|
43
|
+
private writeRequirementsForNamedEvent;
|
|
44
|
+
private matchesExplicitSubscription;
|
|
45
|
+
private replayAllRequirements;
|
|
46
|
+
private writeClientRequirement;
|
|
47
|
+
private getSourceIds;
|
|
48
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { BleClient } from "@capacitor-community/bluetooth-le";
|
|
2
|
+
import { profile } from "../profile.js";
|
|
3
|
+
import { mapBleError } from "../ble-error.js";
|
|
4
|
+
import { EventSource, V2Source, } from "../../microbit-events.js";
|
|
5
|
+
const NAMED_EVENTS = [
|
|
6
|
+
"gesturechanged",
|
|
7
|
+
"buttonaaction",
|
|
8
|
+
"buttonbaction",
|
|
9
|
+
"buttonabaction",
|
|
10
|
+
"logoaction",
|
|
11
|
+
];
|
|
12
|
+
function isNamedEvent(type) {
|
|
13
|
+
return NAMED_EVENTS.includes(type);
|
|
14
|
+
}
|
|
15
|
+
export class EventService {
|
|
16
|
+
constructor(deviceId, dispatchTypedEvent, getBoardVersion) {
|
|
17
|
+
Object.defineProperty(this, "deviceId", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: deviceId
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "dispatchTypedEvent", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: dispatchTypedEvent
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(this, "getBoardVersion", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true,
|
|
33
|
+
value: getBoardVersion
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(this, "uuid", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
value: profile.event.id
|
|
40
|
+
});
|
|
41
|
+
Object.defineProperty(this, "activeEventTypes", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: true,
|
|
45
|
+
value: new Set()
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Filters registered via named events (gestures, buttons), keyed as "source:value".
|
|
49
|
+
* Persists across reconnects so we can replay them.
|
|
50
|
+
*/
|
|
51
|
+
Object.defineProperty(this, "namedRequirements", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
configurable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
value: new Set()
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* Filters registered via explicit {@link subscribeToEvent} calls, keyed as "source:value".
|
|
59
|
+
* Only events matching these are dispatched as `microbitevent`.
|
|
60
|
+
* Persists across reconnects so we can replay them.
|
|
61
|
+
*/
|
|
62
|
+
Object.defineProperty(this, "explicitSubscriptions", {
|
|
63
|
+
enumerable: true,
|
|
64
|
+
configurable: true,
|
|
65
|
+
writable: true,
|
|
66
|
+
value: new Set()
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Tracks which named event types contributed which filter keys,
|
|
70
|
+
* so we can clean up when a named event is stopped.
|
|
71
|
+
*/
|
|
72
|
+
Object.defineProperty(this, "namedEventFilters", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
configurable: true,
|
|
75
|
+
writable: true,
|
|
76
|
+
value: new Map()
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
getRelevantEvents() {
|
|
80
|
+
return [
|
|
81
|
+
"gesturechanged",
|
|
82
|
+
"buttonaaction",
|
|
83
|
+
"buttonbaction",
|
|
84
|
+
"buttonabaction",
|
|
85
|
+
"logoaction",
|
|
86
|
+
"microbitevent",
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
async startNotifications(type) {
|
|
90
|
+
if (!this.getRelevantEvents().includes(type)) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.activeEventTypes.add(type);
|
|
94
|
+
try {
|
|
95
|
+
// Always (re-)register the BLE notification. After a reconnect the
|
|
96
|
+
// previous subscription is gone even though the service instance is
|
|
97
|
+
// reused, so we cannot skip this.
|
|
98
|
+
await BleClient.startNotifications(this.deviceId, profile.event.id, profile.event.characteristics.microBitEvent.id, (value) => this.handleNotification(value));
|
|
99
|
+
if (isNamedEvent(type)) {
|
|
100
|
+
this.writeRequirementsForNamedEvent(type);
|
|
101
|
+
}
|
|
102
|
+
// Replay all filters (handles reconnect case where the micro:bit
|
|
103
|
+
// has lost its listener registrations).
|
|
104
|
+
await this.replayAllRequirements();
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
this.dispatchTypedEvent("backgrounderror", {
|
|
108
|
+
error: mapBleError(e),
|
|
109
|
+
event: type,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async stopNotifications(type) {
|
|
114
|
+
if (!this.getRelevantEvents().includes(type)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.activeEventTypes.delete(type);
|
|
118
|
+
// Remove filters contributed by this named event type
|
|
119
|
+
if (isNamedEvent(type)) {
|
|
120
|
+
const keys = this.namedEventFilters.get(type) ?? [];
|
|
121
|
+
for (const key of keys) {
|
|
122
|
+
this.namedRequirements.delete(key);
|
|
123
|
+
}
|
|
124
|
+
this.namedEventFilters.delete(type);
|
|
125
|
+
}
|
|
126
|
+
if (this.activeEventTypes.size === 0) {
|
|
127
|
+
try {
|
|
128
|
+
await BleClient.stopNotifications(this.deviceId, profile.event.id, profile.event.characteristics.microBitEvent.id);
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
this.dispatchTypedEvent("backgrounderror", {
|
|
132
|
+
error: mapBleError(e),
|
|
133
|
+
event: type,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Register interest in a specific micro:bit message bus event.
|
|
140
|
+
* Tells the micro:bit to forward matching message bus traffic over BLE.
|
|
141
|
+
* Matching events are dispatched as `microbitevent`.
|
|
142
|
+
* Use 0 as the value to match all events from a source.
|
|
143
|
+
*/
|
|
144
|
+
async subscribeToEvent(source, value) {
|
|
145
|
+
const key = filterKey(source, value);
|
|
146
|
+
if (!this.explicitSubscriptions.has(key)) {
|
|
147
|
+
this.explicitSubscriptions.add(key);
|
|
148
|
+
await this.writeClientRequirement(source, value);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Send an event to the micro:bit's message bus.
|
|
153
|
+
*/
|
|
154
|
+
async sendEvent(source, value) {
|
|
155
|
+
const data = new DataView(new ArrayBuffer(4));
|
|
156
|
+
data.setUint16(0, source, true);
|
|
157
|
+
data.setUint16(2, value, true);
|
|
158
|
+
await BleClient.writeWithoutResponse(this.deviceId, profile.event.id, profile.event.characteristics.clientEvent.id, data);
|
|
159
|
+
}
|
|
160
|
+
handleNotification(dataView) {
|
|
161
|
+
for (let offset = 0; offset + 4 <= dataView.byteLength; offset += 4) {
|
|
162
|
+
const source = dataView.getUint16(offset, true);
|
|
163
|
+
const value = dataView.getUint16(offset + 2, true);
|
|
164
|
+
if (this.activeEventTypes.has("microbitevent") &&
|
|
165
|
+
this.matchesExplicitSubscription(source, value)) {
|
|
166
|
+
this.dispatchTypedEvent("microbitevent", { source, value });
|
|
167
|
+
}
|
|
168
|
+
this.demuxToNamedEvents(source, value);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
demuxToNamedEvents(source, value) {
|
|
172
|
+
const src = this.getSourceIds();
|
|
173
|
+
if (!src)
|
|
174
|
+
return;
|
|
175
|
+
if (source === src.Gesture && this.activeEventTypes.has("gesturechanged")) {
|
|
176
|
+
this.dispatchTypedEvent("gesturechanged", {
|
|
177
|
+
gesture: value,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
if (source === src.ButtonA && this.activeEventTypes.has("buttonaaction")) {
|
|
181
|
+
this.dispatchTypedEvent("buttonaaction", {
|
|
182
|
+
button: "A",
|
|
183
|
+
action: value,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
if (source === src.ButtonB && this.activeEventTypes.has("buttonbaction")) {
|
|
187
|
+
this.dispatchTypedEvent("buttonbaction", {
|
|
188
|
+
button: "B",
|
|
189
|
+
action: value,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if (source === src.ButtonAB &&
|
|
193
|
+
this.activeEventTypes.has("buttonabaction")) {
|
|
194
|
+
this.dispatchTypedEvent("buttonabaction", {
|
|
195
|
+
button: "AB",
|
|
196
|
+
action: value,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
if (source === V2Source.Logo && this.activeEventTypes.has("logoaction")) {
|
|
200
|
+
this.dispatchTypedEvent("logoaction", {
|
|
201
|
+
button: "Logo",
|
|
202
|
+
action: value,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
writeRequirementsForNamedEvent(type) {
|
|
207
|
+
const src = this.getSourceIds();
|
|
208
|
+
if (!src)
|
|
209
|
+
return;
|
|
210
|
+
const filters = [];
|
|
211
|
+
switch (type) {
|
|
212
|
+
case "gesturechanged":
|
|
213
|
+
filters.push([src.Gesture, 0]);
|
|
214
|
+
break;
|
|
215
|
+
case "buttonaaction":
|
|
216
|
+
filters.push([src.ButtonA, 0]);
|
|
217
|
+
break;
|
|
218
|
+
case "buttonbaction":
|
|
219
|
+
filters.push([src.ButtonB, 0]);
|
|
220
|
+
break;
|
|
221
|
+
case "buttonabaction":
|
|
222
|
+
filters.push([src.ButtonAB, 0]);
|
|
223
|
+
break;
|
|
224
|
+
case "logoaction":
|
|
225
|
+
filters.push([V2Source.Logo, 0]);
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
const keys = [];
|
|
229
|
+
for (const [source, value] of filters) {
|
|
230
|
+
const key = filterKey(source, value);
|
|
231
|
+
keys.push(key);
|
|
232
|
+
this.namedRequirements.add(key);
|
|
233
|
+
}
|
|
234
|
+
this.namedEventFilters.set(type, keys);
|
|
235
|
+
}
|
|
236
|
+
matchesExplicitSubscription(source, value) {
|
|
237
|
+
if (this.explicitSubscriptions.has(filterKey(source, value)))
|
|
238
|
+
return true;
|
|
239
|
+
if (this.explicitSubscriptions.has(filterKey(source, 0)))
|
|
240
|
+
return true;
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
async replayAllRequirements() {
|
|
244
|
+
for (const key of this.namedRequirements) {
|
|
245
|
+
const [source, value] = key.split(":").map(Number);
|
|
246
|
+
await this.writeClientRequirement(source, value);
|
|
247
|
+
}
|
|
248
|
+
for (const key of this.explicitSubscriptions) {
|
|
249
|
+
const [source, value] = key.split(":").map(Number);
|
|
250
|
+
await this.writeClientRequirement(source, value);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async writeClientRequirement(source, value) {
|
|
254
|
+
const data = new DataView(new ArrayBuffer(4));
|
|
255
|
+
data.setUint16(0, source, true);
|
|
256
|
+
data.setUint16(2, value, true);
|
|
257
|
+
await BleClient.write(this.deviceId, profile.event.id, profile.event.characteristics.clientRequirements.id, data);
|
|
258
|
+
}
|
|
259
|
+
getSourceIds() {
|
|
260
|
+
const version = this.getBoardVersion();
|
|
261
|
+
if (!version)
|
|
262
|
+
return undefined;
|
|
263
|
+
return version === "V1" ? EventSource.v1 : EventSource.v2;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function filterKey(source, value) {
|
|
267
|
+
return `${source}:${value}`;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=event-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-service.js","sourceRoot":"","sources":["../../../../src/bluetooth/services/event-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Service } from "../device-wrapper.js";
|
|
2
|
+
import { PinValue, TypedServiceEvent, TypedServiceEventDispatcher } from "../../service-events.js";
|
|
3
|
+
export declare class IoPinService implements Service {
|
|
4
|
+
private deviceId;
|
|
5
|
+
private dispatchTypedEvent;
|
|
6
|
+
uuid: string;
|
|
7
|
+
constructor(deviceId: string, dispatchTypedEvent: TypedServiceEventDispatcher);
|
|
8
|
+
getRelevantEvents(): TypedServiceEvent[];
|
|
9
|
+
/**
|
|
10
|
+
* Gets which pins are configured as analog.
|
|
11
|
+
* All other pins are digital (the default).
|
|
12
|
+
*
|
|
13
|
+
* @returns array of pin numbers (0-18) configured as analog.
|
|
14
|
+
*/
|
|
15
|
+
getAnalogPins(): Promise<number[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Sets which pins are configured as analog.
|
|
18
|
+
* All other pins become digital (the default).
|
|
19
|
+
*
|
|
20
|
+
* @param pins array of pin numbers (0-18) to configure as analog.
|
|
21
|
+
*/
|
|
22
|
+
setAnalogPins(pins: number[]): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Gets which pins are configured as inputs.
|
|
25
|
+
* Input pins are monitored by the service and their values reported
|
|
26
|
+
* via notifications and reads of the pin data characteristic.
|
|
27
|
+
* All other pins are outputs (the default).
|
|
28
|
+
*
|
|
29
|
+
* @returns array of pin numbers (0-18) configured as inputs.
|
|
30
|
+
*/
|
|
31
|
+
getInputPins(): Promise<number[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Sets which pins are configured as inputs.
|
|
34
|
+
* Input pins are monitored by the service and their values reported
|
|
35
|
+
* via notifications and reads of the pin data characteristic.
|
|
36
|
+
* All other pins become outputs (the default).
|
|
37
|
+
*
|
|
38
|
+
* @param pins array of pin numbers (0-18) to configure as inputs.
|
|
39
|
+
*/
|
|
40
|
+
setInputPins(pins: number[]): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Reads pin data for all active input pins.
|
|
43
|
+
* For digital pins, value is 0 or 1.
|
|
44
|
+
* For analog pins, value is 0-255 (10-bit analog value >> 2).
|
|
45
|
+
*/
|
|
46
|
+
readPins(): Promise<PinValue[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Writes pin data for output pins.
|
|
49
|
+
* Only pins configured as outputs (not active inputs) will be affected.
|
|
50
|
+
* For digital pins, value is 0 or 1.
|
|
51
|
+
* For analog pins, value 0-255 is scaled to 0-1023 on the device.
|
|
52
|
+
*/
|
|
53
|
+
writePins(data: PinValue[]): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Sets PWM output on a pin.
|
|
56
|
+
*
|
|
57
|
+
* @param pin Pin number (0-18).
|
|
58
|
+
* @param value Analog value (0-1024).
|
|
59
|
+
* @param period Period in microseconds.
|
|
60
|
+
*/
|
|
61
|
+
setPwm(pin: number, value: number, period: number): Promise<void>;
|
|
62
|
+
startNotifications(type: TypedServiceEvent): Promise<void>;
|
|
63
|
+
stopNotifications(type: TypedServiceEvent): Promise<void>;
|
|
64
|
+
private dataViewToPinData;
|
|
65
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { BleClient } from "@capacitor-community/bluetooth-le";
|
|
2
|
+
import { profile } from "../profile.js";
|
|
3
|
+
import { mapBleError } from "../ble-error.js";
|
|
4
|
+
function pinsToBitmask(pins) {
|
|
5
|
+
let mask = 0;
|
|
6
|
+
for (const pin of pins) {
|
|
7
|
+
mask |= 1 << pin;
|
|
8
|
+
}
|
|
9
|
+
return mask;
|
|
10
|
+
}
|
|
11
|
+
function bitmaskToPins(mask) {
|
|
12
|
+
const pins = [];
|
|
13
|
+
for (let i = 0; i < 19; i++) {
|
|
14
|
+
if (mask & (1 << i)) {
|
|
15
|
+
pins.push(i);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return pins;
|
|
19
|
+
}
|
|
20
|
+
export class IoPinService {
|
|
21
|
+
constructor(deviceId, dispatchTypedEvent) {
|
|
22
|
+
Object.defineProperty(this, "deviceId", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true,
|
|
26
|
+
value: deviceId
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(this, "dispatchTypedEvent", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
configurable: true,
|
|
31
|
+
writable: true,
|
|
32
|
+
value: dispatchTypedEvent
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(this, "uuid", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true,
|
|
38
|
+
value: profile.ioPin.id
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
getRelevantEvents() {
|
|
42
|
+
return ["pinchanged"];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Gets which pins are configured as analog.
|
|
46
|
+
* All other pins are digital (the default).
|
|
47
|
+
*
|
|
48
|
+
* @returns array of pin numbers (0-18) configured as analog.
|
|
49
|
+
*/
|
|
50
|
+
async getAnalogPins() {
|
|
51
|
+
const dataView = await BleClient.read(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinAdConfiguration.id);
|
|
52
|
+
return bitmaskToPins(dataView.getUint32(0, true));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Sets which pins are configured as analog.
|
|
56
|
+
* All other pins become digital (the default).
|
|
57
|
+
*
|
|
58
|
+
* @param pins array of pin numbers (0-18) to configure as analog.
|
|
59
|
+
*/
|
|
60
|
+
async setAnalogPins(pins) {
|
|
61
|
+
const dataView = new DataView(new ArrayBuffer(4));
|
|
62
|
+
dataView.setUint32(0, pinsToBitmask(pins), true);
|
|
63
|
+
await BleClient.write(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinAdConfiguration.id, dataView);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Gets which pins are configured as inputs.
|
|
67
|
+
* Input pins are monitored by the service and their values reported
|
|
68
|
+
* via notifications and reads of the pin data characteristic.
|
|
69
|
+
* All other pins are outputs (the default).
|
|
70
|
+
*
|
|
71
|
+
* @returns array of pin numbers (0-18) configured as inputs.
|
|
72
|
+
*/
|
|
73
|
+
async getInputPins() {
|
|
74
|
+
const dataView = await BleClient.read(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinIoConfiguration.id);
|
|
75
|
+
return bitmaskToPins(dataView.getUint32(0, true));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Sets which pins are configured as inputs.
|
|
79
|
+
* Input pins are monitored by the service and their values reported
|
|
80
|
+
* via notifications and reads of the pin data characteristic.
|
|
81
|
+
* All other pins become outputs (the default).
|
|
82
|
+
*
|
|
83
|
+
* @param pins array of pin numbers (0-18) to configure as inputs.
|
|
84
|
+
*/
|
|
85
|
+
async setInputPins(pins) {
|
|
86
|
+
const dataView = new DataView(new ArrayBuffer(4));
|
|
87
|
+
dataView.setUint32(0, pinsToBitmask(pins), true);
|
|
88
|
+
await BleClient.write(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinIoConfiguration.id, dataView);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Reads pin data for all active input pins.
|
|
92
|
+
* For digital pins, value is 0 or 1.
|
|
93
|
+
* For analog pins, value is 0-255 (10-bit analog value >> 2).
|
|
94
|
+
*/
|
|
95
|
+
async readPins() {
|
|
96
|
+
const dataView = await BleClient.read(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinData.id);
|
|
97
|
+
return this.dataViewToPinData(dataView);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Writes pin data for output pins.
|
|
101
|
+
* Only pins configured as outputs (not active inputs) will be affected.
|
|
102
|
+
* For digital pins, value is 0 or 1.
|
|
103
|
+
* For analog pins, value 0-255 is scaled to 0-1023 on the device.
|
|
104
|
+
*/
|
|
105
|
+
async writePins(data) {
|
|
106
|
+
const dataView = new DataView(new ArrayBuffer(data.length * 2));
|
|
107
|
+
for (let i = 0; i < data.length; i++) {
|
|
108
|
+
dataView.setUint8(i * 2, data[i].pin);
|
|
109
|
+
dataView.setUint8(i * 2 + 1, data[i].value);
|
|
110
|
+
}
|
|
111
|
+
await BleClient.write(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinData.id, dataView);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Sets PWM output on a pin.
|
|
115
|
+
*
|
|
116
|
+
* @param pin Pin number (0-18).
|
|
117
|
+
* @param value Analog value (0-1024).
|
|
118
|
+
* @param period Period in microseconds.
|
|
119
|
+
*/
|
|
120
|
+
async setPwm(pin, value, period) {
|
|
121
|
+
const dataView = new DataView(new ArrayBuffer(7));
|
|
122
|
+
dataView.setUint8(0, pin);
|
|
123
|
+
dataView.setUint16(1, value, true);
|
|
124
|
+
dataView.setUint32(3, period, true);
|
|
125
|
+
await BleClient.write(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pwmControl.id, dataView);
|
|
126
|
+
}
|
|
127
|
+
async startNotifications(type) {
|
|
128
|
+
if (type !== "pinchanged") {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
await BleClient.startNotifications(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinData.id, (value) => {
|
|
133
|
+
const data = this.dataViewToPinData(value);
|
|
134
|
+
this.dispatchTypedEvent("pinchanged", { data });
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
this.dispatchTypedEvent("backgrounderror", {
|
|
139
|
+
error: mapBleError(e),
|
|
140
|
+
event: type,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async stopNotifications(type) {
|
|
145
|
+
if (type !== "pinchanged") {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
await BleClient.stopNotifications(this.deviceId, profile.ioPin.id, profile.ioPin.characteristics.pinData.id);
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
this.dispatchTypedEvent("backgrounderror", {
|
|
153
|
+
error: mapBleError(e),
|
|
154
|
+
event: type,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
dataViewToPinData(dataView) {
|
|
159
|
+
const result = [];
|
|
160
|
+
for (let i = 0; i + 1 < dataView.byteLength; i += 2) {
|
|
161
|
+
result.push({
|
|
162
|
+
pin: dataView.getUint8(i),
|
|
163
|
+
value: dataView.getUint8(i + 1),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=io-pin-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io-pin-service.js","sourceRoot":"","sources":["../../../../src/bluetooth/services/io-pin-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { Service } from "
|
|
2
|
-
import { LedMatrix } from "
|
|
3
|
-
import { TypedServiceEvent } from "./service-events.js";
|
|
1
|
+
import { Service } from "../device-wrapper.js";
|
|
2
|
+
import { LedMatrix, TypedServiceEvent } from "../../service-events.js";
|
|
4
3
|
export declare class LedService implements Service {
|
|
5
4
|
private deviceId;
|
|
6
5
|
uuid: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BleClient } from "@capacitor-community/bluetooth-le";
|
|
2
|
-
import { profile } from "
|
|
2
|
+
import { profile } from "../profile.js";
|
|
3
3
|
const createLedMatrix = () => {
|
|
4
4
|
return [
|
|
5
5
|
[false, false, false, false, false],
|
|
@@ -32,6 +32,9 @@ export class LedService {
|
|
|
32
32
|
return this.dataViewToLedMatrix(dataView);
|
|
33
33
|
}
|
|
34
34
|
async setLedMatrix(value) {
|
|
35
|
+
if (value.length !== 5 || value.some((row) => row.length !== 5)) {
|
|
36
|
+
throw new Error("LED matrix must be 5x5");
|
|
37
|
+
}
|
|
35
38
|
const dataView = this.ledMatrixToDataView(value);
|
|
36
39
|
await BleClient.write(this.deviceId, profile.led.id, profile.led.characteristics.matrixState.id, dataView);
|
|
37
40
|
}
|