@willieee802/zigbee-herdsman 0.48.3 → 0.49.1

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 (1045) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  2. package/.github/copilot-instructions.md +689 -0
  3. package/.github/dependabot.yml +22 -0
  4. package/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +294 -0
  5. package/.github/prompts/create-agentsmd.prompt.md +249 -0
  6. package/.github/prompts/create-specification.prompt.md +127 -0
  7. package/.github/prompts/review-and-refactor.prompt.md +15 -0
  8. package/.github/prompts/update-specification.prompt.md +127 -0
  9. package/.github/workflows/ci.yml +70 -0
  10. package/.github/workflows/release-please.yml +18 -0
  11. package/.github/workflows/stale.yml +20 -0
  12. package/.github/workflows/typedoc.yaml +47 -0
  13. package/.release-please-manifest.json +2 -2
  14. package/.vscode/extensions.json +3 -0
  15. package/.vscode/settings.json +11 -0
  16. package/AGENTS.md +441 -0
  17. package/CHANGELOG.md +1283 -0
  18. package/README.md +1 -1
  19. package/biome.json +103 -0
  20. package/dist/adapter/adapter.d.ts.map +1 -1
  21. package/dist/adapter/adapterDiscovery.d.ts.map +1 -0
  22. package/dist/adapter/const.d.ts.map +1 -0
  23. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts.map +1 -1
  24. package/dist/adapter/ember/adapter/emberAdapter.d.ts.map +1 -1
  25. package/dist/adapter/ember/adapter/endpoints.d.ts.map +1 -1
  26. package/dist/adapter/ember/adapter/oneWaitress.d.ts.map +1 -1
  27. package/dist/adapter/ember/adapter/tokensManager.d.ts.map +1 -1
  28. package/dist/adapter/ember/ezsp/ezsp.d.ts.map +1 -1
  29. package/dist/adapter/ember/utils/initters.d.ts.map +1 -1
  30. package/dist/adapter/events.d.ts.map +1 -1
  31. package/dist/adapter/ezsp/adapter/backup.d.ts.map +1 -1
  32. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts.map +1 -1
  33. package/dist/adapter/ezsp/driver/driver.d.ts.map +1 -1
  34. package/dist/adapter/ezsp/driver/index.d.ts.map +1 -1
  35. package/dist/adapter/ezsp/driver/multicast.d.ts.map +1 -1
  36. package/dist/adapter/index.d.ts.map +1 -1
  37. package/dist/adapter/z-stack/adapter/endpoints.d.ts.map +1 -1
  38. package/dist/adapter/z-stack/adapter/manager.d.ts.map +1 -1
  39. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts.map +1 -1
  40. package/dist/adapter/z-stack/models/startup-options.d.ts.map +1 -1
  41. package/dist/adapter/zboss/adapter/zbossAdapter.d.ts.map +1 -0
  42. package/dist/adapter/zboss/driver.d.ts.map +1 -0
  43. package/dist/adapter/zboss/frame.d.ts.map +1 -0
  44. package/dist/adapter/zboss/frame.js +200 -0
  45. package/dist/adapter/zboss/frame.js.map +1 -0
  46. package/dist/adapter/zboss/uart.d.ts.map +1 -0
  47. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts.map +1 -1
  48. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts.map +1 -1
  49. package/dist/adapter/zigate/driver/buffaloZiGate.js +70 -62
  50. package/dist/adapter/zigate/driver/buffaloZiGate.js.map +1 -1
  51. package/dist/adapter/zigate/driver/ziGateObject.d.ts.map +1 -1
  52. package/dist/adapter/zigate/driver/zigate.d.ts.map +1 -1
  53. package/dist/adapter/zoh/adapter/zohAdapter.d.ts.map +1 -0
  54. package/dist/controller/controller.d.ts.map +1 -1
  55. package/dist/controller/controller.js +524 -350
  56. package/dist/controller/controller.js.map +1 -1
  57. package/dist/controller/database.d.ts.map +1 -1
  58. package/dist/controller/events.d.ts.map +1 -1
  59. package/dist/controller/events.js +0 -110
  60. package/dist/controller/events.js.map +1 -1
  61. package/dist/controller/greenPower.d.ts.map +1 -1
  62. package/dist/controller/greenPower.js +330 -121
  63. package/dist/controller/greenPower.js.map +1 -1
  64. package/dist/controller/helpers/index.d.ts.map +1 -1
  65. package/dist/controller/helpers/ota.d.ts.map +1 -0
  66. package/dist/controller/helpers/ota.js +467 -0
  67. package/dist/controller/helpers/ota.js.map +1 -0
  68. package/dist/controller/helpers/request.d.ts.map +1 -1
  69. package/dist/controller/helpers/requestQueue.d.ts.map +1 -1
  70. package/dist/controller/helpers/zclFrameConverter.d.ts.map +1 -1
  71. package/dist/controller/helpers/zclFrameConverter.js +36 -22
  72. package/dist/controller/helpers/zclFrameConverter.js.map +1 -1
  73. package/dist/controller/index.d.ts.map +1 -1
  74. package/dist/controller/model/device.d.ts.map +1 -1
  75. package/dist/controller/model/device.js +1052 -402
  76. package/dist/controller/model/device.js.map +1 -1
  77. package/dist/controller/model/endpoint.d.ts.map +1 -1
  78. package/dist/controller/model/endpoint.js +447 -292
  79. package/dist/controller/model/endpoint.js.map +1 -1
  80. package/dist/controller/model/entity.d.ts.map +1 -1
  81. package/dist/controller/model/group.d.ts.map +1 -1
  82. package/dist/controller/model/group.js +202 -85
  83. package/dist/controller/model/group.js.map +1 -1
  84. package/dist/controller/model/index.d.ts.map +1 -1
  85. package/dist/controller/model/zigbeeEntity.d.ts.map +1 -0
  86. package/dist/controller/touchlink.d.ts.map +1 -1
  87. package/dist/controller/tstype.d.ts.map +1 -1
  88. package/dist/controller/tstype.js +0 -6
  89. package/dist/controller/tstype.js.map +1 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/utils/timeService.d.ts.map +1 -0
  92. package/dist/utils/timeService.js +127 -0
  93. package/dist/utils/timeService.js.map +1 -0
  94. package/dist/zspec/zcl/buffaloZcl.d.ts.map +1 -1
  95. package/dist/zspec/zcl/buffaloZcl.js +327 -287
  96. package/dist/zspec/zcl/buffaloZcl.js.map +1 -1
  97. package/dist/zspec/zcl/definition/cluster.d.ts.map +1 -1
  98. package/dist/zspec/zcl/definition/cluster.js +6050 -4043
  99. package/dist/zspec/zcl/definition/cluster.js.map +1 -1
  100. package/dist/zspec/zcl/definition/clusters-types.d.ts +8135 -0
  101. package/dist/zspec/zcl/definition/clusters-types.d.ts.map +1 -0
  102. package/dist/zspec/zcl/definition/clusters-types.js +3 -0
  103. package/dist/zspec/zcl/definition/clusters-types.js.map +1 -0
  104. package/dist/zspec/zcl/definition/foundation.d.ts.map +1 -1
  105. package/dist/zspec/zcl/definition/foundation.js +170 -99
  106. package/dist/zspec/zcl/definition/foundation.js.map +1 -1
  107. package/dist/zspec/zcl/definition/tstype.d.ts +190 -31
  108. package/dist/zspec/zcl/definition/tstype.d.ts.map +1 -1
  109. package/dist/zspec/zcl/definition/tstype.js +0 -1
  110. package/dist/zspec/zcl/definition/tstype.js.map +1 -1
  111. package/dist/zspec/zcl/index.d.ts.map +1 -1
  112. package/dist/zspec/zcl/index.js +23 -13
  113. package/dist/zspec/zcl/index.js.map +1 -1
  114. package/dist/zspec/zcl/utils.d.ts.map +1 -1
  115. package/dist/zspec/zcl/utils.js +288 -103
  116. package/dist/zspec/zcl/utils.js.map +1 -1
  117. package/dist/zspec/zcl/zclFrame.d.ts.map +1 -1
  118. package/dist/zspec/zcl/zclFrame.js +121 -97
  119. package/dist/zspec/zcl/zclFrame.js.map +1 -1
  120. package/dist/zspec/zcl/zclHeader.d.ts.map +1 -1
  121. package/dist/zspec/zcl/zclHeader.js +13 -13
  122. package/dist/zspec/zcl/zclHeader.js.map +1 -1
  123. package/examples/join-and-log.js +18 -18
  124. package/package.json +23 -3
  125. package/release-please-config.json +8 -8
  126. package/scripts/check-clusters-changes.ts +328 -0
  127. package/scripts/clusters-changes.log +584 -0
  128. package/scripts/clusters-typegen.ts +608 -0
  129. package/scripts/utils.ts +88 -0
  130. package/scripts/zap-update-clusters-report.json +303 -0
  131. package/scripts/zap-update-clusters.ts +1520 -0
  132. package/scripts/zap-update-types.ts +707 -0
  133. package/scripts/zap-xml-clusters-overrides-data.ts +52 -0
  134. package/scripts/zap-xml-clusters-overrides.ts +400 -0
  135. package/scripts/zap-xml-types.ts +146 -0
  136. package/src/adapter/adapter.ts +210 -0
  137. package/src/adapter/adapterDiscovery.ts +736 -0
  138. package/src/adapter/const.ts +12 -0
  139. package/src/adapter/deconz/adapter/deconzAdapter.ts +888 -0
  140. package/src/adapter/deconz/driver/constants.ts +246 -0
  141. package/src/adapter/deconz/driver/driver.ts +1528 -0
  142. package/src/adapter/deconz/driver/frame.ts +11 -0
  143. package/src/adapter/deconz/driver/frameParser.ts +766 -0
  144. package/src/adapter/deconz/driver/parser.ts +45 -0
  145. package/src/adapter/deconz/driver/writer.ts +22 -0
  146. package/src/adapter/deconz/types.d.ts +13 -0
  147. package/src/adapter/ember/adapter/emberAdapter.ts +2262 -0
  148. package/src/adapter/ember/adapter/endpoints.ts +86 -0
  149. package/src/adapter/ember/adapter/oneWaitress.ts +324 -0
  150. package/src/adapter/ember/adapter/tokensManager.ts +780 -0
  151. package/src/adapter/ember/consts.ts +178 -0
  152. package/src/adapter/ember/enums.ts +1746 -0
  153. package/src/adapter/ember/ezsp/buffalo.ts +1392 -0
  154. package/src/adapter/ember/ezsp/consts.ts +148 -0
  155. package/src/adapter/ember/ezsp/enums.ts +1114 -0
  156. package/src/adapter/ember/ezsp/ezsp.ts +9073 -0
  157. package/src/adapter/ember/ezspError.ts +10 -0
  158. package/src/adapter/ember/types.ts +866 -0
  159. package/src/adapter/ember/uart/ash.ts +1933 -0
  160. package/src/adapter/ember/uart/consts.ts +109 -0
  161. package/src/adapter/ember/uart/enums.ts +192 -0
  162. package/src/adapter/ember/uart/parser.ts +42 -0
  163. package/src/adapter/ember/uart/queues.ts +247 -0
  164. package/src/adapter/ember/uart/writer.ts +50 -0
  165. package/src/adapter/ember/utils/initters.ts +58 -0
  166. package/src/adapter/ember/utils/math.ts +71 -0
  167. package/src/adapter/events.ts +21 -0
  168. package/src/adapter/ezsp/adapter/backup.ts +100 -0
  169. package/src/adapter/ezsp/adapter/ezspAdapter.ts +632 -0
  170. package/src/adapter/ezsp/driver/commands.ts +2497 -0
  171. package/src/adapter/ezsp/driver/consts.ts +11 -0
  172. package/src/adapter/ezsp/driver/driver.ts +1002 -0
  173. package/src/adapter/ezsp/driver/ezsp.ts +802 -0
  174. package/src/adapter/ezsp/driver/frame.ts +101 -0
  175. package/src/adapter/ezsp/driver/index.ts +4 -0
  176. package/src/adapter/ezsp/driver/multicast.ts +78 -0
  177. package/src/adapter/ezsp/driver/parser.ts +81 -0
  178. package/src/adapter/ezsp/driver/types/basic.ts +201 -0
  179. package/src/adapter/ezsp/driver/types/index.ts +239 -0
  180. package/src/adapter/ezsp/driver/types/named.ts +2330 -0
  181. package/src/adapter/ezsp/driver/types/struct.ts +844 -0
  182. package/src/adapter/ezsp/driver/uart.ts +460 -0
  183. package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +44 -0
  184. package/src/adapter/ezsp/driver/utils/index.ts +32 -0
  185. package/src/adapter/ezsp/driver/writer.ts +64 -0
  186. package/src/adapter/index.ts +3 -0
  187. package/src/adapter/serialPort.ts +58 -0
  188. package/src/adapter/tstype.ts +57 -0
  189. package/src/adapter/utils.ts +41 -0
  190. package/src/adapter/z-stack/adapter/adapter-backup.ts +509 -0
  191. package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +457 -0
  192. package/src/adapter/z-stack/adapter/endpoints.ts +60 -0
  193. package/src/adapter/z-stack/adapter/manager.ts +543 -0
  194. package/src/adapter/z-stack/adapter/tstype.ts +6 -0
  195. package/src/adapter/z-stack/adapter/zStackAdapter.ts +1350 -0
  196. package/src/adapter/z-stack/constants/af.ts +27 -0
  197. package/src/adapter/z-stack/constants/common.ts +285 -0
  198. package/src/adapter/z-stack/constants/dbg.ts +23 -0
  199. package/src/adapter/z-stack/constants/index.ts +11 -0
  200. package/src/adapter/z-stack/constants/mac.ts +128 -0
  201. package/src/adapter/z-stack/constants/sapi.ts +25 -0
  202. package/src/adapter/z-stack/constants/sys.ts +72 -0
  203. package/src/adapter/z-stack/constants/util.ts +82 -0
  204. package/src/adapter/z-stack/constants/utils.ts +14 -0
  205. package/src/adapter/z-stack/constants/zdo.ts +103 -0
  206. package/src/adapter/z-stack/models/startup-options.ts +13 -0
  207. package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +44 -0
  208. package/src/adapter/z-stack/structs/entries/address-manager-table.ts +19 -0
  209. package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +12 -0
  210. package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +21 -0
  211. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +19 -0
  212. package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +21 -0
  213. package/src/adapter/z-stack/structs/entries/channel-list.ts +8 -0
  214. package/src/adapter/z-stack/structs/entries/has-configured.ts +16 -0
  215. package/src/adapter/z-stack/structs/entries/index.ts +16 -0
  216. package/src/adapter/z-stack/structs/entries/nib.ts +66 -0
  217. package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +15 -0
  218. package/src/adapter/z-stack/structs/entries/nwk-key.ts +13 -0
  219. package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +8 -0
  220. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +20 -0
  221. package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +19 -0
  222. package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +33 -0
  223. package/src/adapter/z-stack/structs/entries/security-manager-table.ts +22 -0
  224. package/src/adapter/z-stack/structs/index.ts +4 -0
  225. package/src/adapter/z-stack/structs/serializable-memory-object.ts +14 -0
  226. package/src/adapter/z-stack/structs/struct.ts +367 -0
  227. package/src/adapter/z-stack/structs/table.ts +198 -0
  228. package/src/adapter/z-stack/unpi/constants.ts +33 -0
  229. package/src/adapter/z-stack/unpi/frame.ts +62 -0
  230. package/src/adapter/z-stack/unpi/index.ts +4 -0
  231. package/src/adapter/z-stack/unpi/parser.ts +67 -0
  232. package/src/adapter/z-stack/unpi/writer.ts +37 -0
  233. package/src/adapter/z-stack/utils/channel-list.ts +40 -0
  234. package/src/adapter/z-stack/utils/index.ts +2 -0
  235. package/src/adapter/z-stack/utils/network-options.ts +26 -0
  236. package/src/adapter/z-stack/znp/buffaloZnp.ts +175 -0
  237. package/src/adapter/z-stack/znp/definition.ts +2713 -0
  238. package/src/adapter/z-stack/znp/index.ts +2 -0
  239. package/src/adapter/z-stack/znp/parameterType.ts +22 -0
  240. package/src/adapter/z-stack/znp/tstype.ts +44 -0
  241. package/src/adapter/z-stack/znp/utils.ts +10 -0
  242. package/src/adapter/z-stack/znp/znp.ts +345 -0
  243. package/src/adapter/z-stack/znp/zpiObject.ts +148 -0
  244. package/src/adapter/zboss/adapter/zbossAdapter.ts +535 -0
  245. package/src/adapter/zboss/commands.ts +1184 -0
  246. package/src/adapter/zboss/consts.ts +9 -0
  247. package/src/adapter/zboss/driver.ts +422 -0
  248. package/src/adapter/zboss/enums.ts +360 -0
  249. package/src/adapter/zboss/frame.ts +227 -0
  250. package/src/adapter/zboss/reader.ts +65 -0
  251. package/src/adapter/zboss/types.ts +0 -0
  252. package/src/adapter/zboss/uart.ts +428 -0
  253. package/src/adapter/zboss/utils.ts +58 -0
  254. package/src/adapter/zboss/writer.ts +49 -0
  255. package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +25 -0
  256. package/src/adapter/zigate/adapter/zigateAdapter.ts +633 -0
  257. package/src/adapter/zigate/driver/LICENSE +17 -0
  258. package/src/adapter/zigate/driver/buffaloZiGate.ts +210 -0
  259. package/src/adapter/zigate/driver/commandType.ts +418 -0
  260. package/src/adapter/zigate/driver/constants.ts +150 -0
  261. package/src/adapter/zigate/driver/frame.ts +197 -0
  262. package/src/adapter/zigate/driver/messageType.ts +287 -0
  263. package/src/adapter/zigate/driver/parameterType.ts +32 -0
  264. package/src/adapter/zigate/driver/ziGateObject.ts +146 -0
  265. package/src/adapter/zigate/driver/zigate.ts +422 -0
  266. package/src/adapter/zoh/adapter/utils.ts +27 -0
  267. package/src/adapter/zoh/adapter/zohAdapter.ts +931 -0
  268. package/src/buffalo/buffalo.ts +336 -0
  269. package/src/buffalo/index.ts +1 -0
  270. package/src/controller/controller.ts +1159 -0
  271. package/src/controller/database.ts +148 -0
  272. package/src/controller/events.ts +52 -0
  273. package/src/controller/greenPower.ts +613 -0
  274. package/src/controller/helpers/index.ts +1 -0
  275. package/src/controller/helpers/installCodes.ts +107 -0
  276. package/src/controller/helpers/ota.ts +578 -0
  277. package/src/controller/helpers/request.ts +96 -0
  278. package/src/controller/helpers/requestQueue.ts +126 -0
  279. package/src/controller/helpers/zclFrameConverter.ts +64 -0
  280. package/src/controller/helpers/zclTransactionSequenceNumber.ts +15 -0
  281. package/src/controller/index.ts +6 -0
  282. package/src/controller/model/device.ts +1791 -0
  283. package/src/controller/model/endpoint.ts +1235 -0
  284. package/src/controller/model/entity.ts +43 -0
  285. package/src/controller/model/group.ts +446 -0
  286. package/src/controller/model/index.ts +5 -0
  287. package/src/controller/model/konnextConfig.ts +6 -0
  288. package/src/controller/model/zigbeeEntity.ts +30 -0
  289. package/src/controller/touchlink.ts +195 -0
  290. package/src/controller/tstype.ts +374 -0
  291. package/src/index.ts +14 -0
  292. package/src/models/backup-storage-legacy.ts +48 -0
  293. package/src/models/backup-storage-unified.ts +47 -0
  294. package/src/models/backup.ts +37 -0
  295. package/src/models/index.ts +5 -0
  296. package/src/models/network-options.ts +11 -0
  297. package/src/utils/aes.ts +218 -0
  298. package/src/utils/async-mutex.ts +31 -0
  299. package/src/utils/backup.ts +152 -0
  300. package/src/utils/index.ts +5 -0
  301. package/src/utils/logger.ts +20 -0
  302. package/src/utils/patchBigIntSerialization.ts +8 -0
  303. package/src/utils/queue.ts +79 -0
  304. package/src/utils/timeService.ts +139 -0
  305. package/src/utils/utils.ts +19 -0
  306. package/src/utils/wait.ts +5 -0
  307. package/src/utils/waitress.ts +96 -0
  308. package/src/zspec/consts.ts +89 -0
  309. package/src/zspec/enums.ts +22 -0
  310. package/src/zspec/index.ts +3 -0
  311. package/src/zspec/tstypes.ts +18 -0
  312. package/src/zspec/utils.ts +247 -0
  313. package/src/zspec/zcl/buffaloZcl.ts +1073 -0
  314. package/src/zspec/zcl/definition/cluster.ts +7554 -0
  315. package/src/zspec/zcl/definition/clusters-types.ts +8228 -0
  316. package/src/zspec/zcl/definition/consts.ts +24 -0
  317. package/src/zspec/zcl/definition/datatypes.ts +2454 -0
  318. package/src/zspec/zcl/definition/enums.ts +224 -0
  319. package/src/zspec/zcl/definition/foundation.ts +342 -0
  320. package/src/zspec/zcl/definition/manufacturerCode.ts +730 -0
  321. package/src/zspec/zcl/definition/status.ts +69 -0
  322. package/src/zspec/zcl/definition/tstype.ts +432 -0
  323. package/src/zspec/zcl/index.ts +11 -0
  324. package/src/zspec/zcl/utils.ts +504 -0
  325. package/src/zspec/zcl/zclFrame.ts +383 -0
  326. package/src/zspec/zcl/zclHeader.ts +102 -0
  327. package/src/zspec/zcl/zclStatusError.ts +10 -0
  328. package/src/zspec/zdo/buffaloZdo.ts +2336 -0
  329. package/src/zspec/zdo/definition/clusters.ts +722 -0
  330. package/src/zspec/zdo/definition/consts.ts +16 -0
  331. package/src/zspec/zdo/definition/enums.ts +99 -0
  332. package/src/zspec/zdo/definition/status.ts +105 -0
  333. package/src/zspec/zdo/definition/tstypes.ts +1062 -0
  334. package/src/zspec/zdo/index.ts +7 -0
  335. package/src/zspec/zdo/utils.ts +76 -0
  336. package/src/zspec/zdo/zdoStatusError.ts +10 -0
  337. package/test/adapter/adapter.test.ts +1276 -0
  338. package/test/adapter/ember/ash.test.ts +337 -0
  339. package/test/adapter/ember/consts.ts +131 -0
  340. package/test/adapter/ember/emberAdapter.test.ts +3447 -0
  341. package/test/adapter/ember/ezsp.test.ts +389 -0
  342. package/test/adapter/ember/ezspBuffalo.test.ts +93 -0
  343. package/test/adapter/ember/ezspError.test.ts +12 -0
  344. package/test/adapter/ember/math.test.ts +190 -0
  345. package/test/adapter/ezsp/frame.test.ts +30 -0
  346. package/test/adapter/ezsp/uart.test.ts +181 -0
  347. package/test/adapter/z-stack/adapter.test.ts +4260 -0
  348. package/test/adapter/z-stack/constants.test.ts +33 -0
  349. package/test/adapter/z-stack/structs.test.ts +115 -0
  350. package/test/adapter/z-stack/unpi.test.ts +213 -0
  351. package/test/adapter/z-stack/znp.test.ts +1288 -0
  352. package/test/adapter/zboss/fixZdoResponse.test.ts +179 -0
  353. package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +81 -0
  354. package/test/adapter/zigate/zdo.test.ts +187 -0
  355. package/test/adapter/zoh/utils.test.ts +36 -0
  356. package/test/adapter/zoh/zohAdapter.test.ts +1451 -0
  357. package/test/benchOptions.ts +14 -0
  358. package/test/buffalo.test.ts +431 -0
  359. package/test/controller.bench.ts +215 -0
  360. package/test/controller.test.ts +10038 -0
  361. package/test/data/integrity-code-1166-012B-24031511-upgradeMe-RB 249 T.zigbee +0 -0
  362. package/test/data/manuf-tags-tradfri-cv-cct-unified_release_prod_v587757105_33e34452-9267-4665-bc5a-844c8f61f063.ota +0 -0
  363. package/test/data/padded-tretakt_smart_plug_soc-0x1100-2.4.25-prod.ota.ota.signed +0 -0
  364. package/test/data/telink-aes-A60_RGBW_T-0x00B6-0x03483712-MF_DIS.OTA +0 -0
  365. package/test/data/zbminir2_v1.0.8.ota +0 -0
  366. package/test/device-ota.test.ts +3332 -0
  367. package/test/greenpower.test.ts +1409 -0
  368. package/test/mockAdapters.ts +95 -0
  369. package/test/mockDevices.ts +623 -0
  370. package/test/requests.bench.ts +321 -0
  371. package/test/testUtils.ts +20 -0
  372. package/test/timeService.test.ts +214 -0
  373. package/test/tsconfig.json +9 -0
  374. package/test/utils/math.ts +19 -0
  375. package/test/utils.test.ts +352 -0
  376. package/test/vitest.config.mts +28 -0
  377. package/test/vitest.ts +9 -0
  378. package/test/zcl.test.ts +2887 -0
  379. package/test/zspec/utils.test.ts +68 -0
  380. package/test/zspec/zcl/buffalo.test.ts +1316 -0
  381. package/test/zspec/zcl/frame.test.ts +1056 -0
  382. package/test/zspec/zcl/utils.test.ts +650 -0
  383. package/test/zspec/zdo/buffalo.test.ts +1850 -0
  384. package/test/zspec/zdo/utils.test.ts +241 -0
  385. package/tsconfig.json +8 -10
  386. package/.babelrc.js +0 -6
  387. package/.eslintignore +0 -3
  388. package/dist/adapter/adapter.d.ts +0 -64
  389. package/dist/adapter/adapter.js +0 -157
  390. package/dist/adapter/adapter.js.map +0 -1
  391. package/dist/adapter/deconz/adapter/deconzAdapter.d.ts +0 -71
  392. package/dist/adapter/deconz/adapter/deconzAdapter.js +0 -1072
  393. package/dist/adapter/deconz/adapter/deconzAdapter.js.map +0 -1
  394. package/dist/adapter/deconz/adapter/index.d.ts +0 -3
  395. package/dist/adapter/deconz/adapter/index.d.ts.map +0 -1
  396. package/dist/adapter/deconz/adapter/index.js +0 -11
  397. package/dist/adapter/deconz/adapter/index.js.map +0 -1
  398. package/dist/adapter/deconz/driver/constants.d.ts +0 -105
  399. package/dist/adapter/deconz/driver/constants.d.ts.map +0 -1
  400. package/dist/adapter/deconz/driver/constants.js +0 -56
  401. package/dist/adapter/deconz/driver/constants.js.map +0 -1
  402. package/dist/adapter/deconz/driver/driver.d.ts +0 -82
  403. package/dist/adapter/deconz/driver/driver.d.ts.map +0 -1
  404. package/dist/adapter/deconz/driver/driver.js +0 -751
  405. package/dist/adapter/deconz/driver/driver.js.map +0 -1
  406. package/dist/adapter/deconz/driver/frame.d.ts +0 -7
  407. package/dist/adapter/deconz/driver/frame.d.ts.map +0 -1
  408. package/dist/adapter/deconz/driver/frame.js +0 -14
  409. package/dist/adapter/deconz/driver/frame.js.map +0 -1
  410. package/dist/adapter/deconz/driver/frameParser.d.ts +0 -3
  411. package/dist/adapter/deconz/driver/frameParser.d.ts.map +0 -1
  412. package/dist/adapter/deconz/driver/frameParser.js +0 -444
  413. package/dist/adapter/deconz/driver/frameParser.js.map +0 -1
  414. package/dist/adapter/deconz/driver/parser.d.ts +0 -13
  415. package/dist/adapter/deconz/driver/parser.d.ts.map +0 -1
  416. package/dist/adapter/deconz/driver/parser.js +0 -64
  417. package/dist/adapter/deconz/driver/parser.js.map +0 -1
  418. package/dist/adapter/deconz/driver/writer.d.ts +0 -9
  419. package/dist/adapter/deconz/driver/writer.d.ts.map +0 -1
  420. package/dist/adapter/deconz/driver/writer.js +0 -45
  421. package/dist/adapter/deconz/driver/writer.js.map +0 -1
  422. package/dist/adapter/ember/adapter/emberAdapter.d.ts +0 -806
  423. package/dist/adapter/ember/adapter/emberAdapter.js +0 -2942
  424. package/dist/adapter/ember/adapter/emberAdapter.js.map +0 -1
  425. package/dist/adapter/ember/adapter/endpoints.d.ts +0 -27
  426. package/dist/adapter/ember/adapter/endpoints.js +0 -68
  427. package/dist/adapter/ember/adapter/endpoints.js.map +0 -1
  428. package/dist/adapter/ember/adapter/index.d.ts +0 -3
  429. package/dist/adapter/ember/adapter/index.d.ts.map +0 -1
  430. package/dist/adapter/ember/adapter/index.js +0 -6
  431. package/dist/adapter/ember/adapter/index.js.map +0 -1
  432. package/dist/adapter/ember/adapter/oneWaitress.d.ts +0 -108
  433. package/dist/adapter/ember/adapter/oneWaitress.js +0 -241
  434. package/dist/adapter/ember/adapter/oneWaitress.js.map +0 -1
  435. package/dist/adapter/ember/adapter/requestQueue.d.ts +0 -57
  436. package/dist/adapter/ember/adapter/requestQueue.d.ts.map +0 -1
  437. package/dist/adapter/ember/adapter/requestQueue.js +0 -139
  438. package/dist/adapter/ember/adapter/requestQueue.js.map +0 -1
  439. package/dist/adapter/ember/adapter/tokensManager.d.ts +0 -69
  440. package/dist/adapter/ember/adapter/tokensManager.js +0 -688
  441. package/dist/adapter/ember/adapter/tokensManager.js.map +0 -1
  442. package/dist/adapter/ember/consts.d.ts +0 -191
  443. package/dist/adapter/ember/consts.d.ts.map +0 -1
  444. package/dist/adapter/ember/consts.js +0 -246
  445. package/dist/adapter/ember/consts.js.map +0 -1
  446. package/dist/adapter/ember/enums.d.ts +0 -2172
  447. package/dist/adapter/ember/enums.d.ts.map +0 -1
  448. package/dist/adapter/ember/enums.js +0 -2375
  449. package/dist/adapter/ember/enums.js.map +0 -1
  450. package/dist/adapter/ember/ezsp/buffalo.d.ts +0 -156
  451. package/dist/adapter/ember/ezsp/buffalo.d.ts.map +0 -1
  452. package/dist/adapter/ember/ezsp/buffalo.js +0 -1033
  453. package/dist/adapter/ember/ezsp/buffalo.js.map +0 -1
  454. package/dist/adapter/ember/ezsp/consts.d.ts +0 -116
  455. package/dist/adapter/ember/ezsp/consts.d.ts.map +0 -1
  456. package/dist/adapter/ember/ezsp/consts.js +0 -128
  457. package/dist/adapter/ember/ezsp/consts.js.map +0 -1
  458. package/dist/adapter/ember/ezsp/enums.d.ts +0 -879
  459. package/dist/adapter/ember/ezsp/enums.d.ts.map +0 -1
  460. package/dist/adapter/ember/ezsp/enums.js +0 -948
  461. package/dist/adapter/ember/ezsp/enums.js.map +0 -1
  462. package/dist/adapter/ember/ezsp/ezsp.d.ts +0 -2662
  463. package/dist/adapter/ember/ezsp/ezsp.js +0 -6454
  464. package/dist/adapter/ember/ezsp/ezsp.js.map +0 -1
  465. package/dist/adapter/ember/types.d.ts +0 -733
  466. package/dist/adapter/ember/types.d.ts.map +0 -1
  467. package/dist/adapter/ember/types.js +0 -3
  468. package/dist/adapter/ember/types.js.map +0 -1
  469. package/dist/adapter/ember/uart/ash.d.ts +0 -464
  470. package/dist/adapter/ember/uart/ash.d.ts.map +0 -1
  471. package/dist/adapter/ember/uart/ash.js +0 -1633
  472. package/dist/adapter/ember/uart/ash.js.map +0 -1
  473. package/dist/adapter/ember/uart/consts.d.ts +0 -91
  474. package/dist/adapter/ember/uart/consts.d.ts.map +0 -1
  475. package/dist/adapter/ember/uart/consts.js +0 -100
  476. package/dist/adapter/ember/uart/consts.js.map +0 -1
  477. package/dist/adapter/ember/uart/enums.d.ts +0 -191
  478. package/dist/adapter/ember/uart/enums.d.ts.map +0 -1
  479. package/dist/adapter/ember/uart/enums.js +0 -197
  480. package/dist/adapter/ember/uart/enums.js.map +0 -1
  481. package/dist/adapter/ember/uart/parser.d.ts +0 -10
  482. package/dist/adapter/ember/uart/parser.d.ts.map +0 -1
  483. package/dist/adapter/ember/uart/parser.js +0 -37
  484. package/dist/adapter/ember/uart/parser.js.map +0 -1
  485. package/dist/adapter/ember/uart/queues.d.ts +0 -85
  486. package/dist/adapter/ember/uart/queues.d.ts.map +0 -1
  487. package/dist/adapter/ember/uart/queues.js +0 -214
  488. package/dist/adapter/ember/uart/queues.js.map +0 -1
  489. package/dist/adapter/ember/uart/writer.d.ts +0 -15
  490. package/dist/adapter/ember/uart/writer.d.ts.map +0 -1
  491. package/dist/adapter/ember/uart/writer.js +0 -46
  492. package/dist/adapter/ember/uart/writer.js.map +0 -1
  493. package/dist/adapter/ember/utils/initters.d.ts +0 -20
  494. package/dist/adapter/ember/utils/initters.js +0 -58
  495. package/dist/adapter/ember/utils/initters.js.map +0 -1
  496. package/dist/adapter/ember/utils/math.d.ts +0 -51
  497. package/dist/adapter/ember/utils/math.d.ts.map +0 -1
  498. package/dist/adapter/ember/utils/math.js +0 -102
  499. package/dist/adapter/ember/utils/math.js.map +0 -1
  500. package/dist/adapter/ember/zdo.d.ts +0 -925
  501. package/dist/adapter/ember/zdo.d.ts.map +0 -1
  502. package/dist/adapter/ember/zdo.js +0 -723
  503. package/dist/adapter/ember/zdo.js.map +0 -1
  504. package/dist/adapter/events.d.ts +0 -42
  505. package/dist/adapter/events.js +0 -13
  506. package/dist/adapter/events.js.map +0 -1
  507. package/dist/adapter/ezsp/adapter/backup.d.ts +0 -13
  508. package/dist/adapter/ezsp/adapter/backup.js +0 -101
  509. package/dist/adapter/ezsp/adapter/backup.js.map +0 -1
  510. package/dist/adapter/ezsp/adapter/ezspAdapter.d.ts +0 -65
  511. package/dist/adapter/ezsp/adapter/ezspAdapter.js +0 -634
  512. package/dist/adapter/ezsp/adapter/ezspAdapter.js.map +0 -1
  513. package/dist/adapter/ezsp/adapter/index.d.ts +0 -3
  514. package/dist/adapter/ezsp/adapter/index.d.ts.map +0 -1
  515. package/dist/adapter/ezsp/adapter/index.js +0 -11
  516. package/dist/adapter/ezsp/adapter/index.js.map +0 -1
  517. package/dist/adapter/ezsp/driver/commands.d.ts +0 -37
  518. package/dist/adapter/ezsp/driver/commands.d.ts.map +0 -1
  519. package/dist/adapter/ezsp/driver/commands.js +0 -2387
  520. package/dist/adapter/ezsp/driver/commands.js.map +0 -1
  521. package/dist/adapter/ezsp/driver/consts.d.ts +0 -11
  522. package/dist/adapter/ezsp/driver/consts.d.ts.map +0 -1
  523. package/dist/adapter/ezsp/driver/consts.js +0 -14
  524. package/dist/adapter/ezsp/driver/consts.js.map +0 -1
  525. package/dist/adapter/ezsp/driver/driver.d.ts +0 -109
  526. package/dist/adapter/ezsp/driver/driver.js +0 -796
  527. package/dist/adapter/ezsp/driver/driver.js.map +0 -1
  528. package/dist/adapter/ezsp/driver/ezsp.d.ts +0 -106
  529. package/dist/adapter/ezsp/driver/ezsp.d.ts.map +0 -1
  530. package/dist/adapter/ezsp/driver/ezsp.js +0 -664
  531. package/dist/adapter/ezsp/driver/ezsp.js.map +0 -1
  532. package/dist/adapter/ezsp/driver/frame.d.ts +0 -40
  533. package/dist/adapter/ezsp/driver/frame.d.ts.map +0 -1
  534. package/dist/adapter/ezsp/driver/frame.js +0 -101
  535. package/dist/adapter/ezsp/driver/frame.js.map +0 -1
  536. package/dist/adapter/ezsp/driver/index.d.ts +0 -4
  537. package/dist/adapter/ezsp/driver/index.js +0 -9
  538. package/dist/adapter/ezsp/driver/index.js.map +0 -1
  539. package/dist/adapter/ezsp/driver/multicast.d.ts +0 -13
  540. package/dist/adapter/ezsp/driver/multicast.js +0 -74
  541. package/dist/adapter/ezsp/driver/multicast.js.map +0 -1
  542. package/dist/adapter/ezsp/driver/parser.d.ts +0 -12
  543. package/dist/adapter/ezsp/driver/parser.d.ts.map +0 -1
  544. package/dist/adapter/ezsp/driver/parser.js +0 -105
  545. package/dist/adapter/ezsp/driver/parser.js.map +0 -1
  546. package/dist/adapter/ezsp/driver/types/basic.d.ts +0 -63
  547. package/dist/adapter/ezsp/driver/types/basic.d.ts.map +0 -1
  548. package/dist/adapter/ezsp/driver/types/basic.js +0 -209
  549. package/dist/adapter/ezsp/driver/types/basic.js.map +0 -1
  550. package/dist/adapter/ezsp/driver/types/index.d.ts +0 -10
  551. package/dist/adapter/ezsp/driver/types/index.d.ts.map +0 -1
  552. package/dist/adapter/ezsp/driver/types/index.js +0 -139
  553. package/dist/adapter/ezsp/driver/types/index.js.map +0 -1
  554. package/dist/adapter/ezsp/driver/types/named.d.ts +0 -1288
  555. package/dist/adapter/ezsp/driver/types/named.d.ts.map +0 -1
  556. package/dist/adapter/ezsp/driver/types/named.js +0 -2330
  557. package/dist/adapter/ezsp/driver/types/named.js.map +0 -1
  558. package/dist/adapter/ezsp/driver/types/struct.d.ts +0 -271
  559. package/dist/adapter/ezsp/driver/types/struct.d.ts.map +0 -1
  560. package/dist/adapter/ezsp/driver/types/struct.js +0 -804
  561. package/dist/adapter/ezsp/driver/types/struct.js.map +0 -1
  562. package/dist/adapter/ezsp/driver/uart.d.ts +0 -49
  563. package/dist/adapter/ezsp/driver/uart.d.ts.map +0 -1
  564. package/dist/adapter/ezsp/driver/uart.js +0 -383
  565. package/dist/adapter/ezsp/driver/uart.js.map +0 -1
  566. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts +0 -3
  567. package/dist/adapter/ezsp/driver/utils/crc16ccitt.d.ts.map +0 -1
  568. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js +0 -56
  569. package/dist/adapter/ezsp/driver/utils/crc16ccitt.js.map +0 -1
  570. package/dist/adapter/ezsp/driver/utils/index.d.ts +0 -20
  571. package/dist/adapter/ezsp/driver/utils/index.d.ts.map +0 -1
  572. package/dist/adapter/ezsp/driver/utils/index.js +0 -73
  573. package/dist/adapter/ezsp/driver/utils/index.js.map +0 -1
  574. package/dist/adapter/ezsp/driver/writer.d.ts +0 -14
  575. package/dist/adapter/ezsp/driver/writer.d.ts.map +0 -1
  576. package/dist/adapter/ezsp/driver/writer.js +0 -83
  577. package/dist/adapter/ezsp/driver/writer.js.map +0 -1
  578. package/dist/adapter/index.d.ts +0 -5
  579. package/dist/adapter/index.js +0 -36
  580. package/dist/adapter/index.js.map +0 -1
  581. package/dist/adapter/serialPort.d.ts +0 -14
  582. package/dist/adapter/serialPort.d.ts.map +0 -1
  583. package/dist/adapter/serialPort.js +0 -47
  584. package/dist/adapter/serialPort.js.map +0 -1
  585. package/dist/adapter/serialPortUtils.d.ts +0 -13
  586. package/dist/adapter/serialPortUtils.d.ts.map +0 -1
  587. package/dist/adapter/serialPortUtils.js +0 -19
  588. package/dist/adapter/serialPortUtils.js.map +0 -1
  589. package/dist/adapter/socketPortUtils.d.ts +0 -11
  590. package/dist/adapter/socketPortUtils.d.ts.map +0 -1
  591. package/dist/adapter/socketPortUtils.js +0 -17
  592. package/dist/adapter/socketPortUtils.js.map +0 -1
  593. package/dist/adapter/tstype.d.ts +0 -86
  594. package/dist/adapter/tstype.d.ts.map +0 -1
  595. package/dist/adapter/tstype.js +0 -3
  596. package/dist/adapter/tstype.js.map +0 -1
  597. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts +0 -62
  598. package/dist/adapter/z-stack/adapter/adapter-backup.d.ts.map +0 -1
  599. package/dist/adapter/z-stack/adapter/adapter-backup.js +0 -459
  600. package/dist/adapter/z-stack/adapter/adapter-backup.js.map +0 -1
  601. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts +0 -151
  602. package/dist/adapter/z-stack/adapter/adapter-nv-memory.d.ts.map +0 -1
  603. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js +0 -259
  604. package/dist/adapter/z-stack/adapter/adapter-nv-memory.js.map +0 -1
  605. package/dist/adapter/z-stack/adapter/endpoints.d.ts +0 -12
  606. package/dist/adapter/z-stack/adapter/endpoints.js +0 -74
  607. package/dist/adapter/z-stack/adapter/endpoints.js.map +0 -1
  608. package/dist/adapter/z-stack/adapter/index.d.ts +0 -3
  609. package/dist/adapter/z-stack/adapter/index.d.ts.map +0 -1
  610. package/dist/adapter/z-stack/adapter/index.js +0 -9
  611. package/dist/adapter/z-stack/adapter/index.js.map +0 -1
  612. package/dist/adapter/z-stack/adapter/manager.d.ts +0 -84
  613. package/dist/adapter/z-stack/adapter/manager.js +0 -474
  614. package/dist/adapter/z-stack/adapter/manager.js.map +0 -1
  615. package/dist/adapter/z-stack/adapter/tstype.d.ts +0 -7
  616. package/dist/adapter/z-stack/adapter/tstype.d.ts.map +0 -1
  617. package/dist/adapter/z-stack/adapter/tstype.js +0 -10
  618. package/dist/adapter/z-stack/adapter/tstype.js.map +0 -1
  619. package/dist/adapter/z-stack/adapter/zStackAdapter.d.ts +0 -86
  620. package/dist/adapter/z-stack/adapter/zStackAdapter.js +0 -912
  621. package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +0 -1
  622. package/dist/adapter/z-stack/constants/af.d.ts +0 -24
  623. package/dist/adapter/z-stack/constants/af.d.ts.map +0 -1
  624. package/dist/adapter/z-stack/constants/af.js +0 -28
  625. package/dist/adapter/z-stack/constants/af.js.map +0 -1
  626. package/dist/adapter/z-stack/constants/common.d.ts +0 -279
  627. package/dist/adapter/z-stack/constants/common.d.ts.map +0 -1
  628. package/dist/adapter/z-stack/constants/common.js +0 -293
  629. package/dist/adapter/z-stack/constants/common.js.map +0 -1
  630. package/dist/adapter/z-stack/constants/dbg.d.ts +0 -23
  631. package/dist/adapter/z-stack/constants/dbg.d.ts.map +0 -1
  632. package/dist/adapter/z-stack/constants/dbg.js +0 -25
  633. package/dist/adapter/z-stack/constants/dbg.js.map +0 -1
  634. package/dist/adapter/z-stack/constants/index.d.ts +0 -11
  635. package/dist/adapter/z-stack/constants/index.d.ts.map +0 -1
  636. package/dist/adapter/z-stack/constants/index.js +0 -48
  637. package/dist/adapter/z-stack/constants/index.js.map +0 -1
  638. package/dist/adapter/z-stack/constants/mac.d.ts +0 -128
  639. package/dist/adapter/z-stack/constants/mac.d.ts.map +0 -1
  640. package/dist/adapter/z-stack/constants/mac.js +0 -130
  641. package/dist/adapter/z-stack/constants/mac.js.map +0 -1
  642. package/dist/adapter/z-stack/constants/sapi.d.ts +0 -25
  643. package/dist/adapter/z-stack/constants/sapi.d.ts.map +0 -1
  644. package/dist/adapter/z-stack/constants/sapi.js +0 -27
  645. package/dist/adapter/z-stack/constants/sapi.js.map +0 -1
  646. package/dist/adapter/z-stack/constants/sys.d.ts +0 -72
  647. package/dist/adapter/z-stack/constants/sys.d.ts.map +0 -1
  648. package/dist/adapter/z-stack/constants/sys.js +0 -74
  649. package/dist/adapter/z-stack/constants/sys.js.map +0 -1
  650. package/dist/adapter/z-stack/constants/util.d.ts +0 -82
  651. package/dist/adapter/z-stack/constants/util.d.ts.map +0 -1
  652. package/dist/adapter/z-stack/constants/util.js +0 -84
  653. package/dist/adapter/z-stack/constants/util.js.map +0 -1
  654. package/dist/adapter/z-stack/constants/utils.d.ts +0 -5
  655. package/dist/adapter/z-stack/constants/utils.d.ts.map +0 -1
  656. package/dist/adapter/z-stack/constants/utils.js +0 -15
  657. package/dist/adapter/z-stack/constants/utils.js.map +0 -1
  658. package/dist/adapter/z-stack/constants/zdo.d.ts +0 -103
  659. package/dist/adapter/z-stack/constants/zdo.d.ts.map +0 -1
  660. package/dist/adapter/z-stack/constants/zdo.js +0 -105
  661. package/dist/adapter/z-stack/constants/zdo.js.map +0 -1
  662. package/dist/adapter/z-stack/models/index.d.ts +0 -2
  663. package/dist/adapter/z-stack/models/index.d.ts.map +0 -1
  664. package/dist/adapter/z-stack/models/index.js +0 -18
  665. package/dist/adapter/z-stack/models/index.js.map +0 -1
  666. package/dist/adapter/z-stack/models/startup-options.d.ts +0 -13
  667. package/dist/adapter/z-stack/models/startup-options.js +0 -3
  668. package/dist/adapter/z-stack/models/startup-options.js.map +0 -1
  669. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts +0 -24
  670. package/dist/adapter/z-stack/structs/entries/address-manager-entry.d.ts.map +0 -1
  671. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js +0 -46
  672. package/dist/adapter/z-stack/structs/entries/address-manager-entry.js.map +0 -1
  673. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts +0 -11
  674. package/dist/adapter/z-stack/structs/entries/address-manager-table.d.ts.map +0 -1
  675. package/dist/adapter/z-stack/structs/entries/address-manager-table.js +0 -23
  676. package/dist/adapter/z-stack/structs/entries/address-manager-table.js.map +0 -1
  677. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts +0 -11
  678. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.d.ts.map +0 -1
  679. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js +0 -22
  680. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-entry.js.map +0 -1
  681. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts +0 -11
  682. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.d.ts.map +0 -1
  683. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js +0 -24
  684. package/dist/adapter/z-stack/structs/entries/aps-link-key-data-table.js.map +0 -1
  685. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts +0 -11
  686. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.d.ts.map +0 -1
  687. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js +0 -25
  688. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-entry.js.map +0 -1
  689. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts +0 -11
  690. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.d.ts.map +0 -1
  691. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js +0 -24
  692. package/dist/adapter/z-stack/structs/entries/aps-tc-link-key-table.js.map +0 -1
  693. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts +0 -9
  694. package/dist/adapter/z-stack/structs/entries/channel-list.d.ts.map +0 -1
  695. package/dist/adapter/z-stack/structs/entries/channel-list.js +0 -16
  696. package/dist/adapter/z-stack/structs/entries/channel-list.js.map +0 -1
  697. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts +0 -9
  698. package/dist/adapter/z-stack/structs/entries/has-configured.d.ts.map +0 -1
  699. package/dist/adapter/z-stack/structs/entries/has-configured.js +0 -17
  700. package/dist/adapter/z-stack/structs/entries/has-configured.js.map +0 -1
  701. package/dist/adapter/z-stack/structs/entries/index.d.ts +0 -17
  702. package/dist/adapter/z-stack/structs/entries/index.d.ts.map +0 -1
  703. package/dist/adapter/z-stack/structs/entries/index.js +0 -33
  704. package/dist/adapter/z-stack/structs/entries/index.js.map +0 -1
  705. package/dist/adapter/z-stack/structs/entries/nib.d.ts +0 -11
  706. package/dist/adapter/z-stack/structs/entries/nib.d.ts.map +0 -1
  707. package/dist/adapter/z-stack/structs/entries/nib.js +0 -69
  708. package/dist/adapter/z-stack/structs/entries/nib.js.map +0 -1
  709. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts +0 -11
  710. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.d.ts.map +0 -1
  711. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js +0 -19
  712. package/dist/adapter/z-stack/structs/entries/nwk-key-descriptor.js.map +0 -1
  713. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts +0 -9
  714. package/dist/adapter/z-stack/structs/entries/nwk-key.d.ts.map +0 -1
  715. package/dist/adapter/z-stack/structs/entries/nwk-key.js +0 -16
  716. package/dist/adapter/z-stack/structs/entries/nwk-key.js.map +0 -1
  717. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts +0 -9
  718. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.d.ts.map +0 -1
  719. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js +0 -16
  720. package/dist/adapter/z-stack/structs/entries/nwk-pan-id.js.map +0 -1
  721. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts +0 -14
  722. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.d.ts.map +0 -1
  723. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js +0 -24
  724. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.js.map +0 -1
  725. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts +0 -11
  726. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.d.ts.map +0 -1
  727. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js +0 -23
  728. package/dist/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.js.map +0 -1
  729. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts +0 -21
  730. package/dist/adapter/z-stack/structs/entries/security-manager-entry.d.ts.map +0 -1
  731. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js +0 -37
  732. package/dist/adapter/z-stack/structs/entries/security-manager-entry.js.map +0 -1
  733. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts +0 -11
  734. package/dist/adapter/z-stack/structs/entries/security-manager-table.d.ts.map +0 -1
  735. package/dist/adapter/z-stack/structs/entries/security-manager-table.js +0 -25
  736. package/dist/adapter/z-stack/structs/entries/security-manager-table.js.map +0 -1
  737. package/dist/adapter/z-stack/structs/index.d.ts +0 -5
  738. package/dist/adapter/z-stack/structs/index.d.ts.map +0 -1
  739. package/dist/adapter/z-stack/structs/index.js +0 -21
  740. package/dist/adapter/z-stack/structs/index.js.map +0 -1
  741. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts +0 -14
  742. package/dist/adapter/z-stack/structs/serializable-memory-object.d.ts.map +0 -1
  743. package/dist/adapter/z-stack/structs/serializable-memory-object.js +0 -3
  744. package/dist/adapter/z-stack/structs/serializable-memory-object.js.map +0 -1
  745. package/dist/adapter/z-stack/structs/struct.d.ts +0 -100
  746. package/dist/adapter/z-stack/structs/struct.d.ts.map +0 -1
  747. package/dist/adapter/z-stack/structs/struct.js +0 -297
  748. package/dist/adapter/z-stack/structs/struct.js.map +0 -1
  749. package/dist/adapter/z-stack/structs/table.d.ts +0 -95
  750. package/dist/adapter/z-stack/structs/table.d.ts.map +0 -1
  751. package/dist/adapter/z-stack/structs/table.js +0 -164
  752. package/dist/adapter/z-stack/structs/table.js.map +0 -1
  753. package/dist/adapter/z-stack/unpi/constants.d.ts +0 -29
  754. package/dist/adapter/z-stack/unpi/constants.d.ts.map +0 -1
  755. package/dist/adapter/z-stack/unpi/constants.js +0 -40
  756. package/dist/adapter/z-stack/unpi/constants.js.map +0 -1
  757. package/dist/adapter/z-stack/unpi/frame.d.ts +0 -17
  758. package/dist/adapter/z-stack/unpi/frame.d.ts.map +0 -1
  759. package/dist/adapter/z-stack/unpi/frame.js +0 -55
  760. package/dist/adapter/z-stack/unpi/frame.js.map +0 -1
  761. package/dist/adapter/z-stack/unpi/index.d.ts +0 -6
  762. package/dist/adapter/z-stack/unpi/index.d.ts.map +0 -1
  763. package/dist/adapter/z-stack/unpi/index.js +0 -38
  764. package/dist/adapter/z-stack/unpi/index.js.map +0 -1
  765. package/dist/adapter/z-stack/unpi/parser.d.ts +0 -13
  766. package/dist/adapter/z-stack/unpi/parser.d.ts.map +0 -1
  767. package/dist/adapter/z-stack/unpi/parser.js +0 -86
  768. package/dist/adapter/z-stack/unpi/parser.js.map +0 -1
  769. package/dist/adapter/z-stack/unpi/writer.d.ts +0 -12
  770. package/dist/adapter/z-stack/unpi/writer.d.ts.map +0 -1
  771. package/dist/adapter/z-stack/unpi/writer.js +0 -55
  772. package/dist/adapter/z-stack/unpi/writer.js.map +0 -1
  773. package/dist/adapter/z-stack/utils/channel-list.d.ts +0 -21
  774. package/dist/adapter/z-stack/utils/channel-list.d.ts.map +0 -1
  775. package/dist/adapter/z-stack/utils/channel-list.js +0 -41
  776. package/dist/adapter/z-stack/utils/channel-list.js.map +0 -1
  777. package/dist/adapter/z-stack/utils/index.d.ts +0 -3
  778. package/dist/adapter/z-stack/utils/index.d.ts.map +0 -1
  779. package/dist/adapter/z-stack/utils/index.js +0 -19
  780. package/dist/adapter/z-stack/utils/index.js.map +0 -1
  781. package/dist/adapter/z-stack/utils/network-options.d.ts +0 -9
  782. package/dist/adapter/z-stack/utils/network-options.d.ts.map +0 -1
  783. package/dist/adapter/z-stack/utils/network-options.js +0 -23
  784. package/dist/adapter/z-stack/utils/network-options.js.map +0 -1
  785. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts +0 -14
  786. package/dist/adapter/z-stack/znp/buffaloZnp.d.ts.map +0 -1
  787. package/dist/adapter/z-stack/znp/buffaloZnp.js +0 -243
  788. package/dist/adapter/z-stack/znp/buffaloZnp.js.map +0 -1
  789. package/dist/adapter/z-stack/znp/definition.d.ts +0 -6
  790. package/dist/adapter/z-stack/znp/definition.d.ts.map +0 -1
  791. package/dist/adapter/z-stack/znp/definition.js +0 -3052
  792. package/dist/adapter/z-stack/znp/definition.js.map +0 -1
  793. package/dist/adapter/z-stack/znp/index.d.ts +0 -4
  794. package/dist/adapter/z-stack/znp/index.d.ts.map +0 -1
  795. package/dist/adapter/z-stack/znp/index.js +0 -11
  796. package/dist/adapter/z-stack/znp/index.js.map +0 -1
  797. package/dist/adapter/z-stack/znp/parameterType.d.ts +0 -23
  798. package/dist/adapter/z-stack/znp/parameterType.d.ts.map +0 -1
  799. package/dist/adapter/z-stack/znp/parameterType.js +0 -26
  800. package/dist/adapter/z-stack/znp/parameterType.js.map +0 -1
  801. package/dist/adapter/z-stack/znp/tstype.d.ts +0 -23
  802. package/dist/adapter/z-stack/znp/tstype.d.ts.map +0 -1
  803. package/dist/adapter/z-stack/znp/tstype.js +0 -3
  804. package/dist/adapter/z-stack/znp/tstype.js.map +0 -1
  805. package/dist/adapter/z-stack/znp/znp.d.ts +0 -47
  806. package/dist/adapter/z-stack/znp/znp.d.ts.map +0 -1
  807. package/dist/adapter/z-stack/znp/znp.js +0 -322
  808. package/dist/adapter/z-stack/znp/znp.js.map +0 -1
  809. package/dist/adapter/z-stack/znp/zpiObject.d.ts +0 -20
  810. package/dist/adapter/z-stack/znp/zpiObject.d.ts.map +0 -1
  811. package/dist/adapter/z-stack/znp/zpiObject.js +0 -103
  812. package/dist/adapter/z-stack/znp/zpiObject.js.map +0 -1
  813. package/dist/adapter/zigate/adapter/index.d.ts +0 -3
  814. package/dist/adapter/zigate/adapter/index.d.ts.map +0 -1
  815. package/dist/adapter/zigate/adapter/index.js +0 -11
  816. package/dist/adapter/zigate/adapter/index.js.map +0 -1
  817. package/dist/adapter/zigate/adapter/zigateAdapter.d.ts +0 -72
  818. package/dist/adapter/zigate/adapter/zigateAdapter.js +0 -681
  819. package/dist/adapter/zigate/adapter/zigateAdapter.js.map +0 -1
  820. package/dist/adapter/zigate/driver/buffaloZiGate.d.ts +0 -18
  821. package/dist/adapter/zigate/driver/commandType.d.ts +0 -43
  822. package/dist/adapter/zigate/driver/commandType.d.ts.map +0 -1
  823. package/dist/adapter/zigate/driver/commandType.js +0 -390
  824. package/dist/adapter/zigate/driver/commandType.js.map +0 -1
  825. package/dist/adapter/zigate/driver/constants.d.ts +0 -277
  826. package/dist/adapter/zigate/driver/constants.d.ts.map +0 -1
  827. package/dist/adapter/zigate/driver/constants.js +0 -372
  828. package/dist/adapter/zigate/driver/constants.js.map +0 -1
  829. package/dist/adapter/zigate/driver/frame.d.ts +0 -27
  830. package/dist/adapter/zigate/driver/frame.d.ts.map +0 -1
  831. package/dist/adapter/zigate/driver/frame.js +0 -173
  832. package/dist/adapter/zigate/driver/frame.js.map +0 -1
  833. package/dist/adapter/zigate/driver/messageType.d.ts +0 -13
  834. package/dist/adapter/zigate/driver/messageType.d.ts.map +0 -1
  835. package/dist/adapter/zigate/driver/messageType.js +0 -284
  836. package/dist/adapter/zigate/driver/messageType.js.map +0 -1
  837. package/dist/adapter/zigate/driver/parameterType.d.ts +0 -28
  838. package/dist/adapter/zigate/driver/parameterType.d.ts.map +0 -1
  839. package/dist/adapter/zigate/driver/parameterType.js +0 -33
  840. package/dist/adapter/zigate/driver/parameterType.js.map +0 -1
  841. package/dist/adapter/zigate/driver/ziGateObject.d.ts +0 -24
  842. package/dist/adapter/zigate/driver/ziGateObject.js +0 -111
  843. package/dist/adapter/zigate/driver/ziGateObject.js.map +0 -1
  844. package/dist/adapter/zigate/driver/zigate.d.ts +0 -50
  845. package/dist/adapter/zigate/driver/zigate.js +0 -289
  846. package/dist/adapter/zigate/driver/zigate.js.map +0 -1
  847. package/dist/buffalo/buffalo.d.ts +0 -55
  848. package/dist/buffalo/buffalo.d.ts.map +0 -1
  849. package/dist/buffalo/buffalo.js +0 -230
  850. package/dist/buffalo/buffalo.js.map +0 -1
  851. package/dist/buffalo/index.d.ts +0 -3
  852. package/dist/buffalo/index.d.ts.map +0 -1
  853. package/dist/buffalo/index.js +0 -9
  854. package/dist/buffalo/index.js.map +0 -1
  855. package/dist/controller/controller.d.ts +0 -119
  856. package/dist/controller/database.d.ts +0 -20
  857. package/dist/controller/database.js +0 -94
  858. package/dist/controller/database.js.map +0 -1
  859. package/dist/controller/events.d.ts +0 -59
  860. package/dist/controller/greenPower.d.ts +0 -14
  861. package/dist/controller/helpers/index.d.ts +0 -3
  862. package/dist/controller/helpers/index.js +0 -29
  863. package/dist/controller/helpers/index.js.map +0 -1
  864. package/dist/controller/helpers/request.d.ts +0 -22
  865. package/dist/controller/helpers/request.js +0 -78
  866. package/dist/controller/helpers/request.js.map +0 -1
  867. package/dist/controller/helpers/requestQueue.d.ts +0 -13
  868. package/dist/controller/helpers/requestQueue.js +0 -106
  869. package/dist/controller/helpers/requestQueue.js.map +0 -1
  870. package/dist/controller/helpers/zclFrameConverter.d.ts +0 -9
  871. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts +0 -6
  872. package/dist/controller/helpers/zclTransactionSequenceNumber.d.ts.map +0 -1
  873. package/dist/controller/helpers/zclTransactionSequenceNumber.js +0 -14
  874. package/dist/controller/helpers/zclTransactionSequenceNumber.js.map +0 -1
  875. package/dist/controller/index.d.ts +0 -6
  876. package/dist/controller/index.js +0 -9
  877. package/dist/controller/index.js.map +0 -1
  878. package/dist/controller/model/device.d.ts +0 -140
  879. package/dist/controller/model/endpoint.d.ts +0 -134
  880. package/dist/controller/model/entity.d.ts +0 -15
  881. package/dist/controller/model/entity.js +0 -27
  882. package/dist/controller/model/entity.js.map +0 -1
  883. package/dist/controller/model/group.d.ts +0 -39
  884. package/dist/controller/model/index.d.ts +0 -6
  885. package/dist/controller/model/index.js +0 -15
  886. package/dist/controller/model/index.js.map +0 -1
  887. package/dist/controller/model/konnextConfig.d.ts +0 -7
  888. package/dist/controller/model/konnextConfig.d.ts.map +0 -1
  889. package/dist/controller/model/konnextConfig.js +0 -3
  890. package/dist/controller/model/konnextConfig.js.map +0 -1
  891. package/dist/controller/touchlink.d.ts +0 -20
  892. package/dist/controller/touchlink.js +0 -157
  893. package/dist/controller/touchlink.js.map +0 -1
  894. package/dist/controller/tstype.d.ts +0 -21
  895. package/dist/index.d.ts +0 -6
  896. package/dist/index.js +0 -37
  897. package/dist/index.js.map +0 -1
  898. package/dist/models/backup-storage-legacy.d.ts +0 -27
  899. package/dist/models/backup-storage-legacy.d.ts.map +0 -1
  900. package/dist/models/backup-storage-legacy.js +0 -3
  901. package/dist/models/backup-storage-legacy.js.map +0 -1
  902. package/dist/models/backup-storage-unified.d.ts +0 -50
  903. package/dist/models/backup-storage-unified.d.ts.map +0 -1
  904. package/dist/models/backup-storage-unified.js +0 -3
  905. package/dist/models/backup-storage-unified.js.map +0 -1
  906. package/dist/models/backup.d.ts +0 -38
  907. package/dist/models/backup.d.ts.map +0 -1
  908. package/dist/models/backup.js +0 -3
  909. package/dist/models/backup.js.map +0 -1
  910. package/dist/models/index.d.ts +0 -5
  911. package/dist/models/index.d.ts.map +0 -1
  912. package/dist/models/index.js +0 -21
  913. package/dist/models/index.js.map +0 -1
  914. package/dist/models/network-options.d.ts +0 -13
  915. package/dist/models/network-options.d.ts.map +0 -1
  916. package/dist/models/network-options.js +0 -3
  917. package/dist/models/network-options.js.map +0 -1
  918. package/dist/utils/aes.d.ts +0 -40
  919. package/dist/utils/aes.d.ts.map +0 -1
  920. package/dist/utils/aes.js +0 -198
  921. package/dist/utils/aes.js.map +0 -1
  922. package/dist/utils/assertString.d.ts +0 -3
  923. package/dist/utils/assertString.d.ts.map +0 -1
  924. package/dist/utils/assertString.js +0 -9
  925. package/dist/utils/assertString.js.map +0 -1
  926. package/dist/utils/backup.d.ts +0 -21
  927. package/dist/utils/backup.d.ts.map +0 -1
  928. package/dist/utils/backup.js +0 -190
  929. package/dist/utils/backup.js.map +0 -1
  930. package/dist/utils/equalsPartial.d.ts +0 -3
  931. package/dist/utils/equalsPartial.d.ts.map +0 -1
  932. package/dist/utils/equalsPartial.js +0 -12
  933. package/dist/utils/equalsPartial.js.map +0 -1
  934. package/dist/utils/index.d.ts +0 -10
  935. package/dist/utils/index.d.ts.map +0 -1
  936. package/dist/utils/index.js +0 -46
  937. package/dist/utils/index.js.map +0 -1
  938. package/dist/utils/isNumberArray.d.ts +0 -3
  939. package/dist/utils/isNumberArray.d.ts.map +0 -1
  940. package/dist/utils/isNumberArray.js +0 -7
  941. package/dist/utils/isNumberArray.js.map +0 -1
  942. package/dist/utils/logger.d.ts +0 -9
  943. package/dist/utils/logger.d.ts.map +0 -1
  944. package/dist/utils/logger.js +0 -14
  945. package/dist/utils/logger.js.map +0 -1
  946. package/dist/utils/queue.d.ts +0 -12
  947. package/dist/utils/queue.d.ts.map +0 -1
  948. package/dist/utils/queue.js +0 -62
  949. package/dist/utils/queue.js.map +0 -1
  950. package/dist/utils/realpathSync.d.ts +0 -3
  951. package/dist/utils/realpathSync.d.ts.map +0 -1
  952. package/dist/utils/realpathSync.js +0 -13
  953. package/dist/utils/realpathSync.js.map +0 -1
  954. package/dist/utils/wait.d.ts +0 -3
  955. package/dist/utils/wait.d.ts.map +0 -1
  956. package/dist/utils/wait.js +0 -9
  957. package/dist/utils/wait.js.map +0 -1
  958. package/dist/utils/waitress.d.ts +0 -22
  959. package/dist/utils/waitress.d.ts.map +0 -1
  960. package/dist/utils/waitress.js +0 -69
  961. package/dist/utils/waitress.js.map +0 -1
  962. package/dist/zspec/consts.d.ts +0 -60
  963. package/dist/zspec/consts.d.ts.map +0 -1
  964. package/dist/zspec/consts.js +0 -64
  965. package/dist/zspec/consts.js.map +0 -1
  966. package/dist/zspec/enums.d.ts +0 -19
  967. package/dist/zspec/enums.d.ts.map +0 -1
  968. package/dist/zspec/enums.js +0 -28
  969. package/dist/zspec/enums.js.map +0 -1
  970. package/dist/zspec/index.d.ts +0 -4
  971. package/dist/zspec/index.d.ts.map +0 -1
  972. package/dist/zspec/index.js +0 -43
  973. package/dist/zspec/index.js.map +0 -1
  974. package/dist/zspec/tstypes.d.ts +0 -19
  975. package/dist/zspec/tstypes.d.ts.map +0 -1
  976. package/dist/zspec/tstypes.js +0 -3
  977. package/dist/zspec/tstypes.js.map +0 -1
  978. package/dist/zspec/utils.d.ts +0 -14
  979. package/dist/zspec/utils.d.ts.map +0 -1
  980. package/dist/zspec/utils.js +0 -29
  981. package/dist/zspec/utils.js.map +0 -1
  982. package/dist/zspec/zcl/buffaloZcl.d.ts +0 -55
  983. package/dist/zspec/zcl/definition/cluster.d.ts +0 -3
  984. package/dist/zspec/zcl/definition/consts.d.ts +0 -9
  985. package/dist/zspec/zcl/definition/consts.d.ts.map +0 -1
  986. package/dist/zspec/zcl/definition/consts.js +0 -27
  987. package/dist/zspec/zcl/definition/consts.js.map +0 -1
  988. package/dist/zspec/zcl/definition/enums.d.ts +0 -177
  989. package/dist/zspec/zcl/definition/enums.d.ts.map +0 -1
  990. package/dist/zspec/zcl/definition/enums.js +0 -187
  991. package/dist/zspec/zcl/definition/enums.js.map +0 -1
  992. package/dist/zspec/zcl/definition/foundation.d.ts +0 -11
  993. package/dist/zspec/zcl/definition/manufacturerCode.d.ts +0 -727
  994. package/dist/zspec/zcl/definition/manufacturerCode.d.ts.map +0 -1
  995. package/dist/zspec/zcl/definition/manufacturerCode.js +0 -733
  996. package/dist/zspec/zcl/definition/manufacturerCode.js.map +0 -1
  997. package/dist/zspec/zcl/definition/status.d.ts +0 -69
  998. package/dist/zspec/zcl/definition/status.d.ts.map +0 -1
  999. package/dist/zspec/zcl/definition/status.js +0 -74
  1000. package/dist/zspec/zcl/definition/status.js.map +0 -1
  1001. package/dist/zspec/zcl/index.d.ts +0 -11
  1002. package/dist/zspec/zcl/utils.d.ts +0 -7
  1003. package/dist/zspec/zcl/zclFrame.d.ts +0 -36
  1004. package/dist/zspec/zcl/zclHeader.d.ts +0 -17
  1005. package/dist/zspec/zcl/zclStatusError.d.ts +0 -6
  1006. package/dist/zspec/zcl/zclStatusError.d.ts.map +0 -1
  1007. package/dist/zspec/zcl/zclStatusError.js +0 -13
  1008. package/dist/zspec/zcl/zclStatusError.js.map +0 -1
  1009. package/dist/zspec/zdo/buffaloZdo.d.ts +0 -438
  1010. package/dist/zspec/zdo/buffaloZdo.d.ts.map +0 -1
  1011. package/dist/zspec/zdo/buffaloZdo.js +0 -1892
  1012. package/dist/zspec/zdo/buffaloZdo.js.map +0 -1
  1013. package/dist/zspec/zdo/definition/clusters.d.ts +0 -624
  1014. package/dist/zspec/zdo/definition/clusters.d.ts.map +0 -1
  1015. package/dist/zspec/zdo/definition/clusters.js +0 -687
  1016. package/dist/zspec/zdo/definition/clusters.js.map +0 -1
  1017. package/dist/zspec/zdo/definition/consts.d.ts +0 -13
  1018. package/dist/zspec/zdo/definition/consts.d.ts.map +0 -1
  1019. package/dist/zspec/zdo/definition/consts.js +0 -16
  1020. package/dist/zspec/zdo/definition/consts.js.map +0 -1
  1021. package/dist/zspec/zdo/definition/enums.d.ts +0 -75
  1022. package/dist/zspec/zdo/definition/enums.d.ts.map +0 -1
  1023. package/dist/zspec/zdo/definition/enums.js +0 -97
  1024. package/dist/zspec/zdo/definition/enums.js.map +0 -1
  1025. package/dist/zspec/zdo/definition/status.d.ts +0 -99
  1026. package/dist/zspec/zdo/definition/status.d.ts.map +0 -1
  1027. package/dist/zspec/zdo/definition/status.js +0 -109
  1028. package/dist/zspec/zdo/definition/status.js.map +0 -1
  1029. package/dist/zspec/zdo/definition/tstypes.d.ts +0 -787
  1030. package/dist/zspec/zdo/definition/tstypes.d.ts.map +0 -1
  1031. package/dist/zspec/zdo/definition/tstypes.js +0 -3
  1032. package/dist/zspec/zdo/definition/tstypes.js.map +0 -1
  1033. package/dist/zspec/zdo/index.d.ts +0 -7
  1034. package/dist/zspec/zdo/index.d.ts.map +0 -1
  1035. package/dist/zspec/zdo/index.js +0 -39
  1036. package/dist/zspec/zdo/index.js.map +0 -1
  1037. package/dist/zspec/zdo/utils.d.ts +0 -25
  1038. package/dist/zspec/zdo/utils.d.ts.map +0 -1
  1039. package/dist/zspec/zdo/utils.js +0 -75
  1040. package/dist/zspec/zdo/utils.js.map +0 -1
  1041. package/dist/zspec/zdo/zdoStatusError.d.ts +0 -6
  1042. package/dist/zspec/zdo/zdoStatusError.d.ts.map +0 -1
  1043. package/dist/zspec/zdo/zdoStatusError.js +0 -13
  1044. package/dist/zspec/zdo/zdoStatusError.js.map +0 -1
  1045. package/typedoc-tsconfig.json +0 -44
