amaran-light-cli 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/README.md +108 -14
  2. package/dist/__tests__/autoCct.test.js +27 -0
  3. package/dist/__tests__/autoCct.test.js.map +1 -1
  4. package/dist/__tests__/bleHttpControl.test.d.ts +2 -0
  5. package/dist/__tests__/bleHttpControl.test.d.ts.map +1 -0
  6. package/dist/__tests__/bleHttpControl.test.js +230 -0
  7. package/dist/__tests__/bleHttpControl.test.js.map +1 -0
  8. package/dist/__tests__/bleStack.test.d.ts +2 -0
  9. package/dist/__tests__/bleStack.test.d.ts.map +1 -0
  10. package/dist/__tests__/bleStack.test.js +1239 -0
  11. package/dist/__tests__/bleStack.test.js.map +1 -0
  12. package/dist/__tests__/cctUtil.test.js +9 -4
  13. package/dist/__tests__/cctUtil.test.js.map +1 -1
  14. package/dist/__tests__/circadianDashboardSettings.test.d.ts +2 -0
  15. package/dist/__tests__/circadianDashboardSettings.test.d.ts.map +1 -0
  16. package/dist/__tests__/circadianDashboardSettings.test.js +82 -0
  17. package/dist/__tests__/circadianDashboardSettings.test.js.map +1 -0
  18. package/dist/__tests__/circadianIsolation.test.d.ts +2 -0
  19. package/dist/__tests__/circadianIsolation.test.d.ts.map +1 -0
  20. package/dist/__tests__/circadianIsolation.test.js +30 -0
  21. package/dist/__tests__/circadianIsolation.test.js.map +1 -0
  22. package/dist/__tests__/cli.config.test.js +49 -0
  23. package/dist/__tests__/cli.config.test.js.map +1 -1
  24. package/dist/__tests__/cli.smoke.test.js +34 -0
  25. package/dist/__tests__/cli.smoke.test.js.map +1 -1
  26. package/dist/__tests__/currentCct.test.d.ts +2 -0
  27. package/dist/__tests__/currentCct.test.d.ts.map +1 -0
  28. package/dist/__tests__/currentCct.test.js +29 -0
  29. package/dist/__tests__/currentCct.test.js.map +1 -0
  30. package/dist/__tests__/dashboard.test.d.ts +2 -0
  31. package/dist/__tests__/dashboard.test.d.ts.map +1 -0
  32. package/dist/__tests__/dashboard.test.js +126 -0
  33. package/dist/__tests__/dashboard.test.js.map +1 -0
  34. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts +2 -0
  35. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts.map +1 -0
  36. package/dist/__tests__/daylightSimulationParseUtils.test.js +16 -0
  37. package/dist/__tests__/daylightSimulationParseUtils.test.js.map +1 -0
  38. package/dist/__tests__/desktopImport.test.d.ts +2 -0
  39. package/dist/__tests__/desktopImport.test.d.ts.map +1 -0
  40. package/dist/__tests__/desktopImport.test.js +234 -0
  41. package/dist/__tests__/desktopImport.test.js.map +1 -0
  42. package/dist/__tests__/lightControl.basic.test.d.ts +2 -0
  43. package/dist/__tests__/lightControl.basic.test.d.ts.map +1 -0
  44. package/dist/__tests__/lightControl.basic.test.js +119 -0
  45. package/dist/__tests__/lightControl.basic.test.js.map +1 -0
  46. package/dist/__tests__/lightControl.colorEffects.test.d.ts +2 -0
  47. package/dist/__tests__/lightControl.colorEffects.test.d.ts.map +1 -0
  48. package/dist/__tests__/lightControl.colorEffects.test.js +170 -0
  49. package/dist/__tests__/lightControl.colorEffects.test.js.map +1 -0
  50. package/dist/__tests__/lightControl.management.test.d.ts +2 -0
  51. package/dist/__tests__/lightControl.management.test.d.ts.map +1 -0
  52. package/dist/__tests__/lightControl.management.test.js +90 -0
  53. package/dist/__tests__/lightControl.management.test.js.map +1 -0
  54. package/dist/__tests__/lightControlTestUtils.d.ts +10 -0
  55. package/dist/__tests__/lightControlTestUtils.d.ts.map +1 -0
  56. package/dist/__tests__/lightControlTestUtils.js +57 -0
  57. package/dist/__tests__/lightControlTestUtils.js.map +1 -0
  58. package/dist/__tests__/meshConfiguration.test.d.ts +2 -0
  59. package/dist/__tests__/meshConfiguration.test.d.ts.map +1 -0
  60. package/dist/__tests__/meshConfiguration.test.js +78 -0
  61. package/dist/__tests__/meshConfiguration.test.js.map +1 -0
  62. package/dist/__tests__/nativeGroups.test.d.ts +2 -0
  63. package/dist/__tests__/nativeGroups.test.d.ts.map +1 -0
  64. package/dist/__tests__/nativeGroups.test.js +104 -0
  65. package/dist/__tests__/nativeGroups.test.js.map +1 -0
  66. package/dist/__tests__/programApi.test.d.ts +2 -0
  67. package/dist/__tests__/programApi.test.d.ts.map +1 -0
  68. package/dist/__tests__/programApi.test.js +73 -0
  69. package/dist/__tests__/programApi.test.js.map +1 -0
  70. package/dist/__tests__/programs.test.d.ts +2 -0
  71. package/dist/__tests__/programs.test.d.ts.map +1 -0
  72. package/dist/__tests__/programs.test.js +176 -0
  73. package/dist/__tests__/programs.test.js.map +1 -0
  74. package/dist/__tests__/scheduleMaker.test.d.ts +2 -0
  75. package/dist/__tests__/scheduleMaker.test.d.ts.map +1 -0
  76. package/dist/__tests__/scheduleMaker.test.js +25 -0
  77. package/dist/__tests__/scheduleMaker.test.js.map +1 -0
  78. package/dist/ble/async.d.ts +2 -0
  79. package/dist/ble/async.d.ts.map +1 -0
  80. package/dist/ble/async.js +15 -0
  81. package/dist/ble/async.js.map +1 -0
  82. package/dist/ble/colors.d.ts +5 -0
  83. package/dist/ble/colors.d.ts.map +1 -0
  84. package/dist/ble/colors.js +44 -0
  85. package/dist/ble/colors.js.map +1 -0
  86. package/dist/ble/configuration.d.ts +22 -0
  87. package/dist/ble/configuration.d.ts.map +1 -0
  88. package/dist/ble/configuration.js +122 -0
  89. package/dist/ble/configuration.js.map +1 -0
  90. package/dist/ble/controller.d.ts +118 -0
  91. package/dist/ble/controller.d.ts.map +1 -0
  92. package/dist/ble/controller.js +931 -0
  93. package/dist/ble/controller.js.map +1 -0
  94. package/dist/ble/crypto.d.ts +34 -0
  95. package/dist/ble/crypto.d.ts.map +1 -0
  96. package/dist/ble/crypto.js +178 -0
  97. package/dist/ble/crypto.js.map +1 -0
  98. package/dist/ble/daemon.d.ts +2 -0
  99. package/dist/ble/daemon.d.ts.map +1 -0
  100. package/dist/ble/daemon.js +76 -0
  101. package/dist/ble/daemon.js.map +1 -0
  102. package/dist/ble/dashboard.d.ts +331 -0
  103. package/dist/ble/dashboard.d.ts.map +1 -0
  104. package/dist/ble/dashboard.js +280 -0
  105. package/dist/ble/dashboard.js.map +1 -0
  106. package/dist/ble/desktop.d.ts +4 -0
  107. package/dist/ble/desktop.d.ts.map +1 -0
  108. package/dist/ble/desktop.js +33 -0
  109. package/dist/ble/desktop.js.map +1 -0
  110. package/dist/ble/desktopLibrary.d.ts +12 -0
  111. package/dist/ble/desktopLibrary.d.ts.map +1 -0
  112. package/dist/ble/desktopLibrary.js +346 -0
  113. package/dist/ble/desktopLibrary.js.map +1 -0
  114. package/dist/ble/effects.d.ts +34 -0
  115. package/dist/ble/effects.d.ts.map +1 -0
  116. package/dist/ble/effects.js +138 -0
  117. package/dist/ble/effects.js.map +1 -0
  118. package/dist/ble/fan.d.ts +244 -0
  119. package/dist/ble/fan.d.ts.map +1 -0
  120. package/dist/ble/fan.js +46 -0
  121. package/dist/ble/fan.js.map +1 -0
  122. package/dist/ble/library.d.ts +341 -0
  123. package/dist/ble/library.d.ts.map +1 -0
  124. package/dist/ble/library.js +201 -0
  125. package/dist/ble/library.js.map +1 -0
  126. package/dist/ble/media.d.ts +133 -0
  127. package/dist/ble/media.d.ts.map +1 -0
  128. package/dist/ble/media.js +186 -0
  129. package/dist/ble/media.js.map +1 -0
  130. package/dist/ble/nativeGroups.d.ts +22 -0
  131. package/dist/ble/nativeGroups.d.ts.map +1 -0
  132. package/dist/ble/nativeGroups.js +114 -0
  133. package/dist/ble/nativeGroups.js.map +1 -0
  134. package/dist/ble/packets.d.ts +3 -0
  135. package/dist/ble/packets.d.ts.map +1 -0
  136. package/dist/ble/packets.js +15 -0
  137. package/dist/ble/packets.js.map +1 -0
  138. package/dist/ble/programs.d.ts +318 -0
  139. package/dist/ble/programs.d.ts.map +1 -0
  140. package/dist/ble/programs.js +329 -0
  141. package/dist/ble/programs.js.map +1 -0
  142. package/dist/ble/provisioning.d.ts +13 -0
  143. package/dist/ble/provisioning.d.ts.map +1 -0
  144. package/dist/ble/provisioning.js +39 -0
  145. package/dist/ble/provisioning.js.map +1 -0
  146. package/dist/ble/server.d.ts +18 -0
  147. package/dist/ble/server.d.ts.map +1 -0
  148. package/dist/ble/server.js +548 -0
  149. package/dist/ble/server.js.map +1 -0
  150. package/dist/ble/service.d.ts +2 -0
  151. package/dist/ble/service.d.ts.map +1 -0
  152. package/dist/ble/service.js +77 -0
  153. package/dist/ble/service.js.map +1 -0
  154. package/dist/ble/settings.d.ts +18 -0
  155. package/dist/ble/settings.d.ts.map +1 -0
  156. package/dist/ble/settings.js +25 -0
  157. package/dist/ble/settings.js.map +1 -0
  158. package/dist/ble/setup.d.ts +2 -0
  159. package/dist/ble/setup.d.ts.map +1 -0
  160. package/dist/ble/setup.js +31 -0
  161. package/dist/ble/setup.js.map +1 -0
  162. package/dist/ble/storage.d.ts +94 -0
  163. package/dist/ble/storage.d.ts.map +1 -0
  164. package/dist/ble/storage.js +132 -0
  165. package/dist/ble/storage.js.map +1 -0
  166. package/dist/ble/telink.d.ts +63 -0
  167. package/dist/ble/telink.d.ts.map +1 -0
  168. package/dist/ble/telink.js +108 -0
  169. package/dist/ble/telink.js.map +1 -0
  170. package/dist/ble/transitions.d.ts +3 -0
  171. package/dist/ble/transitions.d.ts.map +1 -0
  172. package/dist/ble/transitions.js +28 -0
  173. package/dist/ble/transitions.js.map +1 -0
  174. package/dist/ble/transport.d.ts +48 -0
  175. package/dist/ble/transport.d.ts.map +1 -0
  176. package/dist/ble/transport.js +370 -0
  177. package/dist/ble/transport.js.map +1 -0
  178. package/dist/circadian.d.ts +3 -0
  179. package/dist/circadian.d.ts.map +1 -1
  180. package/dist/circadian.js +2 -0
  181. package/dist/circadian.js.map +1 -1
  182. package/dist/cli.d.ts +3 -2
  183. package/dist/cli.d.ts.map +1 -1
  184. package/dist/cli.js +125 -6
  185. package/dist/cli.js.map +1 -1
  186. package/dist/commands/__tests__/newCommands.test.js +3 -4
  187. package/dist/commands/__tests__/newCommands.test.js.map +1 -1
  188. package/dist/commands/cmdUtils.d.ts +5 -2
  189. package/dist/commands/cmdUtils.d.ts.map +1 -1
  190. package/dist/commands/cmdUtils.js +29 -10
  191. package/dist/commands/cmdUtils.js.map +1 -1
  192. package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
  193. package/dist/commands/daylightSimulation/autoCct.js +67 -197
  194. package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
  195. package/dist/commands/daylightSimulation/graphSchedule.d.ts +1 -1
  196. package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
  197. package/dist/commands/daylightSimulation/printSchedule.d.ts +1 -1
  198. package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
  199. package/dist/commands/daylightSimulation/printSchedule.js +2 -2
  200. package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
  201. package/dist/commands/daylightSimulation/service.d.ts +1 -1
  202. package/dist/commands/daylightSimulation/service.d.ts.map +1 -1
  203. package/dist/commands/daylightSimulation/service.js +5 -3
  204. package/dist/commands/daylightSimulation/service.js.map +1 -1
  205. package/dist/commands/daylightSimulation/simulateSchedule.d.ts +1 -1
  206. package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
  207. package/dist/commands/daylightSimulation/simulateSchedule.js +5 -4
  208. package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
  209. package/dist/commands/deviceControl/ble.d.ts +4 -0
  210. package/dist/commands/deviceControl/ble.d.ts.map +1 -0
  211. package/dist/commands/deviceControl/ble.js +214 -0
  212. package/dist/commands/deviceControl/ble.js.map +1 -0
  213. package/dist/commands/deviceControl/cct.d.ts.map +1 -1
  214. package/dist/commands/deviceControl/cct.js +41 -11
  215. package/dist/commands/deviceControl/cct.js.map +1 -1
  216. package/dist/commands/deviceControl/color.d.ts.map +1 -1
  217. package/dist/commands/deviceControl/color.js +13 -3
  218. package/dist/commands/deviceControl/color.js.map +1 -1
  219. package/dist/commands/deviceControl/config.d.ts.map +1 -1
  220. package/dist/commands/deviceControl/config.js +26 -3
  221. package/dist/commands/deviceControl/config.js.map +1 -1
  222. package/dist/commands/deviceControl/{discover.d.ts → desktop.d.ts} +3 -2
  223. package/dist/commands/deviceControl/desktop.d.ts.map +1 -0
  224. package/dist/commands/deviceControl/desktop.js +66 -0
  225. package/dist/commands/deviceControl/desktop.js.map +1 -0
  226. package/dist/commands/deviceControl/effect.d.ts.map +1 -1
  227. package/dist/commands/deviceControl/effect.js +90 -159
  228. package/dist/commands/deviceControl/effect.js.map +1 -1
  229. package/dist/commands/deviceControl/fan.d.ts.map +1 -1
  230. package/dist/commands/deviceControl/fan.js +77 -95
  231. package/dist/commands/deviceControl/fan.js.map +1 -1
  232. package/dist/commands/deviceControl/group.d.ts.map +1 -1
  233. package/dist/commands/deviceControl/group.js +43 -6
  234. package/dist/commands/deviceControl/group.js.map +1 -1
  235. package/dist/commands/deviceControl/hsi.d.ts.map +1 -1
  236. package/dist/commands/deviceControl/hsi.js +3 -1
  237. package/dist/commands/deviceControl/hsi.js.map +1 -1
  238. package/dist/commands/deviceControl/info.d.ts.map +1 -1
  239. package/dist/commands/deviceControl/info.js +0 -50
  240. package/dist/commands/deviceControl/info.js.map +1 -1
  241. package/dist/commands/deviceControl/intensity.d.ts.map +1 -1
  242. package/dist/commands/deviceControl/intensity.js +32 -8
  243. package/dist/commands/deviceControl/intensity.js.map +1 -1
  244. package/dist/commands/deviceControl/list.d.ts.map +1 -1
  245. package/dist/commands/deviceControl/list.js +3 -2
  246. package/dist/commands/deviceControl/list.js.map +1 -1
  247. package/dist/commands/deviceControl/power.d.ts.map +1 -1
  248. package/dist/commands/deviceControl/power.js +9 -3
  249. package/dist/commands/deviceControl/power.js.map +1 -1
  250. package/dist/commands/deviceControl/preset.d.ts.map +1 -1
  251. package/dist/commands/deviceControl/preset.js +56 -19
  252. package/dist/commands/deviceControl/preset.js.map +1 -1
  253. package/dist/commands/deviceControl/program.d.ts +4 -0
  254. package/dist/commands/deviceControl/program.d.ts.map +1 -0
  255. package/dist/commands/deviceControl/program.js +199 -0
  256. package/dist/commands/deviceControl/program.js.map +1 -0
  257. package/dist/commands/deviceControl/quickshot.d.ts.map +1 -1
  258. package/dist/commands/deviceControl/quickshot.js +75 -13
  259. package/dist/commands/deviceControl/quickshot.js.map +1 -1
  260. package/dist/commands/deviceControl/scene.d.ts.map +1 -1
  261. package/dist/commands/deviceControl/scene.js +72 -9
  262. package/dist/commands/deviceControl/scene.js.map +1 -1
  263. package/dist/commands/deviceControl/status.d.ts.map +1 -1
  264. package/dist/commands/deviceControl/status.js +26 -3
  265. package/dist/commands/deviceControl/status.js.map +1 -1
  266. package/dist/commands/parseUtils.d.ts +1 -1
  267. package/dist/commands/parseUtils.d.ts.map +1 -1
  268. package/dist/commands/parseUtils.js +1 -11
  269. package/dist/commands/parseUtils.js.map +1 -1
  270. package/dist/commands-api.d.ts +1 -1
  271. package/dist/commands-api.d.ts.map +1 -1
  272. package/dist/commands-api.js +1 -1
  273. package/dist/commands-api.js.map +1 -1
  274. package/dist/commands.d.ts.map +1 -1
  275. package/dist/commands.js +4 -2
  276. package/dist/commands.js.map +1 -1
  277. package/dist/config.d.ts +82 -0
  278. package/dist/config.d.ts.map +1 -1
  279. package/dist/config.js +13 -2
  280. package/dist/config.js.map +1 -1
  281. package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
  282. package/dist/daylightSimulation/cctUtil.js +2 -2
  283. package/dist/daylightSimulation/cctUtil.js.map +1 -1
  284. package/dist/daylightSimulation/constants.d.ts +10 -0
  285. package/dist/daylightSimulation/constants.d.ts.map +1 -1
  286. package/dist/daylightSimulation/constants.js +4 -0
  287. package/dist/daylightSimulation/constants.js.map +1 -1
  288. package/dist/daylightSimulation/currentCct.d.ts +42 -0
  289. package/dist/daylightSimulation/currentCct.d.ts.map +1 -0
  290. package/dist/daylightSimulation/currentCct.js +217 -0
  291. package/dist/daylightSimulation/currentCct.js.map +1 -0
  292. package/dist/daylightSimulation/dashboardSettings.d.ts +47 -0
  293. package/dist/daylightSimulation/dashboardSettings.d.ts.map +1 -0
  294. package/dist/daylightSimulation/dashboardSettings.js +95 -0
  295. package/dist/daylightSimulation/dashboardSettings.js.map +1 -0
  296. package/dist/daylightSimulation/dashboardStatus.d.ts +72 -0
  297. package/dist/daylightSimulation/dashboardStatus.d.ts.map +1 -0
  298. package/dist/daylightSimulation/dashboardStatus.js +191 -0
  299. package/dist/daylightSimulation/dashboardStatus.js.map +1 -0
  300. package/dist/daylightSimulation/parseUtils.d.ts +3 -0
  301. package/dist/daylightSimulation/parseUtils.d.ts.map +1 -0
  302. package/dist/daylightSimulation/parseUtils.js +25 -0
  303. package/dist/daylightSimulation/parseUtils.js.map +1 -0
  304. package/dist/daylightSimulation/scheduleMaker.d.ts +2 -2
  305. package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
  306. package/dist/daylightSimulation/scheduleMaker.js +6 -6
  307. package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
  308. package/dist/daylightSimulation/types.d.ts +13 -2
  309. package/dist/daylightSimulation/types.d.ts.map +1 -1
  310. package/dist/daylightSimulation/types.js +0 -2
  311. package/dist/daylightSimulation/types.js.map +1 -1
  312. package/dist/device-control.d.ts +1 -0
  313. package/dist/device-control.d.ts.map +1 -1
  314. package/dist/device-control.js +1 -0
  315. package/dist/device-control.js.map +1 -1
  316. package/dist/deviceControl/bleHttpControl.d.ts +129 -0
  317. package/dist/deviceControl/bleHttpControl.d.ts.map +1 -0
  318. package/dist/deviceControl/bleHttpControl.js +753 -0
  319. package/dist/deviceControl/bleHttpControl.js.map +1 -0
  320. package/dist/deviceControl/lightControl.d.ts +8 -68
  321. package/dist/deviceControl/lightControl.d.ts.map +1 -1
  322. package/dist/deviceControl/lightControl.js +6 -246
  323. package/dist/deviceControl/lightControl.js.map +1 -1
  324. package/dist/deviceControl/lightControlCommands.d.ts +68 -0
  325. package/dist/deviceControl/lightControlCommands.d.ts.map +1 -0
  326. package/dist/deviceControl/lightControlCommands.js +244 -0
  327. package/dist/deviceControl/lightControlCommands.js.map +1 -0
  328. package/dist/deviceControl/types.d.ts +75 -4
  329. package/dist/deviceControl/types.d.ts.map +1 -1
  330. package/dist/deviceControl/types.js +1 -0
  331. package/dist/deviceControl/types.js.map +1 -1
  332. package/dist/index.d.ts +2 -1
  333. package/dist/index.d.ts.map +1 -1
  334. package/dist/index.js +1 -0
  335. package/dist/index.js.map +1 -1
  336. package/dist/test/MockLightServer.d.ts +1 -0
  337. package/dist/test/MockLightServer.d.ts.map +1 -1
  338. package/dist/test/MockLightServer.js +5 -0
  339. package/dist/test/MockLightServer.js.map +1 -1
  340. package/docs/CHANGELOG.md +37 -0
  341. package/docs/DIRECT_BLE.md +359 -0
  342. package/package.json +8 -4
  343. package/scripts/ble-cli-check.ts +129 -0
  344. package/scripts/ble-config-probe.ts +109 -0
  345. package/scripts/ble-effects-check.ts +82 -0
  346. package/scripts/ble-extended-probe.ts +44 -0
  347. package/scripts/ble-fan-check.ts +129 -0
  348. package/scripts/ble-feature-probe.ts +37 -0
  349. package/scripts/ble-followup-check.ts +165 -0
  350. package/scripts/ble-hardware-check.ts +99 -0
  351. package/scripts/ble-live-extended-check.ts +205 -0
  352. package/scripts/ble-non-ota-check.ts +193 -0
  353. package/scripts/ble-probe.ts +45 -0
  354. package/scripts/calibrate-webcam.ts +152 -0
  355. package/scripts/desktop-reference.ts +85 -0
  356. package/scripts/webcam.ts +129 -0
  357. package/dist/__tests__/lightControl.test.d.ts +0 -2
  358. package/dist/__tests__/lightControl.test.d.ts.map +0 -1
  359. package/dist/__tests__/lightControl.test.js +0 -424
  360. package/dist/__tests__/lightControl.test.js.map +0 -1
  361. package/dist/commands/deviceControl/discover.d.ts.map +0 -1
  362. package/dist/commands/deviceControl/discover.js +0 -29
  363. package/dist/commands/deviceControl/discover.js.map +0 -1
