@robotical/raftjs 2.1.0 → 2.1.2

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 (158) hide show
  1. package/devdocs/devbin-backwards-compatibility.md +105 -0
  2. package/devdocs/pseudocode-to-js-transpiler.md +563 -0
  3. package/dist/react-native/PseudocodeTranspiler.d.ts +6 -0
  4. package/dist/react-native/PseudocodeTranspiler.js +115 -0
  5. package/dist/react-native/PseudocodeTranspiler.js.map +1 -0
  6. package/dist/react-native/RaftAttributeHandler.d.ts +1 -1
  7. package/dist/react-native/RaftAttributeHandler.js +108 -32
  8. package/dist/react-native/RaftAttributeHandler.js.map +1 -1
  9. package/dist/react-native/RaftChannelBLE.web.d.ts +4 -0
  10. package/dist/react-native/RaftChannelBLE.web.js +59 -21
  11. package/dist/react-native/RaftChannelBLE.web.js.map +1 -1
  12. package/dist/react-native/RaftChannelSimulated.d.ts +1 -0
  13. package/dist/react-native/RaftChannelSimulated.js +9 -5
  14. package/dist/react-native/RaftChannelSimulated.js.map +1 -1
  15. package/dist/react-native/RaftChannelWebSocket.js +16 -1
  16. package/dist/react-native/RaftChannelWebSocket.js.map +1 -1
  17. package/dist/react-native/RaftConnector.d.ts +11 -1
  18. package/dist/react-native/RaftConnector.js +75 -9
  19. package/dist/react-native/RaftConnector.js.map +1 -1
  20. package/dist/react-native/RaftCustomAttrHandler.d.ts +2 -2
  21. package/dist/react-native/RaftCustomAttrHandler.js +32 -44
  22. package/dist/react-native/RaftCustomAttrHandler.js.map +1 -1
  23. package/dist/react-native/RaftDeviceInfo.d.ts +18 -0
  24. package/dist/react-native/RaftDeviceInfo.js +8 -0
  25. package/dist/react-native/RaftDeviceInfo.js.map +1 -1
  26. package/dist/react-native/RaftDeviceManager.d.ts +30 -3
  27. package/dist/react-native/RaftDeviceManager.js +618 -107
  28. package/dist/react-native/RaftDeviceManager.js.map +1 -1
  29. package/dist/react-native/RaftDeviceMgrIF.d.ts +11 -2
  30. package/dist/react-native/RaftDeviceStates.d.ts +27 -3
  31. package/dist/react-native/RaftDeviceStates.js +31 -6
  32. package/dist/react-native/RaftDeviceStates.js.map +1 -1
  33. package/dist/react-native/RaftFileHandler.d.ts +0 -1
  34. package/dist/react-native/RaftFileHandler.js +61 -23
  35. package/dist/react-native/RaftFileHandler.js.map +1 -1
  36. package/dist/react-native/RaftPublish.d.ts +2 -0
  37. package/dist/react-native/RaftPublish.js +81 -0
  38. package/dist/react-native/RaftPublish.js.map +1 -0
  39. package/dist/react-native/RaftStreamHandler.d.ts +11 -0
  40. package/dist/react-native/RaftStreamHandler.js +66 -0
  41. package/dist/react-native/RaftStreamHandler.js.map +1 -1
  42. package/dist/react-native/RaftStruct.d.ts +2 -2
  43. package/dist/react-native/RaftStruct.js +97 -26
  44. package/dist/react-native/RaftStruct.js.map +1 -1
  45. package/dist/react-native/RaftSystemType.d.ts +1 -0
  46. package/dist/react-native/RaftSystemUtils.d.ts +17 -1
  47. package/dist/react-native/RaftSystemUtils.js +51 -0
  48. package/dist/react-native/RaftSystemUtils.js.map +1 -1
  49. package/dist/react-native/RaftTimezone.d.ts +16 -0
  50. package/dist/react-native/RaftTimezone.js +153 -0
  51. package/dist/react-native/RaftTimezone.js.map +1 -0
  52. package/dist/react-native/RaftTypes.d.ts +27 -1
  53. package/dist/react-native/RaftTypes.js.map +1 -1
  54. package/dist/react-native/RaftUpdateManager.js +1 -1
  55. package/dist/react-native/RaftUpdateManager.js.map +1 -1
  56. package/dist/react-native/main.d.ts +2 -0
  57. package/dist/react-native/main.js +6 -1
  58. package/dist/react-native/main.js.map +1 -1
  59. package/dist/web/PseudocodeTranspiler.d.ts +6 -0
  60. package/dist/web/PseudocodeTranspiler.js +115 -0
  61. package/dist/web/PseudocodeTranspiler.js.map +1 -0
  62. package/dist/web/RaftAttributeHandler.d.ts +1 -1
  63. package/dist/web/RaftAttributeHandler.js +108 -32
  64. package/dist/web/RaftAttributeHandler.js.map +1 -1
  65. package/dist/web/RaftChannelBLE.web.d.ts +4 -0
  66. package/dist/web/RaftChannelBLE.web.js +59 -21
  67. package/dist/web/RaftChannelBLE.web.js.map +1 -1
  68. package/dist/web/RaftChannelSimulated.d.ts +1 -0
  69. package/dist/web/RaftChannelSimulated.js +9 -5
  70. package/dist/web/RaftChannelSimulated.js.map +1 -1
  71. package/dist/web/RaftChannelWebSocket.js +16 -1
  72. package/dist/web/RaftChannelWebSocket.js.map +1 -1
  73. package/dist/web/RaftConnector.d.ts +11 -1
  74. package/dist/web/RaftConnector.js +75 -9
  75. package/dist/web/RaftConnector.js.map +1 -1
  76. package/dist/web/RaftCustomAttrHandler.d.ts +2 -2
  77. package/dist/web/RaftCustomAttrHandler.js +32 -44
  78. package/dist/web/RaftCustomAttrHandler.js.map +1 -1
  79. package/dist/web/RaftDeviceInfo.d.ts +18 -0
  80. package/dist/web/RaftDeviceInfo.js +8 -0
  81. package/dist/web/RaftDeviceInfo.js.map +1 -1
  82. package/dist/web/RaftDeviceManager.d.ts +30 -3
  83. package/dist/web/RaftDeviceManager.js +618 -107
  84. package/dist/web/RaftDeviceManager.js.map +1 -1
  85. package/dist/web/RaftDeviceMgrIF.d.ts +11 -2
  86. package/dist/web/RaftDeviceStates.d.ts +27 -3
  87. package/dist/web/RaftDeviceStates.js +31 -6
  88. package/dist/web/RaftDeviceStates.js.map +1 -1
  89. package/dist/web/RaftFileHandler.d.ts +0 -1
  90. package/dist/web/RaftFileHandler.js +61 -23
  91. package/dist/web/RaftFileHandler.js.map +1 -1
  92. package/dist/web/RaftPublish.d.ts +2 -0
  93. package/dist/web/RaftPublish.js +81 -0
  94. package/dist/web/RaftPublish.js.map +1 -0
  95. package/dist/web/RaftStreamHandler.d.ts +11 -0
  96. package/dist/web/RaftStreamHandler.js +66 -0
  97. package/dist/web/RaftStreamHandler.js.map +1 -1
  98. package/dist/web/RaftStruct.d.ts +2 -2
  99. package/dist/web/RaftStruct.js +97 -26
  100. package/dist/web/RaftStruct.js.map +1 -1
  101. package/dist/web/RaftSystemType.d.ts +1 -0
  102. package/dist/web/RaftSystemUtils.d.ts +17 -1
  103. package/dist/web/RaftSystemUtils.js +51 -0
  104. package/dist/web/RaftSystemUtils.js.map +1 -1
  105. package/dist/web/RaftTimezone.d.ts +16 -0
  106. package/dist/web/RaftTimezone.js +153 -0
  107. package/dist/web/RaftTimezone.js.map +1 -0
  108. package/dist/web/RaftTypes.d.ts +27 -1
  109. package/dist/web/RaftTypes.js.map +1 -1
  110. package/dist/web/RaftUpdateManager.js +1 -1
  111. package/dist/web/RaftUpdateManager.js.map +1 -1
  112. package/dist/web/main.d.ts +2 -0
  113. package/dist/web/main.js +6 -1
  114. package/dist/web/main.js.map +1 -1
  115. package/examples/dashboard/package.json +2 -2
  116. package/examples/dashboard/src/DeviceActionsForm.tsx +158 -8
  117. package/examples/dashboard/src/DeviceLineChart.tsx +16 -3
  118. package/examples/dashboard/src/DevicePanel.tsx +92 -11
  119. package/examples/dashboard/src/DeviceSelectDialog.tsx +224 -0
  120. package/examples/dashboard/src/DeviceStatsPanel.tsx +76 -0
  121. package/examples/dashboard/src/DevicesPanel.tsx +11 -0
  122. package/examples/dashboard/src/LogConfigPanel.tsx +357 -0
  123. package/examples/dashboard/src/LogFilesPanel.tsx +200 -0
  124. package/examples/dashboard/src/LoggingPanel.tsx +264 -0
  125. package/examples/dashboard/src/Main.tsx +12 -2
  126. package/examples/dashboard/src/SettingsScreen.tsx +9 -4
  127. package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +10 -3
  128. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +37 -3
  129. package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +10 -2
  130. package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +41 -7
  131. package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +34 -3
  132. package/examples/dashboard/src/styles.css +766 -1
  133. package/notes/web-ble-reconnect-retry.md +69 -0
  134. package/package.json +10 -7
  135. package/src/PseudocodeTranspiler.test.ts +372 -0
  136. package/src/PseudocodeTranspiler.ts +127 -0
  137. package/src/RaftAttributeHandler.ts +152 -76
  138. package/src/RaftChannelBLE.web.ts +62 -20
  139. package/src/RaftChannelSimulated.ts +10 -5
  140. package/src/RaftChannelWebSocket.ts +16 -2
  141. package/src/RaftConnector.ts +93 -15
  142. package/src/RaftCustomAttrHandler.ts +35 -45
  143. package/src/RaftDeviceInfo.ts +27 -0
  144. package/src/RaftDeviceManager.test.ts +164 -0
  145. package/src/RaftDeviceManager.ts +705 -127
  146. package/src/RaftDeviceMgrIF.ts +13 -2
  147. package/src/RaftDeviceStates.ts +49 -8
  148. package/src/RaftFileHandler.ts +69 -28
  149. package/src/RaftPublish.ts +92 -0
  150. package/src/RaftStreamHandler.ts +84 -1
  151. package/src/RaftStruct.test.ts +229 -0
  152. package/src/RaftStruct.ts +101 -37
  153. package/src/RaftSystemType.ts +1 -0
  154. package/src/RaftSystemUtils.ts +59 -0
  155. package/src/RaftTimezone.ts +151 -0
  156. package/src/RaftTypes.ts +34 -1
  157. package/src/RaftUpdateManager.ts +1 -1
  158. package/src/main.ts +2 -0