@@ -0,0 +1,1933 @@
1
+ /* v8 ignore start */
2
+
3
+ import {EventEmitter} from "node:events";
4
+ import {Socket} from "node:net";
5
+
6
+ import {wait} from "../../../utils";
7
+ import {logger} from "../../../utils/logger";
8
+ import {SerialPort} from "../../serialPort";
9
+ import type {SerialPortOptions} from "../../tstype";
10
+ import {isTcpPath, parseTcpPath} from "../../utils";
11
+ import {EzspStatus} from "../enums";
12
+ import {halCommonCrc16, inc8, withinRange} from "../utils/math";
13
+ import {
14
+ ASH_ACKNUM_BIT,
15
+ ASH_ACKNUM_MASK,
16
+ ASH_CRC_LEN,
17
+ ASH_DFRAME_MASK,
18
+ ASH_FLIP,
19
+ ASH_FRAME_LEN_ACK,
20
+ ASH_FRAME_LEN_DATA_MIN,
21
+ ASH_FRAME_LEN_ERROR,
22
+ ASH_FRAME_LEN_NAK,
23
+ ASH_FRAME_LEN_RSTACK,
24
+ ASH_FRMNUM_BIT,
25
+ ASH_FRMNUM_MASK,
26
+ ASH_MAX_DATA_FIELD_LEN,
27
+ ASH_MAX_FRAME_WITH_CRC_LEN,
28
+ ASH_MAX_TIMEOUTS,
29
+ ASH_MIN_DATA_FIELD_LEN,
30
+ ASH_MIN_FRAME_WITH_CRC_LEN,
31
+ ASH_NFLAG_MASK,
32
+ ASH_RFLAG_MASK,
33
+ ASH_SHFRAME_MASK,
34
+ ASH_VERSION,
35
+ ASH_WAKE,
36
+ EZSP_HOST_RX_POOL_SIZE,
37
+ LFSR_POLY,
38
+ LFSR_SEED,
39
+ SH_RX_BUFFER_LEN,
40
+ SH_TX_BUFFER_LEN,
41
+ TX_POOL_BUFFERS,
42
+ } from "./consts";
43
+ import {AshFrameType, AshReservedByte, NcpFailedCode} from "./enums";
44
+ import {AshParser} from "./parser";
45
+ import {EzspBuffer, EzspFreeList, EzspQueue} from "./queues";
46
+ import {AshWriter} from "./writer";
47
+
48
+ const NS = "zh:ember:uart:ash";
49
+
50
+ type UartAshCounters = {
51
+ /** DATA frame data fields bytes transmitted */
52
+ txData: number;
53
+ /** frames of all types transmitted */
54
+ txAllFrames: number;
55
+ /** DATA frames transmitted */
56
+ txDataFrames: number;
57
+ /** ACK frames transmitted */
58
+ txAckFrames: number;
59
+ /** NAK frames transmitted */
60
+ txNakFrames: number;
61
+ /** DATA frames retransmitted */
62
+ txReDataFrames: number;
63
+ /** ACK and NAK frames with nFlag 0 transmitted */
64
+ // txN0Frames: number,
65
+ /** ACK and NAK frames with nFlag 1 transmitted */
66
+ txN1Frames: number;
67
+ /** frames cancelled (with ASH_CAN byte) */
68
+ txCancelled: number;
69
+
70
+ /** DATA frame data fields bytes received */
71
+ rxData: number;
72
+ /** frames of all types received */
73
+ rxAllFrames: number;
74
+ /** DATA frames received */
75
+ rxDataFrames: number;
76
+ /** ACK frames received */
77
+ rxAckFrames: number;
78
+ /** NAK frames received */
79
+ rxNakFrames: number;
80
+ /** retransmitted DATA frames received */
81
+ rxReDataFrames: number;
82
+ /** ACK and NAK frames with nFlag 0 received */
83
+ // rxN0Frames: number,
84
+ /** ACK and NAK frames with nFlag 1 received */
85
+ rxN1Frames: number;
86
+ /** frames cancelled (with ASH_CAN byte) */
87
+ rxCancelled: number;
88
+
89
+ /** frames with CRC errors */
90
+ rxCrcErrors: number;
91
+ /** frames with comm errors (with ASH_SUB byte) */
92
+ rxCommErrors: number;
93
+ /** frames shorter than minimum */
94
+ rxTooShort: number;
95
+ /** frames longer than maximum */
96
+ rxTooLong: number;
97
+ /** frames with illegal control byte */
98
+ rxBadControl: number;
99
+ /** frames with illegal length for type of frame */
100
+ rxBadLength: number;
101
+ /** frames with bad ACK numbers */
102
+ rxBadAckNumber: number;
103
+ /** DATA frames discarded due to lack of buffers */
104
+ rxNoBuffer: number;
105
+ /** duplicate retransmitted DATA frames */
106
+ rxDuplicates: number;
107
+ /** DATA frames received out of sequence */
108
+ rxOutOfSequence: number;
109
+ /** received ACK timeouts */
110
+ rxAckTimeouts: number;
111
+ };
112
+
113
+ const enum SendState {
114
+ IDLE = 0,
115
+ SHFRAME = 1,
116
+ TX_DATA = 2,
117
+ RETX_DATA = 3,
118
+ }
119
+
120
+ // Bits in ashFlags
121
+ const enum Flag {
122
+ /** Reject Condition */
123
+ REJ = 0x01,
124
+ /** Retransmit Condition */
125
+ RETX = 0x02,
126
+ /** send NAK */
127
+ NAK = 0x04,
128
+ /** send ACK */
129
+ ACK = 0x08,
130
+ /** send RST */
131
+ RST = 0x10,
132
+ /** send immediate CAN */
133
+ CAN = 0x20,
134
+ /** in CONNECTED state, else ERROR */
135
+ CONNECTED = 0x40,
136
+ /** not ready to receive DATA frames */
137
+ NR = 0x100,
138
+ /** last transmitted NR status */
139
+ NRTX = 0x200,
140
+ }
141
+
142
+ /** max frames sent without being ACKed (1-7) */
143
+ export const CONFIG_TX_K = 3;
144
+ /** adaptive rec'd ACK timeout initial value */
145
+ const CONFIG_ACK_TIME_INIT = 800;
146
+ /** " " " " " minimum value */
147
+ const CONFIG_ACK_TIME_MIN = 400;
148
+ /** " " " " " maximum value */
149
+ const CONFIG_ACK_TIME_MAX = 2400;
150
+ /** time allowed to receive RSTACK after ncp is reset */
151
+ const CONFIG_TIME_RST = 5000;
152
+ /** time between checks for received RSTACK (CONNECTED status) */
153
+ const CONFIG_TIME_RST_CHECK = 100;
154
+ /** if free buffers < limit, host receiver isn't ready, will hold off the ncp from sending normal priority frames */
155
+ const CONFIG_NR_LOW_LIMIT = 8; // RX_FREE_LW
156
+ /** if free buffers > limit, host receiver is ready */
157
+ const CONFIG_NR_HIGH_LIMIT = 12; // RX_FREE_HW
158
+ /** time until a set nFlag must be resent (max 2032) */
159
+ const CONFIG_NR_TIME = 480;
160
+ /** Read/write max bytes count at stream level */
161
+ const CONFIG_HIGHWATER_MARK = 256;
162
+
163
+ interface UartAshEventMap {
164
+ fatalError: [status: EzspStatus];
165
+ frame: [];
166
+ }
167
+
168
+ /**
169
+ * ASH Protocol handler.
170
+ */
171
+ export class UartAsh extends EventEmitter<UartAshEventMap> {
172
+ private readonly portOptions: SerialPortOptions;
173
+ private serialPort?: SerialPort;
174
+ private socketPort?: Socket;
175
+ private writer: AshWriter;
176
+ private parser: AshParser;
177
+
178
+ /** True when serial/socket is currently closing. */
179
+ private closing: boolean;
180
+
181
+ /** time ackTimer started: 0 means not ready uint16_t */
182
+ private ackTimer: number;
183
+ /** time used to check ackTimer expiry (msecs) uint16_t */
184
+ private ackPeriod: number;
185
+ /** not ready timer (16 msec units). Set to (now + config.nrTime) when started. uint8_t */
186
+ private nrTimer: number;
187
+ /** frame decode in progress */
188
+ private decodeInProgress: boolean;
189
+
190
+ // Variables used in encoding frames
191
+ /** true when preceding byte was escaped */
192
+ private encodeEscFlag: boolean;
193
+ /** byte to send after ASH_ESC uint8_t */
194
+ private encodeFlip: number;
195
+ /** uint16_t */
196
+ private encodeCrc: number;
197
+ /** encoder state: 0 = control/data bytes, 1 = crc low byte, 2 = crc high byte, 3 = flag. uint8_t */
198
+ private encodeState: number;
199
+ /** bytes remaining to encode. uint8_t */
200
+ private encodeCount: number;
201
+
202
+ // Variables used in decoding frames
203
+ /** bytes in frame, plus CRC, clamped to limit +1: high values also used to record certain errors. uint8_t */
204
+ private decodeLen: number;
205
+ /** ASH_FLIP if previous byte was ASH_ESC. uint8_t */
206
+ private decodeFlip: number;
207
+ /** a 2 byte queue to avoid outputting crc bytes. uint8_t */
208
+ private decodeByte1: number;
209
+ /** at frame end, they contain the received crc. uint8_t */
210
+ private decodeByte2: number;
211
+ /** uint16_t */
212
+ private decodeCrc: number;
213
+ private decodeOutByte = 0x00;
214
+
215
+ /** outgoing short frames */
216
+ private txSHBuffer: Buffer;
217
+ /** incoming short frames */
218
+ private rxSHBuffer: Buffer;
219
+
220
+ /** bit flags for top-level logic. uint16_t */
221
+ private flags: number;
222
+ /** frame ack'ed from remote peer. uint8_t */
223
+ private ackRx: number;
224
+ /** frame ack'ed to remote peer. uint8_t */
225
+ private ackTx: number;
226
+ /** next frame to be transmitted. uint8_t */
227
+ private frmTx: number;
228
+ /** next frame to be retransmitted. uint8_t */
229
+ private frmReTx: number;
230
+ /** next frame expected to be rec'd. uint8_t */
231
+ private frmRx: number;
232
+ /** frame at retx queue's head. uint8_t */
233
+ private frmReTxHead: number;
234
+ /** consecutive timeout counter. uint8_t */
235
+ private timeouts: number;
236
+ /** rec'd DATA frame buffer. uint8_t */
237
+ private rxDataBuffer?: EzspBuffer;
238
+ /** rec'd frame length. uint8_t */
239
+ private rxLen: number;
240
+ /** tx frame offset. uint8_t */
241
+ private txOffset: number;
242
+
243
+ public counters: UartAshCounters;
244
+
245
+ /**
246
+ * Errors reported by the NCP.
247
+ * The `NcpFailedCode` from the frame reporting this is logged before this is set to make it clear where it failed:
248
+ * - The NCP sent an ERROR frame during the initial reset sequence (before CONNECTED state)
249
+ * - The NCP sent an ERROR frame
250
+ * - The NCP sent an unexpected RSTACK
251
+ */
252
+ private ncpError: EzspStatus;
253
+ /** Errors reported by the Host. */
254
+ private hostError: EzspStatus;
255
+ /** sendExec() state variable */
256
+ private sendState: SendState;
257
+
258
+ /** NCP is enabled to sleep, set by EZSP, not supported atm, always false */
259
+ public ncpSleepEnabled: boolean;
260
+ /**
261
+ * Set when the ncp has indicated it has a pending callback by seting the callback flag in the frame control byte
262
+ * or (uart version only) by sending an an ASH_WAKE byte between frames.
263
+ */
264
+ public ncpHasCallbacks: boolean;
265
+
266
+ /** Transmit buffers */
267
+ private readonly txPool: EzspBuffer[];
268
+ public readonly txQueue: EzspQueue;
269
+ public readonly reTxQueue: EzspQueue;
270
+ public readonly txFree: EzspFreeList;
271
+
272
+ /** Receive buffers */
273
+ private readonly rxPool: EzspBuffer[];
274
+ public readonly rxQueue: EzspQueue;
275
+ public readonly rxFree: EzspFreeList;
276
+
277
+ constructor(options: SerialPortOptions) {
278
+ super();
279
+
280
+ this.portOptions = options;
281
+ this.serialPort = undefined;
282
+ this.socketPort = undefined;
283
+ this.writer = new AshWriter({highWaterMark: CONFIG_HIGHWATER_MARK});
284
+ this.parser = new AshParser({readableHighWaterMark: CONFIG_HIGHWATER_MARK});
285
+
286
+ this.txPool = new Array<EzspBuffer>(TX_POOL_BUFFERS);
287
+ this.txQueue = new EzspQueue();
288
+ this.reTxQueue = new EzspQueue();
289
+ this.txFree = new EzspFreeList();
290
+
291
+ this.rxPool = new Array<EzspBuffer>(EZSP_HOST_RX_POOL_SIZE);
292
+ this.rxQueue = new EzspQueue();
293
+ this.rxFree = new EzspFreeList();
294
+
295
+ this.closing = false;
296
+
297
+ this.txSHBuffer = Buffer.alloc(SH_TX_BUFFER_LEN);
298
+ this.rxSHBuffer = Buffer.alloc(SH_RX_BUFFER_LEN);
299
+ this.ackTimer = 0;
300
+ this.ackPeriod = 0;
301
+ this.nrTimer = 0;
302
+
303
+ this.flags = 0;
304
+ this.decodeInProgress = false;
305
+ this.ackRx = 0;
306
+ this.ackTx = 0;
307
+ this.frmTx = 0;
308
+ this.frmReTx = 0;
309
+ this.frmRx = 0;
310
+ this.frmReTxHead = 0;
311
+ this.timeouts = 0;
312
+ this.rxDataBuffer = undefined;
313
+ this.rxLen = 0;
314
+
315
+ // init to "start of frame" default
316
+ this.encodeCount = 0;
317
+ this.encodeState = 0;
318
+ this.encodeEscFlag = false;
319
+ this.encodeFlip = 0;
320
+ this.encodeCrc = 0xffff;
321
+ this.txOffset = 0;
322
+
323
+ // init to "start of frame" default
324
+ this.decodeLen = 0;
325
+ this.decodeByte1 = 0;
326
+ this.decodeByte2 = 0;
327
+ this.decodeFlip = 0;
328
+ this.decodeCrc = 0xffff;
329
+
330
+ this.ncpError = EzspStatus.NO_ERROR;
331
+ this.hostError = EzspStatus.NO_ERROR;
332
+ this.sendState = SendState.IDLE;
333
+
334
+ this.ncpSleepEnabled = false;
335
+ this.ncpHasCallbacks = false;
336
+
337
+ this.stopAckTimer();
338
+ this.stopNrTimer();
339
+
340
+ this.counters = {
341
+ txData: 0,
342
+ txAllFrames: 0,
343
+ txDataFrames: 0,
344
+ txAckFrames: 0,
345
+ txNakFrames: 0,
346
+ txReDataFrames: 0,
347
+ // txN0Frames: 0,
348
+ txN1Frames: 0,
349
+ txCancelled: 0,
350
+
351
+ rxData: 0,
352
+ rxAllFrames: 0,
353
+ rxDataFrames: 0,
354
+ rxAckFrames: 0,
355
+ rxNakFrames: 0,
356
+ rxReDataFrames: 0,
357
+ // rxN0Frames: 0,
358
+ rxN1Frames: 0,
359
+ rxCancelled: 0,
360
+
361
+ rxCrcErrors: 0,
362
+ rxCommErrors: 0,
363
+ rxTooShort: 0,
364
+ rxTooLong: 0,
365
+ rxBadControl: 0,
366
+ rxBadLength: 0,
367
+ rxBadAckNumber: 0,
368
+ rxNoBuffer: 0,
369
+ rxDuplicates: 0,
370
+ rxOutOfSequence: 0,
371
+ rxAckTimeouts: 0,
372
+ };
373
+
374
+ // All transmit buffers are put into txFree, and txQueue and reTxQueue are empty.
375
+ this.txQueue.tail = undefined;
376
+ this.reTxQueue.tail = undefined;
377
+ this.txFree.link = undefined;
378
+
379
+ for (let i = 0; i < TX_POOL_BUFFERS; i++) {
380
+ this.txPool[i] = new EzspBuffer();
381
+ this.txFree.freeBuffer(this.txPool[i]);
382
+ }
383
+
384
+ // All receive buffers are put into rxFree, and rxQueue is empty.
385
+ this.rxQueue.tail = undefined;
386
+ this.rxFree.link = undefined;
387
+
388
+ for (let i = 0; i < EZSP_HOST_RX_POOL_SIZE; i++) {
389
+ this.rxPool[i] = new EzspBuffer();
390
+ this.rxFree.freeBuffer(this.rxPool[i]);
391
+ }
392
+ }
393
+
394
+ /**
395
+ * Check if port is valid, open, and not closing.
396
+ */
397
+ get portOpen(): boolean {
398
+ if (this.closing) {
399
+ return false;
400
+ }
401
+
402
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
403
+ if (isTcpPath(this.portOptions.path!)) {
404
+ return this.socketPort ? !this.socketPort.closed : false;
405
+ }
406
+
407
+ return this.serialPort ? this.serialPort.isOpen : false;
408
+ }
409
+
410
+ /**
411
+ * Get max wait time before response is considered timed out.
412
+ */
413
+ get responseTimeout(): number {
414
+ return ASH_MAX_TIMEOUTS * CONFIG_ACK_TIME_MAX;
415
+ }
416
+
417
+ /**
418
+ * Indicates if the host is in the Connected state.
419
+ * If not, the host and NCP cannot exchange DATA frames.
420
+ * Note that this function does not actively confirm that communication with NCP is healthy, but simply returns its last known status.
421
+ *
422
+ * @returns
423
+ * - true - host and NCP can exchange DATA frames
424
+ * - false - host and NCP cannot now exchange DATA frames
425
+ */
426
+ get connected(): boolean {
427
+ return (this.flags & Flag.CONNECTED) !== 0;
428
+ }
429
+
430
+ /**
431
+ * Has nothing to do...
432
+ */
433
+ get idle(): boolean {
434
+ return (
435
+ !this.decodeInProgress && // don't have a partial frame
436
+ // && (this.serial.readAvailable() === EzspStatus.NO_RX_DATA) // no rx data
437
+ this.rxQueue.empty && // no rx frames to process
438
+ !this.ncpHasCallbacks && // no pending callbacks
439
+ this.flags === Flag.CONNECTED && // no pending ACKs, NAKs, etc.
440
+ this.ackTx === this.frmRx && // do not need to send an ACK
441
+ this.ackRx === this.frmTx && // not waiting to receive an ACK
442
+ this.sendState === SendState.IDLE && // nothing being transmitted now
443
+ this.txQueue.empty // nothing waiting to transmit
444
+ // && this.serial.outputIsIdle() // nothing in OS buffers or UART FIFO
445
+ );
446
+ }
447
+
448
+ /**
449
+ * Init the serial or socket port and hook parser/writer.
450
+ * NOTE: This is the only function that throws/rejects in the ASH layer (caught by resetNcp and turned into an EzspStatus).
451
+ */
452
+ private async initPort(): Promise<void> {
453
+ await this.closePort(); // will do nothing if nothing's open
454
+
455
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
456
+ if (!isTcpPath(this.portOptions.path!)) {
457
+ const serialOpts = {
458
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
459
+ path: this.portOptions.path!,
460
+ baudRate: typeof this.portOptions.baudRate === "number" ? this.portOptions.baudRate : 115200,
461
+ rtscts: typeof this.portOptions.rtscts === "boolean" ? this.portOptions.rtscts : false,
462
+ autoOpen: false,
463
+ parity: "none" as const,
464
+ stopBits: 1 as const,
465
+ xon: false,
466
+ xoff: false,
467
+ };
468
+
469
+ // enable software flow control if RTS/CTS not enabled in config
470
+ if (!serialOpts.rtscts) {
471
+ logger.info("RTS/CTS config is off, enabling software flow control.", NS);
472
+ serialOpts.xon = true;
473
+ serialOpts.xoff = true;
474
+ }
475
+
476
+ // @ts-expect-error Jest testing
477
+ if (this.portOptions.binding !== undefined) {
478
+ // @ts-expect-error Jest testing
479
+ serialOpts.binding = this.portOptions.binding;
480
+ }
481
+
482
+ logger.debug(() => `Opening serial port with ${JSON.stringify(serialOpts)}`, NS);
483
+ this.serialPort = new SerialPort(serialOpts);
484
+
485
+ this.writer.pipe(this.serialPort);
486
+ this.serialPort.pipe(this.parser);
487
+ this.parser.on("data", this.onFrame.bind(this));
488
+
489
+ try {
490
+ await this.serialPort.asyncOpen();
491
+ logger.info("Serial port opened", NS);
492
+
493
+ this.serialPort.once("close", this.onPortClose.bind(this));
494
+ this.serialPort.on("error", this.onPortError.bind(this));
495
+ } catch (error) {
496
+ await this.stop();
497
+
498
+ throw error;
499
+ }
500
+ } else {
501
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
502
+ const info = parseTcpPath(this.portOptions.path!);
503
+ logger.debug(() => `Opening TCP socket with ${info.host}:${info.port}`, NS);
504
+
505
+ this.socketPort = new Socket();
506
+
507
+ this.socketPort.setNoDelay(true);
508
+ this.socketPort.setKeepAlive(true, 15000);
509
+ this.writer.pipe(this.socketPort);
510
+ this.socketPort.pipe(this.parser);
511
+ this.parser.on("data", this.onFrame.bind(this));
512
+
513
+ return await new Promise((resolve, reject): void => {
514
+ const openError = async (err: Error): Promise<void> => {
515
+ await this.stop();
516
+
517
+ reject(err);
518
+ };
519
+
520
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
521
+ this.socketPort!.on("connect", () => {
522
+ logger.debug(() => "Socket connected", NS);
523
+ });
524
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
525
+ this.socketPort!.on("ready", (): void => {
526
+ logger.info("Socket ready", NS);
527
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
528
+ this.socketPort!.removeListener("error", openError);
529
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
530
+ this.socketPort!.once("close", this.onPortClose.bind(this));
531
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
532
+ this.socketPort!.on("error", this.onPortError.bind(this));
533
+
534
+ resolve();
535
+ });
536
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
537
+ this.socketPort!.once("error", openError);
538
+
539
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
540
+ this.socketPort!.connect(info.port, info.host);
541
+ });
542
+ }
543
+ }
544
+
545
+ /**
546
+ * Handle port closing
547
+ * @param err A boolean for Socket, an Error for serialport
548
+ */
549
+ private onPortClose(error: boolean | Error): void {
550
+ logger.info(`Port closed, error=${error}`, NS);
551
+
552
+ if (this.flags !== 0) {
553
+ this.flags = 0;
554
+ this.emit("fatalError", EzspStatus.ERROR_SERIAL_INIT);
555
+ }
556
+ }
557
+
558
+ /**
559
+ * Handle port error
560
+ * @param error
561
+ */
562
+ private onPortError(error: Error): void {
563
+ logger.error(`Port ${error}`, NS);
564
+ }
565
+
566
+ /**
567
+ * Handle received frame from AshParser.
568
+ * @param buf
569
+ */
570
+ private onFrame(buffer: Buffer): void {
571
+ const iCAN = buffer.lastIndexOf(AshReservedByte.CANCEL); // should only be one, but just in case...
572
+
573
+ if (iCAN !== -1) {
574
+ // ignore the cancel before RSTACK
575
+ if (this.flags & Flag.CONNECTED) {
576
+ this.counters.rxCancelled += 1;
577
+
578
+ logger.warning(`Frame(s) in progress cancelled in [${buffer.toString("hex")}]`, NS);
579
+ }
580
+
581
+ // get rid of everything up to the CAN flag and start reading frame from there, no need to loop through bytes in vain
582
+ buffer = buffer.subarray(iCAN + 1);
583
+ }
584
+
585
+ if (!buffer.length) {
586
+ // skip any CANCEL that results in empty frame (have yet to see one, but just in case...)
587
+ // shouldn't happen for any other reason, unless receiving bad stuff from port?
588
+ logger.debug(() => "Received empty frame. Skipping.", NS);
589
+ return;
590
+ }
591
+
592
+ const status = this.receiveFrame(buffer);
593
+
594
+ this.sendExec(); // always trigger to cover all cases
595
+
596
+ if (status !== EzspStatus.SUCCESS && status !== EzspStatus.ASH_IN_PROGRESS && status !== EzspStatus.NO_RX_DATA) {
597
+ this.emit("fatalError", status);
598
+ return;
599
+ }
600
+ }
601
+
602
+ /**
603
+ * Initializes the ASH protocol, and waits until the NCP finishes rebooting, or a non-recoverable error occurs.
604
+ *
605
+ * @returns
606
+ * - EzspStatus.SUCCESS
607
+ * - EzspStatus.HOST_FATAL_ERROR
608
+ * - EzspStatus.ASH_NCP_FATAL_ERROR)
609
+ */
610
+ public async start(): Promise<EzspStatus> {
611
+ if (!this.portOpen || this.flags & Flag.CONNECTED) {
612
+ return EzspStatus.ERROR_INVALID_CALL;
613
+ }
614
+
615
+ logger.info("======== ASH starting ========", NS);
616
+
617
+ try {
618
+ if (this.serialPort) {
619
+ await this.serialPort.asyncFlush(); // clear read/write buffers
620
+ } else {
621
+ // XXX: Socket equiv?
622
+ }
623
+ } catch (err) {
624
+ logger.error(`Error while flushing before start: ${err}`, NS);
625
+ }
626
+
627
+ // block til RSTACK, fatal error or timeout
628
+ // NOTE: on average, this seems to take around 1000ms when successful
629
+ for (let i = 0; i < CONFIG_TIME_RST; i += CONFIG_TIME_RST_CHECK) {
630
+ this.sendExec();
631
+
632
+ if (this.flags & Flag.CONNECTED) {
633
+ logger.info("======== ASH started ========", NS);
634
+
635
+ return EzspStatus.SUCCESS;
636
+ }
637
+
638
+ if (this.hostError !== EzspStatus.NO_ERROR || this.ncpError !== EzspStatus.NO_ERROR) {
639
+ // don't wait for inevitable fail, bail early, let retry logic in EZSP layer do its thing
640
+ break;
641
+ }
642
+
643
+ logger.debug(() => `Waiting for RSTACK... ${i}/${CONFIG_TIME_RST}`, NS);
644
+ await wait(CONFIG_TIME_RST_CHECK);
645
+ }
646
+
647
+ return EzspStatus.HOST_FATAL_ERROR;
648
+ }
649
+
650
+ /**
651
+ * Stops the ASH protocol - flushes and closes the serial port, clears all queues, stops timers, etc.
652
+ */
653
+ public async stop(): Promise<void> {
654
+ this.closing = true;
655
+
656
+ this.logCounters();
657
+ await this.closePort();
658
+
659
+ logger.info("======== ASH stopped ========", NS);
660
+ }
661
+
662
+ /**
663
+ * Close port and remove listeners.
664
+ * Does nothing if port not defined/open.
665
+ */
666
+ public async closePort(): Promise<void> {
667
+ this.flags = 0;
668
+
669
+ if (this.serialPort?.isOpen) {
670
+ try {
671
+ await this.serialPort.asyncFlushAndClose();
672
+ } catch (err) {
673
+ logger.error(`Failed to close serial port ${err}.`, NS);
674
+ }
675
+
676
+ this.serialPort.removeAllListeners();
677
+ } else if (this.socketPort != null && !this.socketPort.closed) {
678
+ this.socketPort.destroy();
679
+ this.socketPort.removeAllListeners();
680
+ }
681
+ }
682
+
683
+ /**
684
+ * Initializes the ASH serial port and (if enabled) resets the NCP.
685
+ * The method used to do the reset is specified by the the host configuration parameter resetMethod.
686
+ *
687
+ * When the reset method is sending a RST frame, the caller should retry NCP resets a few times if it fails.
688
+ *
689
+ * @returns
690
+ * - EzspStatus.SUCCESS
691
+ * - EzspStatus.HOST_FATAL_ERROR
692
+ */
693
+ public async resetNcp(): Promise<EzspStatus> {
694
+ if (this.closing) {
695
+ return EzspStatus.ERROR_INVALID_CALL;
696
+ }
697
+
698
+ logger.info("======== ASH Adapter reset ========", NS);
699
+
700
+ // ask ncp to reset itself using RST frame
701
+ try {
702
+ if (!this.portOpen) {
703
+ await this.initPort();
704
+ }
705
+
706
+ this.flags = Flag.RST | Flag.CAN;
707
+
708
+ return EzspStatus.SUCCESS;
709
+ } catch (err) {
710
+ logger.error(`Failed to init port with error ${err}`, NS);
711
+
712
+ this.hostError = EzspStatus.HOST_FATAL_ERROR;
713
+
714
+ return this.hostError;
715
+ }
716
+ }
717
+
718
+ /**
719
+ * Adds a DATA frame to the transmit queue to send to the NCP.
720
+ * Frames that are too long or too short will not be sent, and frames will not be added to the queue
721
+ * if the host is not in the Connected state, or the NCP is not ready to receive a DATA frame or if there
722
+ * is no room in the queue;
723
+ *
724
+ * @param len length of data field
725
+ * @param inBuf array containing the data to be sent
726
+ *
727
+ * @returns
728
+ * - EzspStatus.SUCCESS
729
+ * - EzspStatus.NO_TX_SPACE
730
+ * - EzspStatus.DATA_FRAME_TOO_SHORT
731
+ * - EzspStatus.DATA_FRAME_TOO_LONG
732
+ * - EzspStatus.NOT_CONNECTED
733
+ */
734
+ public send(len: number, inBuf: Buffer): EzspStatus {
735
+ // Check for errors that might have been detected
736
+ if (this.hostError !== EzspStatus.NO_ERROR) {
737
+ return EzspStatus.HOST_FATAL_ERROR;
738
+ }
739
+
740
+ if (this.ncpError !== EzspStatus.NO_ERROR) {
741
+ return EzspStatus.ASH_NCP_FATAL_ERROR;
742
+ }
743
+
744
+ // After verifying that the data field length is within bounds,
745
+ // copies data frame to a buffer and appends it to the transmit queue.
746
+ if (len < ASH_MIN_DATA_FIELD_LEN) {
747
+ return EzspStatus.DATA_FRAME_TOO_SHORT;
748
+ }
749
+
750
+ if (len > ASH_MAX_DATA_FIELD_LEN) {
751
+ return EzspStatus.DATA_FRAME_TOO_LONG;
752
+ }
753
+
754
+ if (!(this.flags & Flag.CONNECTED)) {
755
+ return EzspStatus.NOT_CONNECTED;
756
+ }
757
+
758
+ const buffer = this.txFree.allocBuffer();
759
+
760
+ if (buffer === undefined) {
761
+ return EzspStatus.NO_TX_SPACE;
762
+ }
763
+
764
+ inBuf.copy(buffer.data, 0, 0, len);
765
+
766
+ buffer.len = len;
767
+
768
+ this.randomizeBuffer(buffer.data, buffer.len); // IN/OUT data
769
+ this.txQueue.addTail(buffer);
770
+ this.sendExec();
771
+
772
+ return EzspStatus.SUCCESS;
773
+ }
774
+
775
+ /**
776
+ * Manages outgoing communication to the NCP, including DATA frames as well as the frames used for
777
+ * initialization and error detection and recovery.
778
+ */
779
+ public sendExec(): void {
780
+ let outByte = 0x00;
781
+ let inByte = 0x00;
782
+ let len = 0;
783
+ let buffer: EzspBuffer | undefined;
784
+
785
+ // Check for received acknowledgement timer expiry
786
+ if (this.ackTimerHasExpired()) {
787
+ if (this.flags & Flag.CONNECTED) {
788
+ const reTx = this.flags & Flag.RETX;
789
+ const expectedFrm = reTx ? this.frmReTx : this.frmTx;
790
+
791
+ if (this.ackRx !== expectedFrm) {
792
+ this.counters.rxAckTimeouts += 1;
793
+
794
+ this.adjustAckPeriod(true);
795
+
796
+ logger.debug(() => `Timer expired waiting for ACK for ${reTx ? "frmReTx" : "frmTx"}=${expectedFrm}, ackRx=${this.ackRx}`, NS);
797
+
798
+ if (++this.timeouts >= ASH_MAX_TIMEOUTS) {
799
+ this.hostDisconnect(EzspStatus.ASH_ERROR_TIMEOUTS);
800
+
801
+ return;
802
+ }
803
+
804
+ this.startRetransmission();
805
+ } else {
806
+ this.stopAckTimer();
807
+ }
808
+ } /* else {
809
+ this.hostDisconnect(EzspStatus.ASH_ERROR_RESET_FAIL);
810
+ }*/
811
+ // let Ezsp layer retry logic handle timeout
812
+ }
813
+
814
+ while (this.writer.writeAvailable()) {
815
+ // Send ASH_CAN character immediately, ahead of any other transmit data
816
+ if (this.flags & Flag.CAN) {
817
+ if (this.sendState === SendState.IDLE) {
818
+ // sending RST or just woke NCP
819
+ this.writer.writeByte(AshReservedByte.CANCEL);
820
+ } else if (this.sendState === SendState.TX_DATA) {
821
+ // cancel frame in progress
822
+ this.counters.txCancelled += 1;
823
+
824
+ this.writer.writeByte(AshReservedByte.CANCEL);
825
+
826
+ this.stopAckTimer();
827
+
828
+ this.sendState = SendState.IDLE;
829
+ }
830
+
831
+ this.flags &= ~Flag.CAN;
832
+
833
+ continue;
834
+ }
835
+
836
+ switch (this.sendState) {
837
+ case SendState.IDLE: {
838
+ // In between frames - do some housekeeping and decide what to send next
839
+ // If retransmitting, set the next frame to send to the last ackNum
840
+ // received, then check to see if retransmission is now complete.
841
+ if (this.flags & Flag.RETX) {
842
+ if (withinRange(this.frmReTx, this.ackRx, this.frmTx)) {
843
+ this.frmReTx = this.ackRx;
844
+ }
845
+
846
+ if (this.frmReTx === this.frmTx) {
847
+ this.flags &= ~Flag.RETX;
848
+
849
+ this.scrubReTxQueue();
850
+ }
851
+ }
852
+
853
+ // restrain ncp if needed
854
+ this.dataFrameFlowControl();
855
+
856
+ // See if a short frame is flagged to be sent
857
+ // The order of the tests below - RST, NAK and ACK -
858
+ // sets the relative priority of sending these frame types.
859
+ if (this.flags & Flag.RST) {
860
+ this.txSHBuffer[0] = AshFrameType.RST;
861
+
862
+ this.setAndStartAckTimer(CONFIG_TIME_RST);
863
+
864
+ len = 1;
865
+ this.flags &= ~(Flag.RST | Flag.NAK | Flag.ACK);
866
+ this.sendState = SendState.SHFRAME;
867
+ logger.debug(() => "---> [FRAME type=RST]", NS);
868
+ } else if (this.flags & (Flag.NAK | Flag.ACK)) {
869
+ if (this.flags & Flag.NAK) {
870
+ this.txSHBuffer[0] = AshFrameType.NAK + (this.frmRx << ASH_ACKNUM_BIT);
871
+ this.flags &= ~(Flag.NRTX | Flag.NAK | Flag.ACK);
872
+ logger.debug(() => `---> [FRAME type=NAK frmRx=${this.frmRx}](ackRx=${this.ackRx})`, NS);
873
+ } else {
874
+ this.txSHBuffer[0] = AshFrameType.ACK + (this.frmRx << ASH_ACKNUM_BIT);
875
+ this.flags &= ~(Flag.NRTX | Flag.ACK);
876
+ logger.debug(() => `---> [FRAME type=ACK frmRx=${this.frmRx}](ackRx=${this.ackRx})`, NS);
877
+ }
878
+
879
+ if (this.flags & Flag.NR) {
880
+ this.txSHBuffer[0] |= ASH_NFLAG_MASK;
881
+ this.flags |= Flag.NRTX;
882
+
883
+ this.startNrTimer();
884
+ }
885
+
886
+ this.ackTx = this.frmRx;
887
+ len = 1;
888
+ this.sendState = SendState.SHFRAME;
889
+ } else if (this.flags & Flag.RETX) {
890
+ // Retransmitting DATA frames for error recovery
891
+ // buffer assumed valid from loop logic
892
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
893
+ buffer = this.reTxQueue.getNthEntry((this.frmTx - this.frmReTx) & 7)!;
894
+ len = buffer.len + 1;
895
+ this.txSHBuffer[0] = AshFrameType.DATA | (this.frmReTx << ASH_FRMNUM_BIT) | (this.frmRx << ASH_ACKNUM_BIT) | ASH_RFLAG_MASK;
896
+ this.sendState = SendState.RETX_DATA;
897
+ logger.debug(
898
+ () => `---> [FRAME type=DATA_RETX frmReTx=${this.frmReTx} frmRx=${this.frmRx}](ackRx=${this.ackRx} frmTx=${this.frmTx})`,
899
+ NS,
900
+ );
901
+ } else if (this.ackTx !== this.frmRx) {
902
+ // An ACK should be generated
903
+ this.flags |= Flag.ACK;
904
+ break;
905
+ } else if (!this.txQueue.empty && withinRange(this.ackRx, this.frmTx, this.ackRx + CONFIG_TX_K - 1)) {
906
+ // Send a DATA frame if ready
907
+ buffer = this.txQueue.head;
908
+ len = buffer.len + 1;
909
+
910
+ this.counters.txData += len - 1;
911
+
912
+ this.txSHBuffer[0] = AshFrameType.DATA | (this.frmTx << ASH_FRMNUM_BIT) | (this.frmRx << ASH_ACKNUM_BIT);
913
+ this.sendState = SendState.TX_DATA;
914
+ logger.debug(() => `---> [FRAME type=DATA frmTx=${this.frmTx} frmRx=${this.frmRx}](ackRx=${this.ackRx})`, NS);
915
+ } else {
916
+ // Otherwise there's nothing to send
917
+ this.writer.writeFlush();
918
+
919
+ return;
920
+ }
921
+
922
+ this.countFrame(true);
923
+
924
+ // Start frame - encodeByte() is inited by a non-zero length argument
925
+ outByte = this.encodeByte(len, this.txSHBuffer[0]);
926
+
927
+ this.writer.writeByte(outByte);
928
+ break;
929
+ }
930
+
931
+ case SendState.SHFRAME: {
932
+ // sending short frame
933
+ if (this.txOffset !== 0xff) {
934
+ inByte = this.txSHBuffer[this.txOffset];
935
+ outByte = this.encodeByte(0, inByte);
936
+
937
+ this.writer.writeByte(outByte);
938
+ } else {
939
+ this.sendState = SendState.IDLE;
940
+ }
941
+ break;
942
+ }
943
+
944
+ case SendState.TX_DATA:
945
+ case SendState.RETX_DATA: {
946
+ // sending OR resending data frame
947
+ if (this.txOffset !== 0xff) {
948
+ // buffer assumed valid from loop logic
949
+ // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
950
+ inByte = this.txOffset ? buffer!.data[this.txOffset - 1] : this.txSHBuffer[0];
951
+ outByte = this.encodeByte(0, inByte);
952
+
953
+ this.writer.writeByte(outByte);
954
+ } else {
955
+ if (this.sendState === SendState.TX_DATA) {
956
+ this.frmTx = inc8(this.frmTx);
957
+ buffer = this.txQueue.removeHead();
958
+
959
+ this.reTxQueue.addTail(buffer);
960
+ } else {
961
+ this.frmReTx = inc8(this.frmReTx);
962
+ }
963
+
964
+ if (this.ackTimerIsNotRunning()) {
965
+ this.startAckTimer();
966
+ }
967
+
968
+ this.ackTx = this.frmRx;
969
+ this.sendState = SendState.IDLE;
970
+ }
971
+ break;
972
+ }
973
+ }
974
+ }
975
+
976
+ this.writer.writeFlush();
977
+ }
978
+
979
+ /**
980
+ * Retrieve a frame and accept, reTx, reject, fail based on type & validity in current state.
981
+ * @returns
982
+ * - EzspStatus.SUCCESS On valid RSTACK or valid DATA frame.
983
+ * - EzspStatus.ASH_IN_PROGRESS
984
+ * - EzspStatus.NO_RX_DATA
985
+ * - EzspStatus.NO_RX_SPACE
986
+ * - EzspStatus.HOST_FATAL_ERROR
987
+ * - EzspStatus.ASH_NCP_FATAL_ERROR
988
+ */
989
+ private receiveFrame(buffer: Buffer): EzspStatus {
990
+ // Check for errors that might have been detected
991
+ if (this.hostError !== EzspStatus.NO_ERROR) {
992
+ return EzspStatus.HOST_FATAL_ERROR;
993
+ }
994
+
995
+ if (this.ncpError !== EzspStatus.NO_ERROR) {
996
+ return EzspStatus.ASH_NCP_FATAL_ERROR;
997
+ }
998
+
999
+ let ackNum = 0;
1000
+ let frmNum = 0;
1001
+ let frameType: AshFrameType = AshFrameType.INVALID;
1002
+
1003
+ // Read data from serial port and assemble a frame until complete, aborted
1004
+ // due to an error, cancelled, or there is no more serial data available.
1005
+ const status = this.readFrame(buffer);
1006
+
1007
+ switch (status) {
1008
+ case EzspStatus.SUCCESS:
1009
+ break;
1010
+ case EzspStatus.ASH_IN_PROGRESS:
1011
+ // should have a complete frame by now, if not, don't process further
1012
+ return EzspStatus.NO_RX_DATA;
1013
+ case EzspStatus.ASH_CANCELLED:
1014
+ // should have been taken out in onFrame
1015
+ return this.hostDisconnect(status);
1016
+ case EzspStatus.ASH_BAD_CRC:
1017
+ this.counters.rxCrcErrors += 1;
1018
+
1019
+ this.rejectFrame();
1020
+ logger.error("Received frame with CRC error", NS);
1021
+ return EzspStatus.NO_RX_DATA;
1022
+ case EzspStatus.ASH_COMM_ERROR:
1023
+ this.counters.rxCommErrors += 1;
1024
+
1025
+ this.rejectFrame();
1026
+ logger.error("Received frame with comm error", NS);
1027
+ return EzspStatus.NO_RX_DATA;
1028
+ case EzspStatus.ASH_TOO_SHORT:
1029
+ this.counters.rxTooShort += 1;
1030
+
1031
+ this.rejectFrame();
1032
+ logger.error("Received frame shorter than minimum", NS);
1033
+ return EzspStatus.NO_RX_DATA;
1034
+ case EzspStatus.ASH_TOO_LONG:
1035
+ this.counters.rxTooLong += 1;
1036
+
1037
+ this.rejectFrame();
1038
+ logger.error("Received frame longer than maximum", NS);
1039
+ return EzspStatus.NO_RX_DATA;
1040
+ case EzspStatus.ASH_ERROR_XON_XOFF:
1041
+ return this.hostDisconnect(status);
1042
+ default:
1043
+ logger.error(`Unhandled error while receiving frame, status=${EzspStatus[status]}.`, NS);
1044
+ return this.hostDisconnect(EzspStatus.HOST_FATAL_ERROR);
1045
+ }
1046
+
1047
+ // Got a complete frame - validate its control and length.
1048
+ // On an error the type returned will be TYPE_INVALID.
1049
+ frameType = this.getFrameType(this.rxSHBuffer[0], this.rxLen);
1050
+
1051
+ // Free buffer allocated for a received frame if:
1052
+ // DATA frame, and out of order
1053
+ // DATA frame, and not in the CONNECTED state
1054
+ // not a DATA frame
1055
+ if (frameType === AshFrameType.DATA) {
1056
+ if (!(this.flags & Flag.CONNECTED) || (this.rxSHBuffer[0] & ASH_FRMNUM_MASK) >> ASH_FRMNUM_BIT !== this.frmRx) {
1057
+ this.freeAllocatedRxBuffer();
1058
+ }
1059
+ } else {
1060
+ this.freeAllocatedRxBuffer();
1061
+ }
1062
+
1063
+ logger.debug(() => `<--- [FRAME type=${AshFrameType[frameType]}]`, NS);
1064
+ this.countFrame(false);
1065
+
1066
+ // Process frames received while not in the connected state -
1067
+ // ignore everything except RSTACK and ERROR frames
1068
+ if (!(this.flags & Flag.CONNECTED)) {
1069
+ if (frameType === AshFrameType.RSTACK) {
1070
+ // RSTACK frames have the ncp ASH version in the first data field byte,
1071
+ // and the reset reason in the second byte
1072
+ if (this.rxSHBuffer[1] !== ASH_VERSION) {
1073
+ return this.hostDisconnect(EzspStatus.ASH_ERROR_VERSION);
1074
+ }
1075
+
1076
+ // Ignore a RSTACK if the reset reason doesn't match our reset method
1077
+ if (this.rxSHBuffer[2] !== NcpFailedCode.RESET_SOFTWARE) {
1078
+ return EzspStatus.ASH_IN_PROGRESS;
1079
+ }
1080
+
1081
+ this.ncpError = EzspStatus.NO_ERROR;
1082
+
1083
+ this.stopAckTimer();
1084
+
1085
+ this.timeouts = 0;
1086
+
1087
+ this.setAckPeriod(CONFIG_ACK_TIME_INIT);
1088
+
1089
+ this.flags = Flag.CONNECTED | Flag.ACK;
1090
+
1091
+ logger.info("======== ASH connected ========", NS);
1092
+
1093
+ return EzspStatus.SUCCESS;
1094
+ }
1095
+
1096
+ if (frameType === AshFrameType.ERROR) {
1097
+ logger.error(`Received ERROR from adapter while connecting, with code=${NcpFailedCode[this.rxSHBuffer[2]]}.`, NS);
1098
+ // let Ezsp retry logic handle error
1099
+ // return this.ncpDisconnect(EzspStatus.ASH_NCP_FATAL_ERROR);
1100
+ }
1101
+
1102
+ return EzspStatus.ASH_IN_PROGRESS;
1103
+ }
1104
+
1105
+ // Connected - process the ackNum in ACK, NAK and DATA frames
1106
+ if (frameType === AshFrameType.DATA || frameType === AshFrameType.ACK || frameType === AshFrameType.NAK) {
1107
+ ackNum = (this.rxSHBuffer[0] & ASH_ACKNUM_MASK) >> ASH_ACKNUM_BIT;
1108
+
1109
+ logger.debug(() => `<--- [FRAME type=${AshFrameType[frameType]} ackNum=${ackNum}](ackRx=${this.ackRx} frmTx=${this.frmTx})`, NS);
1110
+
1111
+ if (!withinRange(this.ackRx, ackNum, this.frmTx)) {
1112
+ this.counters.rxBadAckNumber += 1;
1113
+
1114
+ logger.debug(
1115
+ () => `<-x- [FRAME type=${AshFrameType[frameType]} ackNum=${ackNum}] Invalid ACK num; not within <${this.ackRx}-${this.frmTx}>`,
1116
+ NS,
1117
+ );
1118
+
1119
+ frameType = AshFrameType.INVALID;
1120
+ } else if (ackNum !== this.ackRx) {
1121
+ // new frame(s) ACK'ed?
1122
+ this.ackRx = ackNum;
1123
+ this.timeouts = 0;
1124
+
1125
+ if (this.flags & Flag.RETX) {
1126
+ // start timer if unACK'ed frames
1127
+ this.stopAckTimer();
1128
+
1129
+ if (ackNum !== this.frmReTx) {
1130
+ this.startAckTimer();
1131
+ }
1132
+ } else {
1133
+ this.adjustAckPeriod(false); // factor ACK time into period
1134
+
1135
+ if (ackNum !== this.frmTx) {
1136
+ // if more unACK'ed frames,
1137
+ this.startAckTimer(); // then restart ACK timer
1138
+ }
1139
+
1140
+ this.scrubReTxQueue(); // free buffer(s) in ReTx queue
1141
+ }
1142
+ }
1143
+ }
1144
+
1145
+ // Process frames received while connected
1146
+ switch (frameType) {
1147
+ case AshFrameType.DATA: {
1148
+ frmNum = (this.rxSHBuffer[0] & ASH_FRMNUM_MASK) >> ASH_FRMNUM_BIT;
1149
+ const frameStr = `[FRAME type=${AshFrameType[frameType]} ackNum=${ackNum} frmNum=${frmNum}](frmRx=${this.frmRx})`;
1150
+
1151
+ if (frmNum === this.frmRx) {
1152
+ // is frame in sequence?
1153
+ if (this.rxDataBuffer == null) {
1154
+ // valid frame but no memory?
1155
+ this.counters.rxNoBuffer += 1;
1156
+
1157
+ logger.debug(() => `<-x- ${frameStr} No buffer available`, NS);
1158
+
1159
+ this.rejectFrame();
1160
+
1161
+ return EzspStatus.NO_RX_SPACE;
1162
+ }
1163
+
1164
+ if (this.rxSHBuffer[0] & ASH_RFLAG_MASK) {
1165
+ // if retransmitted, force ACK
1166
+ this.flags |= Flag.ACK;
1167
+ }
1168
+
1169
+ this.flags &= ~(Flag.REJ | Flag.NAK); // clear the REJ condition
1170
+ this.frmRx = inc8(this.frmRx);
1171
+
1172
+ this.randomizeBuffer(this.rxDataBuffer.data, this.rxDataBuffer.len); // IN/OUT data
1173
+ this.rxQueue.addTail(this.rxDataBuffer); // add frame to receive queue
1174
+
1175
+ logger.debug(() => `<--- ${frameStr} Added to rxQueue`, NS);
1176
+
1177
+ this.counters.rxData += this.rxDataBuffer.len;
1178
+
1179
+ setImmediate(() => this.emit("frame"));
1180
+ return EzspStatus.SUCCESS;
1181
+ }
1182
+
1183
+ // frame is out of sequence
1184
+ if (this.rxSHBuffer[0] & ASH_RFLAG_MASK) {
1185
+ // if retransmitted, force ACK
1186
+ this.counters.rxDuplicates += 1;
1187
+ this.flags |= Flag.ACK;
1188
+ } else {
1189
+ // 1st OOS? then set REJ, send NAK
1190
+ if ((this.flags & Flag.REJ) === 0) {
1191
+ this.counters.rxOutOfSequence += 1;
1192
+
1193
+ logger.debug(() => `<-x- ${frameStr} Out of sequence: expected ${this.frmRx}; got ${frmNum}.`, NS);
1194
+ }
1195
+
1196
+ this.rejectFrame();
1197
+ }
1198
+ break;
1199
+ }
1200
+ case AshFrameType.ACK:
1201
+ // already fully processed
1202
+ break;
1203
+ case AshFrameType.NAK:
1204
+ // start retransmission if needed
1205
+ this.startRetransmission();
1206
+
1207
+ break;
1208
+ case AshFrameType.RSTACK:
1209
+ // unexpected ncp reset
1210
+ logger.error(`Received unexpected reset from adapter, with reason=${NcpFailedCode[this.rxSHBuffer[2]]}.`, NS);
1211
+ this.ncpError = EzspStatus.ASH_NCP_FATAL_ERROR;
1212
+
1213
+ return this.hostDisconnect(EzspStatus.ASH_ERROR_NCP_RESET);
1214
+ case AshFrameType.ERROR:
1215
+ // ncp error
1216
+ logger.error(`Received ERROR from adapter, with code=${NcpFailedCode[this.rxSHBuffer[2]]}.`, NS);
1217
+ return this.ncpDisconnect(EzspStatus.ASH_NCP_FATAL_ERROR);
1218
+ case AshFrameType.INVALID:
1219
+ // reject invalid frames
1220
+ logger.debug(() => `<-x- [FRAME type=${AshFrameType[frameType]}] Rejecting. ${this.rxSHBuffer.toString("hex")}`, NS);
1221
+
1222
+ this.rejectFrame();
1223
+ break;
1224
+ }
1225
+
1226
+ return EzspStatus.ASH_IN_PROGRESS;
1227
+ }
1228
+
1229
+ /**
1230
+ * If the last control byte received was a DATA control, and we are connected and not already in the reject condition,
1231
+ * then send a NAK and set the reject condition.
1232
+ */
1233
+ private rejectFrame(): void {
1234
+ if ((this.rxSHBuffer[0] & ASH_DFRAME_MASK) === AshFrameType.DATA && (this.flags & (Flag.REJ | Flag.CONNECTED)) === Flag.CONNECTED) {
1235
+ this.flags |= Flag.REJ | Flag.NAK;
1236
+ }
1237
+ }
1238
+
1239
+ /**
1240
+ * Retrieve and process serial bytes.
1241
+ * @returns
1242
+ */
1243
+ private readFrame(buffer: Buffer): EzspStatus {
1244
+ let status: EzspStatus = EzspStatus.ERROR_INVALID_CALL; // no actual data to read, something's very wrong
1245
+ let index = 0;
1246
+ // let inByte: number = 0x00;
1247
+ this.decodeOutByte = 0x00;
1248
+
1249
+ if (!this.decodeInProgress) {
1250
+ this.rxLen = 0;
1251
+ this.rxDataBuffer = undefined;
1252
+ }
1253
+
1254
+ for (let i = 0; i < buffer.length; i++) {
1255
+ const inByte = buffer[i];
1256
+
1257
+ // 0xFF byte signals a callback is pending when between frames in synchronous (polled) callback mode.
1258
+ if (!this.decodeInProgress && inByte === ASH_WAKE) {
1259
+ if (this.ncpSleepEnabled) {
1260
+ this.ncpHasCallbacks = true;
1261
+ }
1262
+
1263
+ status = EzspStatus.ASH_IN_PROGRESS;
1264
+ continue;
1265
+ }
1266
+
1267
+ // Decode next input byte - note that many input bytes do not produce
1268
+ // an output byte. Return on any error in decoding.
1269
+ index = this.rxLen;
1270
+ status = this.decodeByte(inByte);
1271
+
1272
+ // discard an invalid frame
1273
+ if (status !== EzspStatus.ASH_IN_PROGRESS && status !== EzspStatus.SUCCESS) {
1274
+ this.freeAllocatedRxBuffer();
1275
+
1276
+ break;
1277
+ }
1278
+
1279
+ // if input byte produced an output byte
1280
+ if (this.rxLen !== index) {
1281
+ if (this.rxLen <= SH_RX_BUFFER_LEN) {
1282
+ // if a short frame, return in rxBuffer
1283
+ this.rxSHBuffer[index] = this.decodeOutByte;
1284
+ } else {
1285
+ // if a longer DATA frame, allocate an EzspBuffer for it.
1286
+ // (Note the control byte is always returned in shRxBuffer[0].
1287
+ // Even if no buffer can be allocated, the control's ackNum must be processed.)
1288
+ if (this.rxLen === SH_RX_BUFFER_LEN + 1) {
1289
+ // alloc buffer, copy prior data
1290
+ this.rxDataBuffer = this.rxFree.allocBuffer();
1291
+
1292
+ if (this.rxDataBuffer !== undefined) {
1293
+ // const len = SH_RX_BUFFER_LEN - 1;
1294
+
1295
+ // (void) memcpy(this.rxDataBuffer.data, this.shRxBuffer + 1, SH_RX_BUFFER_LEN - 1);
1296
+ this.rxSHBuffer.copy(this.rxDataBuffer.data, 0, 1, SH_RX_BUFFER_LEN);
1297
+
1298
+ this.rxDataBuffer.len = SH_RX_BUFFER_LEN - 1;
1299
+ }
1300
+ }
1301
+
1302
+ if (this.rxDataBuffer !== undefined) {
1303
+ // copy next byte to buffer
1304
+ this.rxDataBuffer.data[index - 1] = this.decodeOutByte; // -1 since control is omitted
1305
+ this.rxDataBuffer.len = index;
1306
+ }
1307
+ }
1308
+ }
1309
+
1310
+ if (status !== EzspStatus.ASH_IN_PROGRESS) {
1311
+ break;
1312
+ }
1313
+ }
1314
+
1315
+ return status;
1316
+ }
1317
+
1318
+ /**
1319
+ *
1320
+ */
1321
+ private freeAllocatedRxBuffer(): void {
1322
+ if (this.rxDataBuffer !== undefined) {
1323
+ this.rxFree.freeBuffer(this.rxDataBuffer);
1324
+
1325
+ this.rxDataBuffer = undefined;
1326
+ }
1327
+ }
1328
+
1329
+ /**
1330
+ *
1331
+ */
1332
+ private scrubReTxQueue(): void {
1333
+ let buffer: EzspBuffer;
1334
+
1335
+ while (this.ackRx !== this.frmReTxHead) {
1336
+ buffer = this.reTxQueue.removeHead();
1337
+
1338
+ this.txFree.freeBuffer(buffer);
1339
+
1340
+ this.frmReTxHead = inc8(this.frmReTxHead);
1341
+ }
1342
+ }
1343
+
1344
+ /**
1345
+ * If not already retransmitting, and there are unacked frames, start retransmitting after the last frame that was acked.
1346
+ */
1347
+ private startRetransmission(): void {
1348
+ if (!(this.flags & Flag.RETX) && this.ackRx !== this.frmTx) {
1349
+ this.stopAckTimer();
1350
+
1351
+ this.frmReTx = this.ackRx;
1352
+ this.flags |= Flag.RETX | Flag.CAN;
1353
+ }
1354
+ }
1355
+
1356
+ /**
1357
+ * Check free rx buffers to see whether able to receive DATA frames: set or clear NR flag appropriately.
1358
+ * Inform ncp of our status using the nFlag in ACKs and NAKs.
1359
+ * Note that not ready status must be refreshed if it persists beyond a maximum time limit.
1360
+ */
1361
+ private dataFrameFlowControl(): void {
1362
+ if (this.flags & Flag.CONNECTED) {
1363
+ // Set/clear NR flag based on the number of buffers free
1364
+ if (this.rxFree.length < CONFIG_NR_LOW_LIMIT) {
1365
+ this.flags |= Flag.NR;
1366
+
1367
+ logger.warning("NOT READY - Signaling adapter", NS);
1368
+ } else if (this.rxFree.length > CONFIG_NR_HIGH_LIMIT) {
1369
+ this.flags &= ~Flag.NR;
1370
+
1371
+ this.stopNrTimer(); // needed??
1372
+ }
1373
+
1374
+ // Force an ACK (or possibly NAK) if we need to send an updated nFlag
1375
+ // due to either a changed NR status or to refresh a set nFlag
1376
+ if (this.flags & Flag.NR) {
1377
+ if (!(this.flags & Flag.NRTX) || this.nrTimerHasExpired()) {
1378
+ this.flags |= Flag.ACK;
1379
+
1380
+ this.startNrTimer();
1381
+ }
1382
+ } else {
1383
+ this.nrTimerHasExpired(); // ensure timer checked often
1384
+
1385
+ if (this.flags & Flag.NRTX) {
1386
+ this.flags |= Flag.ACK;
1387
+
1388
+ this.stopNrTimer(); // needed???
1389
+ }
1390
+ }
1391
+ } else {
1392
+ this.stopNrTimer();
1393
+
1394
+ this.flags &= ~(Flag.NRTX | Flag.NR);
1395
+ }
1396
+ }
1397
+
1398
+ /**
1399
+ * Sets a fatal error state at the Host level.
1400
+ * @param error
1401
+ * @returns EzspStatus.HOST_FATAL_ERROR
1402
+ */
1403
+ private hostDisconnect(error: EzspStatus): EzspStatus {
1404
+ this.flags = 0;
1405
+ this.hostError = error;
1406
+
1407
+ logger.error(`ASH disconnected: ${EzspStatus[error]} | Adapter status: ${EzspStatus[this.ncpError]}`, NS);
1408
+
1409
+ return EzspStatus.HOST_FATAL_ERROR;
1410
+ }
1411
+
1412
+ /**
1413
+ * Sets a fatal error state at the NCP level. Will require a reset.
1414
+ * @param error
1415
+ * @returns EzspStatus.ASH_NCP_FATAL_ERROR
1416
+ */
1417
+ private ncpDisconnect(error: EzspStatus): EzspStatus {
1418
+ this.flags = 0;
1419
+ this.ncpError = error;
1420
+
1421
+ logger.error(`ASH disconnected | Adapter status: ${EzspStatus[this.ncpError]}`, NS);
1422
+
1423
+ return EzspStatus.ASH_NCP_FATAL_ERROR;
1424
+ }
1425
+
1426
+ /**
1427
+ * Randomizes array contents by XORing with an 8-bit pseudo random sequence.
1428
+ * This reduces the likelihood that byte-stuffing will greatly increase the size of the payload.
1429
+ * (This could happen if a DATA frame contained repeated instances of the same reserved byte value.)
1430
+ *
1431
+ * Returns buffer as-is if randomize is OFF.
1432
+ * @param buffer IN/OUT
1433
+ * @param len
1434
+ */
1435
+ public randomizeBuffer(buffer: Buffer, len: number): void {
1436
+ let outIdx = 0;
1437
+ let seed = LFSR_SEED;
1438
+
1439
+ while (len--) {
1440
+ // *buf++ ^= seed;
1441
+ buffer[outIdx++] ^= seed;
1442
+
1443
+ seed = seed & 1 ? (seed >> 1) ^ LFSR_POLY : seed >> 1;
1444
+ }
1445
+ }
1446
+
1447
+ /**
1448
+ * Get the frame type from the control byte and validate it against the frame length.
1449
+ * @param control
1450
+ * @param len Frame length
1451
+ * @returns AshFrameType.INVALID if bad control/length otherwise the frame type.
1452
+ */
1453
+ public getFrameType(control: number, len: number): AshFrameType {
1454
+ if (control === AshFrameType.RSTACK) {
1455
+ if (len === ASH_FRAME_LEN_RSTACK) {
1456
+ return AshFrameType.RSTACK;
1457
+ }
1458
+ } else if (control === AshFrameType.ERROR) {
1459
+ if (len === ASH_FRAME_LEN_ERROR) {
1460
+ return AshFrameType.ERROR;
1461
+ }
1462
+ } else if ((control & ASH_DFRAME_MASK) === AshFrameType.DATA) {
1463
+ if (len >= ASH_FRAME_LEN_DATA_MIN) {
1464
+ return AshFrameType.DATA;
1465
+ }
1466
+ } else if ((control & ASH_SHFRAME_MASK) === AshFrameType.ACK) {
1467
+ if (len === ASH_FRAME_LEN_ACK) {
1468
+ return AshFrameType.ACK;
1469
+ }
1470
+ } else if ((control & ASH_SHFRAME_MASK) === AshFrameType.NAK) {
1471
+ if (len === ASH_FRAME_LEN_NAK) {
1472
+ return AshFrameType.NAK;
1473
+ }
1474
+ } else {
1475
+ this.counters.rxBadControl += 1;
1476
+ logger.debug(() => `Frame illegal control ${control}.`, NS); // EzspStatus.ASH_BAD_CONTROL
1477
+
1478
+ return AshFrameType.INVALID;
1479
+ }
1480
+
1481
+ this.counters.rxBadLength += 1;
1482
+ logger.debug(() => `Frame illegal length ${len} for control ${control}.`, NS); // EzspStatus.ASH_BAD_LENGTH
1483
+
1484
+ return AshFrameType.INVALID;
1485
+ }
1486
+
1487
+ /**
1488
+ * Encode byte for sending.
1489
+ * @param len Start a new frame if non-zero
1490
+ * @param byte
1491
+ * @returns outByte
1492
+ */
1493
+ private encodeByte(len: number, byte: number): number {
1494
+ // start a new frame if len is non-zero
1495
+ if (len) {
1496
+ this.encodeCount = len;
1497
+ this.txOffset = 0;
1498
+ this.encodeState = 0;
1499
+ this.encodeEscFlag = false;
1500
+ this.encodeCrc = 0xffff;
1501
+ }
1502
+
1503
+ // was an escape last time?
1504
+ if (this.encodeEscFlag) {
1505
+ this.encodeEscFlag = false;
1506
+
1507
+ // send data byte with bit flipped
1508
+ return this.encodeFlip;
1509
+ }
1510
+
1511
+ // control and data field bytes
1512
+ if (this.encodeState === 0) {
1513
+ this.encodeCrc = halCommonCrc16(byte, this.encodeCrc);
1514
+
1515
+ if (--this.encodeCount === 0) {
1516
+ this.encodeState = 1;
1517
+ } else {
1518
+ ++this.txOffset;
1519
+ }
1520
+
1521
+ return this.encodeStuffByte(byte);
1522
+ }
1523
+
1524
+ if (this.encodeState === 1) {
1525
+ // CRC high byte
1526
+ this.encodeState = 2;
1527
+
1528
+ return this.encodeStuffByte(this.encodeCrc >> 8);
1529
+ }
1530
+
1531
+ if (this.encodeState === 2) {
1532
+ // CRC low byte
1533
+ this.encodeState = 3;
1534
+
1535
+ return this.encodeStuffByte(this.encodeCrc & 0xff);
1536
+ }
1537
+
1538
+ this.txOffset = 0xff;
1539
+
1540
+ return AshReservedByte.FLAG;
1541
+ }
1542
+
1543
+ /**
1544
+ * Stuff byte as defined by ASH protocol.
1545
+ * @param byte
1546
+ * @returns
1547
+ */
1548
+ private encodeStuffByte(byte: number): number {
1549
+ if (
1550
+ byte === AshReservedByte.FLAG ||
1551
+ byte === AshReservedByte.ESCAPE ||
1552
+ byte === AshReservedByte.XON ||
1553
+ byte === AshReservedByte.XOFF ||
1554
+ byte === AshReservedByte.SUBSTITUTE ||
1555
+ byte === AshReservedByte.CANCEL
1556
+ ) {
1557
+ // is special byte
1558
+ this.encodeEscFlag = true;
1559
+ this.encodeFlip = byte ^ ASH_FLIP;
1560
+
1561
+ return AshReservedByte.ESCAPE;
1562
+ }
1563
+
1564
+ return byte;
1565
+ }
1566
+
1567
+ /**
1568
+ * Decode received byte.
1569
+ * @param byte
1570
+ * @returns
1571
+ * - EzspStatus.ASH_IN_PROGRESS
1572
+ * - EzspStatus.ASH_COMM_ERROR
1573
+ * - EzspStatus.ASH_BAD_CRC
1574
+ * - EzspStatus.ASH_TOO_SHORT
1575
+ * - EzspStatus.ASH_TOO_LONG
1576
+ * - EzspStatus.SUCCESS
1577
+ * - EzspStatus.ASH_CANCELLED
1578
+ * - EzspStatus.ASH_ERROR_XON_XOFF
1579
+ */
1580
+ private decodeByte(byte: number): EzspStatus {
1581
+ let status: EzspStatus = EzspStatus.ASH_IN_PROGRESS;
1582
+
1583
+ if (!this.decodeInProgress) {
1584
+ this.decodeLen = 0;
1585
+ this.decodeByte1 = 0;
1586
+ this.decodeByte2 = 0;
1587
+ this.decodeFlip = 0;
1588
+ this.decodeCrc = 0xffff;
1589
+ }
1590
+
1591
+ switch (byte) {
1592
+ case AshReservedByte.FLAG:
1593
+ // flag byte (frame delimiter)
1594
+ if (this.decodeLen === 0) {
1595
+ // if no frame data, not end flag, so ignore it
1596
+ this.decodeFlip = 0; // ignore isolated data escape between flags
1597
+ break;
1598
+ }
1599
+
1600
+ if (this.decodeLen === 0xff) {
1601
+ status = EzspStatus.ASH_COMM_ERROR;
1602
+ } else if (this.decodeCrc !== (this.decodeByte2 << 8) + this.decodeByte1) {
1603
+ status = EzspStatus.ASH_BAD_CRC;
1604
+ } else if (this.decodeLen < ASH_MIN_FRAME_WITH_CRC_LEN) {
1605
+ status = EzspStatus.ASH_TOO_SHORT;
1606
+ } else if (this.decodeLen > ASH_MAX_FRAME_WITH_CRC_LEN) {
1607
+ status = EzspStatus.ASH_TOO_LONG;
1608
+ } else {
1609
+ status = EzspStatus.SUCCESS;
1610
+ }
1611
+ break;
1612
+ case AshReservedByte.ESCAPE:
1613
+ // byte stuffing escape byte
1614
+ this.decodeFlip = ASH_FLIP;
1615
+ break;
1616
+ case AshReservedByte.CANCEL:
1617
+ // cancel frame without an error
1618
+ status = EzspStatus.ASH_CANCELLED;
1619
+ break;
1620
+ case AshReservedByte.SUBSTITUTE:
1621
+ // discard remainder of frame
1622
+ this.decodeLen = 0xff; // special value flags low level comm error
1623
+ break;
1624
+ case AshReservedByte.XON:
1625
+ case AshReservedByte.XOFF:
1626
+ // If host is using RTS/CTS, ignore any XON/XOFFs received from the NCP.
1627
+ // If using XON/XOFF, the host driver must remove them from the input stream.
1628
+ // If it doesn't, it probably means the driver isn't setup for XON/XOFF,
1629
+ // so issue an error to flag the serial port driver problem.
1630
+ if (this.serialPort != null && !this.serialPort.settings.rtscts) {
1631
+ status = EzspStatus.ASH_ERROR_XON_XOFF;
1632
+ }
1633
+ break;
1634
+ default:
1635
+ // a normal byte
1636
+ byte ^= this.decodeFlip;
1637
+ this.decodeFlip = 0;
1638
+
1639
+ if (this.decodeLen <= ASH_MAX_FRAME_WITH_CRC_LEN) {
1640
+ // limit length to max + 1
1641
+ ++this.decodeLen;
1642
+ }
1643
+
1644
+ if (this.decodeLen > ASH_CRC_LEN) {
1645
+ // compute frame CRC even if too long
1646
+ this.decodeCrc = halCommonCrc16(this.decodeByte2, this.decodeCrc);
1647
+
1648
+ if (this.decodeLen <= ASH_MAX_FRAME_WITH_CRC_LEN) {
1649
+ // store to only max len
1650
+ this.decodeOutByte = this.decodeByte2;
1651
+ this.rxLen = this.decodeLen - ASH_CRC_LEN; // CRC is not output, reduce length
1652
+ }
1653
+ }
1654
+
1655
+ this.decodeByte2 = this.decodeByte1;
1656
+ this.decodeByte1 = byte;
1657
+ break;
1658
+ }
1659
+
1660
+ this.decodeInProgress = status === EzspStatus.ASH_IN_PROGRESS;
1661
+
1662
+ return status;
1663
+ }
1664
+
1665
+ /**
1666
+ * Starts the Not Ready timer
1667
+ *
1668
+ * On the host, this times nFlag refreshing when the host doesn't have room for callbacks for a prolonged period.
1669
+ *
1670
+ * On the NCP, if this times out the NCP resumes sending callbacks.
1671
+ */
1672
+ private startNrTimer(): void {
1673
+ this.nrTimer = performance.now() + CONFIG_NR_TIME;
1674
+ }
1675
+
1676
+ /**
1677
+ * Stop Not Ready timer (set to 0).
1678
+ */
1679
+ private stopNrTimer(): void {
1680
+ this.nrTimer = 0;
1681
+ }
1682
+
1683
+ /**
1684
+ * Tests whether the Not Ready timer has expired or has stopped. If expired, it is stopped.
1685
+ *
1686
+ * @returns true if the Not Ready timer has expired or stopped
1687
+ */
1688
+ private nrTimerHasExpired(): boolean {
1689
+ if (this.nrTimer) {
1690
+ if (performance.now() - this.nrTimer >= 0) {
1691
+ this.nrTimer = 0;
1692
+ }
1693
+ }
1694
+
1695
+ return !this.nrTimer;
1696
+ }
1697
+
1698
+ /**
1699
+ * Sets the acknowledgement timer period (in msec) and stops the timer.
1700
+ */
1701
+ private setAckPeriod(msec: number): void {
1702
+ this.ackPeriod = msec;
1703
+ this.ackTimer = 0;
1704
+ }
1705
+
1706
+ /**
1707
+ * Sets the acknowledgement timer period (in msec), and starts the timer running.
1708
+ */
1709
+ private setAndStartAckTimer(msec: number): void {
1710
+ this.setAckPeriod(msec);
1711
+ this.startAckTimer();
1712
+ }
1713
+
1714
+ /**
1715
+ * Adapts the acknowledgement timer period to the observed ACK delay.
1716
+ * If the timer is not running, it does nothing.
1717
+ * If the timer has expired, the timeout period is doubled.
1718
+ * If the timer has not expired, the elapsed time is fed into simple
1719
+ *
1720
+ * IIR filter:
1721
+ * T[n+1] = (7*T[n] + elapsedTime) / 8
1722
+ *
1723
+ * The timeout period, ackPeriod, is limited such that:
1724
+ * config.ackTimeMin <= ackPeriod <= config.ackTimeMax.
1725
+ *
1726
+ * The acknowledgement timer is always stopped by this function.
1727
+ *
1728
+ * @param expired true if timer has expired
1729
+ */
1730
+ private adjustAckPeriod(expired: boolean): void {
1731
+ if (expired) {
1732
+ // if expired, double the period
1733
+ this.ackPeriod += this.ackPeriod;
1734
+ } else if (this.ackTimer) {
1735
+ // adjust period only if running
1736
+ // time elapsed since timer was started
1737
+ let temp: number = this.ackPeriod;
1738
+ // compute time to receive acknowledgement, then stop timer
1739
+ const lastAckTime: number = performance.now() - this.ackTimer;
1740
+ temp = (temp << 3) - temp;
1741
+ temp += lastAckTime << 2;
1742
+ temp >>= 3;
1743
+ this.ackPeriod = temp & 0xffff;
1744
+ }
1745
+
1746
+ // keep ackPeriod within limits
1747
+ if (this.ackPeriod > CONFIG_ACK_TIME_MAX) {
1748
+ this.ackPeriod = CONFIG_ACK_TIME_MAX;
1749
+ } else if (this.ackPeriod < CONFIG_ACK_TIME_MIN) {
1750
+ this.ackPeriod = CONFIG_ACK_TIME_MIN;
1751
+ }
1752
+
1753
+ this.ackTimer = 0; // always stop the timer
1754
+ }
1755
+
1756
+ /**
1757
+ * Sets ACK Timer to the specified period and starts it running.
1758
+ */
1759
+ private startAckTimer(): void {
1760
+ this.ackTimer = performance.now();
1761
+ }
1762
+
1763
+ /**
1764
+ * Stops and clears ACK Timer.
1765
+ */
1766
+ private stopAckTimer(): void {
1767
+ this.ackTimer = 0;
1768
+ }
1769
+
1770
+ /**
1771
+ * Indicates whether or not ACK Timer has expired.
1772
+ * If the timer is stopped (0) then it is not expired.
1773
+ *
1774
+ * @returns
1775
+ */
1776
+ private ackTimerHasExpired(): boolean {
1777
+ if (this.ackTimer === 0) {
1778
+ // if timer is not running, return false
1779
+ return false;
1780
+ }
1781
+
1782
+ // return ((halCommonGetInt16uMillisecondTick() - this.ackTimer) >= this.ackPeriod);
1783
+ return performance.now() - this.ackTimer >= this.ackPeriod;
1784
+ }
1785
+
1786
+ /**
1787
+ * Indicates whether or not ACK Timer is currently running (!= 0).
1788
+ * The timer may be running even if expired.
1789
+ */
1790
+ private ackTimerIsNotRunning(): boolean {
1791
+ return this.ackTimer === 0;
1792
+ }
1793
+
1794
+ /**
1795
+ * Increase counters based on frame type and direction.
1796
+ * @param sent True if frame being sent, false if being received.
1797
+ */
1798
+ private countFrame(sent: boolean): void {
1799
+ let control: number;
1800
+
1801
+ if (sent) {
1802
+ control = this.txSHBuffer[0];
1803
+ this.counters.txAllFrames += 1;
1804
+ } else {
1805
+ control = this.rxSHBuffer[0];
1806
+ this.counters.rxAllFrames += 1;
1807
+ }
1808
+
1809
+ if ((control & ASH_DFRAME_MASK) === AshFrameType.DATA) {
1810
+ if (sent) {
1811
+ if (control & ASH_RFLAG_MASK) {
1812
+ this.counters.txReDataFrames += 1;
1813
+ } else {
1814
+ this.counters.txDataFrames += 1;
1815
+ }
1816
+ } else {
1817
+ if (control & ASH_RFLAG_MASK) {
1818
+ this.counters.rxReDataFrames += 1;
1819
+ } else {
1820
+ this.counters.rxDataFrames += 1;
1821
+ }
1822
+ }
1823
+ } else if ((control & ASH_SHFRAME_MASK) === AshFrameType.ACK) {
1824
+ if (sent) {
1825
+ this.counters.txAckFrames += 1;
1826
+
1827
+ if (control & ASH_NFLAG_MASK) {
1828
+ this.counters.txN1Frames += 1;
1829
+ } /* else {
1830
+ this.counters.txN0Frames += 1;
1831
+ }*/
1832
+ } else {
1833
+ this.counters.rxAckFrames += 1;
1834
+
1835
+ if (control & ASH_NFLAG_MASK) {
1836
+ this.counters.rxN1Frames += 1;
1837
+ } /* else {
1838
+ this.counters.rxN0Frames += 1;
1839
+ }*/
1840
+ }
1841
+ } else if ((control & ASH_SHFRAME_MASK) === AshFrameType.NAK) {
1842
+ if (sent) {
1843
+ this.counters.txNakFrames += 1;
1844
+
1845
+ if (control & ASH_NFLAG_MASK) {
1846
+ this.counters.txN1Frames += 1;
1847
+ } /* else {
1848
+ this.counters.txN0Frames += 1;
1849
+ }*/
1850
+ } else {
1851
+ this.counters.rxNakFrames += 1;
1852
+
1853
+ if (control & ASH_NFLAG_MASK) {
1854
+ this.counters.rxN1Frames += 1;
1855
+ } /* else {
1856
+ this.counters.rxN0Frames += 1;
1857
+ }*/
1858
+ }
1859
+ }
1860
+ }
1861
+
1862
+ /**
1863
+ * Read and clear ASH layer counters in the same manner as the NCP ones.
1864
+ * @returns
1865
+ */
1866
+ public readAndClearCounters(): number[] {
1867
+ const counters = [
1868
+ this.counters.txData,
1869
+ this.counters.txAllFrames,
1870
+ this.counters.txDataFrames,
1871
+ this.counters.txAckFrames,
1872
+ this.counters.txNakFrames,
1873
+ this.counters.txReDataFrames,
1874
+ this.counters.txN1Frames,
1875
+ this.counters.txCancelled,
1876
+
1877
+ this.counters.rxData,
1878
+ this.counters.rxAllFrames,
1879
+ this.counters.rxDataFrames,
1880
+ this.counters.rxAckFrames,
1881
+ this.counters.rxNakFrames,
1882
+ this.counters.rxReDataFrames,
1883
+ this.counters.rxN1Frames,
1884
+ this.counters.rxCancelled,
1885
+
1886
+ this.counters.rxCrcErrors,
1887
+ this.counters.rxCommErrors,
1888
+ this.counters.rxTooShort,
1889
+ this.counters.rxTooLong,
1890
+ this.counters.rxBadControl,
1891
+ this.counters.rxBadLength,
1892
+ this.counters.rxBadAckNumber,
1893
+ this.counters.rxNoBuffer,
1894
+ this.counters.rxDuplicates,
1895
+ this.counters.rxOutOfSequence,
1896
+ this.counters.rxAckTimeouts,
1897
+ ];
1898
+
1899
+ for (const c in this.counters) {
1900
+ this.counters[c as keyof UartAshCounters] = 0;
1901
+ }
1902
+
1903
+ return counters;
1904
+ }
1905
+
1906
+ /**
1907
+ * Log counters (pretty-formatted) as they are since last time they were cleared.
1908
+ * Used on ASH layer stop to get 'pre-stop state'.
1909
+ */
1910
+ private logCounters(): void {
1911
+ logger.info("ASH COUNTERS since last clear:", NS);
1912
+ logger.info(` Total frames: RX=${this.counters.rxAllFrames}, TX=${this.counters.txAllFrames}`, NS);
1913
+ logger.info(` Cancelled : RX=${this.counters.rxCancelled}, TX=${this.counters.txCancelled}`, NS);
1914
+ logger.info(` DATA frames : RX=${this.counters.rxDataFrames}, TX=${this.counters.txDataFrames}`, NS);
1915
+ logger.info(` DATA bytes : RX=${this.counters.rxData}, TX=${this.counters.txData}`, NS);
1916
+ logger.info(` Retry frames: RX=${this.counters.rxReDataFrames}, TX=${this.counters.txReDataFrames}`, NS);
1917
+ logger.info(` ACK frames : RX=${this.counters.rxAckFrames}, TX=${this.counters.txAckFrames}`, NS);
1918
+ logger.info(` NAK frames : RX=${this.counters.rxNakFrames}, TX=${this.counters.txNakFrames}`, NS);
1919
+ logger.info(` nRdy frames : RX=${this.counters.rxN1Frames}, TX=${this.counters.txN1Frames}`, NS);
1920
+
1921
+ logger.info(` CRC errors : RX=${this.counters.rxCrcErrors}`, NS);
1922
+ logger.info(` Comm errors : RX=${this.counters.rxCommErrors}`, NS);
1923
+ logger.info(` Length < minimum: RX=${this.counters.rxTooShort}`, NS);
1924
+ logger.info(` Length > maximum: RX=${this.counters.rxTooLong}`, NS);
1925
+ logger.info(` Bad controls : RX=${this.counters.rxBadControl}`, NS);
1926
+ logger.info(` Bad lengths : RX=${this.counters.rxBadLength}`, NS);
1927
+ logger.info(` Bad ACK numbers : RX=${this.counters.rxBadAckNumber}`, NS);
1928
+ logger.info(` Out of buffers : RX=${this.counters.rxNoBuffer}`, NS);
1929
+ logger.info(` Retry dupes : RX=${this.counters.rxDuplicates}`, NS);
1930
+ logger.info(` Out of sequence : RX=${this.counters.rxOutOfSequence}`, NS);
1931
+ logger.info(` ACK timeouts : RX=${this.counters.rxAckTimeouts}`, NS);
1932
+ }
1933
+ }