@microbit/microbit-connection 0.9.0-apps.alpha.16 → 0.9.0-apps.alpha.18

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.
Files changed (457) hide show
  1. package/build/cjs/async-util.d.ts +3 -1
  2. package/build/cjs/async-util.js +5 -1
  3. package/build/cjs/async-util.js.map +1 -1
  4. package/build/cjs/bluetooth/ble-error.d.ts +10 -0
  5. package/build/cjs/bluetooth/ble-error.js +47 -0
  6. package/build/cjs/bluetooth/ble-error.js.map +1 -0
  7. package/build/cjs/bluetooth/connection.d.ts +137 -0
  8. package/build/cjs/{bluetooth.js → bluetooth/connection.js} +158 -106
  9. package/build/cjs/bluetooth/connection.js.map +1 -0
  10. package/build/cjs/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
  11. package/build/cjs/bluetooth/connection.test.js.map +1 -0
  12. package/build/cjs/bluetooth/device-bond-state.js.map +1 -0
  13. package/build/cjs/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
  14. package/build/cjs/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +38 -42
  15. package/build/cjs/bluetooth/device-wrapper.js.map +1 -0
  16. package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
  17. package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.js +6 -5
  18. package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -0
  19. package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
  20. package/build/cjs/bluetooth/flashing/flashing-makecode.js.map +1 -0
  21. package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.js +3 -3
  22. package/build/cjs/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
  23. package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
  24. package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.js +7 -6
  25. package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -0
  26. package/build/cjs/bluetooth/flashing/flashing-v1.js.map +1 -0
  27. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  28. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.js +15 -11
  29. package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -0
  30. package/build/cjs/bluetooth/flashing/zip.js.map +1 -0
  31. package/build/cjs/bluetooth/flashing/zip.test.js.map +1 -0
  32. package/build/cjs/bluetooth/index.d.ts +5 -0
  33. package/build/cjs/bluetooth/index.js +9 -0
  34. package/build/cjs/bluetooth/index.js.map +1 -0
  35. package/build/cjs/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
  36. package/build/cjs/bluetooth/profile.js.map +1 -0
  37. package/build/cjs/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
  38. package/build/cjs/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +17 -12
  39. package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -0
  40. package/build/{esm → cjs/bluetooth/services}/button-service.d.ts +2 -3
  41. package/build/cjs/{button-service.js → bluetooth/services/button-service.js} +24 -14
  42. package/build/cjs/bluetooth/services/button-service.js.map +1 -0
  43. package/build/{esm → cjs/bluetooth/services}/device-information-service.d.ts +1 -1
  44. package/build/cjs/bluetooth/services/device-information-service.js +29 -0
  45. package/build/cjs/bluetooth/services/device-information-service.js.map +1 -0
  46. package/build/cjs/{dfu-service.js → bluetooth/services/dfu-service.js} +2 -2
  47. package/build/cjs/bluetooth/services/dfu-service.js.map +1 -0
  48. package/build/{esm → cjs/bluetooth/services}/led-service.d.ts +2 -3
  49. package/build/cjs/{led-service.js → bluetooth/services/led-service.js} +10 -7
  50. package/build/cjs/bluetooth/services/led-service.js.map +1 -0
  51. package/build/cjs/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  52. package/build/cjs/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +19 -14
  53. package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -0
  54. package/build/{esm → cjs/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  55. package/build/cjs/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +8 -8
  56. package/build/cjs/bluetooth/services/partial-flashing-service.js.map +1 -0
  57. package/build/cjs/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  58. package/build/cjs/{uart-service.js → bluetooth/services/uart-service.js} +21 -9
  59. package/build/cjs/bluetooth/services/uart-service.js.map +1 -0
  60. package/build/cjs/board-id.d.ts +1 -1
  61. package/build/cjs/board-id.js.map +1 -1
  62. package/build/cjs/device.d.ts +145 -123
  63. package/build/cjs/device.js +47 -128
  64. package/build/cjs/device.js.map +1 -1
  65. package/build/cjs/events.d.ts +8 -108
  66. package/build/cjs/events.js +27 -88
  67. package/build/cjs/events.js.map +1 -1
  68. package/build/cjs/events.test.js +54 -48
  69. package/build/cjs/events.test.js.map +1 -1
  70. package/build/cjs/hex-util.d.ts +1 -0
  71. package/build/cjs/hex-util.js +15 -0
  72. package/build/cjs/hex-util.js.map +1 -0
  73. package/build/cjs/index.d.ts +7 -17
  74. package/build/cjs/index.js +6 -28
  75. package/build/cjs/index.js.map +1 -1
  76. package/build/cjs/radio-bridge/connection.d.ts +52 -0
  77. package/build/cjs/{usb-radio-bridge.js → radio-bridge/connection.js} +69 -37
  78. package/build/cjs/radio-bridge/connection.js.map +1 -0
  79. package/build/cjs/radio-bridge/index.d.ts +4 -0
  80. package/build/cjs/radio-bridge/index.js +9 -0
  81. package/build/cjs/radio-bridge/index.js.map +1 -0
  82. package/build/cjs/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  83. package/build/cjs/radio-bridge/serial-protocol.js.map +1 -0
  84. package/build/cjs/service-events.d.ts +43 -14
  85. package/build/cjs/service-events.js +6 -36
  86. package/build/cjs/service-events.js.map +1 -1
  87. package/build/{esm/hex-flash-data-source.d.ts → cjs/universal-hex/flash-data-source.d.ts} +1 -2
  88. package/build/cjs/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +7 -15
  89. package/build/cjs/universal-hex/flash-data-source.js.map +1 -0
  90. package/build/cjs/universal-hex/index.d.ts +4 -0
  91. package/build/cjs/universal-hex/index.js +9 -0
  92. package/build/cjs/universal-hex/index.js.map +1 -0
  93. package/build/cjs/usb/arm-debug.d.ts +137 -0
  94. package/build/cjs/usb/arm-debug.js +414 -0
  95. package/build/cjs/usb/arm-debug.js.map +1 -0
  96. package/build/cjs/usb/arm-debug.test.js +333 -0
  97. package/build/cjs/usb/arm-debug.test.js.map +1 -0
  98. package/build/{esm → cjs/usb}/board-serial-info.d.ts +2 -1
  99. package/build/cjs/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  100. package/build/cjs/usb/board-serial-info.js.map +1 -0
  101. package/build/cjs/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
  102. package/build/cjs/usb/board-serial-info.test.js.map +1 -0
  103. package/build/cjs/usb/cdc-saturation.d.ts +36 -0
  104. package/build/cjs/usb/cdc-saturation.js +151 -0
  105. package/build/cjs/usb/cdc-saturation.js.map +1 -0
  106. package/build/cjs/usb/cmsis-dap.d.ts +113 -0
  107. package/build/cjs/usb/cmsis-dap.js +349 -0
  108. package/build/cjs/usb/cmsis-dap.js.map +1 -0
  109. package/build/cjs/usb/cmsis-dap.test.js +350 -0
  110. package/build/cjs/usb/cmsis-dap.test.js.map +1 -0
  111. package/build/cjs/usb/connection.d.ts +96 -0
  112. package/build/cjs/{usb.js → usb/connection.js} +257 -173
  113. package/build/cjs/usb/connection.js.map +1 -0
  114. package/build/cjs/{usb.test.js → usb/connection.test.js} +52 -42
  115. package/build/cjs/usb/connection.test.js.map +1 -0
  116. package/build/cjs/usb/cortex-m.d.ts +72 -0
  117. package/build/cjs/usb/cortex-m.js +165 -0
  118. package/build/cjs/usb/cortex-m.js.map +1 -0
  119. package/build/cjs/usb/cortex-m.test.js +217 -0
  120. package/build/cjs/usb/cortex-m.test.js.map +1 -0
  121. package/build/cjs/usb/daplink.d.ts +69 -0
  122. package/build/cjs/usb/daplink.js +238 -0
  123. package/build/cjs/usb/daplink.js.map +1 -0
  124. package/build/cjs/usb/daplink.test.js +290 -0
  125. package/build/cjs/usb/daplink.test.js.map +1 -0
  126. package/build/cjs/usb/device-wrapper.d.ts +34 -0
  127. package/build/cjs/usb/device-wrapper.js +102 -0
  128. package/build/cjs/usb/device-wrapper.js.map +1 -0
  129. package/build/cjs/usb/index.d.ts +5 -0
  130. package/build/cjs/usb/index.js +10 -0
  131. package/build/cjs/usb/index.js.map +1 -0
  132. package/build/{esm/usb-partial-flashing-utils.d.ts → cjs/usb/partial-flashing-utils.d.ts} +6 -9
  133. package/build/cjs/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +6 -49
  134. package/build/cjs/usb/partial-flashing-utils.js.map +1 -0
  135. package/build/{esm/usb-partial-flashing.d.ts → cjs/usb/partial-flashing.d.ts} +37 -11
  136. package/build/cjs/{usb-partial-flashing.js → usb/partial-flashing.js} +170 -135
  137. package/build/cjs/usb/partial-flashing.js.map +1 -0
  138. package/build/cjs/usb/promise-queue.js.map +1 -0
  139. package/build/cjs/usb/promise-queue.test.js.map +1 -0
  140. package/build/cjs/usb/serial-events.d.ts +16 -0
  141. package/build/cjs/{led.js → usb/serial-events.js} +1 -1
  142. package/build/cjs/usb/serial-events.js.map +1 -0
  143. package/build/cjs/usb/transport.d.ts +42 -0
  144. package/build/cjs/usb/transport.js +155 -0
  145. package/build/cjs/usb/transport.js.map +1 -0
  146. package/build/esm/async-util.d.ts +3 -1
  147. package/build/esm/async-util.js +5 -1
  148. package/build/esm/async-util.js.map +1 -1
  149. package/build/esm/bluetooth/ble-error.d.ts +10 -0
  150. package/build/esm/bluetooth/ble-error.js +42 -0
  151. package/build/esm/bluetooth/ble-error.js.map +1 -0
  152. package/build/esm/bluetooth/connection.d.ts +137 -0
  153. package/build/esm/{bluetooth.js → bluetooth/connection.js} +152 -100
  154. package/build/esm/bluetooth/connection.js.map +1 -0
  155. package/build/esm/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
  156. package/build/esm/bluetooth/connection.test.js.map +1 -0
  157. package/build/esm/bluetooth/device-bond-state.js.map +1 -0
  158. package/build/esm/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
  159. package/build/esm/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +35 -39
  160. package/build/esm/bluetooth/device-wrapper.js.map +1 -0
  161. package/build/esm/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
  162. package/build/esm/{flashing → bluetooth/flashing}/flashing-full.js +6 -5
  163. package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -0
  164. package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
  165. package/build/esm/bluetooth/flashing/flashing-makecode.js.map +1 -0
  166. package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.test.js +2 -2
  167. package/build/esm/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
  168. package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
  169. package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.js +6 -5
  170. package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -0
  171. package/build/esm/bluetooth/flashing/flashing-v1.js.map +1 -0
  172. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  173. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.js +15 -11
  174. package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -0
  175. package/build/esm/bluetooth/flashing/zip.js.map +1 -0
  176. package/build/esm/bluetooth/flashing/zip.test.d.ts +1 -0
  177. package/build/esm/bluetooth/flashing/zip.test.js.map +1 -0
  178. package/build/esm/bluetooth/index.d.ts +5 -0
  179. package/build/esm/bluetooth/index.js +5 -0
  180. package/build/esm/bluetooth/index.js.map +1 -0
  181. package/build/esm/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
  182. package/build/{cjs/bluetooth-profile.js.map → esm/bluetooth/profile.js.map} +1 -1
  183. package/build/esm/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
  184. package/build/esm/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +11 -6
  185. package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -0
  186. package/build/{cjs → esm/bluetooth/services}/button-service.d.ts +2 -3
  187. package/build/esm/{button-service.js → bluetooth/services/button-service.js} +20 -10
  188. package/build/esm/bluetooth/services/button-service.js.map +1 -0
  189. package/build/{cjs → esm/bluetooth/services}/device-information-service.d.ts +1 -1
  190. package/build/esm/bluetooth/services/device-information-service.js +25 -0
  191. package/build/esm/bluetooth/services/device-information-service.js.map +1 -0
  192. package/build/esm/{dfu-service.js → bluetooth/services/dfu-service.js} +1 -1
  193. package/build/esm/bluetooth/services/dfu-service.js.map +1 -0
  194. package/build/{cjs → esm/bluetooth/services}/led-service.d.ts +2 -3
  195. package/build/esm/{led-service.js → bluetooth/services/led-service.js} +4 -1
  196. package/build/esm/bluetooth/services/led-service.js.map +1 -0
  197. package/build/esm/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  198. package/build/esm/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +11 -6
  199. package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -0
  200. package/build/{cjs → esm/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  201. package/build/esm/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +4 -4
  202. package/build/esm/bluetooth/services/partial-flashing-service.js.map +1 -0
  203. package/build/esm/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  204. package/build/esm/{uart-service.js → bluetooth/services/uart-service.js} +18 -6
  205. package/build/esm/bluetooth/services/uart-service.js.map +1 -0
  206. package/build/esm/board-id.d.ts +1 -1
  207. package/build/esm/board-id.js.map +1 -1
  208. package/build/esm/device.d.ts +145 -123
  209. package/build/esm/device.js +45 -122
  210. package/build/esm/device.js.map +1 -1
  211. package/build/esm/events.d.ts +8 -108
  212. package/build/esm/events.js +26 -86
  213. package/build/esm/events.js.map +1 -1
  214. package/build/esm/events.test.js +55 -49
  215. package/build/esm/events.test.js.map +1 -1
  216. package/build/esm/hex-util.d.ts +1 -0
  217. package/build/esm/hex-util.js +11 -0
  218. package/build/esm/hex-util.js.map +1 -0
  219. package/build/esm/index.d.ts +7 -17
  220. package/build/esm/index.js +6 -11
  221. package/build/esm/index.js.map +1 -1
  222. package/build/esm/radio-bridge/connection.d.ts +52 -0
  223. package/build/esm/{usb-radio-bridge.js → radio-bridge/connection.js} +69 -37
  224. package/build/esm/radio-bridge/connection.js.map +1 -0
  225. package/build/esm/radio-bridge/index.d.ts +4 -0
  226. package/build/esm/radio-bridge/index.js +5 -0
  227. package/build/esm/radio-bridge/index.js.map +1 -0
  228. package/build/esm/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  229. package/build/esm/radio-bridge/serial-protocol.js.map +1 -0
  230. package/build/esm/service-events.d.ts +43 -14
  231. package/build/esm/service-events.js +5 -34
  232. package/build/esm/service-events.js.map +1 -1
  233. package/build/{cjs/hex-flash-data-source.d.ts → esm/universal-hex/flash-data-source.d.ts} +1 -2
  234. package/build/esm/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -13
  235. package/build/esm/universal-hex/flash-data-source.js.map +1 -0
  236. package/build/esm/universal-hex/index.d.ts +4 -0
  237. package/build/esm/universal-hex/index.js +5 -0
  238. package/build/esm/universal-hex/index.js.map +1 -0
  239. package/build/esm/usb/arm-debug.d.ts +137 -0
  240. package/build/esm/usb/arm-debug.js +409 -0
  241. package/build/esm/usb/arm-debug.js.map +1 -0
  242. package/build/esm/usb/arm-debug.test.d.ts +1 -0
  243. package/build/esm/usb/arm-debug.test.js +331 -0
  244. package/build/esm/usb/arm-debug.test.js.map +1 -0
  245. package/build/{cjs → esm/usb}/board-serial-info.d.ts +2 -1
  246. package/build/esm/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  247. package/build/esm/usb/board-serial-info.js.map +1 -0
  248. package/build/esm/usb/board-serial-info.test.d.ts +1 -0
  249. package/build/esm/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
  250. package/build/esm/usb/board-serial-info.test.js.map +1 -0
  251. package/build/esm/usb/cdc-saturation.d.ts +36 -0
  252. package/build/esm/usb/cdc-saturation.js +148 -0
  253. package/build/esm/usb/cdc-saturation.js.map +1 -0
  254. package/build/esm/usb/cmsis-dap.d.ts +113 -0
  255. package/build/esm/usb/cmsis-dap.js +342 -0
  256. package/build/esm/usb/cmsis-dap.js.map +1 -0
  257. package/build/esm/usb/cmsis-dap.test.d.ts +1 -0
  258. package/build/esm/usb/cmsis-dap.test.js +348 -0
  259. package/build/esm/usb/cmsis-dap.test.js.map +1 -0
  260. package/build/esm/usb/connection.d.ts +96 -0
  261. package/build/esm/{usb.js → usb/connection.js} +253 -168
  262. package/build/esm/usb/connection.js.map +1 -0
  263. package/build/esm/usb/connection.test.d.ts +1 -0
  264. package/build/esm/{usb.test.js → usb/connection.test.js} +47 -37
  265. package/build/esm/usb/connection.test.js.map +1 -0
  266. package/build/esm/usb/cortex-m.d.ts +72 -0
  267. package/build/esm/usb/cortex-m.js +161 -0
  268. package/build/esm/usb/cortex-m.js.map +1 -0
  269. package/build/esm/usb/cortex-m.test.d.ts +1 -0
  270. package/build/esm/usb/cortex-m.test.js +215 -0
  271. package/build/esm/usb/cortex-m.test.js.map +1 -0
  272. package/build/esm/usb/daplink.d.ts +69 -0
  273. package/build/esm/usb/daplink.js +231 -0
  274. package/build/esm/usb/daplink.js.map +1 -0
  275. package/build/esm/usb/daplink.test.d.ts +1 -0
  276. package/build/esm/usb/daplink.test.js +288 -0
  277. package/build/esm/usb/daplink.test.js.map +1 -0
  278. package/build/esm/usb/device-wrapper.d.ts +34 -0
  279. package/build/esm/usb/device-wrapper.js +98 -0
  280. package/build/esm/usb/device-wrapper.js.map +1 -0
  281. package/build/esm/usb/index.d.ts +5 -0
  282. package/build/esm/usb/index.js +5 -0
  283. package/build/esm/usb/index.js.map +1 -0
  284. package/build/{cjs/usb-partial-flashing-utils.d.ts → esm/usb/partial-flashing-utils.d.ts} +6 -9
  285. package/build/esm/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +4 -44
  286. package/build/esm/usb/partial-flashing-utils.js.map +1 -0
  287. package/build/{cjs/usb-partial-flashing.d.ts → esm/usb/partial-flashing.d.ts} +37 -11
  288. package/build/esm/{usb-partial-flashing.js → usb/partial-flashing.js} +169 -111
  289. package/build/esm/usb/partial-flashing.js.map +1 -0
  290. package/build/esm/usb/promise-queue.js.map +1 -0
  291. package/build/esm/usb/promise-queue.test.d.ts +1 -0
  292. package/build/esm/usb/promise-queue.test.js.map +1 -0
  293. package/build/esm/usb/serial-events.d.ts +16 -0
  294. package/build/esm/usb/serial-events.js +2 -0
  295. package/build/esm/usb/serial-events.js.map +1 -0
  296. package/build/esm/usb/transport.d.ts +42 -0
  297. package/build/esm/usb/transport.js +151 -0
  298. package/build/esm/usb/transport.js.map +1 -0
  299. package/package.json +43 -2
  300. package/build/cjs/accelerometer-service.js.map +0 -1
  301. package/build/cjs/accelerometer.d.ts +0 -9
  302. package/build/cjs/accelerometer.js +0 -16
  303. package/build/cjs/accelerometer.js.map +0 -1
  304. package/build/cjs/bluetooth-device-wrapper.js.map +0 -1
  305. package/build/cjs/bluetooth.d.ts +0 -114
  306. package/build/cjs/bluetooth.js.map +0 -1
  307. package/build/cjs/bluetooth.test.js.map +0 -1
  308. package/build/cjs/board-serial-info.js.map +0 -1
  309. package/build/cjs/board-serial-info.test.js.map +0 -1
  310. package/build/cjs/button-service.js.map +0 -1
  311. package/build/cjs/buttons.d.ts +0 -10
  312. package/build/cjs/buttons.js +0 -22
  313. package/build/cjs/buttons.js.map +0 -1
  314. package/build/cjs/constants.d.ts +0 -48
  315. package/build/cjs/constants.js +0 -73
  316. package/build/cjs/constants.js.map +0 -1
  317. package/build/cjs/device-bond-state.js.map +0 -1
  318. package/build/cjs/device-information-service.js +0 -34
  319. package/build/cjs/device-information-service.js.map +0 -1
  320. package/build/cjs/dfu-service.js.map +0 -1
  321. package/build/cjs/flashing/flashing-full.js.map +0 -1
  322. package/build/cjs/flashing/flashing-makecode.js.map +0 -1
  323. package/build/cjs/flashing/flashing-makecode.test.js.map +0 -1
  324. package/build/cjs/flashing/flashing-partial.js.map +0 -1
  325. package/build/cjs/flashing/flashing-v1.js.map +0 -1
  326. package/build/cjs/flashing/nordic-dfu.js.map +0 -1
  327. package/build/cjs/flashing/zip.js.map +0 -1
  328. package/build/cjs/flashing/zip.test.js.map +0 -1
  329. package/build/cjs/hex-flash-data-source.js.map +0 -1
  330. package/build/cjs/led-service.js.map +0 -1
  331. package/build/cjs/led.d.ts +0 -6
  332. package/build/cjs/led.js.map +0 -1
  333. package/build/cjs/magnetometer-service.js.map +0 -1
  334. package/build/cjs/magnetometer.d.ts +0 -9
  335. package/build/cjs/magnetometer.js +0 -16
  336. package/build/cjs/magnetometer.js.map +0 -1
  337. package/build/cjs/partial-flashing-service.js.map +0 -1
  338. package/build/cjs/promise-queue.js.map +0 -1
  339. package/build/cjs/promise-queue.test.js.map +0 -1
  340. package/build/cjs/serial-events.d.ts +0 -20
  341. package/build/cjs/serial-events.js +0 -69
  342. package/build/cjs/serial-events.js.map +0 -1
  343. package/build/cjs/uart-service.js.map +0 -1
  344. package/build/cjs/uart.d.ts +0 -4
  345. package/build/cjs/uart.js +0 -16
  346. package/build/cjs/uart.js.map +0 -1
  347. package/build/cjs/usb-device-wrapper.d.ts +0 -47
  348. package/build/cjs/usb-device-wrapper.js +0 -437
  349. package/build/cjs/usb-device-wrapper.js.map +0 -1
  350. package/build/cjs/usb-partial-flashing-utils.js.map +0 -1
  351. package/build/cjs/usb-partial-flashing.js.map +0 -1
  352. package/build/cjs/usb-radio-bridge.d.ts +0 -24
  353. package/build/cjs/usb-radio-bridge.js.map +0 -1
  354. package/build/cjs/usb-serial-protocol.js.map +0 -1
  355. package/build/cjs/usb.d.ts +0 -66
  356. package/build/cjs/usb.js.map +0 -1
  357. package/build/cjs/usb.test.js.map +0 -1
  358. package/build/esm/accelerometer-service.js.map +0 -1
  359. package/build/esm/accelerometer.d.ts +0 -9
  360. package/build/esm/accelerometer.js +0 -12
  361. package/build/esm/accelerometer.js.map +0 -1
  362. package/build/esm/bluetooth-device-wrapper.js.map +0 -1
  363. package/build/esm/bluetooth-profile.js.map +0 -1
  364. package/build/esm/bluetooth.d.ts +0 -114
  365. package/build/esm/bluetooth.js.map +0 -1
  366. package/build/esm/bluetooth.test.js.map +0 -1
  367. package/build/esm/board-serial-info.js.map +0 -1
  368. package/build/esm/board-serial-info.test.js.map +0 -1
  369. package/build/esm/button-service.js.map +0 -1
  370. package/build/esm/buttons.d.ts +0 -10
  371. package/build/esm/buttons.js +0 -18
  372. package/build/esm/buttons.js.map +0 -1
  373. package/build/esm/constants.d.ts +0 -48
  374. package/build/esm/constants.js +0 -70
  375. package/build/esm/constants.js.map +0 -1
  376. package/build/esm/device-bond-state.js.map +0 -1
  377. package/build/esm/device-information-service.js +0 -30
  378. package/build/esm/device-information-service.js.map +0 -1
  379. package/build/esm/dfu-service.js.map +0 -1
  380. package/build/esm/flashing/flashing-full.js.map +0 -1
  381. package/build/esm/flashing/flashing-makecode.js.map +0 -1
  382. package/build/esm/flashing/flashing-makecode.test.js.map +0 -1
  383. package/build/esm/flashing/flashing-partial.js.map +0 -1
  384. package/build/esm/flashing/flashing-v1.js.map +0 -1
  385. package/build/esm/flashing/nordic-dfu.js.map +0 -1
  386. package/build/esm/flashing/zip.js.map +0 -1
  387. package/build/esm/flashing/zip.test.js.map +0 -1
  388. package/build/esm/hex-flash-data-source.js.map +0 -1
  389. package/build/esm/led-service.js.map +0 -1
  390. package/build/esm/led.d.ts +0 -6
  391. package/build/esm/led.js +0 -2
  392. package/build/esm/led.js.map +0 -1
  393. package/build/esm/magnetometer-service.js.map +0 -1
  394. package/build/esm/magnetometer.d.ts +0 -9
  395. package/build/esm/magnetometer.js +0 -12
  396. package/build/esm/magnetometer.js.map +0 -1
  397. package/build/esm/partial-flashing-service.js.map +0 -1
  398. package/build/esm/promise-queue.js.map +0 -1
  399. package/build/esm/promise-queue.test.js.map +0 -1
  400. package/build/esm/serial-events.d.ts +0 -20
  401. package/build/esm/serial-events.js +0 -61
  402. package/build/esm/serial-events.js.map +0 -1
  403. package/build/esm/uart-service.js.map +0 -1
  404. package/build/esm/uart.d.ts +0 -4
  405. package/build/esm/uart.js +0 -12
  406. package/build/esm/uart.js.map +0 -1
  407. package/build/esm/usb-device-wrapper.d.ts +0 -47
  408. package/build/esm/usb-device-wrapper.js +0 -410
  409. package/build/esm/usb-device-wrapper.js.map +0 -1
  410. package/build/esm/usb-partial-flashing-utils.js.map +0 -1
  411. package/build/esm/usb-partial-flashing.js.map +0 -1
  412. package/build/esm/usb-radio-bridge.d.ts +0 -24
  413. package/build/esm/usb-radio-bridge.js.map +0 -1
  414. package/build/esm/usb-serial-protocol.js.map +0 -1
  415. package/build/esm/usb.d.ts +0 -66
  416. package/build/esm/usb.js.map +0 -1
  417. package/build/esm/usb.test.js.map +0 -1
  418. /package/build/cjs/{bluetooth.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
  419. /package/build/cjs/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
  420. /package/build/cjs/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
  421. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
  422. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.d.ts +0 -0
  423. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  424. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  425. /package/build/cjs/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  426. /package/build/cjs/{flashing → bluetooth/flashing}/zip.js +0 -0
  427. /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.d.ts +0 -0
  428. /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.js +0 -0
  429. /package/build/cjs/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
  430. /package/build/cjs/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  431. /package/build/cjs/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  432. /package/build/cjs/{board-serial-info.test.d.ts → usb/arm-debug.test.d.ts} +0 -0
  433. /package/build/{esm → cjs/usb}/board-serial-info.test.d.ts +0 -0
  434. /package/build/cjs/{promise-queue.test.d.ts → usb/cmsis-dap.test.d.ts} +0 -0
  435. /package/build/cjs/{usb.test.d.ts → usb/connection.test.d.ts} +0 -0
  436. /package/build/{esm/bluetooth.test.d.ts → cjs/usb/cortex-m.test.d.ts} +0 -0
  437. /package/build/{esm/flashing/flashing-makecode.test.d.ts → cjs/usb/daplink.test.d.ts} +0 -0
  438. /package/build/cjs/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  439. /package/build/cjs/{promise-queue.js → usb/promise-queue.js} +0 -0
  440. /package/build/{esm → cjs/usb}/promise-queue.test.d.ts +0 -0
  441. /package/build/cjs/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
  442. /package/build/esm/{flashing/zip.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
  443. /package/build/esm/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
  444. /package/build/esm/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
  445. /package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
  446. /package/build/esm/{usb.test.d.ts → bluetooth/flashing/flashing-makecode.test.d.ts} +0 -0
  447. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  448. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  449. /package/build/esm/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  450. /package/build/esm/{flashing → bluetooth/flashing}/zip.js +0 -0
  451. /package/build/esm/{flashing → bluetooth/flashing}/zip.test.js +0 -0
  452. /package/build/esm/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
  453. /package/build/esm/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  454. /package/build/esm/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  455. /package/build/esm/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  456. /package/build/esm/{promise-queue.js → usb/promise-queue.js} +0 -0
  457. /package/build/esm/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
@@ -0,0 +1,288 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { DapTransferError } from "./cmsis-dap.js";
3
+ import { ConsoleLogging } from "../logging.js";
4
+ import { DAPLINK_VENDOR_READ_UNIQUE_ID, DAPLINK_VENDOR_READ_SETTINGS, DAPLINK_VENDOR_SERIAL_READ, DAPLINK_VENDOR_SERIAL_WRITE, DAPLINK_VENDOR_WRITE_SETTINGS, DAPLINK_VENDOR_FLASH_CLOSE, DAPLINK_VENDOR_FLASH_OPEN, DAPLINK_VENDOR_FLASH_RESET, DAPLINK_VENDOR_FLASH_WRITE, DapLinkSerial, dapLinkFlash, readDaplinkUniqueId, readMem32WithRetry, } from "./daplink.js";
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers
7
+ // ---------------------------------------------------------------------------
8
+ const logging = new ConsoleLogging();
9
+ /** Create a DataView response with a command echo and status/length byte. */
10
+ function makeResponse(command, secondByte, extraBytes = []) {
11
+ const buf = new ArrayBuffer(64);
12
+ const view = new DataView(buf);
13
+ view.setUint8(0, command);
14
+ view.setUint8(1, secondByte);
15
+ extraBytes.forEach((b, i) => view.setUint8(2 + i, b));
16
+ return view;
17
+ }
18
+ function createMockDap() {
19
+ return {
20
+ isOpen: true,
21
+ blockSize: 59,
22
+ send: vi.fn(),
23
+ clearAbort: vi.fn(),
24
+ swjSequence: vi.fn(),
25
+ swjClock: vi.fn(),
26
+ connect: vi.fn(),
27
+ disconnect: vi.fn(),
28
+ configureTransfer: vi.fn(),
29
+ open: vi.fn(),
30
+ close: vi.fn(),
31
+ transfer: vi.fn(),
32
+ transferBlockRead: vi.fn(),
33
+ transferBlockWrite: vi.fn(),
34
+ drainStaleResponses: vi.fn(),
35
+ };
36
+ }
37
+ function createMockAdi(dap) {
38
+ return {
39
+ dap,
40
+ get isOpen() {
41
+ return true;
42
+ },
43
+ readMem32: vi.fn(),
44
+ writeMem32: vi.fn(),
45
+ readMem32Ops: vi.fn(() => []),
46
+ writeMem32Ops: vi.fn(() => []),
47
+ readBlock: vi.fn(),
48
+ writeBlock: vi.fn(),
49
+ transferSequence: vi.fn(),
50
+ resetState: vi.fn(),
51
+ connect: vi.fn(),
52
+ disconnect: vi.fn(),
53
+ reinit: vi.fn(),
54
+ };
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // DapLinkSerial
58
+ // ---------------------------------------------------------------------------
59
+ describe("DapLinkSerial", () => {
60
+ let dap;
61
+ let serial;
62
+ beforeEach(() => {
63
+ dap = createMockDap();
64
+ serial = new DapLinkSerial(dap, logging);
65
+ });
66
+ describe("getBaudrate", () => {
67
+ it("reads baud rate from READ_SETTINGS response", async () => {
68
+ const response = new DataView(new ArrayBuffer(64));
69
+ response.setUint8(0, DAPLINK_VENDOR_READ_SETTINGS);
70
+ response.setUint32(1, 115200, true);
71
+ vi.mocked(dap.send).mockResolvedValueOnce(response);
72
+ const baud = await serial.getBaudrate();
73
+ expect(baud).toBe(115200);
74
+ expect(dap.send).toHaveBeenCalledWith(DAPLINK_VENDOR_READ_SETTINGS);
75
+ });
76
+ });
77
+ describe("setBaudrate", () => {
78
+ it("sends baud rate via WRITE_SETTINGS", async () => {
79
+ vi.mocked(dap.send).mockResolvedValueOnce(new DataView(new ArrayBuffer(64)));
80
+ await serial.setBaudrate(9600);
81
+ expect(dap.send).toHaveBeenCalledWith(DAPLINK_VENDOR_WRITE_SETTINGS, expect.any(Uint8Array));
82
+ const payload = vi.mocked(dap.send).mock.calls[0][1];
83
+ const sentBaud = new DataView(payload.buffer).getUint32(0, true);
84
+ expect(sentBaud).toBe(9600);
85
+ });
86
+ });
87
+ describe("read", () => {
88
+ it("returns decoded string when data is available", async () => {
89
+ const text = "Hi";
90
+ const encoded = new TextEncoder().encode(text);
91
+ const response = new DataView(new ArrayBuffer(64));
92
+ response.setUint8(0, DAPLINK_VENDOR_SERIAL_READ);
93
+ response.setUint8(1, encoded.length);
94
+ encoded.forEach((b, i) => response.setUint8(2 + i, b));
95
+ vi.mocked(dap.send).mockResolvedValueOnce(response);
96
+ const result = await serial.read();
97
+ expect(result).toBe("Hi");
98
+ });
99
+ it("returns undefined when no data", async () => {
100
+ vi.mocked(dap.send).mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_SERIAL_READ, 0));
101
+ const result = await serial.read();
102
+ expect(result).toBeUndefined();
103
+ });
104
+ });
105
+ describe("write", () => {
106
+ it("sends encoded string with length prefix", async () => {
107
+ vi.mocked(dap.send).mockResolvedValueOnce(new DataView(new ArrayBuffer(64)));
108
+ await serial.write("AB");
109
+ expect(dap.send).toHaveBeenCalledWith(DAPLINK_VENDOR_SERIAL_WRITE, expect.any(Uint8Array));
110
+ const payload = vi.mocked(dap.send).mock.calls[0][1];
111
+ expect(payload[0]).toBe(2); // length
112
+ expect(payload[1]).toBe(0x41); // 'A'
113
+ expect(payload[2]).toBe(0x42); // 'B'
114
+ });
115
+ });
116
+ describe("drain", () => {
117
+ it("reads until empty", async () => {
118
+ // Two reads with data, then one empty
119
+ const text = new TextEncoder().encode("x");
120
+ const withData = new DataView(new ArrayBuffer(64));
121
+ withData.setUint8(1, 1);
122
+ withData.setUint8(2, text[0]);
123
+ vi.mocked(dap.send)
124
+ .mockResolvedValueOnce(withData)
125
+ .mockResolvedValueOnce(withData)
126
+ .mockResolvedValueOnce(makeResponse(0, 0)); // empty
127
+ await serial.drain();
128
+ expect(dap.send).toHaveBeenCalledTimes(3);
129
+ });
130
+ it("does nothing when already empty", async () => {
131
+ vi.mocked(dap.send).mockResolvedValueOnce(makeResponse(0, 0));
132
+ await serial.drain();
133
+ expect(dap.send).toHaveBeenCalledTimes(1);
134
+ });
135
+ });
136
+ describe("startPolling / stopPolling", () => {
137
+ it("calls onData for each read and stops when requested", async () => {
138
+ const received = [];
139
+ let callCount = 0;
140
+ vi.mocked(dap.send).mockImplementation(async () => {
141
+ callCount++;
142
+ if (callCount <= 2) {
143
+ const resp = new DataView(new ArrayBuffer(64));
144
+ resp.setUint8(1, 1);
145
+ resp.setUint8(2, 0x41 + callCount - 1); // 'A', 'B'
146
+ return resp;
147
+ }
148
+ // After 2 data reads, stop polling
149
+ serial.stopPolling();
150
+ return makeResponse(0, 0);
151
+ });
152
+ await serial.startPolling((data) => received.push(data), 0);
153
+ expect(received).toEqual(["A", "B"]);
154
+ });
155
+ });
156
+ });
157
+ // ---------------------------------------------------------------------------
158
+ // dapLinkFlash
159
+ // ---------------------------------------------------------------------------
160
+ describe("dapLinkFlash", () => {
161
+ let dap;
162
+ let adi;
163
+ beforeEach(() => {
164
+ dap = createMockDap();
165
+ adi = createMockAdi(dap);
166
+ });
167
+ it("streams hex data in 62-byte pages", async () => {
168
+ // 124 bytes = 2 full pages
169
+ const buffer = new Uint8Array(124);
170
+ buffer.fill(0x3a); // ':' characters (Intel HEX)
171
+ vi.mocked(dap.send)
172
+ // FLASH_OPEN → success
173
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_OPEN, 0))
174
+ // FLASH_WRITE page 1 → success
175
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_WRITE, 0))
176
+ // FLASH_WRITE page 2 → success
177
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_WRITE, 0))
178
+ // FLASH_CLOSE → success
179
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_CLOSE, 0))
180
+ // FLASH_RESET
181
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_RESET, 0));
182
+ const progress = vi.fn();
183
+ await dapLinkFlash(adi, buffer, progress);
184
+ // OPEN + 2 WRITE + CLOSE + RESET = 5 sends
185
+ expect(dap.send).toHaveBeenCalledTimes(5);
186
+ // Progress called for each page + final 1.0
187
+ expect(progress).toHaveBeenCalledWith(1.0);
188
+ // resetState called in finally
189
+ expect(adi.resetState).toHaveBeenCalled();
190
+ });
191
+ it("stops early on ERROR_SUCCESS_DONE", async () => {
192
+ const buffer = new Uint8Array(124);
193
+ vi.mocked(dap.send)
194
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_OPEN, 0))
195
+ // First page returns DONE (18)
196
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_WRITE, 18))
197
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_CLOSE, 0))
198
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_RESET, 0));
199
+ await dapLinkFlash(adi, buffer);
200
+ // Only 1 write (stopped at DONE), then CLOSE + RESET
201
+ expect(dap.send).toHaveBeenCalledTimes(4);
202
+ });
203
+ it("throws on FLASH_OPEN error", async () => {
204
+ vi.mocked(dap.send).mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_OPEN, 5));
205
+ await expect(dapLinkFlash(adi, new Uint8Array(10))).rejects.toThrow("Flash open error");
206
+ // The throw happens before the try/finally block, so resetState is not called.
207
+ expect(adi.resetState).not.toHaveBeenCalled();
208
+ });
209
+ it("throws on FLASH_CLOSE error and attempts cleanup", async () => {
210
+ const buffer = new Uint8Array(10);
211
+ vi.mocked(dap.send)
212
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_OPEN, 0))
213
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_WRITE, 0))
214
+ // FLASH_CLOSE returns error
215
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_CLOSE, 7))
216
+ // Cleanup FLASH_CLOSE in catch
217
+ .mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_FLASH_CLOSE, 0));
218
+ await expect(dapLinkFlash(adi, buffer)).rejects.toThrow("Flash close error");
219
+ expect(adi.resetState).toHaveBeenCalled();
220
+ });
221
+ });
222
+ // ---------------------------------------------------------------------------
223
+ // readDaplinkUniqueId
224
+ // ---------------------------------------------------------------------------
225
+ describe("readDaplinkUniqueId", () => {
226
+ let dap;
227
+ beforeEach(() => {
228
+ dap = createMockDap();
229
+ });
230
+ it("returns the unique ID string", async () => {
231
+ const id = "9900012345678901234567890123456789012345678901234";
232
+ const encoded = new TextEncoder().encode(id);
233
+ const response = new DataView(new ArrayBuffer(64));
234
+ response.setUint8(0, DAPLINK_VENDOR_READ_UNIQUE_ID);
235
+ response.setUint8(1, encoded.length);
236
+ encoded.forEach((b, i) => response.setUint8(2 + i, b));
237
+ vi.mocked(dap.send).mockResolvedValueOnce(response);
238
+ const result = await readDaplinkUniqueId(dap, logging);
239
+ expect(result).toBe(id);
240
+ });
241
+ it("returns undefined for zero-length response", async () => {
242
+ vi.mocked(dap.send).mockResolvedValueOnce(makeResponse(DAPLINK_VENDOR_READ_UNIQUE_ID, 0));
243
+ const result = await readDaplinkUniqueId(dap, logging);
244
+ expect(result).toBeUndefined();
245
+ });
246
+ it("returns undefined on error", async () => {
247
+ vi.mocked(dap.send).mockRejectedValueOnce(new Error("USB gone"));
248
+ const result = await readDaplinkUniqueId(dap, logging);
249
+ expect(result).toBeUndefined();
250
+ });
251
+ });
252
+ // ---------------------------------------------------------------------------
253
+ // readMem32WithRetry
254
+ // ---------------------------------------------------------------------------
255
+ describe("readMem32WithRetry", () => {
256
+ let dap;
257
+ let adi;
258
+ beforeEach(() => {
259
+ dap = createMockDap();
260
+ adi = createMockAdi(dap);
261
+ });
262
+ it("returns value on first success", async () => {
263
+ vi.mocked(adi.readMem32).mockResolvedValueOnce(0xdeadbeef);
264
+ const value = await readMem32WithRetry(adi, 0x10000010, logging);
265
+ expect(value).toBe(0xdeadbeef);
266
+ expect(adi.readMem32).toHaveBeenCalledTimes(1);
267
+ });
268
+ it("retries on DapTransferError", async () => {
269
+ vi.mocked(adi.readMem32)
270
+ .mockRejectedValueOnce(new DapTransferError(0x04, 0, 1))
271
+ .mockRejectedValueOnce(new DapTransferError(0x04, 0, 1))
272
+ .mockResolvedValueOnce(0x42);
273
+ const value = await readMem32WithRetry(adi, 0x10000010, logging, 5, 0);
274
+ expect(value).toBe(0x42);
275
+ expect(adi.readMem32).toHaveBeenCalledTimes(3);
276
+ });
277
+ it("throws non-transfer errors immediately", async () => {
278
+ vi.mocked(adi.readMem32).mockRejectedValueOnce(new Error("USB gone"));
279
+ await expect(readMem32WithRetry(adi, 0x10000010, logging, 5, 0)).rejects.toThrow("USB gone");
280
+ expect(adi.readMem32).toHaveBeenCalledTimes(1);
281
+ });
282
+ it("throws after exhausting retries", async () => {
283
+ vi.mocked(adi.readMem32).mockRejectedValue(new DapTransferError(0x04, 0, 1));
284
+ await expect(readMem32WithRetry(adi, 0x10000010, logging, 3, 0)).rejects.toThrow(DapTransferError);
285
+ expect(adi.readMem32).toHaveBeenCalledTimes(3);
286
+ });
287
+ });
288
+ //# sourceMappingURL=daplink.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daplink.test.js","sourceRoot":"","sources":["../../../src/usb/daplink.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * (c) 2021, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { BoardSerialInfo } from "./board-serial-info.js";
7
+ import { Logging } from "../logging.js";
8
+ import { ArmDebugSwd } from "./arm-debug.js";
9
+ import { CortexM } from "./cortex-m.js";
10
+ import { DapLinkSerial } from "./daplink.js";
11
+ export interface BoardConnectionInfo {
12
+ boardSerialInfo: BoardSerialInfo;
13
+ deviceId: number;
14
+ pageSize: number;
15
+ numPages: number;
16
+ }
17
+ export declare class USBDeviceWrapper {
18
+ readonly usbDevice: USBDevice;
19
+ private logging;
20
+ adi: ArmDebugSwd;
21
+ cortexM: CortexM;
22
+ serial: DapLinkSerial;
23
+ private initialConnectionComplete;
24
+ constructor(usbDevice: USBDevice, logging: Logging);
25
+ reconnect(): Promise<BoardConnectionInfo>;
26
+ /**
27
+ * Read the board serial info, preferring the DAPLink vendor command.
28
+ * Chrome may anonymize USBDevice.serialNumber for anti-fingerprinting
29
+ * (https://github.com/microbit-foundation/microbit-connection/issues/57)
30
+ * so we read it via the DAP protocol instead.
31
+ */
32
+ private readBoardSerialInfo;
33
+ disconnect(): Promise<void>;
34
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * (c) 2021, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { BoardSerialInfo } from "./board-serial-info.js";
7
+ import { ArmDebugSwd } from "./arm-debug.js";
8
+ import { CmsisDapUsb } from "./cmsis-dap.js";
9
+ import { CortexM } from "./cortex-m.js";
10
+ import { DapLinkSerial, readDaplinkUniqueId, readMem32WithRetry, } from "./daplink.js";
11
+ import { UsbTransport } from "./transport.js";
12
+ // FICR Registers (Nordic nRF SoC Factory Information Configuration)
13
+ // https://docs.nordicsemi.com/bundle/ps_nrf52833/page/ficr.html
14
+ const FICR_CODEPAGESIZE = 0x10000010;
15
+ const FICR_CODESIZE = 0x10000014;
16
+ const FICR_DEVICE_ID_1 = 0x10000064;
17
+ export class USBDeviceWrapper {
18
+ constructor(usbDevice, logging) {
19
+ Object.defineProperty(this, "usbDevice", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: usbDevice
24
+ });
25
+ Object.defineProperty(this, "logging", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: logging
30
+ });
31
+ Object.defineProperty(this, "adi", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: void 0
36
+ });
37
+ Object.defineProperty(this, "cortexM", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: void 0
42
+ });
43
+ Object.defineProperty(this, "serial", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: void 0
48
+ });
49
+ Object.defineProperty(this, "initialConnectionComplete", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: false
54
+ });
55
+ const cmsisDap = new CmsisDapUsb(new UsbTransport(this.usbDevice), this.logging);
56
+ this.adi = new ArmDebugSwd(cmsisDap, this.logging);
57
+ this.cortexM = new CortexM(this.adi);
58
+ this.serial = new DapLinkSerial(cmsisDap, this.logging);
59
+ }
60
+ // Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L119
61
+ async reconnect() {
62
+ if (this.initialConnectionComplete) {
63
+ await this.disconnect();
64
+ }
65
+ else {
66
+ this.initialConnectionComplete = true;
67
+ }
68
+ await this.adi.connect();
69
+ const boardSerialInfo = await this.readBoardSerialInfo();
70
+ this.logging.log(`Detected board ID ${boardSerialInfo.id}`);
71
+ // https://support.microbit.org/support/solutions/articles/19000067679-how-to-find-the-name-of-your-micro-bit
72
+ // We retry on errors as immediately after flash the micro:bit won't be ready to respond
73
+ const deviceId = await readMem32WithRetry(this.adi, FICR_DEVICE_ID_1, this.logging);
74
+ const pageSize = await readMem32WithRetry(this.adi, FICR_CODEPAGESIZE, this.logging);
75
+ const numPages = await readMem32WithRetry(this.adi, FICR_CODESIZE, this.logging);
76
+ return { boardSerialInfo, deviceId, pageSize, numPages };
77
+ }
78
+ /**
79
+ * Read the board serial info, preferring the DAPLink vendor command.
80
+ * Chrome may anonymize USBDevice.serialNumber for anti-fingerprinting
81
+ * (https://github.com/microbit-foundation/microbit-connection/issues/57)
82
+ * so we read it via the DAP protocol instead.
83
+ */
84
+ async readBoardSerialInfo() {
85
+ const dapSerial = await readDaplinkUniqueId(this.adi.dap, this.logging);
86
+ if (dapSerial) {
87
+ return BoardSerialInfo.fromSerial(dapSerial, this.logging.log.bind(this.logging));
88
+ }
89
+ this.logging.log("Failed to read unique ID via DAP vendor command, falling back to USB serial number (may be affected by anti-fingerprinting)");
90
+ return BoardSerialInfo.parse(this.usbDevice, this.logging.log.bind(this.logging));
91
+ }
92
+ async disconnect() {
93
+ if (this.usbDevice.opened && this.adi.isOpen) {
94
+ return this.adi.disconnect();
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=device-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-wrapper.js","sourceRoot":"","sources":["../../../src/usb/device-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @module @microbit/microbit-connection/usb
3
+ */
4
+ export { createUSBConnection, DeviceSelectionMode, type MicrobitUSBConnection, type MicrobitUSBConnectionOptions, } from "./connection.js";
5
+ export type { SerialData } from "./serial-events.js";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @module @microbit/microbit-connection/usb
3
+ */
4
+ export { createUSBConnection, DeviceSelectionMode, } from "./connection.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usb/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAGpB,MAAM,iBAAiB,CAAC"}
@@ -1,17 +1,14 @@
1
- export declare const CoreRegister: {
2
- SP: number;
3
- LR: number;
4
- PC: number;
5
- };
1
+ /**
2
+ * (c) 2021, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
6
  export declare const read32FromUInt8Array: (data: Uint8Array, i: number) => number;
7
- export declare const bufferConcat: (bufs: Uint8Array[]) => Uint8Array;
8
7
  export declare const murmur3_core: (data: Uint8Array) => [number, number];
9
- export declare const apReg: (r: number, mode: number) => number;
10
- export declare const regRequest: (regId: number, isWrite?: boolean) => number;
11
8
  export declare class Page {
12
9
  readonly targetAddr: number;
13
10
  readonly data: Uint8Array;
14
11
  constructor(targetAddr: number, data: Uint8Array);
15
12
  }
16
13
  export declare const pageAlignBlocks: (buffer: Uint8Array, targetAddr: number, pageSize: number) => Page[];
17
- export declare const onlyChanged: (pages: Page[], checksums: Uint8Array, pageSize: number) => Page[];
14
+ export declare const onlyChanged: (pages: Page[], checksums: Uint32Array, pageSize: number) => Page[];
@@ -3,14 +3,6 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { DapVal } from "./constants.js";
7
- // Represents the micro:bit's core registers
8
- // Drawn from https://armmbed.github.io/dapjs/docs/enums/coreregister.html
9
- export const CoreRegister = {
10
- SP: 13,
11
- LR: 14,
12
- PC: 15,
13
- };
14
6
  export const read32FromUInt8Array = (data, i) => {
15
7
  return ((data[i] |
16
8
  (data[i + 1] << 8) |
@@ -18,19 +10,6 @@ export const read32FromUInt8Array = (data, i) => {
18
10
  (data[i + 3] << 24)) >>>
19
11
  0);
20
12
  };
21
- export const bufferConcat = (bufs) => {
22
- let len = 0;
23
- for (const b of bufs) {
24
- len += b.length;
25
- }
26
- const r = new Uint8Array(len);
27
- len = 0;
28
- for (const b of bufs) {
29
- r.set(b, len);
30
- len += b.length;
31
- }
32
- return r;
33
- };
34
13
  // Returns the MurmurHash of the data passed to it, used for checksum calculation.
35
14
  // Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L14
36
15
  export const murmur3_core = (data) => {
@@ -50,25 +29,6 @@ export const murmur3_core = (data) => {
50
29
  }
51
30
  return [h0, h1];
52
31
  };
53
- // Returns a representation of an Access Port Register.
54
- // Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/util.ts#L63
55
- export const apReg = (r, mode) => {
56
- const v = r | mode | DapVal.AP_ACC;
57
- return 4 + ((v & 0x0c) >> 2);
58
- };
59
- // Returns a code representing a request to read/write a certain register.
60
- // Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/util.ts#L92
61
- export const regRequest = (regId, isWrite = false) => {
62
- let request = !isWrite ? 1 << 1 /* READ */ : 0 << 1; /* WRITE */
63
- if (regId < 4) {
64
- request |= 0 << 0 /* DP_ACC */;
65
- }
66
- else {
67
- request |= 1 << 0 /* AP_ACC */;
68
- }
69
- request |= (regId & 3) << 2;
70
- return request;
71
- };
72
32
  export class Page {
73
33
  constructor(targetAddr, data) {
74
34
  Object.defineProperty(this, "targetAddr", {
@@ -109,14 +69,14 @@ export const pageAlignBlocks = (buffer, targetAddr, pageSize) => {
109
69
  export const onlyChanged = (pages, checksums, pageSize) => {
110
70
  return pages.filter((page) => {
111
71
  let idx = page.targetAddr / pageSize;
112
- if (idx * 8 + 8 > checksums.length)
72
+ if (idx * 2 + 2 > checksums.length)
113
73
  return true; // out of range?
114
- let c0 = read32FromUInt8Array(checksums, idx * 8);
115
- let c1 = read32FromUInt8Array(checksums, idx * 8 + 4);
74
+ let c0 = checksums[idx * 2];
75
+ let c1 = checksums[idx * 2 + 1];
116
76
  let ch = murmur3_core(page.data);
117
77
  if (c0 === ch[0] && c1 === ch[1])
118
78
  return false;
119
79
  return true;
120
80
  });
121
81
  };
122
- //# sourceMappingURL=usb-partial-flashing-utils.js.map
82
+ //# sourceMappingURL=partial-flashing-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-flashing-utils.js","sourceRoot":"","sources":["../../../src/usb/partial-flashing-utils.ts"],"names":[],"mappings":"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"}
@@ -37,20 +37,28 @@
37
37
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38
38
  * SOFTWARE.
39
39
  */
40
- import { Logging } from "./logging.js";
41
- import { DAPWrapper } from "./usb-device-wrapper.js";
42
- import { BoardVersion, ProgressCallback } from "./device.js";
40
+ /**
41
+ * Implementation of partial flashing for the micro:bit.
42
+ *
43
+ * Latest Microsoft implementation is here:
44
+ * https://github.com/microsoft/pxt-microbit/blob/master/editor/flash.ts
45
+ */
46
+ import { Logging } from "../logging.js";
47
+ import { BoardVersion, ProgressCallback } from "../device.js";
43
48
  import MemoryMap from "nrf-intel-hex";
49
+ import { USBDeviceWrapper } from "./device-wrapper.js";
44
50
  /**
45
- * Uses a DAPWrapper to flash the micro:bit.
51
+ * Uses a USBDeviceWrapper to flash the micro:bit.
46
52
  *
47
- * Intented to be used for a single flash with a pre-connected DAPWrapper.
53
+ * Intended to be used for a single flash with a pre-connected USBDeviceWrapper.
48
54
  */
49
55
  export declare class PartialFlashing {
50
- private dapwrapper;
56
+ private device;
51
57
  private logging;
52
58
  private boardVersion;
53
- constructor(dapwrapper: DAPWrapper, logging: Logging, boardVersion: BoardVersion);
59
+ private pageSize;
60
+ private numPages;
61
+ constructor(device: USBDeviceWrapper, logging: Logging, boardVersion: BoardVersion, pageSize: number, numPages: number);
54
62
  private log;
55
63
  private getFlashChecksumsAsync;
56
64
  private runFlash;
@@ -60,8 +68,26 @@ export declare class PartialFlashing {
60
68
  fullFlashAsync(data: string | Uint8Array | MemoryMap, updateProgress: ProgressCallback): Promise<void>;
61
69
  flashAsync(data: string | Uint8Array | MemoryMap, updateProgress: ProgressCallback): Promise<boolean>;
62
70
  private convertDataToHexString;
63
- private convertDataToPaddedBytes;
64
- private hexStringToPaddedBytes;
65
- private paddedBytesToHexString;
66
- private memoryMapToPaddedBytes;
71
+ /**
72
+ * Parse the flash data into a MemoryMap (if not already one).
73
+ */
74
+ private toMemoryMap;
75
+ /**
76
+ * Extract padded flash bytes (main flash only) and UICR entries from a
77
+ * MemoryMap. Parses the data once for both.
78
+ */
79
+ private extractFlashAndUicr;
80
+ /**
81
+ * Check UICR and repair if needed after a partial flash.
82
+ *
83
+ * UICR bits can only be cleared (1→0) without erasing. If all mismatched
84
+ * bits only need 1→0, we can write directly on both V1 and V2.
85
+ * If any bit needs 0→1, an erase is required first:
86
+ * - V2: erase via NVMC.ERASEUICR, then write
87
+ * - V1: no independent UICR erase, fall back to full flash
88
+ *
89
+ * Returns true if we stayed on the partial flash path, false if we had
90
+ * to fall back to full flash.
91
+ */
92
+ private ensureUicr;
67
93
  }