@ovok/native 1.6.46 → 1.6.48

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 (291) hide show
  1. package/lib/commonjs/modules/bt-device/constants/baby-sleep-clip-catalog-asset.js +10 -0
  2. package/lib/commonjs/modules/bt-device/constants/baby-sleep-clip-catalog-asset.js.map +1 -0
  3. package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js +14 -1
  4. package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
  5. package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-assets.js +5 -1
  6. package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-assets.js.map +1 -1
  7. package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-entries.js +19 -0
  8. package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-entries.js.map +1 -1
  9. package/lib/commonjs/modules/bt-device/constants/supported-devices.js +50 -0
  10. package/lib/commonjs/modules/bt-device/constants/supported-devices.js.map +1 -1
  11. package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js +1 -1
  12. package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
  13. package/lib/commonjs/modules/bt-management/services/background-sync/background-service-uuids.js +2 -0
  14. package/lib/commonjs/modules/bt-management/services/background-sync/background-service-uuids.js.map +1 -1
  15. package/lib/commonjs/modules/bt-management/services/device-classes.js +95 -0
  16. package/lib/commonjs/modules/bt-management/services/device-classes.js.map +1 -0
  17. package/lib/commonjs/modules/bt-management/services/device-creator.js +5 -78
  18. package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
  19. package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js +6 -1
  20. package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  21. package/lib/commonjs/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.js +57 -0
  22. package/lib/commonjs/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.js.map +1 -0
  23. package/lib/commonjs/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.js +106 -0
  24. package/lib/commonjs/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.js.map +1 -0
  25. package/lib/commonjs/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.js +80 -0
  26. package/lib/commonjs/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.js.map +1 -0
  27. package/lib/commonjs/modules/bt-management/services/devices/viatom/lpm311.device.js +55 -0
  28. package/lib/commonjs/modules/bt-management/services/devices/viatom/lpm311.device.js.map +1 -0
  29. package/lib/commonjs/modules/bt-management/services/devices/viatom/lpm311.protocol.js +103 -0
  30. package/lib/commonjs/modules/bt-management/services/devices/viatom/lpm311.protocol.js.map +1 -0
  31. package/lib/commonjs/modules/bt-management/services/devices/viatom/lpm311.sequencer.js +33 -0
  32. package/lib/commonjs/modules/bt-management/services/devices/viatom/lpm311.sequencer.js.map +1 -0
  33. package/lib/commonjs/modules/bt-management/services/devices/viatom/oxy-s3.device.js +72 -0
  34. package/lib/commonjs/modules/bt-management/services/devices/viatom/oxy-s3.device.js.map +1 -0
  35. package/lib/commonjs/modules/bt-management/services/devices/viatom/oxy-s3.protocol.js +103 -0
  36. package/lib/commonjs/modules/bt-management/services/devices/viatom/oxy-s3.protocol.js.map +1 -0
  37. package/lib/commonjs/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.js +110 -0
  38. package/lib/commonjs/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.js.map +1 -0
  39. package/lib/commonjs/modules/bt-management/services/devices/viatom/pf10aw1.device.js +53 -0
  40. package/lib/commonjs/modules/bt-management/services/devices/viatom/pf10aw1.device.js.map +1 -0
  41. package/lib/commonjs/modules/bt-management/services/devices/viatom/pf10aw1.protocol.js +64 -0
  42. package/lib/commonjs/modules/bt-management/services/devices/viatom/pf10aw1.protocol.js.map +1 -0
  43. package/lib/commonjs/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.js +96 -0
  44. package/lib/commonjs/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.js.map +1 -0
  45. package/lib/commonjs/modules/bt-management/services/devices/viatom/sp20.device.js +54 -0
  46. package/lib/commonjs/modules/bt-management/services/devices/viatom/sp20.device.js.map +1 -0
  47. package/lib/commonjs/modules/bt-management/services/devices/viatom/sp20.protocol.js +102 -0
  48. package/lib/commonjs/modules/bt-management/services/devices/viatom/sp20.protocol.js.map +1 -0
  49. package/lib/commonjs/modules/bt-management/services/devices/viatom/sp20.sequencer.js +115 -0
  50. package/lib/commonjs/modules/bt-management/services/devices/viatom/sp20.sequencer.js.map +1 -0
  51. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.js +81 -0
  52. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.js.map +1 -0
  53. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-r20.device.js +57 -0
  54. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-r20.device.js.map +1 -0
  55. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-r20.protocol.js +118 -0
  56. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-r20.protocol.js.map +1 -0
  57. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.js +95 -0
  58. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.js.map +1 -0
  59. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.pm10.device.js +48 -0
  60. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.pm10.device.js.map +1 -0
  61. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.js +104 -0
  62. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.js.map +1 -0
  63. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.js +57 -0
  64. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.js.map +1 -0
  65. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.device.js +50 -0
  66. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.device.js.map +1 -0
  67. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js +108 -0
  68. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js.map +1 -0
  69. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.js +64 -0
  70. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.js.map +1 -0
  71. package/lib/commonjs/modules/bt-management/types/clock-sync.js +3 -0
  72. package/lib/commonjs/modules/bt-management/types/clock-sync.js.map +1 -1
  73. package/lib/commonjs/modules/bt-management/types/device-measurement-map.js.map +1 -1
  74. package/lib/commonjs/modules/bt-management/types/integrated-devices.js +13 -0
  75. package/lib/commonjs/modules/bt-management/types/integrated-devices.js.map +1 -1
  76. package/lib/module/modules/bt-device/constants/baby-sleep-clip-catalog-asset.js +7 -0
  77. package/lib/module/modules/bt-device/constants/baby-sleep-clip-catalog-asset.js.map +1 -0
  78. package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js +14 -1
  79. package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
  80. package/lib/module/modules/bt-device/constants/supported-device-catalog-assets.js +5 -1
  81. package/lib/module/modules/bt-device/constants/supported-device-catalog-assets.js.map +1 -1
  82. package/lib/module/modules/bt-device/constants/supported-device-catalog-entries.js +20 -1
  83. package/lib/module/modules/bt-device/constants/supported-device-catalog-entries.js.map +1 -1
  84. package/lib/module/modules/bt-device/constants/supported-devices.js +50 -0
  85. package/lib/module/modules/bt-device/constants/supported-devices.js.map +1 -1
  86. package/lib/module/modules/bt-management/constants/integrated-devices-map.js +1 -1
  87. package/lib/module/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
  88. package/lib/module/modules/bt-management/services/background-sync/background-service-uuids.js +2 -0
  89. package/lib/module/modules/bt-management/services/background-sync/background-service-uuids.js.map +1 -1
  90. package/lib/module/modules/bt-management/services/device-classes.js +92 -0
  91. package/lib/module/modules/bt-management/services/device-classes.js.map +1 -0
  92. package/lib/module/modules/bt-management/services/device-creator.js +3 -77
  93. package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
  94. package/lib/module/modules/bt-management/services/devices/bt-managed-device.js +6 -1
  95. package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  96. package/lib/module/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.js +52 -0
  97. package/lib/module/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.js.map +1 -0
  98. package/lib/module/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.js +99 -0
  99. package/lib/module/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.js.map +1 -0
  100. package/lib/module/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.js +75 -0
  101. package/lib/module/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.js.map +1 -0
  102. package/lib/module/modules/bt-management/services/devices/viatom/lpm311.device.js +50 -0
  103. package/lib/module/modules/bt-management/services/devices/viatom/lpm311.device.js.map +1 -0
  104. package/lib/module/modules/bt-management/services/devices/viatom/lpm311.protocol.js +98 -0
  105. package/lib/module/modules/bt-management/services/devices/viatom/lpm311.protocol.js.map +1 -0
  106. package/lib/module/modules/bt-management/services/devices/viatom/lpm311.sequencer.js +28 -0
  107. package/lib/module/modules/bt-management/services/devices/viatom/lpm311.sequencer.js.map +1 -0
  108. package/lib/module/modules/bt-management/services/devices/viatom/oxy-s3.device.js +67 -0
  109. package/lib/module/modules/bt-management/services/devices/viatom/oxy-s3.device.js.map +1 -0
  110. package/lib/module/modules/bt-management/services/devices/viatom/oxy-s3.protocol.js +94 -0
  111. package/lib/module/modules/bt-management/services/devices/viatom/oxy-s3.protocol.js.map +1 -0
  112. package/lib/module/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.js +105 -0
  113. package/lib/module/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.js.map +1 -0
  114. package/lib/module/modules/bt-management/services/devices/viatom/pf10aw1.device.js +48 -0
  115. package/lib/module/modules/bt-management/services/devices/viatom/pf10aw1.device.js.map +1 -0
  116. package/lib/module/modules/bt-management/services/devices/viatom/pf10aw1.protocol.js +57 -0
  117. package/lib/module/modules/bt-management/services/devices/viatom/pf10aw1.protocol.js.map +1 -0
  118. package/lib/module/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.js +91 -0
  119. package/lib/module/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.js.map +1 -0
  120. package/lib/module/modules/bt-management/services/devices/viatom/sp20.device.js +49 -0
  121. package/lib/module/modules/bt-management/services/devices/viatom/sp20.device.js.map +1 -0
  122. package/lib/module/modules/bt-management/services/devices/viatom/sp20.protocol.js +94 -0
  123. package/lib/module/modules/bt-management/services/devices/viatom/sp20.protocol.js.map +1 -0
  124. package/lib/module/modules/bt-management/services/devices/viatom/sp20.sequencer.js +110 -0
  125. package/lib/module/modules/bt-management/services/devices/viatom/sp20.sequencer.js.map +1 -0
  126. package/lib/module/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.js +71 -0
  127. package/lib/module/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.js.map +1 -0
  128. package/lib/module/modules/bt-management/services/devices/viatom/viatom-r20.device.js +52 -0
  129. package/lib/module/modules/bt-management/services/devices/viatom/viatom-r20.device.js.map +1 -0
  130. package/lib/module/modules/bt-management/services/devices/viatom/viatom-r20.protocol.js +110 -0
  131. package/lib/module/modules/bt-management/services/devices/viatom/viatom-r20.protocol.js.map +1 -0
  132. package/lib/module/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.js +90 -0
  133. package/lib/module/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.js.map +1 -0
  134. package/lib/module/modules/bt-management/services/devices/viatom/viatom.pm10.device.js +43 -0
  135. package/lib/module/modules/bt-management/services/devices/viatom/viatom.pm10.device.js.map +1 -0
  136. package/lib/module/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.js +92 -0
  137. package/lib/module/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.js.map +1 -0
  138. package/lib/module/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.js +52 -0
  139. package/lib/module/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.js.map +1 -0
  140. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.device.js +45 -0
  141. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.device.js.map +1 -0
  142. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js +94 -0
  143. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js.map +1 -0
  144. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.js +59 -0
  145. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.js.map +1 -0
  146. package/lib/module/modules/bt-management/types/clock-sync.js +3 -0
  147. package/lib/module/modules/bt-management/types/clock-sync.js.map +1 -1
  148. package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
  149. package/lib/module/modules/bt-management/types/integrated-devices.js +13 -0
  150. package/lib/module/modules/bt-management/types/integrated-devices.js.map +1 -1
  151. package/lib/typescript/commonjs/src/modules/bt-device/constants/baby-sleep-clip-catalog-asset.d.ts +4 -0
  152. package/lib/typescript/commonjs/src/modules/bt-device/constants/baby-sleep-clip-catalog-asset.d.ts.map +1 -0
  153. package/lib/typescript/commonjs/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
  154. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts +5 -1
  155. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts.map +1 -1
  156. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-entries.d.ts.map +1 -1
  157. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts +1 -1
  158. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
  159. package/lib/typescript/commonjs/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
  160. package/lib/typescript/commonjs/src/modules/bt-management/services/background-sync/background-service-uuids.d.ts.map +1 -1
  161. package/lib/typescript/commonjs/src/modules/bt-management/services/device-classes.d.ts +89 -0
  162. package/lib/typescript/commonjs/src/modules/bt-management/services/device-classes.d.ts.map +1 -0
  163. package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  164. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -0
  165. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.d.ts +18 -0
  167. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.d.ts.map +1 -0
  168. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.d.ts +27 -0
  169. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.d.ts.map +1 -0
  170. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.d.ts +32 -0
  171. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.d.ts.map +1 -0
  172. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/lpm311.device.d.ts +9 -0
  173. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/lpm311.device.d.ts.map +1 -0
  174. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/lpm311.protocol.d.ts +14 -0
  175. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/lpm311.protocol.d.ts.map +1 -0
  176. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/lpm311.sequencer.d.ts +10 -0
  177. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/lpm311.sequencer.d.ts.map +1 -0
  178. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/oxy-s3.device.d.ts +18 -0
  179. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/oxy-s3.device.d.ts.map +1 -0
  180. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/oxy-s3.protocol.d.ts +42 -0
  181. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/oxy-s3.protocol.d.ts.map +1 -0
  182. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.d.ts +31 -0
  183. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.d.ts.map +1 -0
  184. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/pf10aw1.device.d.ts +19 -0
  185. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/pf10aw1.device.d.ts.map +1 -0
  186. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/pf10aw1.protocol.d.ts +30 -0
  187. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/pf10aw1.protocol.d.ts.map +1 -0
  188. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.d.ts +27 -0
  189. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.d.ts.map +1 -0
  190. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/sp20.device.d.ts +20 -0
  191. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/sp20.device.d.ts.map +1 -0
  192. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/sp20.protocol.d.ts +28 -0
  193. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/sp20.protocol.d.ts.map +1 -0
  194. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/sp20.sequencer.d.ts +26 -0
  195. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/sp20.sequencer.d.ts.map +1 -0
  196. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.d.ts +7 -0
  197. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.d.ts.map +1 -0
  198. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-r20.device.d.ts +20 -0
  199. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-r20.device.d.ts.map +1 -0
  200. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-r20.protocol.d.ts +38 -0
  201. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-r20.protocol.d.ts.map +1 -0
  202. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.d.ts +35 -0
  203. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.d.ts.map +1 -0
  204. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.pm10.device.d.ts +15 -0
  205. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.pm10.device.d.ts.map +1 -0
  206. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.d.ts +25 -0
  207. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.d.ts.map +1 -0
  208. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.d.ts +21 -0
  209. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.d.ts.map +1 -0
  210. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.wbp02.device.d.ts +14 -0
  211. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.wbp02.device.d.ts.map +1 -0
  212. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.d.ts +31 -0
  213. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.d.ts.map +1 -0
  214. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.d.ts +20 -0
  215. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.d.ts.map +1 -0
  216. package/lib/typescript/commonjs/src/modules/bt-management/types/clock-sync.d.ts.map +1 -1
  217. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +14 -1
  218. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  219. package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts +14 -1
  220. package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
  221. package/lib/typescript/module/src/modules/bt-device/constants/baby-sleep-clip-catalog-asset.d.ts +4 -0
  222. package/lib/typescript/module/src/modules/bt-device/constants/baby-sleep-clip-catalog-asset.d.ts.map +1 -0
  223. package/lib/typescript/module/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
  224. package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts +5 -1
  225. package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts.map +1 -1
  226. package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-entries.d.ts.map +1 -1
  227. package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts +1 -1
  228. package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
  229. package/lib/typescript/module/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
  230. package/lib/typescript/module/src/modules/bt-management/services/background-sync/background-service-uuids.d.ts.map +1 -1
  231. package/lib/typescript/module/src/modules/bt-management/services/device-classes.d.ts +89 -0
  232. package/lib/typescript/module/src/modules/bt-management/services/device-classes.d.ts.map +1 -0
  233. package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  234. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -0
  235. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  236. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.d.ts +18 -0
  237. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.device.d.ts.map +1 -0
  238. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.d.ts +27 -0
  239. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.protocol.d.ts.map +1 -0
  240. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.d.ts +32 -0
  241. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/baby-sleep-clip.sequencer.d.ts.map +1 -0
  242. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/lpm311.device.d.ts +9 -0
  243. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/lpm311.device.d.ts.map +1 -0
  244. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/lpm311.protocol.d.ts +14 -0
  245. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/lpm311.protocol.d.ts.map +1 -0
  246. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/lpm311.sequencer.d.ts +10 -0
  247. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/lpm311.sequencer.d.ts.map +1 -0
  248. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/oxy-s3.device.d.ts +18 -0
  249. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/oxy-s3.device.d.ts.map +1 -0
  250. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/oxy-s3.protocol.d.ts +42 -0
  251. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/oxy-s3.protocol.d.ts.map +1 -0
  252. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.d.ts +31 -0
  253. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/oxy-s3.sequencer.d.ts.map +1 -0
  254. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/pf10aw1.device.d.ts +19 -0
  255. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/pf10aw1.device.d.ts.map +1 -0
  256. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/pf10aw1.protocol.d.ts +30 -0
  257. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/pf10aw1.protocol.d.ts.map +1 -0
  258. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.d.ts +27 -0
  259. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/pf10aw1.sequencer.d.ts.map +1 -0
  260. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/sp20.device.d.ts +20 -0
  261. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/sp20.device.d.ts.map +1 -0
  262. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/sp20.protocol.d.ts +28 -0
  263. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/sp20.protocol.d.ts.map +1 -0
  264. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/sp20.sequencer.d.ts +26 -0
  265. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/sp20.sequencer.d.ts.map +1 -0
  266. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.d.ts +7 -0
  267. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-lepu-crypto.d.ts.map +1 -0
  268. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-r20.device.d.ts +20 -0
  269. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-r20.device.d.ts.map +1 -0
  270. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-r20.protocol.d.ts +38 -0
  271. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-r20.protocol.d.ts.map +1 -0
  272. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.d.ts +35 -0
  273. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom-r20.sequencer.d.ts.map +1 -0
  274. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.pm10.device.d.ts +15 -0
  275. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.pm10.device.d.ts.map +1 -0
  276. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.d.ts +25 -0
  277. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.pm10.protocol.d.ts.map +1 -0
  278. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.d.ts +21 -0
  279. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.pm10.sequencer.d.ts.map +1 -0
  280. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.wbp02.device.d.ts +14 -0
  281. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.wbp02.device.d.ts.map +1 -0
  282. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.d.ts +31 -0
  283. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.d.ts.map +1 -0
  284. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.d.ts +20 -0
  285. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.wbp02.sequencer.d.ts.map +1 -0
  286. package/lib/typescript/module/src/modules/bt-management/types/clock-sync.d.ts.map +1 -1
  287. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +14 -1
  288. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  289. package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts +14 -1
  290. package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
  291. package/package.json +6 -4
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ import { MeasurementTypeKey } from "@ovok/core";
4
+ import { CaseType } from "../../../types/case-type.js";
5
+ import { LepuCommandBuilder } from "../lepu/lepu.command-builder.js";
6
+ import { decodePf10Aw1Response, parsePf10Aw1OximeterReading, Pf10Aw1Command } from "./pf10aw1.protocol.js";
7
+ import { createLepuAccessToken, decryptLepuHandshake, decryptLepuPayload, encryptLepuPayload, parseLepuSessionKey } from "./viatom-lepu-crypto.js";
8
+ const isValidOxygen = value => value >= 50 && value <= 100;
9
+ const isValidPulse = value => value > 0 && value <= 300;
10
+
11
+ /** Drives the vendor-encrypted A5 exchange used by the PF10AW1 oximeter models. */
12
+ export class Pf10Aw1Sequencer {
13
+ commands = new LepuCommandBuilder("a5");
14
+ phase = "authenticate";
15
+ constructor(params) {
16
+ this.params = params;
17
+ }
18
+ initialCommands = () => [this.write(this.commands.build(Pf10Aw1Command.authenticate, createLepuAccessToken(this.params.now?.() ?? new Date())))];
19
+ nextCommand = frame => {
20
+ const response = decodePf10Aw1Response(frame);
21
+ if (!response) {
22
+ return undefined;
23
+ }
24
+ if (this.phase === "authenticate") {
25
+ return this.acceptHandshake(response.command, response.status, response.payload);
26
+ }
27
+ if (this.phase === "clock" && response.command === Pf10Aw1Command.setUtcTime) {
28
+ if (response.status !== 1) {
29
+ return undefined;
30
+ }
31
+ this.phase = "parameters";
32
+ return [this.buildEncryptedCommand(Pf10Aw1Command.enableParameters, [1])];
33
+ }
34
+ if (this.phase === "parameters" && response.command === Pf10Aw1Command.enableParameters && response.status === 1) {
35
+ this.phase = "wave";
36
+ return [this.buildEncryptedCommand(Pf10Aw1Command.enableWave, [1])];
37
+ }
38
+ if (this.phase === "wave" && response.command === Pf10Aw1Command.enableWave && response.status === 1) {
39
+ this.phase = "ready";
40
+ return undefined;
41
+ }
42
+ if (this.phase === "ready" && response.command === Pf10Aw1Command.realtimeParameters && response.status === 1) {
43
+ this.report(this.decrypt(response.payload));
44
+ }
45
+ return undefined;
46
+ };
47
+ acceptHandshake = (command, status, payload) => {
48
+ if (command !== Pf10Aw1Command.authenticate || status !== 1) {
49
+ return undefined;
50
+ }
51
+ const key = parseLepuSessionKey(decryptLepuHandshake(payload));
52
+ if (!key) {
53
+ return undefined;
54
+ }
55
+ this.sessionKey = key;
56
+ this.phase = "clock";
57
+ return [this.buildEncryptedCommand(Pf10Aw1Command.setUtcTime, this.timePayload())];
58
+ };
59
+ buildEncryptedCommand = (command, payload) => {
60
+ const encrypted = encryptLepuPayload(payload, this.sessionKey ?? []);
61
+ return this.write(this.commands.build(command, encrypted));
62
+ };
63
+ decrypt = payload => (this.sessionKey && decryptLepuPayload(payload, this.sessionKey)) ?? [];
64
+ timePayload = () => {
65
+ const date = this.params.now?.() ?? new Date();
66
+ const timezoneOffsetTenthHours = Math.round(-date.getTimezoneOffset() / 6);
67
+ return [date.getFullYear() & 0xff, date.getFullYear() >>> 8 & 0xff, date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), timezoneOffsetTenthHours & 0xff];
68
+ };
69
+ report = payload => {
70
+ const reading = parsePf10Aw1OximeterReading(payload);
71
+ if (!reading || reading.probeOff || !isValidOxygen(reading.bloodOxygen) || !isValidPulse(reading.pulseRate)) {
72
+ return;
73
+ }
74
+ this.params.onResult({
75
+ caseType: CaseType.RESULT,
76
+ measurementTypeKey: MeasurementTypeKey.bloodOxygenPulseRate,
77
+ bloodOxygen: reading.bloodOxygen,
78
+ pulseRate: reading.pulseRate,
79
+ ...(reading.perfusionIndex > 0 ? {
80
+ perfusionIndex: reading.perfusionIndex
81
+ } : {}),
82
+ recordedAt: this.params.now?.() ?? new Date()
83
+ });
84
+ };
85
+ write = frame => ({
86
+ ...this.params.write,
87
+ frame,
88
+ withoutResponse: true
89
+ });
90
+ }
91
+ //# sourceMappingURL=pf10aw1.sequencer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","LepuCommandBuilder","decodePf10Aw1Response","parsePf10Aw1OximeterReading","Pf10Aw1Command","createLepuAccessToken","decryptLepuHandshake","decryptLepuPayload","encryptLepuPayload","parseLepuSessionKey","isValidOxygen","value","isValidPulse","Pf10Aw1Sequencer","commands","phase","constructor","params","initialCommands","write","build","authenticate","now","Date","nextCommand","frame","response","undefined","acceptHandshake","command","status","payload","setUtcTime","buildEncryptedCommand","enableParameters","enableWave","realtimeParameters","report","decrypt","key","sessionKey","timePayload","encrypted","date","timezoneOffsetTenthHours","Math","round","getTimezoneOffset","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","reading","probeOff","bloodOxygen","pulseRate","onResult","caseType","RESULT","measurementTypeKey","bloodOxygenPulseRate","perfusionIndex","recordedAt","withoutResponse"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/pf10aw1.sequencer.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable import/group-exports */
4
+
5
+ import { MeasurementTypeKey } from "@ovok/core";
6
+ import { BTManagedDevice } from "../bt-managed-device.js";
7
+ import { SP20_NOTIFY, SP20_SERVICE, SP20_WRITE, Sp20FrameReader } from "./sp20.protocol.js";
8
+ import { Sp20Sequencer } from "./sp20.sequencer.js";
9
+ const acceptNothing = {
10
+ caseValuePosition: [],
11
+ cases: []
12
+ };
13
+ export const sp20MainServices = [{
14
+ uuid: SP20_SERVICE,
15
+ monitorUuids: [{
16
+ uuid: SP20_NOTIFY,
17
+ parsingModel: acceptNothing
18
+ }],
19
+ writeUuid: {
20
+ uuid: SP20_WRITE,
21
+ mainCommandUuid: "aa55"
22
+ }
23
+ }];
24
+
25
+ /** ViHealth SP-20, SP-20-BLE, and SP-20-WPS encrypted realtime oximeter. */
26
+ export class Sp20Device extends BTManagedDevice {
27
+ mainServices = sp20MainServices;
28
+ stuckDataTimeout = 60_000;
29
+ onStreamStart = undefined;
30
+ preferredMtu = 247;
31
+ getSupportedMeasurementTypeKeys() {
32
+ return [MeasurementTypeKey.bloodOxygenPulseRate];
33
+ }
34
+ constructor(device, params) {
35
+ super(device, params);
36
+ this.frameReader = new Sp20FrameReader();
37
+ this.createCommandSequencer = () => new Sp20Sequencer({
38
+ write: {
39
+ serviceUuid: SP20_SERVICE,
40
+ characteristicUuid: SP20_WRITE
41
+ },
42
+ onResult: result => this.onResult?.(result)
43
+ });
44
+ }
45
+ handleSuccessResult() {
46
+ return;
47
+ }
48
+ }
49
+ //# sourceMappingURL=sp20.device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MeasurementTypeKey","BTManagedDevice","SP20_NOTIFY","SP20_SERVICE","SP20_WRITE","Sp20FrameReader","Sp20Sequencer","acceptNothing","caseValuePosition","cases","sp20MainServices","uuid","monitorUuids","parsingModel","writeUuid","mainCommandUuid","Sp20Device","mainServices","stuckDataTimeout","onStreamStart","undefined","preferredMtu","getSupportedMeasurementTypeKeys","bloodOxygenPulseRate","constructor","device","params","frameReader","createCommandSequencer","write","serviceUuid","characteristicUuid","onResult","result","handleSuccessResult"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/sp20.device.ts"],"mappings":";;AAAA;;AAEA,SAASA,kBAAkB,QAAQ,YAAY;AAQ/C,SAASC,eAAe,QAAQ,yBAAsB;AAEtD,SACEC,WAAW,EACXC,YAAY,EACZC,UAAU,EACVC,eAAe,QACV,oBAAiB;AACxB,SAASC,aAAa,QAAQ,qBAAkB;AAOhD,MAAMC,aAAa,GAAG;EAAEC,iBAAiB,EAAE,EAAE;EAAEC,KAAK,EAAE;AAAG,CAAC;AAE1D,OAAO,MAAMC,gBAA4B,GAAG,CAC1C;EACEC,IAAI,EAAER,YAAY;EAClBS,YAAY,EAAE,CAAC;IAAED,IAAI,EAAET,WAAW;IAAEW,YAAY,EAAEN;EAAc,CAAC,CAAC;EAClEO,SAAS,EAAE;IAAEH,IAAI,EAAEP,UAAU;IAAEW,eAAe,EAAE;EAAO;AACzD,CAAC,CACF;;AAED;AACA,OAAO,MAAMC,UAAU,SAASf,eAAe,CAAe;EAClDgB,YAAY,GAAGP,gBAAgB;EAC/BQ,gBAAgB,GAAG,MAAM;EACzBC,aAAa,GAAGC,SAAS;EAChBC,YAAY,GAAG,GAAG;EAClBC,+BAA+BA,CAAA,EAAyB;IACzE,OAAO,CAACtB,kBAAkB,CAACuB,oBAAoB,CAAC;EAClD;EAEOC,WAAWA,CAChBC,MAAc,EACdC,MAAwC,EACxC;IACA,KAAK,CAACD,MAAM,EAAEC,MAAM,CAAC;IACrB,IAAI,CAACC,WAAW,GAAG,IAAItB,eAAe,CAAC,CAAC;IACxC,IAAI,CAACuB,sBAAsB,GAAG,MAC5B,IAAItB,aAAa,CAAC;MAChBuB,KAAK,EAAE;QAAEC,WAAW,EAAE3B,YAAY;QAAE4B,kBAAkB,EAAE3B;MAAW,CAAC;MACpE4B,QAAQ,EAAGC,MAAM,IACf,IAAI,CAACD,QAAQ,GACXC,MAGF;IACJ,CAAC,CAAC;EACN;EAEUC,mBAAmBA,CAAA,EAAS;IACpC;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable import/group-exports */
4
+
5
+ import { FrameReadStatus } from "../../../types/frame-read-status.js";
6
+ import { calculateCrc8Pc } from "../../../utils/calculate-crc-8-pc.js";
7
+ import { hexToByte } from "../../../utils/hex-to-byte.js";
8
+ export const SP20_SERVICE = "0000fff0-0000-1000-8000-00805f9b34fb";
9
+ export const SP20_NOTIFY = "0000fff1-0000-1000-8000-00805f9b34fb";
10
+ export const SP20_WRITE = "0000fff2-0000-1000-8000-00805f9b34fb";
11
+ const byte = value => (value & 0xff).toString(16).padStart(2, "0");
12
+ export const buildSp20Frame = (token, type, payload = []) => {
13
+ const frame = ["aa", "55", byte(token), byte(payload.length + 2), byte(type), ...payload.map(byte), "00"];
14
+ frame[frame.length - 1] = byte(calculateCrc8Pc(frame));
15
+ return frame;
16
+ };
17
+ export const decodeSp20Frame = frame => {
18
+ if (hexToByte(frame[0] ?? "00") !== 0xaa || hexToByte(frame[1] ?? "00") !== 0x55 || frame.length < 6 || frame.length !== hexToByte(frame[3] ?? "00") + 4 || calculateCrc8Pc(frame) !== hexToByte(frame.at(-1) ?? "00")) {
19
+ return undefined;
20
+ }
21
+ return {
22
+ token: hexToByte(frame[2] ?? "00"),
23
+ type: hexToByte(frame[4] ?? "00"),
24
+ content: frame.slice(5, -1).map(value => hexToByte(value)),
25
+ cipherText: frame.slice(4, -1).map(value => hexToByte(value))
26
+ };
27
+ };
28
+ export const parseSp20OximeterReading = content => {
29
+ if (content.length < 6) {
30
+ return undefined;
31
+ }
32
+ const flags = content[4] ?? 0;
33
+ return {
34
+ bloodOxygen: content[0] ?? 0,
35
+ pulseRate: (content[1] ?? 0) | (content[2] ?? 0) << 8,
36
+ perfusionIndex: content[3] ?? 0,
37
+ probeOff: (flags & 0x02) !== 0,
38
+ pulseSearching: (flags & 0x04) !== 0,
39
+ checkProbe: (flags & 0x08) !== 0
40
+ };
41
+ };
42
+
43
+ /** AA55 frames carry their length at byte 3; notifications may split or batch them. */
44
+ export class Sp20FrameReader {
45
+ readFrame(buffer) {
46
+ const start = this.findHeader(buffer);
47
+ if (start < 0) {
48
+ return {
49
+ status: FrameReadStatus.INCOMPLETE,
50
+ consumedBytes: Math.max(0, buffer.length - 1)
51
+ };
52
+ }
53
+ if (start + 4 > buffer.length) {
54
+ return {
55
+ status: FrameReadStatus.INCOMPLETE,
56
+ consumedBytes: start
57
+ };
58
+ }
59
+ const length = hexToByte(buffer[start + 3] ?? "00") + 4;
60
+ if (length < 6) {
61
+ return {
62
+ status: FrameReadStatus.CORRUPT,
63
+ consumedBytes: start + 2
64
+ };
65
+ }
66
+ if (start + length > buffer.length) {
67
+ return {
68
+ status: FrameReadStatus.INCOMPLETE,
69
+ consumedBytes: start
70
+ };
71
+ }
72
+ const frame = buffer.slice(start, start + length);
73
+ if (calculateCrc8Pc(frame) !== hexToByte(frame.at(-1) ?? "00")) {
74
+ return {
75
+ status: FrameReadStatus.CORRUPT,
76
+ consumedBytes: start + 2
77
+ };
78
+ }
79
+ return {
80
+ status: FrameReadStatus.COMPLETE,
81
+ consumedBytes: start + length,
82
+ frame
83
+ };
84
+ }
85
+ findHeader = buffer => {
86
+ for (let index = 0; index < buffer.length - 1; index += 1) {
87
+ if (hexToByte(buffer[index] ?? "00") === 0xaa && hexToByte(buffer[index + 1] ?? "00") === 0x55) {
88
+ return index;
89
+ }
90
+ }
91
+ return -1;
92
+ };
93
+ }
94
+ //# sourceMappingURL=sp20.protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FrameReadStatus","calculateCrc8Pc","hexToByte","SP20_SERVICE","SP20_NOTIFY","SP20_WRITE","byte","value","toString","padStart","buildSp20Frame","token","type","payload","frame","length","map","decodeSp20Frame","at","undefined","content","slice","cipherText","parseSp20OximeterReading","flags","bloodOxygen","pulseRate","perfusionIndex","probeOff","pulseSearching","checkProbe","Sp20FrameReader","readFrame","buffer","start","findHeader","status","INCOMPLETE","consumedBytes","Math","max","CORRUPT","COMPLETE","index"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/sp20.protocol.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ import { MeasurementTypeKey } from "@ovok/core";
4
+ import { CaseType } from "../../../types/case-type.js";
5
+ import { calculateCrc8Pc } from "../../../utils/calculate-crc-8-pc.js";
6
+ import { buildSp20Frame, decodeSp20Frame, parseSp20OximeterReading } from "./sp20.protocol.js";
7
+ import { decryptLepuHandshake, decryptLepuPayload, encryptLepuPayload, parseLepuSessionKey, createLepuAccessToken } from "./viatom-lepu-crypto.js";
8
+ const command = (write, frame) => ({
9
+ ...write,
10
+ frame,
11
+ withoutResponse: true
12
+ });
13
+ const validOxygen = value => value >= 50 && value <= 100;
14
+ const validPulse = value => value > 0 && value <= 300;
15
+
16
+ /** Handles the encrypted AA55 exchange used by the ViHealth SP-20 variants. */
17
+ export class Sp20Sequencer {
18
+ phase = "authenticate";
19
+ constructor(params) {
20
+ this.params = params;
21
+ }
22
+ initialCommands = () => {
23
+ const token = createLepuAccessToken(this.params.now?.() ?? new Date());
24
+ return [this.write(buildSp20Frame(0xff, 0x81, token))];
25
+ };
26
+ nextCommand = frame => {
27
+ const raw = decodeSp20Frame(frame);
28
+ if (!raw) {
29
+ return undefined;
30
+ }
31
+ const response = this.decodePayload(raw);
32
+ if (!response) {
33
+ return undefined;
34
+ }
35
+ if (this.phase === "authenticate") {
36
+ return this.acceptHandshake(raw, response);
37
+ }
38
+ if (this.phase === "clock" && response.token === 0x0f && response.type === 7) {
39
+ this.phase = "parameters";
40
+ return [this.encryptedCommand(0x84, [1])];
41
+ }
42
+ if (this.phase === "parameters" && response.token === 0x0f && response.type === 4) {
43
+ this.phase = "wave";
44
+ return [this.encryptedCommand(0x85, [1])];
45
+ }
46
+ if (this.phase === "wave" && response.token === 0x0f && response.type === 5) {
47
+ this.phase = "ready";
48
+ return undefined;
49
+ }
50
+ if (this.phase === "ready" && response.token === 0xf0 && response.type === 1) {
51
+ this.report(response.content);
52
+ }
53
+ return undefined;
54
+ };
55
+ decodePayload = response => {
56
+ if (response.token === 0xff && !this.sessionKey) {
57
+ return response;
58
+ }
59
+ if (!this.sessionKey) {
60
+ return undefined;
61
+ }
62
+ const decrypted = decryptLepuPayload(response.cipherText, this.sessionKey);
63
+ return decrypted?.length ? {
64
+ token: response.token,
65
+ type: decrypted[0] ?? 0,
66
+ content: decrypted.slice(1),
67
+ cipherText: response.cipherText
68
+ } : undefined;
69
+ };
70
+ acceptHandshake = (raw, response) => {
71
+ if (raw.token !== 0xff || raw.type !== 1) {
72
+ return undefined;
73
+ }
74
+ const key = parseLepuSessionKey(decryptLepuHandshake(response.content));
75
+ if (!key) {
76
+ return undefined;
77
+ }
78
+ this.sessionKey = key;
79
+ this.phase = "clock";
80
+ return [this.encryptedCommand(0x87, this.timePayload())];
81
+ };
82
+ encryptedCommand = (type, payload) => {
83
+ const encrypted = encryptLepuPayload([type, ...payload], this.sessionKey ?? []);
84
+ const frame = ["aa", "55", "0f", (encrypted.length + 1 & 0xff).toString(16).padStart(2, "0"), ...encrypted.map(value => value.toString(16).padStart(2, "0")), "00"];
85
+ frame[frame.length - 1] = calculateCrc8Pc(frame).toString(16).padStart(2, "0");
86
+ return this.write(frame);
87
+ };
88
+ timePayload = () => {
89
+ const date = this.params.now?.() ?? new Date();
90
+ return [date.getFullYear() >>> 8 & 0xff, date.getFullYear() & 0xff, date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()];
91
+ };
92
+ report = content => {
93
+ const reading = parseSp20OximeterReading(content);
94
+ if (!reading || reading.probeOff || reading.pulseSearching || reading.checkProbe || !validOxygen(reading.bloodOxygen) || !validPulse(reading.pulseRate)) {
95
+ return;
96
+ }
97
+ this.params.onResult({
98
+ caseType: CaseType.RESULT,
99
+ measurementTypeKey: MeasurementTypeKey.bloodOxygenPulseRate,
100
+ bloodOxygen: reading.bloodOxygen,
101
+ pulseRate: reading.pulseRate,
102
+ ...(reading.perfusionIndex > 0 ? {
103
+ perfusionIndex: reading.perfusionIndex
104
+ } : {}),
105
+ recordedAt: this.params.now?.() ?? new Date()
106
+ });
107
+ };
108
+ write = frame => command(this.params.write, frame);
109
+ }
110
+ //# sourceMappingURL=sp20.sequencer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","calculateCrc8Pc","buildSp20Frame","decodeSp20Frame","parseSp20OximeterReading","decryptLepuHandshake","decryptLepuPayload","encryptLepuPayload","parseLepuSessionKey","createLepuAccessToken","command","write","frame","withoutResponse","validOxygen","value","validPulse","Sp20Sequencer","phase","constructor","params","initialCommands","token","now","Date","nextCommand","raw","undefined","response","decodePayload","acceptHandshake","type","encryptedCommand","report","content","sessionKey","decrypted","cipherText","length","slice","key","timePayload","payload","encrypted","toString","padStart","map","date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","reading","probeOff","pulseSearching","checkProbe","bloodOxygen","pulseRate","onResult","caseType","RESULT","measurementTypeKey","bloodOxygenPulseRate","perfusionIndex","recordedAt"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/sp20.sequencer.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAkC,YAAY;AAEzE,SAASC,QAAQ,QAAQ,6BAA0B;AAInD,SAASC,eAAe,QAAQ,sCAAmC;AAEnE,SACEC,cAAc,EACdC,eAAe,EACfC,wBAAwB,QAEnB,oBAAiB;AACxB,SACEC,oBAAoB,EACpBC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,EACnBC,qBAAqB,QAChB,yBAAsB;AAU7B,MAAMC,OAAO,GAAGA,CACdC,KAAmC,EACnCC,KAAwB,MACL;EAAE,GAAGD,KAAK;EAAEC,KAAK;EAAEC,eAAe,EAAE;AAAK,CAAC,CAAC;AAEhE,MAAMC,WAAW,GAAIC,KAAa,IAAcA,KAAK,IAAI,EAAE,IAAIA,KAAK,IAAI,GAAG;AAC3E,MAAMC,UAAU,GAAID,KAAa,IAAcA,KAAK,GAAG,CAAC,IAAIA,KAAK,IAAI,GAAG;;AAExE;AACA,OAAO,MAAME,aAAa,CAA6B;EAC7CC,KAAK,GAAU,cAAc;EAG9BC,WAAWA,CAAkBC,MAA2B,EAAE;IAAA,KAA7BA,MAA2B,GAA3BA,MAA2B;EAAG;EAE3DC,eAAe,GAAGA,CAAA,KAAgC;IACvD,MAAMC,KAAK,GAAGb,qBAAqB,CAAC,IAAI,CAACW,MAAM,CAACG,GAAG,GAAG,CAAC,IAAI,IAAIC,IAAI,CAAC,CAAC,CAAC;IAEtE,OAAO,CACL,IAAI,CAACb,KAAK,CAACT,cAAc,CAAC,IAAI,EAAE,IAAI,EAAEoB,KAAK,CAAC,CAAC,CAC9C;EACH,CAAC;EAEMG,WAAW,GAChBb,KAAwB,IACiB;IACzC,MAAMc,GAAG,GAAGvB,eAAe,CAACS,KAAK,CAAC;IAElC,IAAI,CAACc,GAAG,EAAE;MACR,OAAOC,SAAS;IAClB;IAEA,MAAMC,QAAQ,GAAG,IAAI,CAACC,aAAa,CAACH,GAAG,CAAC;IAExC,IAAI,CAACE,QAAQ,EAAE;MACb,OAAOD,SAAS;IAClB;IAEA,IAAI,IAAI,CAACT,KAAK,KAAK,cAAc,EAAE;MACjC,OAAO,IAAI,CAACY,eAAe,CAACJ,GAAG,EAAEE,QAAQ,CAAC;IAC5C;IAEA,IACE,IAAI,CAACV,KAAK,KAAK,OAAO,IACtBU,QAAQ,CAACN,KAAK,KAAK,IAAI,IACvBM,QAAQ,CAACG,IAAI,KAAK,CAAC,EACnB;MACA,IAAI,CAACb,KAAK,GAAG,YAAY;MAEzB,OAAO,CAAC,IAAI,CAACc,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C;IAEA,IACE,IAAI,CAACd,KAAK,KAAK,YAAY,IAC3BU,QAAQ,CAACN,KAAK,KAAK,IAAI,IACvBM,QAAQ,CAACG,IAAI,KAAK,CAAC,EACnB;MACA,IAAI,CAACb,KAAK,GAAG,MAAM;MAEnB,OAAO,CAAC,IAAI,CAACc,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C;IAEA,IACE,IAAI,CAACd,KAAK,KAAK,MAAM,IACrBU,QAAQ,CAACN,KAAK,KAAK,IAAI,IACvBM,QAAQ,CAACG,IAAI,KAAK,CAAC,EACnB;MACA,IAAI,CAACb,KAAK,GAAG,OAAO;MAEpB,OAAOS,SAAS;IAClB;IAEA,IACE,IAAI,CAACT,KAAK,KAAK,OAAO,IACtBU,QAAQ,CAACN,KAAK,KAAK,IAAI,IACvBM,QAAQ,CAACG,IAAI,KAAK,CAAC,EACnB;MACA,IAAI,CAACE,MAAM,CAACL,QAAQ,CAACM,OAAO,CAAC;IAC/B;IAEA,OAAOP,SAAS;EAClB,CAAC;EAEOE,aAAa,GAAID,QAAsB,IAA+B;IAC5E,IAAIA,QAAQ,CAACN,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAACa,UAAU,EAAE;MAC/C,OAAOP,QAAQ;IACjB;IAEA,IAAI,CAAC,IAAI,CAACO,UAAU,EAAE;MACpB,OAAOR,SAAS;IAClB;IAEA,MAAMS,SAAS,GAAG9B,kBAAkB,CAACsB,QAAQ,CAACS,UAAU,EAAE,IAAI,CAACF,UAAU,CAAC;IAE1E,OAAOC,SAAS,EAAEE,MAAM,GACpB;MACFhB,KAAK,EAAEM,QAAQ,CAACN,KAAK;MACrBS,IAAI,EAAEK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;MACvBF,OAAO,EAAEE,SAAS,CAACG,KAAK,CAAC,CAAC,CAAC;MAC3BF,UAAU,EAAET,QAAQ,CAACS;IACnB,CAAC,GACDV,SAAS;EACf,CAAC;EAEOG,eAAe,GAAGA,CACxBJ,GAAiB,EACjBE,QAAsB,KACmB;IACzC,IAAIF,GAAG,CAACJ,KAAK,KAAK,IAAI,IAAII,GAAG,CAACK,IAAI,KAAK,CAAC,EAAE;MACxC,OAAOJ,SAAS;IAClB;IAEA,MAAMa,GAAG,GAAGhC,mBAAmB,CAACH,oBAAoB,CAACuB,QAAQ,CAACM,OAAO,CAAC,CAAC;IAEvE,IAAI,CAACM,GAAG,EAAE;MACR,OAAOb,SAAS;IAClB;IAEA,IAAI,CAACQ,UAAU,GAAGK,GAAG;IACrB,IAAI,CAACtB,KAAK,GAAG,OAAO;IAEpB,OAAO,CAAC,IAAI,CAACc,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAACS,WAAW,CAAC,CAAC,CAAC,CAAC;EAC1D,CAAC;EAEOT,gBAAgB,GAAGA,CACzBD,IAAY,EACZW,OAA0B,KACR;IAClB,MAAMC,SAAS,GAAGpC,kBAAkB,CAClC,CAACwB,IAAI,EAAE,GAAGW,OAAO,CAAC,EAClB,IAAI,CAACP,UAAU,IAAI,EACrB,CAAC;IAED,MAAMvB,KAAK,GAAG,CACZ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,CAAE+B,SAAS,CAACL,MAAM,GAAG,CAAC,GAAI,IAAI,EAAEM,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAC7D,GAAGF,SAAS,CAACG,GAAG,CAAE/B,KAAK,IAAKA,KAAK,CAAC6B,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAChE,IAAI,CACL;IAEDjC,KAAK,CAACA,KAAK,CAAC0B,MAAM,GAAG,CAAC,CAAC,GAAGrC,eAAe,CAACW,KAAK,CAAC,CAC7CgC,QAAQ,CAAC,EAAE,CAAC,CACZC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IAEnB,OAAO,IAAI,CAAClC,KAAK,CAACC,KAAK,CAAC;EAC1B,CAAC;EAEO6B,WAAW,GAAGA,CAAA,KAAgB;IACpC,MAAMM,IAAI,GAAG,IAAI,CAAC3B,MAAM,CAACG,GAAG,GAAG,CAAC,IAAI,IAAIC,IAAI,CAAC,CAAC;IAE9C,OAAO,CACJuB,IAAI,CAACC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAI,IAAI,EACjCD,IAAI,CAACC,WAAW,CAAC,CAAC,GAAG,IAAI,EACzBD,IAAI,CAACE,QAAQ,CAAC,CAAC,GAAG,CAAC,EACnBF,IAAI,CAACG,OAAO,CAAC,CAAC,EACdH,IAAI,CAACI,QAAQ,CAAC,CAAC,EACfJ,IAAI,CAACK,UAAU,CAAC,CAAC,EACjBL,IAAI,CAACM,UAAU,CAAC,CAAC,CAClB;EACH,CAAC;EAEOpB,MAAM,GAAIC,OAA0B,IAAW;IACrD,MAAMoB,OAAO,GAAGlD,wBAAwB,CAAC8B,OAAO,CAAC;IAEjD,IACE,CAACoB,OAAO,IACRA,OAAO,CAACC,QAAQ,IAChBD,OAAO,CAACE,cAAc,IACtBF,OAAO,CAACG,UAAU,IAClB,CAAC3C,WAAW,CAACwC,OAAO,CAACI,WAAW,CAAC,IACjC,CAAC1C,UAAU,CAACsC,OAAO,CAACK,SAAS,CAAC,EAC9B;MACA;IACF;IAEA,IAAI,CAACvC,MAAM,CAACwC,QAAQ,CAAC;MACnBC,QAAQ,EAAE7D,QAAQ,CAAC8D,MAAM;MACzBC,kBAAkB,EAAEhE,kBAAkB,CAACiE,oBAAoB;MAC3DN,WAAW,EAAEJ,OAAO,CAACI,WAAW;MAChCC,SAAS,EAAEL,OAAO,CAACK,SAAS;MAC5B,IAAIL,OAAO,CAACW,cAAc,GAAG,CAAC,GAC1B;QAAEA,cAAc,EAAEX,OAAO,CAACW;MAAe,CAAC,GAC1C,CAAC,CAAC,CAAC;MACPC,UAAU,EAAE,IAAI,CAAC9C,MAAM,CAACG,GAAG,GAAG,CAAC,IAAI,IAAIC,IAAI,CAAC;IAC9C,CAAC,CAAC;EACJ,CAAC;EAEOb,KAAK,GAAIC,KAAwB,IACvCF,OAAO,CAAC,IAAI,CAACU,MAAM,CAACT,KAAK,EAAEC,KAAK,CAAC;AAErC","ignoreList":[]}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable import/group-exports */
4
+
5
+ import CryptoJS from "crypto-js";
6
+ const LEPU_CIPHER_KEY = "c2a7cf50dafed885a8f8f7eac44335f3";
7
+ const DEFAULT_ENCRYPTION_ID = "0000";
8
+ const AES_BLOCK_BYTES = 16;
9
+ const toHex = bytes => bytes.map(value => (value & 0xff).toString(16).padStart(2, "0")).join("");
10
+ const fromHex = hex => hex.match(/.{2}/g)?.map(value => Number.parseInt(value, 16)) ?? [];
11
+ const lepuXor = bytes => {
12
+ const key = fromHex(LEPU_CIPHER_KEY);
13
+ return bytes.map((value, index) => value ^ (key[index % key.length] ?? 0));
14
+ };
15
+
16
+ /** Builds the vendor's four-character client token without logging identity or key bytes. */
17
+ export const createLepuAccessToken = (now = new Date(), encryptionId = DEFAULT_ENCRYPTION_ID) => {
18
+ const idBytes = Array.from(encryptionId, character => character.charCodeAt(0));
19
+ if (idBytes.length !== 4 || idBytes.some(value => value > 0x7f)) {
20
+ throw new Error("Lepu encryption ID must be four ASCII characters.");
21
+ }
22
+ const key = fromHex(LEPU_CIPHER_KEY);
23
+ const token = Array(16).fill(0);
24
+ for (let index = 0; index < 8; index += 1) {
25
+ token[index] = key[index * 2] ?? 0;
26
+ }
27
+ token.splice(8, 4, ...idBytes);
28
+ const epochSeconds = Math.floor(now.getTime() / 1000);
29
+ for (let index = 0; index < 4; index += 1) {
30
+ token[index + 12] = epochSeconds >> index & 0xff;
31
+ }
32
+ return lepuXor(token);
33
+ };
34
+ export const decryptLepuHandshake = encrypted => lepuXor(encrypted);
35
+ export const parseLepuSessionKey = handshake => {
36
+ if (handshake.length < 4 || handshake[0] !== 1) {
37
+ return undefined;
38
+ }
39
+ const length = handshake[1] ?? 0;
40
+ const key = handshake.slice(4, 4 + length);
41
+ return key.length === length && [16, 24, 32].includes(length) ? key : undefined;
42
+ };
43
+ export const encryptLepuPayload = (payload, sessionKey) => {
44
+ if (![16, 24, 32].includes(sessionKey.length)) {
45
+ throw new Error("Invalid Lepu AES session key length.");
46
+ }
47
+ const encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Hex.parse(toHex(payload)), CryptoJS.enc.Hex.parse(toHex(sessionKey)), {
48
+ mode: CryptoJS.mode.ECB,
49
+ padding: CryptoJS.pad.Pkcs7
50
+ });
51
+ return fromHex(CryptoJS.enc.Hex.stringify(encrypted.ciphertext));
52
+ };
53
+ export const decryptLepuPayload = (encrypted, sessionKey) => {
54
+ if (![16, 24, 32].includes(sessionKey.length) || encrypted.length === 0 || encrypted.length % AES_BLOCK_BYTES !== 0) {
55
+ return undefined;
56
+ }
57
+ const ciphertext = CryptoJS.lib.CipherParams.create({
58
+ ciphertext: CryptoJS.enc.Hex.parse(toHex(encrypted))
59
+ });
60
+ const decrypted = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Hex.parse(toHex(sessionKey)), {
61
+ mode: CryptoJS.mode.ECB,
62
+ padding: CryptoJS.pad.NoPadding
63
+ });
64
+ const unpadded = fromHex(CryptoJS.enc.Hex.stringify(decrypted));
65
+ const paddingLength = unpadded.at(-1) ?? 0;
66
+ if (paddingLength === 0 || paddingLength > AES_BLOCK_BYTES || unpadded.length < paddingLength || unpadded.slice(-paddingLength).some(value => value !== paddingLength)) {
67
+ return undefined;
68
+ }
69
+ return unpadded.slice(0, -paddingLength);
70
+ };
71
+ //# sourceMappingURL=viatom-lepu-crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CryptoJS","LEPU_CIPHER_KEY","DEFAULT_ENCRYPTION_ID","AES_BLOCK_BYTES","toHex","bytes","map","value","toString","padStart","join","fromHex","hex","match","Number","parseInt","lepuXor","key","index","length","createLepuAccessToken","now","Date","encryptionId","idBytes","Array","from","character","charCodeAt","some","Error","token","fill","splice","epochSeconds","Math","floor","getTime","decryptLepuHandshake","encrypted","parseLepuSessionKey","handshake","undefined","slice","includes","encryptLepuPayload","payload","sessionKey","AES","encrypt","enc","Hex","parse","mode","ECB","padding","pad","Pkcs7","stringify","ciphertext","decryptLepuPayload","lib","CipherParams","create","decrypted","decrypt","NoPadding","unpadded","paddingLength","at"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/viatom-lepu-crypto.ts"],"mappings":";;AAAA;;AAEA,OAAOA,QAAQ,MAAM,WAAW;AAEhC,MAAMC,eAAe,GAAG,kCAAkC;AAC1D,MAAMC,qBAAqB,GAAG,MAAM;AACpC,MAAMC,eAAe,GAAG,EAAE;AAE1B,MAAMC,KAAK,GAAIC,KAAwB,IACrCA,KAAK,CAACC,GAAG,CAAEC,KAAK,IAAK,CAACA,KAAK,GAAG,IAAI,EAAEC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;AAE7E,MAAMC,OAAO,GAAIC,GAAW,IAC1BA,GAAG,CAACC,KAAK,CAAC,OAAO,CAAC,EAAEP,GAAG,CAAEC,KAAK,IAAKO,MAAM,CAACC,QAAQ,CAACR,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;AAEtE,MAAMS,OAAO,GAAIX,KAAwB,IAAe;EACtD,MAAMY,GAAG,GAAGN,OAAO,CAACV,eAAe,CAAC;EAEpC,OAAOI,KAAK,CAACC,GAAG,CAAC,CAACC,KAAK,EAAEW,KAAK,KAAKX,KAAK,IAAIU,GAAG,CAACC,KAAK,GAAGD,GAAG,CAACE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5E,CAAC;;AAED;AACA,OAAO,MAAMC,qBAAqB,GAAGA,CACnCC,GAAS,GAAG,IAAIC,IAAI,CAAC,CAAC,EACtBC,YAAY,GAAGrB,qBAAqB,KACvB;EACb,MAAMsB,OAAO,GAAGC,KAAK,CAACC,IAAI,CAACH,YAAY,EAAGI,SAAS,IAAKA,SAAS,CAACC,UAAU,CAAC,CAAC,CAAC,CAAC;EAEhF,IAAIJ,OAAO,CAACL,MAAM,KAAK,CAAC,IAAIK,OAAO,CAACK,IAAI,CAAEtB,KAAK,IAAKA,KAAK,GAAG,IAAI,CAAC,EAAE;IACjE,MAAM,IAAIuB,KAAK,CAAC,mDAAmD,CAAC;EACtE;EAEA,MAAMb,GAAG,GAAGN,OAAO,CAACV,eAAe,CAAC;EACpC,MAAM8B,KAAK,GAAGN,KAAK,CAAS,EAAE,CAAC,CAACO,IAAI,CAAC,CAAC,CAAC;EAEvC,KAAK,IAAId,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG,CAAC,EAAEA,KAAK,IAAI,CAAC,EAAE;IACzCa,KAAK,CAACb,KAAK,CAAC,GAAGD,GAAG,CAACC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;EACpC;EAEAa,KAAK,CAACE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAGT,OAAO,CAAC;EAE9B,MAAMU,YAAY,GAAGC,IAAI,CAACC,KAAK,CAACf,GAAG,CAACgB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;EAErD,KAAK,IAAInB,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG,CAAC,EAAEA,KAAK,IAAI,CAAC,EAAE;IACzCa,KAAK,CAACb,KAAK,GAAG,EAAE,CAAC,GAAIgB,YAAY,IAAIhB,KAAK,GAAI,IAAI;EACpD;EAEA,OAAOF,OAAO,CAACe,KAAK,CAAC;AACvB,CAAC;AAED,OAAO,MAAMO,oBAAoB,GAAIC,SAA4B,IAC/DvB,OAAO,CAACuB,SAAS,CAAC;AAEpB,OAAO,MAAMC,mBAAmB,GAC9BC,SAA4B,IACH;EACzB,IAAIA,SAAS,CAACtB,MAAM,GAAG,CAAC,IAAIsB,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;IAC9C,OAAOC,SAAS;EAClB;EAEA,MAAMvB,MAAM,GAAGsB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;EAChC,MAAMxB,GAAG,GAAGwB,SAAS,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAGxB,MAAM,CAAC;EAE1C,OAAOF,GAAG,CAACE,MAAM,KAAKA,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAACyB,QAAQ,CAACzB,MAAM,CAAC,GACzDF,GAAG,GACHyB,SAAS;AACf,CAAC;AAED,OAAO,MAAMG,kBAAkB,GAAGA,CAChCC,OAA0B,EAC1BC,UAA6B,KAChB;EACb,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAACH,QAAQ,CAACG,UAAU,CAAC5B,MAAM,CAAC,EAAE;IAC7C,MAAM,IAAIW,KAAK,CAAC,sCAAsC,CAAC;EACzD;EAEA,MAAMS,SAAS,GAAGvC,QAAQ,CAACgD,GAAG,CAACC,OAAO,CACpCjD,QAAQ,CAACkD,GAAG,CAACC,GAAG,CAACC,KAAK,CAAChD,KAAK,CAAC0C,OAAO,CAAC,CAAC,EACtC9C,QAAQ,CAACkD,GAAG,CAACC,GAAG,CAACC,KAAK,CAAChD,KAAK,CAAC2C,UAAU,CAAC,CAAC,EACzC;IAAEM,IAAI,EAAErD,QAAQ,CAACqD,IAAI,CAACC,GAAG;IAAEC,OAAO,EAAEvD,QAAQ,CAACwD,GAAG,CAACC;EAAM,CACzD,CAAC;EAED,OAAO9C,OAAO,CAACX,QAAQ,CAACkD,GAAG,CAACC,GAAG,CAACO,SAAS,CAACnB,SAAS,CAACoB,UAAU,CAAC,CAAC;AAClE,CAAC;AAED,OAAO,MAAMC,kBAAkB,GAAGA,CAChCrB,SAA4B,EAC5BQ,UAA6B,KACJ;EACzB,IACE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAACH,QAAQ,CAACG,UAAU,CAAC5B,MAAM,CAAC,IACzCoB,SAAS,CAACpB,MAAM,KAAK,CAAC,IACtBoB,SAAS,CAACpB,MAAM,GAAGhB,eAAe,KAAK,CAAC,EACxC;IACA,OAAOuC,SAAS;EAClB;EAEA,MAAMiB,UAAU,GAAG3D,QAAQ,CAAC6D,GAAG,CAACC,YAAY,CAACC,MAAM,CAAC;IAClDJ,UAAU,EAAE3D,QAAQ,CAACkD,GAAG,CAACC,GAAG,CAACC,KAAK,CAAChD,KAAK,CAACmC,SAAS,CAAC;EACrD,CAAC,CAAC;EAEF,MAAMyB,SAAS,GAAGhE,QAAQ,CAACgD,GAAG,CAACiB,OAAO,CACpCN,UAAU,EACV3D,QAAQ,CAACkD,GAAG,CAACC,GAAG,CAACC,KAAK,CAAChD,KAAK,CAAC2C,UAAU,CAAC,CAAC,EACzC;IAAEM,IAAI,EAAErD,QAAQ,CAACqD,IAAI,CAACC,GAAG;IAAEC,OAAO,EAAEvD,QAAQ,CAACwD,GAAG,CAACU;EAAU,CAC7D,CAAC;EAED,MAAMC,QAAQ,GAAGxD,OAAO,CAACX,QAAQ,CAACkD,GAAG,CAACC,GAAG,CAACO,SAAS,CAACM,SAAS,CAAC,CAAC;EAC/D,MAAMI,aAAa,GAAGD,QAAQ,CAACE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;EAE1C,IACED,aAAa,KAAK,CAAC,IACnBA,aAAa,GAAGjE,eAAe,IAC/BgE,QAAQ,CAAChD,MAAM,GAAGiD,aAAa,IAC/BD,QAAQ,CAACxB,KAAK,CAAC,CAACyB,aAAa,CAAC,CAACvC,IAAI,CAAEtB,KAAK,IAAKA,KAAK,KAAK6D,aAAa,CAAC,EACvE;IACA,OAAO1B,SAAS;EAClB;EAEA,OAAOyB,QAAQ,CAACxB,KAAK,CAAC,CAAC,EAAE,CAACyB,aAAa,CAAC;AAC1C,CAAC","ignoreList":[]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable import/group-exports */
4
+
5
+ import { BTManagedDevice } from "../bt-managed-device.js";
6
+ import { parseViatomR20Advertisement, ViatomR20FrameReader, VIATOM_R20_MEASUREMENT_TYPE, VIATOM_R20_NOTIFY, VIATOM_R20_SERVICE, VIATOM_R20_WRITE } from "./viatom-r20.protocol.js";
7
+ import { ViatomR20Sequencer } from "./viatom-r20.sequencer.js";
8
+ const acceptNothing = {
9
+ caseValuePosition: [],
10
+ cases: []
11
+ };
12
+ export const viatomR20MainServices = [{
13
+ uuid: VIATOM_R20_SERVICE,
14
+ monitorUuids: [{
15
+ uuid: VIATOM_R20_NOTIFY,
16
+ parsingModel: acceptNothing
17
+ }],
18
+ writeUuid: {
19
+ uuid: VIATOM_R20_WRITE,
20
+ mainCommandUuid: "a5"
21
+ }
22
+ }];
23
+ /** ViHealth LeRes-A/R20 and LeRes-C/R200 ventilators use the same A5 BLE service. */
24
+ export class ViatomR20Device extends BTManagedDevice {
25
+ mainServices = viatomR20MainServices;
26
+ stuckDataTimeout = 60_000;
27
+ onStreamStart = undefined;
28
+ preferredMtu = 247;
29
+ getSupportedMeasurementTypeKeys() {
30
+ return [VIATOM_R20_MEASUREMENT_TYPE];
31
+ }
32
+ constructor(device, params) {
33
+ super(device, {
34
+ ...params,
35
+ oneReadingPerConnection: params.oneReadingPerConnection ?? true
36
+ });
37
+ this.frameReader = new ViatomR20FrameReader();
38
+ this.createCommandSequencer = () => new ViatomR20Sequencer({
39
+ encrypted: parseViatomR20Advertisement(device.manufacturerData).encrypted,
40
+ write: {
41
+ serviceUuid: VIATOM_R20_SERVICE,
42
+ characteristicUuid: VIATOM_R20_WRITE
43
+ },
44
+ clockSync: params.clockSync,
45
+ onResult: result => this.onResult?.(result)
46
+ });
47
+ }
48
+ handleSuccessResult() {
49
+ return;
50
+ }
51
+ }
52
+ //# sourceMappingURL=viatom-r20.device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["BTManagedDevice","parseViatomR20Advertisement","ViatomR20FrameReader","VIATOM_R20_MEASUREMENT_TYPE","VIATOM_R20_NOTIFY","VIATOM_R20_SERVICE","VIATOM_R20_WRITE","ViatomR20Sequencer","acceptNothing","caseValuePosition","cases","viatomR20MainServices","uuid","monitorUuids","parsingModel","writeUuid","mainCommandUuid","ViatomR20Device","mainServices","stuckDataTimeout","onStreamStart","undefined","preferredMtu","getSupportedMeasurementTypeKeys","constructor","device","params","oneReadingPerConnection","frameReader","createCommandSequencer","encrypted","manufacturerData","write","serviceUuid","characteristicUuid","clockSync","onResult","result","handleSuccessResult"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/viatom-r20.device.ts"],"mappings":";;AAAA;;AAUA,SAASA,eAAe,QAAQ,yBAAsB;AAEtD,SACEC,2BAA2B,EAC3BC,oBAAoB,EACpBC,2BAA2B,EAC3BC,iBAAiB,EACjBC,kBAAkB,EAClBC,gBAAgB,QACX,0BAAuB;AAC9B,SAASC,kBAAkB,QAAQ,2BAAwB;AAE3D,MAAMC,aAAa,GAAG;EAAEC,iBAAiB,EAAE,EAAE;EAAEC,KAAK,EAAE;AAAG,CAAC;AAE1D,OAAO,MAAMC,qBAAiC,GAAG,CAC/C;EACEC,IAAI,EAAEP,kBAAkB;EACxBQ,YAAY,EAAE,CAAC;IAAED,IAAI,EAAER,iBAAiB;IAAEU,YAAY,EAAEN;EAAc,CAAC,CAAC;EACxEO,SAAS,EAAE;IAAEH,IAAI,EAAEN,gBAAgB;IAAEU,eAAe,EAAE;EAAK;AAC7D,CAAC,CACF;AAMD;AACA,OAAO,MAAMC,eAAe,SAASjB,eAAe,CAAsB;EAC9DkB,YAAY,GAAGP,qBAAqB;EACpCQ,gBAAgB,GAAG,MAAM;EACzBC,aAAa,GAAGC,SAAS;EAChBC,YAAY,GAAG,GAAG;EAElBC,+BAA+BA,CAAA,EAAyB;IACzE,OAAO,CAACpB,2BAA2B,CAAC;EACtC;EAEOqB,WAAWA,CAChBC,MAAc,EACdC,MAA+C,EAC/C;IACA,KAAK,CAACD,MAAM,EAAE;MACZ,GAAGC,MAAM;MACTC,uBAAuB,EAAED,MAAM,CAACC,uBAAuB,IAAI;IAC7D,CAAC,CAAC;IACF,IAAI,CAACC,WAAW,GAAG,IAAI1B,oBAAoB,CAAC,CAAC;IAC7C,IAAI,CAAC2B,sBAAsB,GAAG,MAC5B,IAAItB,kBAAkB,CAAC;MACrBuB,SAAS,EAAE7B,2BAA2B,CAACwB,MAAM,CAACM,gBAAgB,CAAC,CAC5DD,SAAS;MACZE,KAAK,EAAE;QACLC,WAAW,EAAE5B,kBAAkB;QAC/B6B,kBAAkB,EAAE5B;MACtB,CAAC;MACD6B,SAAS,EAAET,MAAM,CAACS,SAAS;MAC3BC,QAAQ,EAAGC,MAAM,IACf,IAAI,CAACD,QAAQ,GACXC,MAGF;IACJ,CAAC,CAAC;EACN;EAEUC,mBAAmBA,CAAA,EAAS;IACpC;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable import/group-exports */
4
+
5
+ import { MeasurementTypeKey } from "@ovok/core";
6
+ import { calculateCrc8 } from "../../../utils/calculate-crc-8.js";
7
+ import { hexToByte } from "../../../utils/hex-to-byte.js";
8
+ import { le16FromHex } from "../../../utils/le-16-from-hex.js";
9
+ import { manufacturerBytes } from "../lepu/lepu.advertisement.js";
10
+ import { LepuFrameReader } from "../lepu/lepu.frame-reader.js";
11
+ export const VIATOM_R20_SERVICE = "14839ac4-7d7e-415c-9a42-167340cf2339";
12
+ export const VIATOM_R20_WRITE = "8b00ace7-eb0b-49b0-bbe9-9aee0a26e1a3";
13
+ export const VIATOM_R20_NOTIFY = "0734594a-a8e7-4b1a-a6b1-cd5243059a57";
14
+ export const VIATOM_R20_MEASUREMENT_TYPE = MeasurementTypeKey.respiratoryTherapy;
15
+ export const ViatomR20Command = {
16
+ authenticate: 0xff,
17
+ syncTime: 0xc0,
18
+ readParameters: 54
19
+ };
20
+ const unitComponent = (name, value, unit, code) => ({
21
+ code: {
22
+ text: name
23
+ },
24
+ valueQuantity: {
25
+ value,
26
+ unit,
27
+ system: "http://unitsofmeasure.org",
28
+ code
29
+ }
30
+ });
31
+ const u16 = (bytes, offset) => (bytes[offset] ?? 0) | (bytes[offset + 1] ?? 0) << 8;
32
+ const bounded = (value, min, max) => value >= min && value <= max ? value : undefined;
33
+
34
+ /**
35
+ * ViHealth's `BleBroadcast` uses byte 3 for protocol v1 and byte 4 for v2. The selected
36
+ * byte's high nibble is the encryption level; levels 1 and 2 require the Lepu handshake.
37
+ */
38
+ export const parseViatomR20Advertisement = manufacturerData => {
39
+ const bytes = manufacturerBytes(manufacturerData ?? undefined);
40
+ const uuid2 = bytes[4] ?? 0;
41
+ const selected = (uuid2 & 0x0f) === 2 ? uuid2 : bytes[3] ?? 0;
42
+ const level = (selected & 0xf0) >> 4;
43
+ return {
44
+ encrypted: level === 1 || level === 2
45
+ };
46
+ };
47
+
48
+ /** Validates the A5 request/reply frame shared by the ViHealth ventilator models. */
49
+ export const decodeViatomR20Response = frame => {
50
+ if (frame.length < 8 || hexToByte(frame[0] ?? "00") !== 0xa5) {
51
+ return undefined;
52
+ }
53
+ const command = hexToByte(frame[1] ?? "00");
54
+ const checksumIndex = frame.length - 1;
55
+ const payloadLength = le16FromHex(frame, 5);
56
+ if (hexToByte(frame[2] ?? "00") !== (~command & 0xff) || frame.length !== payloadLength + 8 || hexToByte(frame[checksumIndex] ?? "00") !== calculateCrc8([...frame], checksumIndex)) {
57
+ return undefined;
58
+ }
59
+ return {
60
+ command,
61
+ status: hexToByte(frame[3] ?? "00"),
62
+ payload: frame.slice(7, checksumIndex).map(hexToByte)
63
+ };
64
+ };
65
+
66
+ /**
67
+ * Converts the 24-byte RT_PARAM response documented in VentilatorBleResponse.RtParam.
68
+ * The device response has no measurement timestamp, so callers supply the receive time.
69
+ */
70
+ export const decodeViatomR20Parameters = (bytes, recordedAt = new Date()) => {
71
+ if (bytes.length < 24) {
72
+ return undefined;
73
+ }
74
+ const components = [];
75
+ const add = (name, value, min, max, unit, code, includeZero = false) => {
76
+ const valid = bounded(value, min, max);
77
+ if (valid !== undefined && (valid > 0 || includeZero)) {
78
+ components.push(unitComponent(name, valid, unit, code));
79
+ }
80
+ };
81
+ add("Airway pressure", u16(bytes, 0) / 10, 0, 60, "cmH2O", "cm[H2O]");
82
+ add("Inspiratory pressure", u16(bytes, 2) / 10, 0, 60, "cmH2O", "cm[H2O]");
83
+ add("Expiratory pressure", u16(bytes, 4) / 10, 0, 60, "cmH2O", "cm[H2O]");
84
+ add("Tidal volume", u16(bytes, 6), 0, 5000, "mL", "mL");
85
+ add("Minute ventilation", u16(bytes, 8) / 10, 0, 100, "L/min", "L/min");
86
+ add("Leak", u16(bytes, 10) / 10, 0, 200, "L/min", "L/min", true);
87
+ add("Respiratory rate", u16(bytes, 12), 0, 100, "breaths/min", "{breaths}/min");
88
+ add("Inspiratory time", u16(bytes, 14) / 10, 0, 10, "s", "s");
89
+ add("Inspiratory/expiratory ratio", u16(bytes, 16) / 10_000, 0, 10, "ratio", "1");
90
+ add("Blood oxygen saturation", u16(bytes, 18), 1, 100, "%", "%");
91
+ add("Pulse rate", u16(bytes, 20), 1, 300, "beats/min", "/min");
92
+ add("Heart rate", u16(bytes, 22), 1, 300, "beats/min", "/min");
93
+ if (components.length === 0 || components.every(({
94
+ valueQuantity
95
+ }) => (valueQuantity?.value ?? 0) === 0)) {
96
+ return undefined;
97
+ }
98
+ return {
99
+ measurementTypeKey: VIATOM_R20_MEASUREMENT_TYPE,
100
+ components,
101
+ recordedAt
102
+ };
103
+ };
104
+
105
+ /** Reads complete A5 notifications and safely joins split or concatenated frames. */
106
+ export class ViatomR20FrameReader {
107
+ reader = new LepuFrameReader(["a5"]);
108
+ readFrame = buffer => this.reader.readFrame(buffer);
109
+ }
110
+ //# sourceMappingURL=viatom-r20.protocol.js.map