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

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 (441) hide show
  1. package/build/{esm/bluetooth.d.ts → cjs/bluetooth/connection.d.ts} +30 -26
  2. package/build/cjs/{bluetooth.js → bluetooth/connection.js} +147 -104
  3. package/build/cjs/bluetooth/connection.js.map +1 -0
  4. package/build/cjs/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
  5. package/build/cjs/bluetooth/connection.test.js.map +1 -0
  6. package/build/cjs/bluetooth/device-bond-state.js.map +1 -0
  7. package/build/cjs/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
  8. package/build/cjs/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +35 -35
  9. package/build/cjs/bluetooth/device-wrapper.js.map +1 -0
  10. package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
  11. package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
  12. package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -0
  13. package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
  14. package/build/cjs/bluetooth/flashing/flashing-makecode.js.map +1 -0
  15. package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.js +3 -3
  16. package/build/cjs/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
  17. package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
  18. package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.js +5 -5
  19. package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -0
  20. package/build/cjs/bluetooth/flashing/flashing-v1.js.map +1 -0
  21. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  22. package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.js +11 -8
  23. package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -0
  24. package/build/cjs/bluetooth/flashing/zip.js.map +1 -0
  25. package/build/cjs/bluetooth/flashing/zip.test.js.map +1 -0
  26. package/build/cjs/bluetooth/index.d.ts +5 -0
  27. package/build/cjs/bluetooth/index.js +9 -0
  28. package/build/cjs/bluetooth/index.js.map +1 -0
  29. package/build/cjs/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
  30. package/build/cjs/bluetooth/profile.js.map +1 -0
  31. package/build/cjs/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
  32. package/build/cjs/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +16 -12
  33. package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -0
  34. package/build/{esm → cjs/bluetooth/services}/button-service.d.ts +2 -3
  35. package/build/cjs/{button-service.js → bluetooth/services/button-service.js} +15 -14
  36. package/build/cjs/bluetooth/services/button-service.js.map +1 -0
  37. package/build/{esm → cjs/bluetooth/services}/device-information-service.d.ts +1 -1
  38. package/build/cjs/{device-information-service.js → bluetooth/services/device-information-service.js} +2 -2
  39. package/build/cjs/bluetooth/services/device-information-service.js.map +1 -0
  40. package/build/cjs/{dfu-service.js → bluetooth/services/dfu-service.js} +2 -2
  41. package/build/cjs/bluetooth/services/dfu-service.js.map +1 -0
  42. package/build/{esm → cjs/bluetooth/services}/led-service.d.ts +2 -3
  43. package/build/cjs/{led-service.js → bluetooth/services/led-service.js} +7 -7
  44. package/build/cjs/bluetooth/services/led-service.js.map +1 -0
  45. package/build/cjs/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  46. package/build/cjs/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +18 -14
  47. package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -0
  48. package/build/{esm → cjs/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  49. package/build/cjs/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +8 -8
  50. package/build/cjs/bluetooth/services/partial-flashing-service.js.map +1 -0
  51. package/build/cjs/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  52. package/build/cjs/{uart-service.js → bluetooth/services/uart-service.js} +12 -9
  53. package/build/cjs/bluetooth/services/uart-service.js.map +1 -0
  54. package/build/cjs/board-id.d.ts +1 -1
  55. package/build/cjs/board-id.js.map +1 -1
  56. package/build/cjs/device.d.ts +82 -75
  57. package/build/cjs/device.js +40 -126
  58. package/build/cjs/device.js.map +1 -1
  59. package/build/cjs/events.d.ts +9 -108
  60. package/build/cjs/events.js +27 -88
  61. package/build/cjs/events.js.map +1 -1
  62. package/build/cjs/events.test.js +54 -48
  63. package/build/cjs/events.test.js.map +1 -1
  64. package/build/cjs/hex-util.d.ts +1 -0
  65. package/build/cjs/hex-util.js +15 -0
  66. package/build/cjs/hex-util.js.map +1 -0
  67. package/build/cjs/index.d.ts +7 -16
  68. package/build/cjs/index.js +6 -26
  69. package/build/cjs/index.js.map +1 -1
  70. package/build/cjs/radio-bridge/connection.d.ts +39 -0
  71. package/build/cjs/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
  72. package/build/cjs/radio-bridge/connection.js.map +1 -0
  73. package/build/cjs/radio-bridge/index.d.ts +4 -0
  74. package/build/cjs/radio-bridge/index.js +9 -0
  75. package/build/cjs/radio-bridge/index.js.map +1 -0
  76. package/build/cjs/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  77. package/build/cjs/radio-bridge/serial-protocol.js.map +1 -0
  78. package/build/cjs/service-events.d.ts +42 -14
  79. package/build/cjs/service-events.js +6 -36
  80. package/build/cjs/service-events.js.map +1 -1
  81. package/build/{esm/hex-flash-data-source.d.ts → cjs/universal-hex/flash-data-source.d.ts} +1 -2
  82. package/build/cjs/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +7 -15
  83. package/build/cjs/universal-hex/flash-data-source.js.map +1 -0
  84. package/build/cjs/universal-hex/index.d.ts +4 -0
  85. package/build/cjs/universal-hex/index.js +9 -0
  86. package/build/cjs/universal-hex/index.js.map +1 -0
  87. package/build/cjs/usb/arm-debug.d.ts +137 -0
  88. package/build/cjs/usb/arm-debug.js +414 -0
  89. package/build/cjs/usb/arm-debug.js.map +1 -0
  90. package/build/cjs/usb/arm-debug.test.js +333 -0
  91. package/build/cjs/usb/arm-debug.test.js.map +1 -0
  92. package/build/{esm → cjs/usb}/board-serial-info.d.ts +2 -1
  93. package/build/cjs/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  94. package/build/cjs/usb/board-serial-info.js.map +1 -0
  95. package/build/cjs/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
  96. package/build/cjs/usb/board-serial-info.test.js.map +1 -0
  97. package/build/cjs/usb/cdc-saturation.d.ts +36 -0
  98. package/build/cjs/usb/cdc-saturation.js +151 -0
  99. package/build/cjs/usb/cdc-saturation.js.map +1 -0
  100. package/build/cjs/usb/cmsis-dap.d.ts +113 -0
  101. package/build/cjs/usb/cmsis-dap.js +349 -0
  102. package/build/cjs/usb/cmsis-dap.js.map +1 -0
  103. package/build/cjs/usb/cmsis-dap.test.js +350 -0
  104. package/build/cjs/usb/cmsis-dap.test.js.map +1 -0
  105. package/build/cjs/usb/connection.d.ts +81 -0
  106. package/build/cjs/{usb.js → usb/connection.js} +243 -166
  107. package/build/cjs/usb/connection.js.map +1 -0
  108. package/build/cjs/{usb.test.js → usb/connection.test.js} +52 -42
  109. package/build/cjs/usb/connection.test.js.map +1 -0
  110. package/build/cjs/usb/cortex-m.d.ts +72 -0
  111. package/build/cjs/usb/cortex-m.js +165 -0
  112. package/build/cjs/usb/cortex-m.js.map +1 -0
  113. package/build/cjs/usb/cortex-m.test.js +217 -0
  114. package/build/cjs/usb/cortex-m.test.js.map +1 -0
  115. package/build/cjs/usb/daplink.d.ts +69 -0
  116. package/build/cjs/usb/daplink.js +238 -0
  117. package/build/cjs/usb/daplink.js.map +1 -0
  118. package/build/cjs/usb/daplink.test.js +290 -0
  119. package/build/cjs/usb/daplink.test.js.map +1 -0
  120. package/build/cjs/usb/device-wrapper.d.ts +34 -0
  121. package/build/cjs/usb/device-wrapper.js +102 -0
  122. package/build/cjs/usb/device-wrapper.js.map +1 -0
  123. package/build/cjs/usb/index.d.ts +5 -0
  124. package/build/cjs/usb/index.js +10 -0
  125. package/build/cjs/usb/index.js.map +1 -0
  126. package/build/{esm/usb-partial-flashing-utils.d.ts → cjs/usb/partial-flashing-utils.d.ts} +6 -9
  127. package/build/cjs/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +6 -49
  128. package/build/cjs/usb/partial-flashing-utils.js.map +1 -0
  129. package/build/{esm/usb-partial-flashing.d.ts → cjs/usb/partial-flashing.d.ts} +15 -7
  130. package/build/cjs/{usb-partial-flashing.js → usb/partial-flashing.js} +64 -119
  131. package/build/cjs/usb/partial-flashing.js.map +1 -0
  132. package/build/cjs/usb/promise-queue.js.map +1 -0
  133. package/build/cjs/usb/promise-queue.test.js.map +1 -0
  134. package/build/cjs/usb/serial-events.d.ts +21 -0
  135. package/build/cjs/{led.js → usb/serial-events.js} +1 -1
  136. package/build/cjs/usb/serial-events.js.map +1 -0
  137. package/build/cjs/usb/transport.d.ts +42 -0
  138. package/build/cjs/usb/transport.js +155 -0
  139. package/build/cjs/usb/transport.js.map +1 -0
  140. package/build/{cjs/bluetooth.d.ts → esm/bluetooth/connection.d.ts} +30 -26
  141. package/build/esm/{bluetooth.js → bluetooth/connection.js} +141 -98
  142. package/build/esm/bluetooth/connection.js.map +1 -0
  143. package/build/esm/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
  144. package/build/esm/bluetooth/connection.test.js.map +1 -0
  145. package/build/esm/bluetooth/device-bond-state.js.map +1 -0
  146. package/build/esm/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
  147. package/build/esm/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +32 -32
  148. package/build/esm/bluetooth/device-wrapper.js.map +1 -0
  149. package/build/esm/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
  150. package/build/esm/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
  151. package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -0
  152. package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
  153. package/build/esm/bluetooth/flashing/flashing-makecode.js.map +1 -0
  154. package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.test.js +2 -2
  155. package/build/esm/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
  156. package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
  157. package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.js +4 -4
  158. package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -0
  159. package/build/esm/bluetooth/flashing/flashing-v1.js.map +1 -0
  160. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
  161. package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.js +11 -8
  162. package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -0
  163. package/build/esm/bluetooth/flashing/zip.js.map +1 -0
  164. package/build/esm/bluetooth/flashing/zip.test.d.ts +1 -0
  165. package/build/esm/bluetooth/flashing/zip.test.js.map +1 -0
  166. package/build/esm/bluetooth/index.d.ts +5 -0
  167. package/build/esm/bluetooth/index.js +5 -0
  168. package/build/esm/bluetooth/index.js.map +1 -0
  169. package/build/esm/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
  170. package/build/{cjs/bluetooth-profile.js.map → esm/bluetooth/profile.js.map} +1 -1
  171. package/build/esm/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
  172. package/build/esm/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +10 -6
  173. package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -0
  174. package/build/{cjs → esm/bluetooth/services}/button-service.d.ts +2 -3
  175. package/build/esm/{button-service.js → bluetooth/services/button-service.js} +10 -9
  176. package/build/esm/bluetooth/services/button-service.js.map +1 -0
  177. package/build/{cjs → esm/bluetooth/services}/device-information-service.d.ts +1 -1
  178. package/build/esm/{device-information-service.js → bluetooth/services/device-information-service.js} +1 -1
  179. package/build/esm/bluetooth/services/device-information-service.js.map +1 -0
  180. package/build/esm/{dfu-service.js → bluetooth/services/dfu-service.js} +1 -1
  181. package/build/esm/bluetooth/services/dfu-service.js.map +1 -0
  182. package/build/{cjs → esm/bluetooth/services}/led-service.d.ts +2 -3
  183. package/build/esm/{led-service.js → bluetooth/services/led-service.js} +1 -1
  184. package/build/esm/bluetooth/services/led-service.js.map +1 -0
  185. package/build/esm/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
  186. package/build/esm/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +10 -6
  187. package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -0
  188. package/build/{cjs → esm/bluetooth/services}/partial-flashing-service.d.ts +1 -1
  189. package/build/esm/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +4 -4
  190. package/build/esm/bluetooth/services/partial-flashing-service.js.map +1 -0
  191. package/build/esm/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
  192. package/build/esm/{uart-service.js → bluetooth/services/uart-service.js} +8 -5
  193. package/build/esm/bluetooth/services/uart-service.js.map +1 -0
  194. package/build/esm/board-id.d.ts +1 -1
  195. package/build/esm/board-id.js.map +1 -1
  196. package/build/esm/device.d.ts +82 -75
  197. package/build/esm/device.js +38 -120
  198. package/build/esm/device.js.map +1 -1
  199. package/build/esm/events.d.ts +9 -108
  200. package/build/esm/events.js +26 -86
  201. package/build/esm/events.js.map +1 -1
  202. package/build/esm/events.test.js +55 -49
  203. package/build/esm/events.test.js.map +1 -1
  204. package/build/esm/hex-util.d.ts +1 -0
  205. package/build/esm/hex-util.js +11 -0
  206. package/build/esm/hex-util.js.map +1 -0
  207. package/build/esm/index.d.ts +7 -16
  208. package/build/esm/index.js +6 -10
  209. package/build/esm/index.js.map +1 -1
  210. package/build/esm/radio-bridge/connection.d.ts +39 -0
  211. package/build/esm/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
  212. package/build/esm/radio-bridge/connection.js.map +1 -0
  213. package/build/esm/radio-bridge/index.d.ts +4 -0
  214. package/build/esm/radio-bridge/index.js +5 -0
  215. package/build/esm/radio-bridge/index.js.map +1 -0
  216. package/build/esm/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
  217. package/build/esm/radio-bridge/serial-protocol.js.map +1 -0
  218. package/build/esm/service-events.d.ts +42 -14
  219. package/build/esm/service-events.js +5 -34
  220. package/build/esm/service-events.js.map +1 -1
  221. package/build/{cjs/hex-flash-data-source.d.ts → esm/universal-hex/flash-data-source.d.ts} +1 -2
  222. package/build/esm/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -13
  223. package/build/esm/universal-hex/flash-data-source.js.map +1 -0
  224. package/build/esm/universal-hex/index.d.ts +4 -0
  225. package/build/esm/universal-hex/index.js +5 -0
  226. package/build/esm/universal-hex/index.js.map +1 -0
  227. package/build/esm/usb/arm-debug.d.ts +137 -0
  228. package/build/esm/usb/arm-debug.js +409 -0
  229. package/build/esm/usb/arm-debug.js.map +1 -0
  230. package/build/esm/usb/arm-debug.test.d.ts +1 -0
  231. package/build/esm/usb/arm-debug.test.js +331 -0
  232. package/build/esm/usb/arm-debug.test.js.map +1 -0
  233. package/build/{cjs → esm/usb}/board-serial-info.d.ts +2 -1
  234. package/build/esm/{board-serial-info.js → usb/board-serial-info.js} +10 -7
  235. package/build/esm/usb/board-serial-info.js.map +1 -0
  236. package/build/esm/usb/board-serial-info.test.d.ts +1 -0
  237. package/build/esm/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
  238. package/build/esm/usb/board-serial-info.test.js.map +1 -0
  239. package/build/esm/usb/cdc-saturation.d.ts +36 -0
  240. package/build/esm/usb/cdc-saturation.js +148 -0
  241. package/build/esm/usb/cdc-saturation.js.map +1 -0
  242. package/build/esm/usb/cmsis-dap.d.ts +113 -0
  243. package/build/esm/usb/cmsis-dap.js +342 -0
  244. package/build/esm/usb/cmsis-dap.js.map +1 -0
  245. package/build/esm/usb/cmsis-dap.test.d.ts +1 -0
  246. package/build/esm/usb/cmsis-dap.test.js +348 -0
  247. package/build/esm/usb/cmsis-dap.test.js.map +1 -0
  248. package/build/esm/usb/connection.d.ts +81 -0
  249. package/build/esm/{usb.js → usb/connection.js} +239 -161
  250. package/build/esm/usb/connection.js.map +1 -0
  251. package/build/esm/usb/connection.test.d.ts +1 -0
  252. package/build/esm/{usb.test.js → usb/connection.test.js} +47 -37
  253. package/build/esm/usb/connection.test.js.map +1 -0
  254. package/build/esm/usb/cortex-m.d.ts +72 -0
  255. package/build/esm/usb/cortex-m.js +161 -0
  256. package/build/esm/usb/cortex-m.js.map +1 -0
  257. package/build/esm/usb/cortex-m.test.d.ts +1 -0
  258. package/build/esm/usb/cortex-m.test.js +215 -0
  259. package/build/esm/usb/cortex-m.test.js.map +1 -0
  260. package/build/esm/usb/daplink.d.ts +69 -0
  261. package/build/esm/usb/daplink.js +231 -0
  262. package/build/esm/usb/daplink.js.map +1 -0
  263. package/build/esm/usb/daplink.test.d.ts +1 -0
  264. package/build/esm/usb/daplink.test.js +288 -0
  265. package/build/esm/usb/daplink.test.js.map +1 -0
  266. package/build/esm/usb/device-wrapper.d.ts +34 -0
  267. package/build/esm/usb/device-wrapper.js +98 -0
  268. package/build/esm/usb/device-wrapper.js.map +1 -0
  269. package/build/esm/usb/index.d.ts +5 -0
  270. package/build/esm/usb/index.js +5 -0
  271. package/build/esm/usb/index.js.map +1 -0
  272. package/build/{cjs/usb-partial-flashing-utils.d.ts → esm/usb/partial-flashing-utils.d.ts} +6 -9
  273. package/build/esm/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +4 -44
  274. package/build/esm/usb/partial-flashing-utils.js.map +1 -0
  275. package/build/{cjs/usb-partial-flashing.d.ts → esm/usb/partial-flashing.d.ts} +15 -7
  276. package/build/esm/{usb-partial-flashing.js → usb/partial-flashing.js} +62 -94
  277. package/build/esm/usb/partial-flashing.js.map +1 -0
  278. package/build/esm/usb/promise-queue.js.map +1 -0
  279. package/build/esm/usb/promise-queue.test.d.ts +1 -0
  280. package/build/esm/usb/promise-queue.test.js.map +1 -0
  281. package/build/esm/usb/serial-events.d.ts +21 -0
  282. package/build/esm/usb/serial-events.js +2 -0
  283. package/build/esm/usb/serial-events.js.map +1 -0
  284. package/build/esm/usb/transport.d.ts +42 -0
  285. package/build/esm/usb/transport.js +151 -0
  286. package/build/esm/usb/transport.js.map +1 -0
  287. package/package.json +43 -2
  288. package/build/cjs/accelerometer-service.js.map +0 -1
  289. package/build/cjs/accelerometer.d.ts +0 -9
  290. package/build/cjs/accelerometer.js +0 -16
  291. package/build/cjs/accelerometer.js.map +0 -1
  292. package/build/cjs/bluetooth-device-wrapper.js.map +0 -1
  293. package/build/cjs/bluetooth.js.map +0 -1
  294. package/build/cjs/bluetooth.test.js.map +0 -1
  295. package/build/cjs/board-serial-info.js.map +0 -1
  296. package/build/cjs/board-serial-info.test.js.map +0 -1
  297. package/build/cjs/button-service.js.map +0 -1
  298. package/build/cjs/buttons.d.ts +0 -10
  299. package/build/cjs/buttons.js +0 -22
  300. package/build/cjs/buttons.js.map +0 -1
  301. package/build/cjs/constants.d.ts +0 -48
  302. package/build/cjs/constants.js +0 -73
  303. package/build/cjs/constants.js.map +0 -1
  304. package/build/cjs/device-bond-state.js.map +0 -1
  305. package/build/cjs/device-information-service.js.map +0 -1
  306. package/build/cjs/dfu-service.js.map +0 -1
  307. package/build/cjs/flashing/flashing-full.js.map +0 -1
  308. package/build/cjs/flashing/flashing-makecode.js.map +0 -1
  309. package/build/cjs/flashing/flashing-makecode.test.js.map +0 -1
  310. package/build/cjs/flashing/flashing-partial.js.map +0 -1
  311. package/build/cjs/flashing/flashing-v1.js.map +0 -1
  312. package/build/cjs/flashing/nordic-dfu.js.map +0 -1
  313. package/build/cjs/flashing/zip.js.map +0 -1
  314. package/build/cjs/flashing/zip.test.js.map +0 -1
  315. package/build/cjs/hex-flash-data-source.js.map +0 -1
  316. package/build/cjs/led-service.js.map +0 -1
  317. package/build/cjs/led.d.ts +0 -6
  318. package/build/cjs/led.js.map +0 -1
  319. package/build/cjs/magnetometer-service.js.map +0 -1
  320. package/build/cjs/magnetometer.d.ts +0 -9
  321. package/build/cjs/magnetometer.js +0 -16
  322. package/build/cjs/magnetometer.js.map +0 -1
  323. package/build/cjs/partial-flashing-service.js.map +0 -1
  324. package/build/cjs/promise-queue.js.map +0 -1
  325. package/build/cjs/promise-queue.test.js.map +0 -1
  326. package/build/cjs/serial-events.d.ts +0 -20
  327. package/build/cjs/serial-events.js +0 -69
  328. package/build/cjs/serial-events.js.map +0 -1
  329. package/build/cjs/uart-service.js.map +0 -1
  330. package/build/cjs/uart.d.ts +0 -4
  331. package/build/cjs/uart.js +0 -16
  332. package/build/cjs/uart.js.map +0 -1
  333. package/build/cjs/usb-device-wrapper.d.ts +0 -47
  334. package/build/cjs/usb-device-wrapper.js +0 -437
  335. package/build/cjs/usb-device-wrapper.js.map +0 -1
  336. package/build/cjs/usb-partial-flashing-utils.js.map +0 -1
  337. package/build/cjs/usb-partial-flashing.js.map +0 -1
  338. package/build/cjs/usb-radio-bridge.d.ts +0 -24
  339. package/build/cjs/usb-radio-bridge.js.map +0 -1
  340. package/build/cjs/usb-serial-protocol.js.map +0 -1
  341. package/build/cjs/usb.d.ts +0 -66
  342. package/build/cjs/usb.js.map +0 -1
  343. package/build/cjs/usb.test.js.map +0 -1
  344. package/build/esm/accelerometer-service.js.map +0 -1
  345. package/build/esm/accelerometer.d.ts +0 -9
  346. package/build/esm/accelerometer.js +0 -12
  347. package/build/esm/accelerometer.js.map +0 -1
  348. package/build/esm/bluetooth-device-wrapper.js.map +0 -1
  349. package/build/esm/bluetooth-profile.js.map +0 -1
  350. package/build/esm/bluetooth.js.map +0 -1
  351. package/build/esm/bluetooth.test.js.map +0 -1
  352. package/build/esm/board-serial-info.js.map +0 -1
  353. package/build/esm/board-serial-info.test.js.map +0 -1
  354. package/build/esm/button-service.js.map +0 -1
  355. package/build/esm/buttons.d.ts +0 -10
  356. package/build/esm/buttons.js +0 -18
  357. package/build/esm/buttons.js.map +0 -1
  358. package/build/esm/constants.d.ts +0 -48
  359. package/build/esm/constants.js +0 -70
  360. package/build/esm/constants.js.map +0 -1
  361. package/build/esm/device-bond-state.js.map +0 -1
  362. package/build/esm/device-information-service.js.map +0 -1
  363. package/build/esm/dfu-service.js.map +0 -1
  364. package/build/esm/flashing/flashing-full.js.map +0 -1
  365. package/build/esm/flashing/flashing-makecode.js.map +0 -1
  366. package/build/esm/flashing/flashing-makecode.test.js.map +0 -1
  367. package/build/esm/flashing/flashing-partial.js.map +0 -1
  368. package/build/esm/flashing/flashing-v1.js.map +0 -1
  369. package/build/esm/flashing/nordic-dfu.js.map +0 -1
  370. package/build/esm/flashing/zip.js.map +0 -1
  371. package/build/esm/flashing/zip.test.js.map +0 -1
  372. package/build/esm/hex-flash-data-source.js.map +0 -1
  373. package/build/esm/led-service.js.map +0 -1
  374. package/build/esm/led.d.ts +0 -6
  375. package/build/esm/led.js +0 -2
  376. package/build/esm/led.js.map +0 -1
  377. package/build/esm/magnetometer-service.js.map +0 -1
  378. package/build/esm/magnetometer.d.ts +0 -9
  379. package/build/esm/magnetometer.js +0 -12
  380. package/build/esm/magnetometer.js.map +0 -1
  381. package/build/esm/partial-flashing-service.js.map +0 -1
  382. package/build/esm/promise-queue.js.map +0 -1
  383. package/build/esm/promise-queue.test.js.map +0 -1
  384. package/build/esm/serial-events.d.ts +0 -20
  385. package/build/esm/serial-events.js +0 -61
  386. package/build/esm/serial-events.js.map +0 -1
  387. package/build/esm/uart-service.js.map +0 -1
  388. package/build/esm/uart.d.ts +0 -4
  389. package/build/esm/uart.js +0 -12
  390. package/build/esm/uart.js.map +0 -1
  391. package/build/esm/usb-device-wrapper.d.ts +0 -47
  392. package/build/esm/usb-device-wrapper.js +0 -410
  393. package/build/esm/usb-device-wrapper.js.map +0 -1
  394. package/build/esm/usb-partial-flashing-utils.js.map +0 -1
  395. package/build/esm/usb-partial-flashing.js.map +0 -1
  396. package/build/esm/usb-radio-bridge.d.ts +0 -24
  397. package/build/esm/usb-radio-bridge.js.map +0 -1
  398. package/build/esm/usb-serial-protocol.js.map +0 -1
  399. package/build/esm/usb.d.ts +0 -66
  400. package/build/esm/usb.js.map +0 -1
  401. package/build/esm/usb.test.js.map +0 -1
  402. /package/build/cjs/{bluetooth.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
  403. /package/build/cjs/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
  404. /package/build/cjs/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
  405. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
  406. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.d.ts +0 -0
  407. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  408. /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  409. /package/build/cjs/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  410. /package/build/cjs/{flashing → bluetooth/flashing}/zip.js +0 -0
  411. /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.d.ts +0 -0
  412. /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.js +0 -0
  413. /package/build/cjs/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
  414. /package/build/cjs/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  415. /package/build/cjs/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  416. /package/build/cjs/{board-serial-info.test.d.ts → usb/arm-debug.test.d.ts} +0 -0
  417. /package/build/{esm → cjs/usb}/board-serial-info.test.d.ts +0 -0
  418. /package/build/cjs/{promise-queue.test.d.ts → usb/cmsis-dap.test.d.ts} +0 -0
  419. /package/build/cjs/{usb.test.d.ts → usb/connection.test.d.ts} +0 -0
  420. /package/build/{esm/bluetooth.test.d.ts → cjs/usb/cortex-m.test.d.ts} +0 -0
  421. /package/build/{esm/flashing/flashing-makecode.test.d.ts → cjs/usb/daplink.test.d.ts} +0 -0
  422. /package/build/cjs/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  423. /package/build/cjs/{promise-queue.js → usb/promise-queue.js} +0 -0
  424. /package/build/{esm → cjs/usb}/promise-queue.test.d.ts +0 -0
  425. /package/build/cjs/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
  426. /package/build/esm/{flashing/zip.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
  427. /package/build/esm/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
  428. /package/build/esm/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
  429. /package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
  430. /package/build/esm/{usb.test.d.ts → bluetooth/flashing/flashing-makecode.test.d.ts} +0 -0
  431. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
  432. /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
  433. /package/build/esm/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
  434. /package/build/esm/{flashing → bluetooth/flashing}/zip.js +0 -0
  435. /package/build/esm/{flashing → bluetooth/flashing}/zip.test.js +0 -0
  436. /package/build/esm/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
  437. /package/build/esm/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
  438. /package/build/esm/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
  439. /package/build/esm/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
  440. /package/build/esm/{promise-queue.js → usb/promise-queue.js} +0 -0
  441. /package/build/esm/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
@@ -0,0 +1,331 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { DeviceError } from "../device.js";
3
+ import { ConsoleLogging } from "../logging.js";
4
+ import { ArmDebugSwd, waitFor } from "./arm-debug.js";
5
+ import { AP, DapResponseMismatchError, DP, READ, WRITE, } from "./cmsis-dap.js";
6
+ // ---------------------------------------------------------------------------
7
+ // Mock DAP
8
+ // ---------------------------------------------------------------------------
9
+ /**
10
+ * Creates a mock Dap that records transfer calls and returns configurable
11
+ * values. By default all methods resolve successfully.
12
+ *
13
+ * Read operations auto-respond from a register map (keyed by "port:register")
14
+ * when no queued results are available, making tests resilient to changes in
15
+ * the number or ordering of internal transfer calls.
16
+ */
17
+ function createMockDap() {
18
+ // Track all transfer calls for assertions
19
+ const transferCalls = [];
20
+ // Queue of return values for transfer() — takes priority over registers.
21
+ const transferResults = [];
22
+ // Queue of return values for transferBlockRead()
23
+ const blockReadResults = [];
24
+ // Register map for auto-responding to reads when the queue is empty.
25
+ const registers = new Map();
26
+ let _isOpen = false;
27
+ const mock = {
28
+ get isOpen() {
29
+ return _isOpen;
30
+ },
31
+ blockSize: 59, // same as real CmsisDapUsb (64 - 4 - 1)
32
+ transferCalls,
33
+ registers,
34
+ queueTransferResult(...values) {
35
+ transferResults.push(new Uint32Array(values));
36
+ },
37
+ queueBlockReadResult(...values) {
38
+ blockReadResults.push(new Uint32Array(values));
39
+ },
40
+ open: vi.fn(async () => {
41
+ _isOpen = true;
42
+ }),
43
+ close: vi.fn(async () => {
44
+ _isOpen = false;
45
+ }),
46
+ send: vi.fn(async () => new DataView(new ArrayBuffer(64))),
47
+ clearAbort: vi.fn(async () => { }),
48
+ swjSequence: vi.fn(async () => { }),
49
+ swjClock: vi.fn(async () => { }),
50
+ connect: vi.fn(async () => { }),
51
+ disconnect: vi.fn(async () => { }),
52
+ configureTransfer: vi.fn(async () => { }),
53
+ drainStaleResponses: vi.fn(async () => { }),
54
+ transfer: vi.fn(async (ops) => {
55
+ transferCalls.push([...ops]);
56
+ if (transferResults.length > 0) {
57
+ return transferResults.shift();
58
+ }
59
+ // Auto-respond: return values for READ ops from the register map.
60
+ const readValues = [];
61
+ for (const op of ops) {
62
+ if (op.mode === READ) {
63
+ readValues.push(registers.get(`${op.port}:${op.register}`) ?? 0);
64
+ }
65
+ }
66
+ return new Uint32Array(readValues);
67
+ }),
68
+ transferBlockRead: vi.fn(async () => {
69
+ return blockReadResults.shift() ?? new Uint32Array(0);
70
+ }),
71
+ transferBlockWrite: vi.fn(async () => { }),
72
+ };
73
+ return mock;
74
+ }
75
+ // CTRL/STAT power-up ACK bits (must match arm-debug.ts constants)
76
+ const CSYSPWRUPACK = 1 << 31;
77
+ const CDBGPWRUPACK = 1 << 29;
78
+ const POWER_UP_ACK = (CSYSPWRUPACK | CDBGPWRUPACK) >>> 0;
79
+ // AP registers
80
+ const AP_DRW = 0x0c;
81
+ const logging = new ConsoleLogging();
82
+ // DP registers (matching arm-debug.ts constants)
83
+ const DP_DPIDR = 0x0;
84
+ const DP_CTRL_STAT = 0x4;
85
+ // ---------------------------------------------------------------------------
86
+ // Helpers
87
+ // ---------------------------------------------------------------------------
88
+ /**
89
+ * Set up register map values so the SWD connect sequence succeeds.
90
+ * Unlike a queue-based approach, this is resilient to changes in the
91
+ * number or ordering of internal transfer calls during connect.
92
+ */
93
+ function setupConnectRegisters(dap) {
94
+ dap.registers.set(`${DP}:${DP_DPIDR}`, 0x0bb11477);
95
+ dap.registers.set(`${DP}:${DP_CTRL_STAT}`, POWER_UP_ACK);
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // Tests
99
+ // ---------------------------------------------------------------------------
100
+ describe("ArmDebugSwd", () => {
101
+ let dap;
102
+ let adi;
103
+ beforeEach(() => {
104
+ dap = createMockDap();
105
+ adi = new ArmDebugSwd(dap, logging);
106
+ });
107
+ describe("connect", () => {
108
+ it("runs the SWD init sequence", async () => {
109
+ setupConnectRegisters(dap);
110
+ await adi.connect();
111
+ // Transport opened
112
+ expect(dap.open).toHaveBeenCalled();
113
+ // SWD protocol setup
114
+ expect(dap.swjClock).toHaveBeenCalledWith(10_000_000);
115
+ expect(dap.connect).toHaveBeenCalled();
116
+ expect(dap.configureTransfer).toHaveBeenCalledWith(0, 100, 0);
117
+ // 4 SWJ sequences (line reset, SWD select, line reset, idle)
118
+ expect(dap.swjSequence).toHaveBeenCalledTimes(4);
119
+ // DP register operations happened
120
+ expect(dap.transfer).toHaveBeenCalled();
121
+ });
122
+ it("skips if already connected", async () => {
123
+ setupConnectRegisters(dap);
124
+ await adi.connect();
125
+ vi.mocked(dap.open).mockClear();
126
+ await adi.connect();
127
+ expect(dap.open).not.toHaveBeenCalled();
128
+ });
129
+ it("retries on DapResponseMismatchError", async () => {
130
+ // First attempt: swjClock throws mismatch
131
+ vi.mocked(dap.swjClock).mockRejectedValueOnce(new DapResponseMismatchError(0x11, 0x05));
132
+ // clearAbort on the failed attempt
133
+ vi.mocked(dap.clearAbort).mockResolvedValueOnce(undefined);
134
+ // Second attempt succeeds
135
+ setupConnectRegisters(dap);
136
+ await adi.connect();
137
+ expect(dap.drainStaleResponses).toHaveBeenCalledTimes(1);
138
+ expect(dap.swjClock).toHaveBeenCalledTimes(2);
139
+ });
140
+ it("throws after exhausting retries", async () => {
141
+ vi.mocked(dap.swjClock).mockRejectedValue(new DapResponseMismatchError(0x11, 0x05));
142
+ await expect(adi.connect(2)).rejects.toThrow(DapResponseMismatchError);
143
+ expect(dap.drainStaleResponses).toHaveBeenCalledTimes(1);
144
+ });
145
+ it("rethrows non-mismatch errors immediately", async () => {
146
+ vi.mocked(dap.swjClock).mockRejectedValueOnce(new Error("USB gone"));
147
+ await expect(adi.connect()).rejects.toThrow("USB gone");
148
+ expect(dap.drainStaleResponses).not.toHaveBeenCalled();
149
+ });
150
+ });
151
+ describe("disconnect", () => {
152
+ it("disconnects and closes transport", async () => {
153
+ setupConnectRegisters(dap);
154
+ await adi.connect();
155
+ await adi.disconnect();
156
+ expect(dap.disconnect).toHaveBeenCalled();
157
+ expect(dap.close).toHaveBeenCalled();
158
+ });
159
+ it("is a no-op if not connected", async () => {
160
+ await adi.disconnect();
161
+ expect(dap.disconnect).not.toHaveBeenCalled();
162
+ expect(dap.close).not.toHaveBeenCalled();
163
+ });
164
+ it("falls back to clearAbort if disconnect fails", async () => {
165
+ setupConnectRegisters(dap);
166
+ await adi.connect();
167
+ vi.mocked(dap.disconnect).mockRejectedValueOnce(new Error("fail"));
168
+ await adi.disconnect();
169
+ expect(dap.clearAbort).toHaveBeenCalled();
170
+ expect(dap.close).toHaveBeenCalled();
171
+ });
172
+ });
173
+ describe("reinit", () => {
174
+ it("resets state and reconnects without closing", async () => {
175
+ setupConnectRegisters(dap);
176
+ await adi.connect();
177
+ vi.mocked(dap.open).mockClear();
178
+ vi.mocked(dap.close).mockClear();
179
+ // reinit calls connectOnce which needs the full sequence
180
+ setupConnectRegisters(dap);
181
+ await adi.reinit();
182
+ // open is called again (connectOnce opens transport)
183
+ expect(dap.open).toHaveBeenCalled();
184
+ // close was NOT called (reinit doesn't close)
185
+ expect(dap.close).not.toHaveBeenCalled();
186
+ });
187
+ });
188
+ describe("readMem32 / writeMem32", () => {
189
+ beforeEach(async () => {
190
+ setupConnectRegisters(dap);
191
+ await adi.connect();
192
+ dap.transferCalls.length = 0;
193
+ });
194
+ it("reads a 32-bit value from memory", async () => {
195
+ dap.queueTransferResult(0xdeadbeef);
196
+ const value = await adi.readMem32(0x10000010);
197
+ expect(value).toBe(0xdeadbeef);
198
+ // Should have generated ops for CSW, TAR, and DRW read
199
+ const ops = dap.transferCalls[0];
200
+ expect(ops.some((op) => op.register === AP_DRW && op.mode === READ)).toBe(true);
201
+ });
202
+ it("writes a 32-bit value to memory", async () => {
203
+ await adi.writeMem32(0x10000010, 0x12345678);
204
+ const ops = dap.transferCalls[0];
205
+ const drwWrite = ops.find((op) => op.register === AP_DRW && op.mode === WRITE);
206
+ expect(drwWrite).toBeDefined();
207
+ expect(drwWrite.value).toBe(0x12345678);
208
+ });
209
+ });
210
+ describe("register caching", () => {
211
+ beforeEach(async () => {
212
+ setupConnectRegisters(dap);
213
+ await adi.connect();
214
+ dap.transferCalls.length = 0;
215
+ });
216
+ it("caches DP_SELECT and skips redundant writes", async () => {
217
+ // First read: all ops including DP_SELECT
218
+ await adi.readMem32(0x10000010);
219
+ const firstCallOpCount = dap.transferCalls[0].length;
220
+ // Second read at same address: DP_SELECT should be cached
221
+ await adi.readMem32(0x10000010);
222
+ const secondCallOpCount = dap.transferCalls[1].length;
223
+ expect(secondCallOpCount).toBeLessThan(firstCallOpCount);
224
+ });
225
+ it("invalidates cache on transfer error", async () => {
226
+ // First read succeeds, populating cache
227
+ await adi.readMem32(0x10000010);
228
+ // Second read: cache is warm, fewer ops
229
+ await adi.readMem32(0x10000010);
230
+ const cachedCallOpCount = dap.transferCalls[1].length;
231
+ // Third read fails — this invalidates the cache
232
+ vi.mocked(dap.transfer).mockRejectedValueOnce(new Error("fault"));
233
+ await expect(adi.readMem32(0x10000010)).rejects.toThrow("fault");
234
+ // Fourth read: cache should be invalidated, more ops than cached
235
+ await adi.readMem32(0x10000010);
236
+ const afterErrorOpCount = dap.transferCalls[2].length;
237
+ expect(afterErrorOpCount).toBeGreaterThan(cachedCallOpCount);
238
+ });
239
+ });
240
+ describe("readBlock", () => {
241
+ beforeEach(async () => {
242
+ setupConnectRegisters(dap);
243
+ await adi.connect();
244
+ dap.transferCalls.length = 0;
245
+ });
246
+ it("reads a small block in a single chunk", async () => {
247
+ dap.queueBlockReadResult(0x100, 0x200, 0x300);
248
+ const result = await adi.readBlock(0x20000000, 3);
249
+ expect(result.length).toBe(3);
250
+ expect(result[0]).toBe(0x100);
251
+ expect(result[1]).toBe(0x200);
252
+ expect(result[2]).toBe(0x300);
253
+ expect(dap.transferBlockRead).toHaveBeenCalledTimes(1);
254
+ });
255
+ it("splits reads at TAR auto-increment page boundaries", async () => {
256
+ // Address near a 1KB boundary: 0x200003F0 is 0x10 (16) bytes from the
257
+ // 1KB boundary at 0x20000400, so 4 words fit in the first page.
258
+ const address = 0x200003f0;
259
+ const count = 8; // 4 words in first page + 4 in next
260
+ dap.queueBlockReadResult(1, 2, 3, 4);
261
+ dap.queueBlockReadResult(5, 6, 7, 8);
262
+ const result = await adi.readBlock(address, count);
263
+ expect(result.length).toBe(8);
264
+ expect(Array.from(result)).toEqual([1, 2, 3, 4, 5, 6, 7, 8]);
265
+ expect(dap.transferBlockRead).toHaveBeenCalledTimes(2);
266
+ });
267
+ });
268
+ describe("writeBlock", () => {
269
+ beforeEach(async () => {
270
+ setupConnectRegisters(dap);
271
+ await adi.connect();
272
+ dap.transferCalls.length = 0;
273
+ });
274
+ it("writes a small block in a single chunk", async () => {
275
+ await adi.writeBlock(0x20000000, new Uint32Array([0xaa, 0xbb]));
276
+ expect(dap.transferBlockWrite).toHaveBeenCalledTimes(1);
277
+ const call = vi.mocked(dap.transferBlockWrite).mock.calls[0];
278
+ expect(call[0]).toBe(AP);
279
+ expect(call[1]).toBe(AP_DRW);
280
+ expect(Array.from(call[2])).toEqual([0xaa, 0xbb]);
281
+ });
282
+ it("splits writes at TAR auto-increment page boundaries", async () => {
283
+ const address = 0x200003f0; // 16 bytes (4 words) from 1KB boundary
284
+ await adi.writeBlock(address, new Uint32Array([1, 2, 3, 4, 5, 6, 7, 8]));
285
+ expect(dap.transferBlockWrite).toHaveBeenCalledTimes(2);
286
+ const firstChunk = vi.mocked(dap.transferBlockWrite).mock.calls[0][2];
287
+ const secondChunk = vi.mocked(dap.transferBlockWrite).mock.calls[1][2];
288
+ expect(Array.from(firstChunk)).toEqual([1, 2, 3, 4]);
289
+ expect(Array.from(secondChunk)).toEqual([5, 6, 7, 8]);
290
+ });
291
+ });
292
+ describe("transferSequence", () => {
293
+ beforeEach(async () => {
294
+ setupConnectRegisters(dap);
295
+ await adi.connect();
296
+ dap.transferCalls.length = 0;
297
+ });
298
+ it("executes groups as separate transfers and concatenates results", async () => {
299
+ const callsBefore = dap.transferCalls.length;
300
+ dap.queueTransferResult(0x11);
301
+ dap.queueTransferResult(0x22);
302
+ const result = await adi.transferSequence([
303
+ [{ port: DP, mode: READ, register: 0x00 }],
304
+ [{ port: DP, mode: READ, register: 0x04 }],
305
+ ]);
306
+ // Two new transfer calls for our two groups
307
+ expect(dap.transferCalls.length - callsBefore).toBe(2);
308
+ expect(result.length).toBe(2);
309
+ expect(result[0]).toBe(0x11);
310
+ expect(result[1]).toBe(0x22);
311
+ });
312
+ });
313
+ describe("waitFor", () => {
314
+ it("throws DeviceError on timeout", async () => {
315
+ await expect(waitFor(() => Promise.resolve(false), 1)).rejects.toThrow(DeviceError);
316
+ });
317
+ });
318
+ describe("resetState", () => {
319
+ it("allows reconnecting after reset", async () => {
320
+ setupConnectRegisters(dap);
321
+ await adi.connect();
322
+ adi.resetState();
323
+ // Should be able to connect again (connectOnce won't skip)
324
+ setupConnectRegisters(dap);
325
+ await adi.connect();
326
+ // open called twice
327
+ expect(dap.open).toHaveBeenCalledTimes(2);
328
+ });
329
+ });
330
+ });
331
+ //# sourceMappingURL=arm-debug.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arm-debug.test.js","sourceRoot":"","sources":["../../../src/usb/arm-debug.test.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,13 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { BoardId } from "./board-id.js";
6
+ import { BoardId } from "../board-id.js";
7
7
  export declare class BoardSerialInfo {
8
8
  id: BoardId;
9
9
  familyId: string;
10
10
  hic: string;
11
11
  constructor(id: BoardId, familyId: string, hic: string);
12
+ static fromSerial(serial: string, log: (msg: string) => void): BoardSerialInfo;
12
13
  static parse(device: USBDevice, log: (msg: string) => void): BoardSerialInfo;
13
14
  eq(other: BoardSerialInfo): boolean;
14
15
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { BoardId } from "./board-id.js";
6
+ import { BoardId } from "../board-id.js";
7
7
  export class BoardSerialInfo {
8
8
  constructor(id, familyId, hic) {
9
9
  Object.defineProperty(this, "id", {
@@ -25,19 +25,22 @@ export class BoardSerialInfo {
25
25
  value: hic
26
26
  });
27
27
  }
28
- static parse(device, log) {
29
- const serial = device.serialNumber;
30
- if (!serial) {
31
- throw new Error("Could not detected ID from connected board.");
32
- }
28
+ static fromSerial(serial, log) {
33
29
  if (serial.length !== 48) {
34
- log(`USB serial number unexpected length: ${serial.length}`);
30
+ log(`Serial number unexpected length: ${serial.length}`);
35
31
  }
36
32
  const id = serial.substring(0, 4);
37
33
  const familyId = serial.substring(4, 8);
38
34
  const hic = serial.slice(-8);
39
35
  return new BoardSerialInfo(BoardId.parse(id), familyId, hic);
40
36
  }
37
+ static parse(device, log) {
38
+ const serial = device.serialNumber;
39
+ if (!serial) {
40
+ throw new Error("Could not detected ID from connected board.");
41
+ }
42
+ return BoardSerialInfo.fromSerial(serial, log);
43
+ }
41
44
  eq(other) {
42
45
  return (other.id === this.id &&
43
46
  other.familyId === this.familyId &&
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-serial-info.js","sourceRoot":"","sources":["../../../src/usb/board-serial-info.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,eAAe;IAC1B,YACS,EAAW,EACX,QAAgB,EAChB,GAAW;QAFlB;;;;mBAAO,EAAE;WAAS;QAClB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,GAAG;WAAQ;IACjB,CAAC;IAEJ,MAAM,CAAC,UAAU,CAAC,MAAc,EAAE,GAA0B;QAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,GAAG,CAAC,oCAAoC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAiB,EAAE,GAA0B;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,EAAE,CAAC,KAAsB;QACvB,OAAO,CACL,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;YACpB,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAChC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CACvB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { BoardId } from "./board-id.js";
6
+ import { BoardId } from "../board-id.js";
7
7
  import { BoardSerialInfo } from "./board-serial-info.js";
8
8
  import { afterEach, describe, expect, it, vi } from "vitest";
9
9
  describe("BoardSerialInfo", () => {
@@ -38,9 +38,7 @@ describe("BoardSerialInfo", () => {
38
38
  familyId: "3602",
39
39
  hic: "00097969",
40
40
  });
41
- expect(log.mock.calls).toEqual([
42
- ["USB serial number unexpected length: 45"],
43
- ]);
41
+ expect(log.mock.calls).toEqual([["Serial number unexpected length: 45"]]);
44
42
  });
45
43
  });
46
44
  //# sourceMappingURL=board-serial-info.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-serial-info.test.js","sourceRoot":"","sources":["../../../src/usb/board-serial-info.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,KAAK,GAAG;QACZ,YAAY,EAAE,kDAAkD;KACpD,CAAC;IACf,MAAM,WAAW,GAAG;QAClB,YAAY,EAAE,+CAA+C;KACjD,CAAC;IACf,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,EAAE,EAAe,CAAC;IAClD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;QAEjE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACzB,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACzB,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * (c) 2026, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * CDC pipeline saturation
8
+ *
9
+ * DAPLink's CDC serial path and WebUSB vendor serial reads share the same
10
+ * UART ring buffer. After a physical USB connection, CDC consumes early
11
+ * serial bytes before our vendor reads can get them, causing truncated
12
+ * output. See: https://github.com/ARMmbed/DAPLink/issues/903
13
+ *
14
+ * Workaround: before flashing, push dummy data through the target's UART
15
+ * to fill DAPLink's internal buffers. When nobody is reading from the CDC
16
+ * serial port, the CDC TX buffer fills first, then cdc_process_event()
17
+ * stops pulling from the UART RX ring buffer, and that fills too. Once
18
+ * both are full, all subsequent UART data overflows harmlessly and
19
+ * post-flash serial output is left for our vendor reads.
20
+ *
21
+ * V1 (nRF51) uses a Thumb blob for the legacy byte-at-a-time UART.
22
+ * V2 (nRF52833) uses SWD register writes to trigger a UARTE DMA transfer.
23
+ *
24
+ * V1 DAPLink defaults to 9600 baud on fresh USB connection, so we call
25
+ * setBaudrate(115200) before saturation to ensure DAPLink can decode the
26
+ * bytes we send.
27
+ */
28
+ import { BoardVersion } from "../device.js";
29
+ import { Logging } from "../logging.js";
30
+ import { type USBDeviceWrapper } from "./device-wrapper.js";
31
+ /**
32
+ * Push dummy data through the target's UART to fill DAPLink's internal
33
+ * CDC buffers, preventing CDC from consuming post-flash serial output.
34
+ * Must be called while the target is halted.
35
+ */
36
+ export declare function saturateCdcPipeline(device: USBDeviceWrapper, boardVersion: BoardVersion, logging: Logging): Promise<void>;
@@ -0,0 +1,148 @@
1
+ /**
2
+ * (c) 2026, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { CoreRegister } from "./cortex-m.js";
7
+ const CDC_SAT_LOAD_ADDR = 0x20000000;
8
+ // DAPLink's UART RX ring buffer + CDC TX buffer must both fill before CDC
9
+ // stops consuming. Buffer sizes vary by interface chip:
10
+ // KL26/KL27: 64 + 64 = 128 bytes
11
+ // nRF52820/nRF52833: 1024 + 64 = 1088 bytes
12
+ // 2048 covers all known variants with headroom (~178ms at 115200 baud).
13
+ const CDC_SAT_BYTE_COUNT = 2048;
14
+ // nRF51 legacy UART registers (base 0x40002000)
15
+ const NRF51_UART_TASKS_STARTTX = 0x40002008;
16
+ const NRF51_UART_TASKS_STOPTX = 0x4000200c;
17
+ const NRF51_UART_EVENTS_TXDRDY = 0x4000211c;
18
+ const NRF51_UART_ENABLE = 0x40002500;
19
+ const NRF51_UART_PSEL_TXD = 0x4000250c;
20
+ const NRF51_UART_BAUDRATE = 0x40002524;
21
+ const NRF51_UART_TXD = 0x4000251c;
22
+ // nRF52833 UARTE registers (base 0x40002000)
23
+ const NRF52_UARTE_TASKS_STARTTX = 0x40002008;
24
+ const NRF52_UARTE_TASKS_STOPTX = 0x4000210c;
25
+ const NRF52_UARTE_EVENTS_ENDTX = 0x40002120;
26
+ const NRF52_UARTE_EVENTS_TXSTOPPED = 0x40002158;
27
+ const NRF52_UARTE_ENABLE = 0x40002500;
28
+ const NRF52_UARTE_PSEL_TXD = 0x4000250c;
29
+ const NRF52_UARTE_BAUDRATE = 0x40002524;
30
+ const NRF52_UARTE_TXD_PTR = 0x40002544;
31
+ const NRF52_UARTE_TXD_MAXCNT = 0x40002548;
32
+ // UART baud rate register value for 115200 (same encoding on nRF51 and nRF52)
33
+ const NRF_BAUDRATE_115200 = 0x01d7e000;
34
+ // micro:bit UART TX pins (target → interface chip)
35
+ const MICROBIT_V1_TX_PIN = 24; // P0.24
36
+ const MICROBIT_V2_TX_PIN = 6; // P0.06
37
+ /**
38
+ * Push dummy data through the target's UART to fill DAPLink's internal
39
+ * CDC buffers, preventing CDC from consuming post-flash serial output.
40
+ * Must be called while the target is halted.
41
+ */
42
+ export async function saturateCdcPipeline(device, boardVersion, logging) {
43
+ try {
44
+ if (boardVersion === "V1") {
45
+ await saturateCdcV1(device, logging);
46
+ }
47
+ else {
48
+ await saturateCdcV2(device, logging);
49
+ }
50
+ }
51
+ catch (e) {
52
+ logging.log(`CDC saturation failed (non-fatal): ${e instanceof Error ? e.message : e}`);
53
+ }
54
+ }
55
+ /**
56
+ * V1 (nRF51): Run a Thumb blob that sends CDC_SAT_BYTE_COUNT bytes at
57
+ * wire speed through the legacy UART. The CPU is resumed with PRIMASK=1
58
+ * to prevent the halted program's ISRs from interfering.
59
+ *
60
+ * Blob register convention (values passed via writeCoreRegister):
61
+ * r0 = byte count, r1 = TXD addr, r2 = TXDRDY addr,
62
+ * r3 = data byte, r4 = 0 (for clearing events)
63
+ *
64
+ * Thumb instructions (word 0 is a BKPT pair used as the LR target):
65
+ * loop: str r4, [r2] // clear TXDRDY
66
+ * str r3, [r1] // write TXD
67
+ * wait: ldr r5, [r2] // read TXDRDY
68
+ * cmp r5, #0
69
+ * beq wait
70
+ * subs r0, #1
71
+ * bne loop
72
+ * bkpt #0
73
+ */
74
+ async function saturateCdcV1(device, logging) {
75
+ const { adi, cortexM } = device;
76
+ // Stop any in-flight TX and fully reconfigure the UART from scratch.
77
+ // The previous program (e.g. MakeCode) may not have set up the UART at
78
+ // all, so we can't assume any registers are configured.
79
+ await adi.writeMem32(NRF51_UART_TASKS_STOPTX, 1);
80
+ await adi.writeMem32(NRF51_UART_ENABLE, 0);
81
+ await adi.writeMem32(NRF51_UART_PSEL_TXD, MICROBIT_V1_TX_PIN);
82
+ await adi.writeMem32(NRF51_UART_BAUDRATE, NRF_BAUDRATE_115200);
83
+ await adi.writeMem32(NRF51_UART_ENABLE, 4); // UART enable
84
+ await adi.writeMem32(NRF51_UART_EVENTS_TXDRDY, 0);
85
+ await adi.writeMem32(NRF51_UART_TASKS_STARTTX, 1);
86
+ const blob = new Uint32Array([
87
+ 0xbe00be00, // BKPT (LR target) + pad
88
+ 0x600b6014, // str r4,[r2]; str r3,[r1]
89
+ 0x2d006815, // ldr r5,[r2]; cmp r5,#0
90
+ 0x3801d0fc, // beq wait; subs r0,#1
91
+ 0xbe00d1f8, // bne loop; bkpt
92
+ ]);
93
+ await adi.writeBlock(CDC_SAT_LOAD_ADDR, blob);
94
+ await cortexM.writeCoreRegister(CoreRegister.PC, (CDC_SAT_LOAD_ADDR + 4) | 1);
95
+ await cortexM.writeCoreRegister(CoreRegister.LR, CDC_SAT_LOAD_ADDR | 1);
96
+ await cortexM.writeCoreRegister(CoreRegister.SP, 0x20004000);
97
+ await cortexM.writeCoreRegister(CoreRegister.PSR, 0x01000000);
98
+ await cortexM.writeCoreRegister(0, CDC_SAT_BYTE_COUNT);
99
+ await cortexM.writeCoreRegister(1, NRF51_UART_TXD);
100
+ await cortexM.writeCoreRegister(2, NRF51_UART_EVENTS_TXDRDY);
101
+ await cortexM.writeCoreRegister(3, 0x00); // NUL byte (ignored by terminals)
102
+ await cortexM.writeCoreRegister(4, 0);
103
+ await cortexM.writeCoreRegister(20, 1); // PRIMASK = 1
104
+ await cortexM.resume(false);
105
+ // Wait for blob to hit its final BKPT (~178ms for 2048 bytes at 115200).
106
+ for (let i = 0; i < 2000; i++) {
107
+ if (await cortexM.isHalted())
108
+ return;
109
+ }
110
+ logging.log("V1 CDC saturation blob did not complete, halting");
111
+ await cortexM.halt();
112
+ }
113
+ /**
114
+ * V2 (nRF52833): Set up a UARTE DMA transfer via SWD register writes.
115
+ * The DMA engine runs independently of the halted CPU.
116
+ */
117
+ async function saturateCdcV2(device, logging) {
118
+ const { adi } = device;
119
+ // Stop any in-flight transfer cleanly
120
+ await adi.writeMem32(NRF52_UARTE_EVENTS_TXSTOPPED, 0);
121
+ await adi.writeMem32(NRF52_UARTE_TASKS_STOPTX, 1);
122
+ for (let i = 0; i < 100; i++) {
123
+ if (await adi.readMem32(NRF52_UARTE_EVENTS_TXSTOPPED))
124
+ break;
125
+ }
126
+ // Fully reconfigure UARTE from scratch — the previous program may not
127
+ // have set up the peripheral at all.
128
+ await adi.writeMem32(NRF52_UARTE_ENABLE, 0);
129
+ await adi.writeMem32(NRF52_UARTE_PSEL_TXD, MICROBIT_V2_TX_PIN);
130
+ await adi.writeMem32(NRF52_UARTE_BAUDRATE, NRF_BAUDRATE_115200);
131
+ await adi.writeMem32(NRF52_UARTE_ENABLE, 8); // 8 = UARTE mode
132
+ // Write NUL bytes to RAM for the DMA buffer (harmless if seen by a
133
+ // CDC reader — terminals ignore NUL).
134
+ const nulBuf = new Uint32Array(CDC_SAT_BYTE_COUNT / 4);
135
+ await adi.writeBlock(CDC_SAT_LOAD_ADDR, nulBuf);
136
+ // Set up DMA and trigger
137
+ await adi.writeMem32(NRF52_UARTE_TXD_PTR, CDC_SAT_LOAD_ADDR);
138
+ await adi.writeMem32(NRF52_UARTE_TXD_MAXCNT, CDC_SAT_BYTE_COUNT);
139
+ await adi.writeMem32(NRF52_UARTE_EVENTS_ENDTX, 0);
140
+ await adi.writeMem32(NRF52_UARTE_TASKS_STARTTX, 1);
141
+ // Poll for ENDTX (~178ms for 2048 bytes at 115200 baud).
142
+ for (let i = 0; i < 2000; i++) {
143
+ if (await adi.readMem32(NRF52_UARTE_EVENTS_ENDTX))
144
+ return;
145
+ }
146
+ logging.log("UARTE ENDTX not detected after polling");
147
+ }
148
+ //# sourceMappingURL=cdc-saturation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdc-saturation.js","sourceRoot":"","sources":["../../../src/usb/cdc-saturation.ts"],"names":[],"mappings":"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"}