@@ -0,0 +1,346 @@
1
+ import { z } from 'zod';
2
+ import { capabilities, validateAction } from './controller.js';
3
+ import { desktopRows } from './desktop.js';
4
+ import { SavedStateSchema } from './library.js';
5
+ const Id = z
6
+ .string()
7
+ .regex(/^[0-9a-f-]+$/i)
8
+ .transform((value) => value.replaceAll('-', '').toLowerCase());
9
+ const Named = z.object({ uuid: Id, name: z.string(), update_time: z.number() });
10
+ const PresetRow = z.object({
11
+ id: Id,
12
+ category: z.number().int(),
13
+ type: z.number().int(),
14
+ name: z.string().trim().min(1),
15
+ data: z.string(),
16
+ update_time: z.number().nullable(),
17
+ });
18
+ const Params = z
19
+ .object({
20
+ cct: z.number().optional(),
21
+ gm: z.number().optional(),
22
+ intensity: z.number().int().min(0).max(1000),
23
+ sleep: z.boolean(),
24
+ hue: z.number().optional(),
25
+ sat: z.number().optional(),
26
+ saturation: z.number().optional(),
27
+ })
28
+ .strict();
29
+ const EffectBase = {
30
+ sleep: z.boolean(),
31
+ intensity: z.number().int().min(0).max(100),
32
+ frequency: z.number().int().min(1).max(10),
33
+ };
34
+ const EffectCct = {
35
+ cct: z.number().int(),
36
+ gm: z.number().min(0).max(200),
37
+ };
38
+ const EffectHsi = {
39
+ hue: z.number().min(0).max(360),
40
+ sat: z.number().min(0).max(100),
41
+ };
42
+ const Trigger = {
43
+ trigger_mode: z.union([z.literal(0), z.literal(1), z.literal(2)]),
44
+ };
45
+ const EffectMode = {
46
+ effect_mode: z.union([z.literal(0), z.literal(1)]),
47
+ };
48
+ const DesktopEffects = {
49
+ 4: {
50
+ effect: 'paparazzi',
51
+ schema: z.object({ ...EffectBase, ...EffectCct }).strict(),
52
+ },
53
+ 5: {
54
+ effect: 'lightning',
55
+ schema: z.object({ ...EffectBase, speed: z.number().int().min(0).max(10), ...Trigger, ...EffectCct }).strict(),
56
+ },
57
+ 6: {
58
+ effect: 'tv',
59
+ schema: z.object({ ...EffectBase, cct_type: z.number().int().min(0).max(2) }).strict(),
60
+ },
61
+ 8: {
62
+ effect: 'fire',
63
+ schema: z.object({ ...EffectBase, cct_type: z.number().int().min(0).max(2) }).strict(),
64
+ },
65
+ 9: {
66
+ effect: 'strobe',
67
+ schema: z.object({ ...EffectBase, ...Trigger, ...EffectMode, ...EffectCct, ...EffectHsi }).strict(),
68
+ },
69
+ 10: {
70
+ effect: 'explosion',
71
+ schema: z.object({ ...EffectBase, ...Trigger, ...EffectMode, ...EffectCct, ...EffectHsi }).strict(),
72
+ },
73
+ 11: {
74
+ effect: 'faulty-bulb',
75
+ schema: z
76
+ .object({
77
+ ...EffectBase,
78
+ speed: z.number().int().min(0).max(10),
79
+ ...Trigger,
80
+ ...EffectMode,
81
+ ...EffectCct,
82
+ ...EffectHsi,
83
+ })
84
+ .strict(),
85
+ },
86
+ 12: {
87
+ effect: 'pulsing',
88
+ schema: z
89
+ .object({
90
+ ...EffectBase,
91
+ speed: z.number().int().min(0).max(10),
92
+ ...Trigger,
93
+ ...EffectMode,
94
+ ...EffectCct,
95
+ ...EffectHsi,
96
+ })
97
+ .strict(),
98
+ },
99
+ 14: {
100
+ effect: 'cop-car',
101
+ schema: z.object({ ...EffectBase, color: z.number().int().min(0).max(2) }).strict(),
102
+ },
103
+ 16: {
104
+ effect: 'party-lights',
105
+ schema: z.object({ ...EffectBase, sat: z.number().min(0).max(100) }).strict(),
106
+ },
107
+ 17: {
108
+ effect: 'fireworks',
109
+ schema: z.object({ ...EffectBase, type: z.number().int().min(0).max(2) }).strict(),
110
+ },
111
+ };
112
+ function effectTint(gm) {
113
+ return Math.round((gm - 100) / 10) * 10;
114
+ }
115
+ export function desktopEffectState(light, type, value, updated) {
116
+ const definition = DesktopEffects[type];
117
+ if (!definition)
118
+ throw new Error(`Unsupported Desktop effect type ${type}`);
119
+ const data = definition.schema.parse(value);
120
+ const state = {
121
+ mode: 'effect',
122
+ effect: definition.effect,
123
+ sleep: data.sleep,
124
+ intensity: data.intensity * 10,
125
+ frequency: data.frequency,
126
+ observedAt: new Date(updated).toISOString(),
127
+ };
128
+ if ('speed' in data)
129
+ state.speed = data.speed;
130
+ if ('trigger_mode' in data)
131
+ state.trigger = data.trigger_mode;
132
+ if ('effect_mode' in data && data.effect_mode === 1) {
133
+ state.hue = data.hue;
134
+ state.sat = data.sat;
135
+ }
136
+ else if ('cct' in data) {
137
+ state.cct = Math.round(data.cct / 100) * 100;
138
+ const gm = effectTint(data.gm);
139
+ if (capabilities(light).gm_support)
140
+ state.gm = gm;
141
+ else if (gm !== 0)
142
+ throw new Error(`${light.name} cannot reproduce non-neutral G/M`);
143
+ }
144
+ if ('cct_type' in data)
145
+ state.palette = data.cct_type;
146
+ if ('color' in data)
147
+ state.palette = data.color;
148
+ if ('type' in data)
149
+ state.palette = data.type;
150
+ if (definition.effect === 'party-lights')
151
+ state.sat = data.sat;
152
+ const body = {
153
+ name: state.effect,
154
+ brightness: state.intensity / 10,
155
+ frequency: state.frequency,
156
+ ...(state.speed === undefined ? {} : { speed: state.speed }),
157
+ ...(state.trigger === undefined ? {} : { trigger: state.trigger }),
158
+ ...(state.cct === undefined ? {} : { kelvin: state.cct }),
159
+ ...(state.gm === undefined ? {} : { gm: state.gm }),
160
+ ...(state.hue === undefined ? {} : { hue: state.hue }),
161
+ ...(state.sat === undefined ? {} : { saturation: state.sat }),
162
+ ...(state.palette === undefined ? {} : { palette: state.palette }),
163
+ };
164
+ validateAction(light, 'effect', body);
165
+ return SavedStateSchema.parse(state);
166
+ }
167
+ export function desktopState(light, mode, value, updated) {
168
+ const data = Params.parse(value);
169
+ const observedAt = new Date(updated).toISOString();
170
+ const intensity = Math.round(data.intensity / 10) * 10;
171
+ let state;
172
+ if (mode === 0 && data.cct !== undefined) {
173
+ state = { mode: 'cct', cct: Math.round(data.cct / 100) * 100, sleep: data.sleep, intensity, observedAt };
174
+ if (capabilities(light).gm_support) {
175
+ if (data.gm === undefined || data.gm < 0 || data.gm > 200)
176
+ throw new Error('Expected Desktop tint in 0-200 units');
177
+ state.gm = Math.round((data.gm - 100) / 10) * 10;
178
+ }
179
+ validateAction(light, 'cct', {
180
+ kelvin: state.cct,
181
+ brightness: intensity / 10,
182
+ ...(state.gm === undefined ? {} : { gm: state.gm }),
183
+ });
184
+ }
185
+ else if (mode === 1 && data.hue !== undefined && (data.sat ?? data.saturation) !== undefined) {
186
+ state = { mode: 'hsi', hue: data.hue, sat: data.sat ?? data.saturation, sleep: data.sleep, intensity, observedAt };
187
+ validateAction(light, 'hsi', { hue: state.hue, saturation: state.sat, brightness: intensity / 10 });
188
+ }
189
+ else
190
+ throw new Error(`Unsupported Desktop light mode ${mode}; no settings guessed`);
191
+ return SavedStateSchema.parse(state);
192
+ }
193
+ export function planDesktopImport(database, config, prefix = 'Desktop', read = desktopRows) {
194
+ z.string().trim().min(1).max(30).parse(prefix);
195
+ const fixtures = z
196
+ .array(z.object({ uuid: Id, mac_address: z.string(), code: z.string() }))
197
+ .parse(read(database, 'SELECT uuid, mac_address, code FROM fixtures'));
198
+ const mapping = new Map();
199
+ for (const fixture of fixtures) {
200
+ const compact = fixture.mac_address.replace(/[^0-9a-f]/gi, '').toUpperCase();
201
+ const light = config.lights.find((item) => item.mac.replace(/[^0-9a-f]/gi, '').toUpperCase() === compact);
202
+ if (light) {
203
+ mapping.set(`${fixture.code}-${compact.slice(-6)}`.toUpperCase(), light);
204
+ mapping.set(fixture.uuid.toUpperCase(), light);
205
+ }
206
+ }
207
+ const sceneRows = z.array(Named).parse(read(database, 'SELECT uuid, name, update_time FROM scenes'));
208
+ const sceneDetails = z
209
+ .array(z.object({ scene_uuid: Id, node_name: z.string() }))
210
+ .parse(read(database, 'SELECT scene_uuid, node_name FROM scene_detail'));
211
+ const groups = z
212
+ .array(Named.extend({ scene_uuid: z.string() }))
213
+ .parse(read(database, 'SELECT uuid, name, scene_uuid, update_time FROM groups'));
214
+ const groupDetails = z
215
+ .array(z.object({ group_uuid: Id, node_name: z.string() }))
216
+ .parse(read(database, 'SELECT group_uuid, node_name FROM group_detail'));
217
+ const shots = z.array(Named).parse(read(database, 'SELECT uuid, name, update_time FROM quick_shots'));
218
+ const details = z
219
+ .array(z.object({
220
+ quick_shot_id: Id,
221
+ node_name: z.string(),
222
+ light_mode: z.number().int(),
223
+ parameters: z.string(),
224
+ update_time: z.number(),
225
+ }))
226
+ .parse(read(database, 'SELECT quick_shot_id, node_name, light_mode, parameters, update_time FROM quickshot_detail'));
227
+ const presets = z
228
+ .array(PresetRow)
229
+ .parse(read(database, 'SELECT id, category, type, name, data, update_time FROM presets'))
230
+ .sort((a, b) => (a.update_time ?? 0) - (b.update_time ?? 0) || a.id.localeCompare(b.id));
231
+ const errors = [];
232
+ const warnings = [
233
+ 'Desktop scenes are workspaces, not lighting snapshots; they are imported as local groups. Native subscriptions and fan profiles are not changed.',
234
+ ];
235
+ const plan = { groups: [], entries: [] };
236
+ const presetNames = new Set();
237
+ const importedName = (name) => {
238
+ const base = `${prefix}: ${name}`;
239
+ let candidate = base.slice(0, 80);
240
+ for (let duplicate = 2; presetNames.has(candidate.toLowerCase()); duplicate++) {
241
+ const suffix = ` (${duplicate})`;
242
+ candidate = `${base.slice(0, 80 - suffix.length)}${suffix}`;
243
+ }
244
+ presetNames.add(candidate.toLowerCase());
245
+ return candidate;
246
+ };
247
+ const resolve = (names) => [
248
+ ...new Set(names.map((name) => {
249
+ const light = mapping.get(name.toUpperCase());
250
+ if (!light)
251
+ throw new Error(`Unmapped fixture ${name}`);
252
+ return light.key;
253
+ })),
254
+ ];
255
+ for (const scene of sceneRows) {
256
+ try {
257
+ plan.groups.push({
258
+ id: `group:desktop:scene:${scene.uuid}`,
259
+ name: `${prefix}: workspace ${scene.name}`,
260
+ members: resolve(sceneDetails.filter((item) => item.scene_uuid === scene.uuid).map((item) => item.node_name)),
261
+ });
262
+ }
263
+ catch (error) {
264
+ errors.push(`Workspace ${scene.name}: ${error.message}`);
265
+ }
266
+ }
267
+ for (const group of groups) {
268
+ try {
269
+ const workspace = sceneRows.find((item) => item.uuid === group.scene_uuid.replaceAll('-', '').toLowerCase());
270
+ const members = groupDetails.filter((item) => item.group_uuid === group.uuid).map((item) => item.node_name);
271
+ if (!members.length) {
272
+ warnings.push(`Skipped empty or implicit Desktop group ${group.name}; membership was not guessed`);
273
+ continue;
274
+ }
275
+ plan.groups.push({
276
+ id: `group:desktop:group:${group.uuid}`,
277
+ name: `${prefix}: ${workspace ? `${workspace.name} / ` : ''}${group.name}`,
278
+ members: resolve(members),
279
+ });
280
+ }
281
+ catch (error) {
282
+ errors.push(`Group ${group.name}: ${error.message}`);
283
+ }
284
+ }
285
+ for (const shot of shots) {
286
+ try {
287
+ const states = {};
288
+ const rows = details.filter((item) => item.quick_shot_id === shot.uuid);
289
+ if (!rows.length)
290
+ throw new Error('No fixture states');
291
+ for (const row of rows) {
292
+ const light = mapping.get(row.node_name.toUpperCase());
293
+ if (!light)
294
+ throw new Error(`Unmapped fixture ${row.node_name}`);
295
+ if (states[light.key])
296
+ throw new Error(`Duplicate fixture ${light.key}`);
297
+ states[light.key] = desktopState(light, row.light_mode, JSON.parse(row.parameters), row.update_time || shot.update_time);
298
+ }
299
+ plan.entries.push({
300
+ collection: 'quickshots',
301
+ entry: { id: `desktop:quickshot:${shot.uuid}`, name: `${prefix}: ${shot.name}`, states },
302
+ });
303
+ }
304
+ catch (error) {
305
+ errors.push(`Quickshot ${shot.name}: ${error.message}`);
306
+ }
307
+ }
308
+ for (const preset of presets) {
309
+ if (preset.category !== 2) {
310
+ warnings.push(`Skipped Desktop preset ${preset.name}: category ${preset.category} is not an effect preset`);
311
+ continue;
312
+ }
313
+ try {
314
+ const data = JSON.parse(preset.data);
315
+ const failures = [];
316
+ let selected;
317
+ for (const light of config.lights) {
318
+ try {
319
+ selected = {
320
+ light,
321
+ state: desktopEffectState(light, preset.type, data, preset.update_time ?? 0),
322
+ };
323
+ break;
324
+ }
325
+ catch (error) {
326
+ failures.push(`${light.key}: ${error.message}`);
327
+ }
328
+ }
329
+ if (!selected)
330
+ throw new Error(`No configured fixture can reproduce it (${failures.join('; ') || 'no fixtures configured'})`);
331
+ plan.entries.push({
332
+ collection: 'presets',
333
+ entry: {
334
+ id: `desktop:preset:${preset.id}`,
335
+ name: importedName(preset.name),
336
+ states: { [selected.light.key]: selected.state },
337
+ },
338
+ });
339
+ }
340
+ catch (error) {
341
+ errors.push(`Effect preset ${preset.name}: ${error.message}`);
342
+ }
343
+ }
344
+ return { plan, errors, warnings };
345
+ }
346
+ //# sourceMappingURL=desktopLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktopLibrary.js","sourceRoot":"","sources":["../../src/ble/desktopLibrary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { FixtureState } from './telink.js';
2
+ export declare const EFFECTS: {
3
+ readonly paparazzi: 1;
4
+ readonly lightning: 2;
5
+ readonly tv: 3;
6
+ readonly fire: 5;
7
+ readonly strobe: 6;
8
+ readonly explosion: 7;
9
+ readonly 'faulty-bulb': 8;
10
+ readonly pulsing: 9;
11
+ readonly 'cop-car': 11;
12
+ readonly 'party-lights': 13;
13
+ readonly fireworks: 14;
14
+ };
15
+ export type EffectName = keyof typeof EFFECTS;
16
+ export declare const TRIGGER_EFFECTS: EffectName[];
17
+ export declare const WHITE_EFFECTS: EffectName[];
18
+ export declare const COLOR_EFFECTS: EffectName[];
19
+ export declare function effectName(value: unknown): EffectName;
20
+ export interface EffectOptions {
21
+ effect: EffectName;
22
+ intensity: number;
23
+ frequency: number;
24
+ speed: number;
25
+ cct: number;
26
+ gm: number;
27
+ palette: number;
28
+ hue?: number;
29
+ saturation?: number;
30
+ trigger?: 0 | 1 | 2;
31
+ }
32
+ export declare function effectPacket(options: EffectOptions): Buffer;
33
+ export declare function decodeEffect(data: Buffer): FixtureState;
34
+ //# sourceMappingURL=effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../src/ble/effects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,OAAO;;;;;;;;;;;;CAYV,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAC;AAC9C,eAAO,MAAM,eAAe,EAAE,UAAU,EAAmE,CAAC;AAC5G,eAAO,MAAM,aAAa,EAAE,UAAU,EAUrC,CAAC;AACF,eAAO,MAAM,aAAa,EAAE,UAAU,EAUrC,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAKrD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAmC3D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAmCvD"}
@@ -0,0 +1,138 @@
1
+ import { numberInRange, packet } from './packets.js';
2
+ export const EFFECTS = {
3
+ paparazzi: 1,
4
+ lightning: 2,
5
+ tv: 3,
6
+ fire: 5,
7
+ strobe: 6,
8
+ explosion: 7,
9
+ 'faulty-bulb': 8,
10
+ pulsing: 9,
11
+ 'cop-car': 11,
12
+ 'party-lights': 13,
13
+ fireworks: 14,
14
+ };
15
+ export const TRIGGER_EFFECTS = ['lightning', 'faulty-bulb', 'pulsing', 'strobe', 'explosion'];
16
+ export const WHITE_EFFECTS = [
17
+ 'paparazzi',
18
+ 'fireworks',
19
+ 'tv',
20
+ 'fire',
21
+ 'lightning',
22
+ 'faulty-bulb',
23
+ 'pulsing',
24
+ 'strobe',
25
+ 'explosion',
26
+ ];
27
+ export const COLOR_EFFECTS = [
28
+ 'paparazzi',
29
+ 'fireworks',
30
+ 'tv',
31
+ 'fire',
32
+ 'lightning',
33
+ 'faulty-bulb',
34
+ 'pulsing',
35
+ 'cop-car',
36
+ 'party-lights',
37
+ ];
38
+ export function effectName(value) {
39
+ if (typeof value !== 'string')
40
+ throw new Error('Effect name is required');
41
+ const name = value.toLowerCase().replaceAll('_', '-');
42
+ if (!Object.hasOwn(EFFECTS, name))
43
+ throw new Error(`Unknown effect: ${value}`);
44
+ return name;
45
+ }
46
+ export function effectPacket(options) {
47
+ const { effect } = options;
48
+ if (options.trigger !== undefined) {
49
+ numberInRange(options.trigger, 'trigger', 0, 2);
50
+ if (!Number.isInteger(options.trigger))
51
+ throw new Error('Trigger mode must be an integer');
52
+ }
53
+ const id = EFFECTS[effect];
54
+ const intensity = BigInt(Math.round(numberInRange(options.intensity, 'intensity', 0, 1000)));
55
+ const frequency = BigInt(Math.round(numberInRange(options.frequency, 'frequency', 1, 10)));
56
+ const cct = BigInt(Math.round(numberInRange(options.cct, 'CCT', 2500, 7500) / 10));
57
+ const gm = BigInt(Math.round(numberInRange(options.gm, 'G/M', -100, 100) / 10) + 10);
58
+ const speed = BigInt(Math.round(numberInRange(options.speed, 'speed', 0, 10)));
59
+ const palette = BigInt(Math.round(numberInRange(options.palette, 'palette', 0, 2)));
60
+ let bits = BigInt(id) << 64n;
61
+ if ([6, 7, 8, 9].includes(id)) {
62
+ bits |= (intensity << 46n) | (frequency << 56n);
63
+ if (options.hue !== undefined) {
64
+ const hue = BigInt(Math.round(numberInRange(options.hue, 'hue', 0, 360)) % 360);
65
+ const sat = BigInt(Math.round(numberInRange(options.saturation, 'saturation', 0, 100)));
66
+ bits |= (1n << 60n) | (hue << 37n) | (sat << 30n) | (BigInt(options.trigger ?? 1) << 28n);
67
+ if (id === 8 || id === 9)
68
+ bits |= speed << 24n;
69
+ }
70
+ else {
71
+ bits |= (cct << 36n) | (gm << 29n) | (BigInt(options.trigger ?? 1) << 27n);
72
+ if (id === 8 || id === 9)
73
+ bits |= speed << 23n;
74
+ }
75
+ }
76
+ else {
77
+ bits |= (intensity << 54n) | (frequency << 50n);
78
+ if (id === 1 || id === 2)
79
+ bits |= (cct << 40n) | (gm << 33n);
80
+ if (id === 2)
81
+ bits |= (speed << 27n) | (BigInt(options.trigger ?? 0) << 31n);
82
+ if (id === 3 || id === 5)
83
+ bits |= palette << 40n;
84
+ if (id === 14)
85
+ bits |= palette << 42n;
86
+ if (id === 11)
87
+ bits |= palette << 46n;
88
+ if (id === 13)
89
+ bits |= BigInt(Math.round(numberInRange(options.saturation ?? 100, 'saturation', 0, 100))) << 43n;
90
+ }
91
+ return packet(0x87, bits);
92
+ }
93
+ export function decodeEffect(data) {
94
+ const id = data[8];
95
+ const effect = Object.entries(EFFECTS).find(([, value]) => value === id)?.[0];
96
+ if (!effect)
97
+ throw new Error(`Unsupported native effect reply ${id}`);
98
+ const bits = data.readBigUInt64LE();
99
+ const field = (offset, mask) => Number((bits >> offset) & mask);
100
+ const compact = [6, 7, 8, 9].includes(id);
101
+ const variant = compact ? field(60n, 15n) : 0;
102
+ if (variant > 1)
103
+ throw new Error('Unsupported GEL effect variant on these fixtures');
104
+ const state = {
105
+ sleep: !(data[1] & 1),
106
+ mode: 'effect',
107
+ effect,
108
+ intensity: field(compact ? 46n : 54n, 1023n),
109
+ frequency: field(compact ? 56n : 50n, 15n),
110
+ observedAt: new Date().toISOString(),
111
+ };
112
+ if (compact && variant === 1) {
113
+ state.hue = field(37n, 511n);
114
+ state.sat = field(30n, 127n);
115
+ }
116
+ else if (compact || id === 1 || id === 2) {
117
+ state.cct = field(compact ? 36n : 40n, 1023n) * 10;
118
+ state.gm = (field(compact ? 29n : 33n, 127n) - 10) * 10;
119
+ }
120
+ if ([2, 6, 7, 8, 9].includes(id)) {
121
+ const trigger = field(id === 2 ? 31n : variant === 1 ? 28n : 27n, 3n);
122
+ if (trigger > 2)
123
+ throw new Error(`Unsupported native trigger mode ${trigger}`);
124
+ state.trigger = trigger;
125
+ }
126
+ if (id === 8 || id === 9 || id === 2)
127
+ state.speed = field(id === 2 ? 27n : variant === 1 ? 24n : 23n, 15n);
128
+ if (id === 3 || id === 5)
129
+ state.palette = field(40n, 1023n);
130
+ if (id === 14)
131
+ state.palette = field(42n, 255n);
132
+ if (id === 11)
133
+ state.palette = field(46n, 15n);
134
+ if (id === 13)
135
+ state.sat = field(43n, 127n);
136
+ return state;
137
+ }
138
+ //# sourceMappingURL=effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/ble/effects.ts"],"names":[],"mappings":"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"}