@@ -8,11 +8,12 @@
8
8
  //
9
9
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
+ const PseudocodeTranspiler_1 = require("./PseudocodeTranspiler");
11
12
  class CustomAttrHandler {
12
13
  constructor() {
13
14
  this._jsFunctionCache = new Map();
14
15
  }
15
- handleAttr(pollRespMetadata, msgBuffer, msgBufIdx) {
16
+ handleAttr(pollRespMetadata, msgBuffer, msgBufIdx, msgEndIdx = msgBuffer.length) {
16
17
  // Number of bytes in each message
17
18
  const numMsgBytes = pollRespMetadata.b;
18
19
  // Create a vector for each attribute in the metadata
@@ -28,63 +29,50 @@ class CustomAttrHandler {
28
29
  if (!customFnDef) {
29
30
  return attrValueVecs;
30
31
  }
31
- // Provide the message buffer sliced to the data portion
32
- const buf = msgBuffer.slice(msgBufIdx);
33
- if (buf.length < numMsgBytes) {
32
+ // Provide this poll block to the custom handler. Use the smaller of
33
+ // pollRespMetadata.b and the bytes actually available — variable-length
34
+ // samples may be shorter than b, and the last sample in a frame may not
35
+ // have b bytes remaining in the buffer.
36
+ const boundedMsgEndIdx = Math.min(Math.max(msgEndIdx, msgBufIdx), msgBuffer.length);
37
+ const availableBytes = Math.min(numMsgBytes, boundedMsgEndIdx - msgBufIdx);
38
+ if (availableBytes <= 0) {
34
39
  return [];
35
40
  }
36
- // Execute supplied JS implementation if provided
37
- if (customFnDef.j && customFnDef.j.trim().length > 0) {
38
- const jsFn = this.getOrCompileJsFunction(customFnDef);
39
- if (!jsFn) {
40
- return attrValueVecs;
41
- }
42
- try {
43
- jsFn(buf, attrValues, attrValueVecs, pollRespMetadata, msgBuffer, msgBufIdx, numMsgBytes);
44
- }
45
- catch (err) {
46
- console.error(`CustomAttrHandler JS function ${customFnDef.n} execution failed`, err);
47
- }
41
+ const buf = msgBuffer.slice(msgBufIdx, msgBufIdx + availableBytes);
42
+ const fn = this.getOrCompileFunction(customFnDef);
43
+ if (!fn) {
48
44
  return attrValueVecs;
49
45
  }
50
- // Custom code for each device type handled natively
51
- if (customFnDef.n === "max30101_fifo") {
52
- // Generated code ...
53
- const N = (buf[0] + 32 - buf[2]) % 32;
54
- let k = 3;
55
- let i = 0;
56
- while (i < N) {
57
- attrValues["Red"].push(0);
58
- attrValues["Red"][attrValues["Red"].length - 1] = (buf[k] << 16) | (buf[k + 1] << 8) | buf[k + 2];
59
- attrValues["IR"].push(0);
60
- attrValues["IR"][attrValues["IR"].length - 1] = (buf[k + 3] << 16) | (buf[k + 4] << 8) | buf[k + 5];
61
- k += 6;
62
- i++;
63
- }
46
+ try {
47
+ fn(buf, attrValues, attrValueVecs, pollRespMetadata, msgBuffer, msgBufIdx, numMsgBytes);
64
48
  }
65
- else if (customFnDef.n === "gravity_o2_calc") {
66
- const key = 20.9 / 120.0;
67
- const val = key * (buf[0] + buf[1] / 10.0 + buf[2] / 100.0);
68
- attrValues["oxygen"].push(val);
49
+ catch (err) {
50
+ console.error(`CustomAttrHandler function ${customFnDef.n} execution failed`, err);
69
51
  }
70
52
  return attrValueVecs;
71
53
  }
72
- getOrCompileJsFunction(customFnDef) {
73
- if (!customFnDef.j) {
54
+ getOrCompileFunction(customFnDef) {
55
+ var _a;
56
+ // Prefer explicit JS if provided, otherwise transpile from pseudocode
57
+ let jsSource = (_a = customFnDef.j) === null || _a === void 0 ? void 0 : _a.trim();
58
+ if (!jsSource && customFnDef.c) {
59
+ jsSource = (0, PseudocodeTranspiler_1.transpilePseudocodeToJs)(customFnDef.c);
60
+ }
61
+ if (!jsSource) {
74
62
  return null;
75
63
  }
76
- const cacheKey = `${customFnDef.n}::${customFnDef.j}`;
77
- const cachedFn = this._jsFunctionCache.get(cacheKey);
78
- if (cachedFn) {
79
- return cachedFn;
64
+ const cacheKey = `${customFnDef.n}::${jsSource}`;
65
+ const cached = this._jsFunctionCache.get(cacheKey);
66
+ if (cached) {
67
+ return cached;
80
68
  }
81
69
  try {
82
- const compiledFn = new Function("buf", "attrValues", "attrValueVecs", "pollRespMetadata", "msgBuffer", "msgBufIdx", "numMsgBytes", customFnDef.j);
83
- this._jsFunctionCache.set(cacheKey, compiledFn);
84
- return compiledFn;
70
+ const fn = new Function("buf", "attrValues", "attrValueVecs", "pollRespMetadata", "msgBuffer", "msgBufIdx", "numMsgBytes", jsSource);
71
+ this._jsFunctionCache.set(cacheKey, fn);
72
+ return fn;
85
73
  }
86
74
  catch (err) {
87
- console.error(`CustomAttrHandler failed to compile JS function ${customFnDef.n}`, err);
75
+ console.error(`CustomAttrHandler failed to compile function ${customFnDef.n}`, err);
88
76
  return null;
89
77
  }
90
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RaftCustomAttrHandler.js","sourceRoot":"","sources":["../../src/RaftCustomAttrHandler.ts"],"names":[],"mappings":";AAAA,iHAAiH;AACjH,EAAE;AACF,wBAAwB;AACxB,4CAA4C;AAC5C,EAAE;AACF,sBAAsB;AACtB,EAAE;AACF,iHAAiH;;AAcjH,MAAqB,iBAAiB;IAAtC;QAEY,qBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;IA6FjE,CAAC;IA3FU,UAAU,CAAC,gBAA4C,EAAE,SAAqB,EAAE,SAAiB;QAEpG,kCAAkC;QAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC;QAEvC,qDAAqD;QACrD,MAAM,aAAa,GAAe,EAAE,CAAC;QAErC,6CAA6C;QAC7C,MAAM,UAAU,GAA6B,EAAE,CAAC;QAEhD,+BAA+B;QAC/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;YACnE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,wDAAwD;QACxD,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,GAAG,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,iDAAiD;QACjD,IAAI,WAAW,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,OAAO,aAAa,CAAC;YACzB,CAAC;YACD,IAAI,CAAC;gBACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YAC9F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,iCAAiC,WAAW,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;YAC1F,CAAC;YACD,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,oDAAoD;QACpD,IAAI,WAAW,CAAC,CAAC,KAAK,eAAe,EAAE,CAAC;YACpC,qBAAqB;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACX,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1B,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpG,CAAC,IAAI,CAAC,CAAC;gBACP,CAAC,EAAE,CAAC;YACR,CAAC;QACL,CAAC;aAAM,IAAI,WAAW,CAAC,CAAC,KAAK,iBAAiB,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;YAC5D,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAEO,sBAAsB,CAAC,WAAqC;QAChE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,WAAW,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,QAAQ,CAC3B,KAAK,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,CAAC,CAAC,CACE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mDAAmD,WAAW,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACvF,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;CACJ;AA/FD,oCA+FC"}
1
+ {"version":3,"file":"RaftCustomAttrHandler.js","sourceRoot":"","sources":["../../src/RaftCustomAttrHandler.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,22 @@ export interface DeviceTypePollRespMetadata {
38
38
  c?: CustomFunctionDefinition;
39
39
  us?: number;
40
40
  }
41
+ export interface SampleRateResult {
42
+ ok: boolean;
43
+ requestedRateHz: number;
44
+ actualRateHz: number;
45
+ intervalUs: number;
46
+ numSamples: number;
47
+ error?: string;
48
+ }
49
+ export interface ActionMapEntry {
50
+ w: string;
51
+ i?: number;
52
+ s?: number;
53
+ }
54
+ export type ActionMapValue = string | ActionMapEntry;
55
+ export declare function getActionMapHex(entry: ActionMapValue): string;
56
+ export declare function getActionMapEntry(entry: ActionMapValue): ActionMapEntry | null;
41
57
  export interface DeviceTypeAction {
42
58
  n: string;
43
59
  t?: string;
@@ -51,6 +67,8 @@ export interface DeviceTypeAction {
51
67
  mul?: number;
52
68
  sub?: number;
53
69
  d?: number;
70
+ map?: Record<string, ActionMapValue>;
71
+ desc?: string;
54
72
  }
55
73
  export interface DeviceTypeInfo {
56
74
  name: string;
@@ -11,6 +11,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
11
11
  exports.getAttrTypeBits = getAttrTypeBits;
12
12
  exports.isAttrTypeSigned = isAttrTypeSigned;
13
13
  exports.decodeAttrUnitsEncoding = decodeAttrUnitsEncoding;
14
+ exports.getActionMapHex = getActionMapHex;
15
+ exports.getActionMapEntry = getActionMapEntry;
14
16
  const attrTypeBits = {
15
17
  "c": 8, "b": 8, "B": 8, "?": 8,
16
18
  "h": 16, "H": 16, ">h": 16, "<h": 16, ">H": 16, "<H": 16,
@@ -47,4 +49,10 @@ function decodeAttrUnitsEncoding(unitsEncoding) {
47
49
  // Replace instances of HTML encoded chars like &deg; with the actual char
48
50
  return unitsEncoding.replace(/&deg;/g, "°");
49
51
  }
52
+ function getActionMapHex(entry) {
53
+ return typeof entry === 'string' ? entry : entry.w;
54
+ }
55
+ function getActionMapEntry(entry) {
56
+ return typeof entry === 'object' ? entry : null;
57
+ }
50
58
  //# sourceMappingURL=RaftDeviceInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RaftDeviceInfo.js","sourceRoot":"","sources":["../../src/RaftDeviceInfo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RaftDeviceInfo.js","sourceRoot":"","sources":["../../src/RaftDeviceInfo.ts"],"names":[],"mappings":";AAAA,iHAAiH;AACjH,EAAE;AACF,iBAAiB;AACjB,sCAAsC;AACtC,EAAE;AACF,sBAAsB;AACtB,EAAE;AACF,iHAAiH;;AAWjH,0CAqBC;AAED,4CAGC;AAED,0DAGC;AA2DD,0CAEC;AAED,8CAEC;AAzGD,MAAM,YAAY,GAA8B;IAC5C,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAC9B,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IACxD,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IAClH,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IACxD,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IAC3B,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;CAC1B,CAAC;AAEN,SAAgB,eAAe,CAAC,QAAgB;IAC5C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,YAAY,GAAG,QAAQ,CAAC;IAE5B,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,YAAY,GAAG,cAAc,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,GAAG,YAAY,CAAC;YAC1B,CAAC;YACD,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC;AACtB,CAAC;AAED,SAAgB,gBAAgB,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5H,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,CAAC;AACvG,CAAC;AAED,SAAgB,uBAAuB,CAAC,aAAqB;IACzD,0EAA0E;IAC1E,OAAO,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AA2DD,SAAgB,eAAe,CAAC,KAAqB;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAqB;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC"}
@@ -1,5 +1,5 @@
1
- import { DeviceAttributeState, DevicesState, DeviceState } from "./RaftDeviceStates";
2
- import { DeviceTypeAction } from "./RaftDeviceInfo";
1
+ import { DeviceAttributeState, DevicesState, DeviceState, DeviceStats } from "./RaftDeviceStates";
2
+ import { DeviceTypeAction, SampleRateResult } from "./RaftDeviceInfo";
3
3
  import RaftSystemUtils from "./RaftSystemUtils";
4
4
  import RaftDeviceMgrIF from "./RaftDeviceMgrIF";
5
5
  export interface DeviceDecodedData {
@@ -8,7 +8,7 @@ export interface DeviceDecodedData {
8
8
  deviceAddress: string;
9
9
  deviceType: string;
10
10
  attrGroupName?: string;
11
- attrValues: Record<string, number[]>;
11
+ attrValues: Record<string, (number | string)[]>;
12
12
  timestampsUs: number[];
13
13
  markers?: Record<string, unknown>;
14
14
  fromOfflineBuffer?: boolean;
@@ -26,9 +26,15 @@ export declare class DeviceManager implements RaftDeviceMgrIF {
26
26
  private _newDeviceAttributeCallbacks;
27
27
  private _newAttributeDataCallbacks;
28
28
  private _decodedDataCallbacks;
29
+ private _deviceRemovedCallbacks;
29
30
  private _debugMsgIndex;
31
+ private _statsWindowMs;
32
+ private _deviceStats;
33
+ private _malformedSampleWarnLastMs;
30
34
  getDevicesState(): DevicesState;
31
35
  getDeviceState(deviceKey: string): DeviceState;
36
+ getDeviceStats(deviceKey: string): DeviceStats;
37
+ resetDeviceStats(deviceKey: string): void;
32
38
  private _cachedDeviceTypeRecs;
33
39
  private _cachedDeviceTypePreviousAttemptTimes;
34
40
  private _pendingDeviceTypeRequests;
@@ -44,16 +50,37 @@ export declare class DeviceManager implements RaftDeviceMgrIF {
44
50
  removeAttributeDataCallback(callback: (deviceKey: string, attrState: DeviceAttributeState) => void): void;
45
51
  addDecodedDataCallback(callback: (decoded: DeviceDecodedData) => void): void;
46
52
  removeDecodedDataCallback(callback: (decoded: DeviceDecodedData) => void): void;
53
+ addDeviceRemovedCallback(callback: (deviceKey: string, state: DeviceState) => void): void;
54
+ removeDeviceRemovedCallback(callback: (deviceKey: string, state: DeviceState) => void): void;
47
55
  setFriendlyName(friendlyName: string): Promise<void>;
48
56
  handleClientMsgBinary(rxMsg: Uint8Array): Promise<void>;
49
57
  handleClientMsgJson(jsonMsg: string): Promise<void>;
50
58
  private processStateCallback;
59
+ private removeDevice;
51
60
  private getDeviceTypeInfo;
52
61
  private executeDeviceTypeInfoRequest;
62
+ private hasValidRecordAt;
63
+ private resolveRecordPayloadFormat;
64
+ private areLengthPrefixedSamplesValid;
65
+ private areLegacyRawSamplesValid;
66
+ private getBinaryDeviceKey;
67
+ private getLegacyRawSampleLen;
68
+ private getPollRespPayloadSize;
69
+ private parseDeviceKeyForCommand;
70
+ private warnMalformedSample;
53
71
  private toHex;
54
72
  sendAction(deviceKey: string, action: DeviceTypeAction, data: number[]): Promise<boolean>;
55
73
  sendCompoundAction(deviceKey: string, action: DeviceTypeAction, data: number[][]): Promise<boolean>;
74
+ setSampleRate(deviceKey: string, sampleRateHz: number, options?: {
75
+ numSamples?: number;
76
+ intervalUs?: number;
77
+ maxNumSamples?: number;
78
+ }): Promise<SampleRateResult>;
56
79
  private hexToBytes;
80
+ private createEmptyStats;
81
+ private getOrCreateDeviceStats;
82
+ private cloneDeviceStats;
83
+ private updateDeviceStats;
57
84
  private snapshotAttrLengths;
58
85
  private emitDecodedData;
59
86
  private extractMarkers;