@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
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3
+ //
4
+ // PseudocodeTranspiler
5
+ // Transpiles Raft device pseudocode (from devInfoJson resp.c.c) to JavaScript function bodies
6
+ //
7
+ // Rob Dobson (C) 2024
8
+ //
9
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.tokenize = tokenize;
12
+ exports.transpilePseudocodeToJs = transpilePseudocodeToJs;
13
+ const TOKEN_SPEC = [
14
+ ['FLOAT_KW', /float\b/],
15
+ ['INT_KW', /int\b/],
16
+ ['RETURN', /return\b/],
17
+ ['WHILE', /while\b/],
18
+ ['NEXT', /next\b/],
19
+ ['HEX_NUM', /0x[0-9A-Fa-f]+/],
20
+ ['NUM_FLOAT', /\d+\.\d*/],
21
+ ['NUM_INT', /\d+/],
22
+ ['ID', /[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/],
23
+ ['LSHIFT', /<</],
24
+ ['RSHIFT', />>/],
25
+ ['LOGICAL_AND', /&&/],
26
+ ['LOGICAL_OR', /\|\|/],
27
+ ['REL_OP', /==|!=|<=|>=|<|>/],
28
+ ['INC_OP', /\+\+/],
29
+ ['DEC_OP', /--/],
30
+ ['ASSIGN', /=/],
31
+ ['ADD_OP', /\+/],
32
+ ['SUB_OP', /-/],
33
+ ['MUL_OP', /\*/],
34
+ ['DIV_OP', /\//],
35
+ ['MOD_OP', /%/],
36
+ ['BITWISE_AND', /&/],
37
+ ['BITWISE_OR', /\|/],
38
+ ['BITWISE_XOR', /\^/],
39
+ ['BITWISE_NOT', /~/],
40
+ ['LOGICAL_NOT', /!/],
41
+ ['SEMI', /;/],
42
+ ['COMMA', /,/],
43
+ ['LPAREN', /\(/],
44
+ ['RPAREN', /\)/],
45
+ ['LBRACE', /\{/],
46
+ ['RBRACE', /\}/],
47
+ ['LBRACK', /\[/],
48
+ ['RBRACK', /\]/],
49
+ ['WS', /[ \t\n]+/],
50
+ ];
51
+ // Build the combined regex once at module load
52
+ const COMBINED_RE = new RegExp(TOKEN_SPEC.map(([name, re]) => `(?<${name}>${re.source})`).join('|'), 'g');
53
+ function tokenize(code) {
54
+ // Reset lastIndex since we reuse the global regex
55
+ COMBINED_RE.lastIndex = 0;
56
+ const tokens = [];
57
+ let match;
58
+ while ((match = COMBINED_RE.exec(code)) !== null) {
59
+ for (const [name] of TOKEN_SPEC) {
60
+ if (match.groups[name] !== undefined) {
61
+ if (name !== 'WS') {
62
+ tokens.push({ type: name, value: match[0] });
63
+ }
64
+ break;
65
+ }
66
+ }
67
+ }
68
+ return tokens;
69
+ }
70
+ const PREAMBLE = 'const out = new Proxy({}, { set(_, p, v) { if (attrValues[p]) attrValues[p].push(v); return true; } });\n' +
71
+ 'function toInt16(lo, hi) { const u = (hi << 8) | lo; return u & 0x8000 ? u - 0x10000 : u; }\n' +
72
+ 'function toInt32(b0, b1, b2, b3) { return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0; }\n';
73
+ function transpilePseudocodeToJs(pseudocode) {
74
+ const tokens = tokenize(pseudocode);
75
+ let js = PREAMBLE;
76
+ // Track int declarations so we can wrap the init expression in Math.trunc()
77
+ // to emulate C integer division semantics
78
+ let afterIntKw = false;
79
+ let wrappedInTrunc = false;
80
+ for (const token of tokens) {
81
+ switch (token.type) {
82
+ case 'INT_KW':
83
+ js += 'let ';
84
+ afterIntKw = true;
85
+ break;
86
+ case 'FLOAT_KW':
87
+ js += 'let ';
88
+ afterIntKw = false;
89
+ break;
90
+ case 'ASSIGN':
91
+ js += '=';
92
+ if (afterIntKw) {
93
+ js += 'Math.trunc(';
94
+ wrappedInTrunc = true;
95
+ }
96
+ break;
97
+ case 'SEMI':
98
+ if (wrappedInTrunc) {
99
+ js += ')';
100
+ wrappedInTrunc = false;
101
+ }
102
+ js += ';';
103
+ afterIntKw = false;
104
+ break;
105
+ case 'NEXT':
106
+ // no-op in JS — samples are pushed to arrays via the out Proxy
107
+ break;
108
+ default:
109
+ js += token.value;
110
+ break;
111
+ }
112
+ }
113
+ return js;
114
+ }
115
+ //# sourceMappingURL=PseudocodeTranspiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PseudocodeTranspiler.js","sourceRoot":"","sources":["../../src/PseudocodeTranspiler.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ export default class AttributeHandler {
5
5
  private POLL_RESULT_TIMESTAMP_SIZE;
6
6
  private POLL_RESULT_WRAP_VALUE;
7
7
  private POLL_RESULT_RESOLUTION_US;
8
- processMsgAttrGroup(msgBuffer: Uint8Array, msgBufIdx: number, deviceTimeline: DeviceTimeline, pollRespMetadata: DeviceTypePollRespMetadata, devAttrsState: DeviceAttributesState, maxDataPoints: number): number;
8
+ processMsgAttrGroup(msgBuffer: Uint8Array, msgBufIdx: number, deviceTimeline: DeviceTimeline, pollRespMetadata: DeviceTypePollRespMetadata, devAttrsState: DeviceAttributesState, maxDataPoints: number, msgEndIdx?: number): number;
9
9
  private validateAttributes;
10
10
  private processMsgAttribute;
11
11
  private signExtend;
@@ -19,12 +19,13 @@ class AttributeHandler {
19
19
  // Message timestamp size
20
20
  this.POLL_RESULT_TIMESTAMP_SIZE = 2;
21
21
  this.POLL_RESULT_WRAP_VALUE = this.POLL_RESULT_TIMESTAMP_SIZE === 2 ? 65536 : 4294967296;
22
- this.POLL_RESULT_RESOLUTION_US = 1000;
22
+ this.POLL_RESULT_RESOLUTION_US = 100;
23
23
  }
24
- processMsgAttrGroup(msgBuffer, msgBufIdx, deviceTimeline, pollRespMetadata, devAttrsState, maxDataPoints) {
24
+ processMsgAttrGroup(msgBuffer, msgBufIdx, deviceTimeline, pollRespMetadata, devAttrsState, maxDataPoints, msgEndIdx = msgBuffer.length) {
25
25
  // console.log(`processMsgAttrGroup msg ${msgHexStr} timestamp ${timestamp} origTimestamp ${origTimestamp} msgBufIdx ${msgBufIdx}`)
26
+ const boundedMsgEndIdx = Math.min(Math.max(msgEndIdx, msgBufIdx), msgBuffer.length);
26
27
  // Extract msg timestamp
27
- const { newBufIdx, timestampUs } = this.extractTimestampAndAdvanceIdx(msgBuffer, msgBufIdx, deviceTimeline);
28
+ const { newBufIdx, timestampUs } = this.extractTimestampAndAdvanceIdx(msgBuffer, msgBufIdx, deviceTimeline, boundedMsgEndIdx);
28
29
  if (newBufIdx < 0)
29
30
  return -1;
30
31
  msgBufIdx = newBufIdx;
@@ -34,7 +35,32 @@ class AttributeHandler {
34
35
  let newAttrValues = [];
35
36
  if ("c" in pollRespMetadata) {
36
37
  // Extract attribute values using custom handler
37
- newAttrValues = this._customAttrHandler.handleAttr(pollRespMetadata, msgBuffer, msgBufIdx);
38
+ newAttrValues = this._customAttrHandler.handleAttr(pollRespMetadata, msgBuffer, msgBufIdx, boundedMsgEndIdx);
39
+ // Apply per-attribute transforms that the custom handler doesn't handle
40
+ for (let attrIdx = 0; attrIdx < pollRespMetadata.a.length && attrIdx < newAttrValues.length; attrIdx++) {
41
+ const attrDef = pollRespMetadata.a[attrIdx];
42
+ if (newAttrValues[attrIdx].length === 0)
43
+ continue;
44
+ // Sign-extend values for signed types — the pseudocode produces unsigned
45
+ // values from bitwise operations, but the attribute type declares signedness
46
+ if (attrDef.t && (0, RaftDeviceInfo_1.isAttrTypeSigned)(attrDef.t)) {
47
+ const byteWidth = (0, RaftStruct_1.structSizeOf)(attrDef.t);
48
+ const signBit = 1 << (byteWidth * 8 - 1);
49
+ const range = signBit * 2;
50
+ newAttrValues[attrIdx] = newAttrValues[attrIdx].map(v => {
51
+ const n = v;
52
+ return (n & signBit) ? n - range : n;
53
+ });
54
+ }
55
+ if ("d" in attrDef && attrDef.d) {
56
+ const divisor = attrDef.d;
57
+ newAttrValues[attrIdx] = newAttrValues[attrIdx].map(v => v / divisor);
58
+ }
59
+ if ("a" in attrDef && attrDef.a !== undefined) {
60
+ const addend = attrDef.a;
61
+ newAttrValues[attrIdx] = newAttrValues[attrIdx].map(v => v + addend);
62
+ }
63
+ }
38
64
  }
39
65
  else {
40
66
  // console.log(`RaftAttrHdlr.processMsgAttrGroup ${JSON.stringify(pollRespMetadata)} msgBufIdx ${msgBufIdx} timestampUs ${timestampUs}`);
@@ -49,10 +75,9 @@ class AttributeHandler {
49
75
  }
50
76
  // console.log(`RaftAttrHdlr.processMsgAttrGroup attr ${attrDef.n} msgBufIdx ${msgBufIdx} timestampUs ${timestampUs} attrDef ${JSON.stringify(attrDef)}`);
51
77
  // Process the attribute
52
- const { values, newMsgBufIdx } = this.processMsgAttribute(attrDef, msgBuffer, msgBufIdx, msgDataStartIdx);
78
+ const { values, newMsgBufIdx } = this.processMsgAttribute(attrDef, msgBuffer, msgBufIdx, msgDataStartIdx, boundedMsgEndIdx);
53
79
  if (newMsgBufIdx < 0) {
54
- newAttrValues.push([]);
55
- continue;
80
+ return -1;
56
81
  }
57
82
  msgBufIdx = newMsgBufIdx;
58
83
  newAttrValues.push(values);
@@ -66,7 +91,7 @@ class AttributeHandler {
66
91
  // Check if any attributes were added (in addition to timestamp)
67
92
  if (newAttrValues.length === 0) {
68
93
  console.warn(`DeviceManager msg attrGroup ${JSON.stringify(pollRespMetadata)} newAttrValues ${newAttrValues} is empty`);
69
- return msgDataStartIdx + pollRespSizeBytes;
94
+ return -1;
70
95
  }
71
96
  // All attributes must have the same number of new values
72
97
  const numNewDataPoints = newAttrValues[0].length;
@@ -109,11 +134,55 @@ class AttributeHandler {
109
134
  devAttrsState[attrDef.n].newData = newAttrValues[attrIdx].length > 0;
110
135
  devAttrsState[attrDef.n].numNewValues = newAttrValues[attrIdx].length;
111
136
  }
112
- // Handle the timestamps with increments if specified
137
+ // --- Piecewise EMA timestamp reconstruction ---
138
+ // Track the last assigned sample timestamp and step forward by emaIntervalUs
139
+ // per sample. No T0 recomputation — avoids amplified batch-boundary jitter.
113
140
  const timeIncUs = pollRespMetadata.us ? pollRespMetadata.us : 1000;
141
+ if (!deviceTimeline.emaCalibrated) {
142
+ // Cold start: anchor so that sample 0 gets the poll timestamp
143
+ deviceTimeline.emaIntervalUs = timeIncUs;
144
+ deviceTimeline.emaLastSampleTimeUs = timestampUs - deviceTimeline.emaIntervalUs;
145
+ deviceTimeline.emaPrevPollTimeUs = timestampUs;
146
+ deviceTimeline.emaCalibrated = true;
147
+ deviceTimeline.emaCalibrationPolls = 1;
148
+ }
149
+ else {
150
+ // EMA interval update from poll-to-poll gap
151
+ if (numNewDataPoints > 1) {
152
+ const instantIntervalUs = (timestampUs - deviceTimeline.emaPrevPollTimeUs) / numNewDataPoints;
153
+ const alpha = deviceTimeline.emaCalibrationPolls < 20 ? 0.3 : 0.05;
154
+ deviceTimeline.emaIntervalUs = alpha * instantIntervalUs
155
+ + (1.0 - alpha) * deviceTimeline.emaIntervalUs;
156
+ }
157
+ else if (numNewDataPoints === 1) {
158
+ const instantIntervalUs = timestampUs - deviceTimeline.emaPrevPollTimeUs;
159
+ if (Number.isFinite(instantIntervalUs) && instantIntervalUs > 0) {
160
+ deviceTimeline.emaIntervalUs = instantIntervalUs;
161
+ }
162
+ }
163
+ deviceTimeline.emaPrevPollTimeUs = timestampUs;
164
+ deviceTimeline.emaCalibrationPolls++;
165
+ }
166
+ // Assign timestamps: each sample steps forward by emaIntervalUs
114
167
  const timestampsUs = Array(numNewDataPoints).fill(0);
168
+ const lastTimeUs = deviceTimeline.timestampsUs.length > 0
169
+ ? deviceTimeline.timestampsUs[deviceTimeline.timestampsUs.length - 1]
170
+ : -Infinity;
115
171
  for (let i = 0; i < numNewDataPoints; i++) {
116
- timestampsUs[i] = timestampUs + i * timeIncUs;
172
+ timestampsUs[i] = numNewDataPoints === 1
173
+ ? timestampUs
174
+ : deviceTimeline.emaLastSampleTimeUs + (i + 1) * deviceTimeline.emaIntervalUs;
175
+ // Ensure monotonically increasing timestamps
176
+ if (i === 0 && timestampsUs[0] <= lastTimeUs) {
177
+ timestampsUs[0] = lastTimeUs + 1;
178
+ }
179
+ else if (i > 0 && timestampsUs[i] <= timestampsUs[i - 1]) {
180
+ timestampsUs[i] = timestampsUs[i - 1] + 1;
181
+ }
182
+ }
183
+ // Advance the piecewise model cursor past all samples in this batch
184
+ if (deviceTimeline.emaCalibrated && numNewDataPoints > 0) {
185
+ deviceTimeline.emaLastSampleTimeUs = timestampsUs[timestampsUs.length - 1];
117
186
  }
118
187
  // Check if timeline points need to be discarded
119
188
  const discardCount = Math.max(0, deviceTimeline.timestampsUs.length + timestampsUs.length - maxDataPoints);
@@ -122,6 +191,7 @@ class AttributeHandler {
122
191
  }
123
192
  // Add the new timestamps
124
193
  deviceTimeline.timestampsUs.push(...timestampsUs);
194
+ deviceTimeline.totalSamplesAdded += numNewDataPoints;
125
195
  // Validate attributes based on the vft field
126
196
  this.validateAttributes(pollRespMetadata, devAttrsState, numNewDataPoints);
127
197
  // Return the next message buffer index
@@ -168,29 +238,34 @@ class AttributeHandler {
168
238
  }
169
239
  }
170
240
  }
171
- processMsgAttribute(attrDef, msgBuffer, msgBufIdx, msgDataStartIdx) {
241
+ processMsgAttribute(attrDef, msgBuffer, msgBufIdx, msgDataStartIdx, msgEndIdx) {
172
242
  // Current field message string index
173
243
  let curFieldBufIdx = msgBufIdx;
174
244
  let attrUsesAbsPos = false;
245
+ const boundedMsgEndIdx = Math.min(Math.max(msgEndIdx, msgDataStartIdx), msgBuffer.length);
246
+ const attrTypesOnly = attrDef.t;
247
+ const numBytesConsumed = (0, RaftStruct_1.structSizeOf)(attrTypesOnly);
175
248
  // Check for "at" field which means absolute position in the buffer
176
249
  if (attrDef.at !== undefined) {
177
250
  // Handle both single value and array of byte positions
178
251
  if (Array.isArray(attrDef.at)) {
179
252
  // Create a new buffer for non-contiguous data extraction
180
- const elemSize = (0, RaftStruct_1.structSizeOf)(attrDef.t);
253
+ const elemSize = numBytesConsumed;
181
254
  const bytesForType = new Uint8Array(elemSize);
182
255
  // Zero out the buffer
183
256
  bytesForType.fill(0);
184
257
  // Copy bytes from the specified positions
185
258
  for (let i = 0; i < attrDef.at.length && i < elemSize; i++) {
186
259
  const sourceIdx = msgDataStartIdx + attrDef.at[i];
187
- if (sourceIdx < msgBuffer.length) {
188
- bytesForType[i] = msgBuffer[sourceIdx];
260
+ if (sourceIdx >= boundedMsgEndIdx) {
261
+ return { values: [], newMsgBufIdx: -1 };
189
262
  }
263
+ bytesForType[i] = msgBuffer[sourceIdx];
190
264
  }
191
265
  // Use this buffer for attribute extraction
192
266
  msgBuffer = bytesForType;
193
267
  curFieldBufIdx = 0;
268
+ msgEndIdx = bytesForType.length;
194
269
  }
195
270
  else {
196
271
  // Standard absolute position in the buffer
@@ -199,21 +274,21 @@ class AttributeHandler {
199
274
  attrUsesAbsPos = true;
200
275
  }
201
276
  // Check if outside bounds of message
202
- if (curFieldBufIdx >= msgBuffer.length) {
277
+ const attrEndIdx = curFieldBufIdx + numBytesConsumed;
278
+ const effectiveMsgEndIdx = Math.min(Math.max(msgEndIdx, curFieldBufIdx), msgBuffer.length);
279
+ if (curFieldBufIdx >= effectiveMsgEndIdx || attrEndIdx > effectiveMsgEndIdx) {
203
280
  // console.warn(`DeviceManager msg outside bounds msgBuffer ${msgBuffer} attrName ${attrDef.n}`);
204
281
  return { values: [], newMsgBufIdx: -1 };
205
282
  }
206
- // Attribute type
207
- const attrTypesOnly = attrDef.t;
208
283
  // Slice into buffer
209
- const attrBuf = msgBuffer.slice(curFieldBufIdx);
284
+ const attrBuf = msgBuffer.slice(curFieldBufIdx, effectiveMsgEndIdx);
210
285
  // Check if a mask is used and the value is signed
211
286
  const maskOnSignedValue = "m" in attrDef && (0, RaftDeviceInfo_1.isAttrTypeSigned)(attrTypesOnly);
212
287
  // Extract the value using python-struct
213
288
  const unpackValues = (0, RaftStruct_1.structUnpack)(maskOnSignedValue ? attrTypesOnly.toUpperCase() : attrTypesOnly, attrBuf);
214
289
  let attrValues = unpackValues;
215
- // Get number of bytes consumed
216
- const numBytesConsumed = (0, RaftStruct_1.structSizeOf)(attrTypesOnly);
290
+ // Check if any values are strings (from 's' format) — skip numeric transforms for those
291
+ const hasStringValues = attrValues.some(v => typeof v === 'string');
217
292
  // // Check if sign extendable mask specified on signed value
218
293
  // if (mmSpecifiedOnSignedValue) {
219
294
  // const signBitMask = 1 << (signExtendableMaskSignPos - 1);
@@ -225,17 +300,17 @@ class AttributeHandler {
225
300
  // }
226
301
  // }
227
302
  // Check for XOR mask
228
- if ("x" in attrDef) {
303
+ if (!hasStringValues && "x" in attrDef) {
229
304
  const mask = typeof attrDef.x === "string" ? parseInt(attrDef.x, 16) : attrDef.x;
230
305
  attrValues = attrValues.map((value) => (value >>> 0) ^ mask);
231
306
  }
232
307
  // Check for AND mask
233
- if ("m" in attrDef) {
308
+ if (!hasStringValues && "m" in attrDef) {
234
309
  const mask = typeof attrDef.m === "string" ? parseInt(attrDef.m, 16) : attrDef.m;
235
310
  attrValues = attrValues.map((value) => (maskOnSignedValue ? this.signExtend(value, mask) : (value >>> 0) & mask));
236
311
  }
237
312
  // Check for a sign-bit
238
- if ("sb" in attrDef) {
313
+ if (!hasStringValues && "sb" in attrDef) {
239
314
  const signBitPos = attrDef.sb;
240
315
  const signBitMask = 1 << signBitPos;
241
316
  if ("ss" in attrDef) {
@@ -247,7 +322,7 @@ class AttributeHandler {
247
322
  }
248
323
  }
249
324
  // Check for bit shift required
250
- if ("s" in attrDef && attrDef.s) {
325
+ if (!hasStringValues && "s" in attrDef && attrDef.s) {
251
326
  const bitshift = attrDef.s;
252
327
  if (bitshift > 0) {
253
328
  attrValues = attrValues.map((value) => (value >>> 0) >>> bitshift);
@@ -257,17 +332,17 @@ class AttributeHandler {
257
332
  }
258
333
  }
259
334
  // Check for divisor
260
- if ("d" in attrDef && attrDef.d) {
335
+ if (!hasStringValues && "d" in attrDef && attrDef.d) {
261
336
  const divisor = attrDef.d;
262
- attrValues = attrValues.map((value) => (value) / divisor);
337
+ attrValues = attrValues.map((value) => value / divisor);
263
338
  }
264
339
  // Check for value to add
265
- if ("a" in attrDef && attrDef.a !== undefined) {
340
+ if (!hasStringValues && "a" in attrDef && attrDef.a !== undefined) {
266
341
  const addValue = attrDef.a;
267
- attrValues = attrValues.map((value) => (value) + addValue);
342
+ attrValues = attrValues.map((value) => value + addValue);
268
343
  }
269
344
  // Apply lookup table if defined
270
- if ("lut" in attrDef && attrDef.lut !== undefined) {
345
+ if (!hasStringValues && "lut" in attrDef && attrDef.lut !== undefined) {
271
346
  attrValues = attrValues.map((value) => {
272
347
  // Skip NaN values
273
348
  if (isNaN(value)) {
@@ -313,9 +388,10 @@ class AttributeHandler {
313
388
  }
314
389
  return value;
315
390
  }
316
- extractTimestampAndAdvanceIdx(msgBuffer, msgBufIdx, timestampWrapHandler) {
391
+ extractTimestampAndAdvanceIdx(msgBuffer, msgBufIdx, timestampWrapHandler, msgEndIdx = msgBuffer.length) {
392
+ const boundedMsgEndIdx = Math.min(Math.max(msgEndIdx, msgBufIdx), msgBuffer.length);
317
393
  // Check there are enough bytes for the timestamp
318
- if (msgBufIdx + this.POLL_RESULT_TIMESTAMP_SIZE > msgBuffer.length) {
394
+ if (msgBufIdx + this.POLL_RESULT_TIMESTAMP_SIZE > boundedMsgEndIdx) {
319
395
  return { newBufIdx: -1, timestampUs: 0 };
320
396
  }
321
397
  // Use struct to extract the timestamp
@@ -328,7 +404,7 @@ class AttributeHandler {
328
404
  timestampUs = (0, RaftStruct_1.structUnpack)(">I", tsBuffer)[0] * this.POLL_RESULT_RESOLUTION_US;
329
405
  }
330
406
  // Check if time is before lastReportTimeMs by more than 100ms - in which case a wrap around occurred to add on the max value
331
- if (timestampUs + 100000 < timestampWrapHandler.lastReportTimestampUs) {
407
+ if (timestampUs + 10000 < timestampWrapHandler.lastReportTimestampUs) {
332
408
  timestampWrapHandler.reportTimestampOffsetUs += this.POLL_RESULT_WRAP_VALUE * this.POLL_RESULT_RESOLUTION_US;
333
409
  }
334
410
  timestampWrapHandler.lastReportTimestampUs = timestampUs;
@@ -1 +1 @@
1
- {"version":3,"file":"RaftAttributeHandler.js","sourceRoot":"","sources":["../../src/RaftAttributeHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RaftAttributeHandler.js","sourceRoot":"","sources":["../../src/RaftAttributeHandler.ts"],"names":[],"mappings":";AAAA,iHAAiH;AACjH,EAAE;AACF,uBAAuB;AACvB,qCAAqC;AACrC,EAAE;AACF,sBAAsB;AACtB,EAAE;AACF,iHAAiH;;;AAEjH,4FAAwD;AACxD,qDAA8H;AAE9H,6CAA0D;AAE1D,MAAqB,gBAAgB;IAArC;QAEI,2BAA2B;QACnB,uBAAkB,GAAG,IAAI,+BAAiB,EAAE,CAAC;QAErD,yBAAyB;QACjB,+BAA0B,GAAG,CAAC,CAAC;QAC/B,2BAAsB,GAAG,IAAI,CAAC,0BAA0B,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;QACpF,8BAAyB,GAAG,GAAG,CAAC;IAuf5C,CAAC;IArfU,mBAAmB,CAAC,SAAqB,EAAE,SAAiB,EAAE,cAA8B,EAAE,gBAA4C,EAC7H,aAAoC,EAAE,aAAqB,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM;QAEzG,mIAAmI;QACnI,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAEpF,wBAAwB;QACxB,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;QAC9H,IAAI,SAAS,GAAG,CAAC;YACb,OAAO,CAAC,CAAC,CAAC;QACd,SAAS,GAAG,SAAS,CAAC;QAEtB,wBAAwB;QACxB,MAAM,eAAe,GAAG,SAAS,CAAC;QAElC,wEAAwE;QACxE,IAAI,aAAa,GAA0B,EAAE,CAAC;QAC9C,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAE1B,gDAAgD;YAChD,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;YAE7G,wEAAwE;YACxE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;gBACrG,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAElD,yEAAyE;gBACzE,6EAA6E;gBAC7E,IAAI,OAAO,CAAC,CAAC,IAAI,IAAA,iCAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3C,MAAM,SAAS,GAAG,IAAA,yBAAY,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACzC,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC;oBAC1B,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;wBACpD,MAAM,CAAC,GAAG,CAAW,CAAC;wBACtB,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,CAAC,CAAC,CAAC;gBACP,CAAC;gBAED,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;oBAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,CAAW,CAAC;oBACpC,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAY,GAAG,OAAO,CAAC,CAAC;gBACtF,CAAC;gBACD,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAW,CAAC;oBACnC,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAY,GAAG,MAAM,CAAC,CAAC;gBACrF,CAAC;YACL,CAAC;QAEL,CAAC;aAAM,CAAC;YAEJ,yIAAyI;YAEzI,0BAA0B;YAC1B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;gBAEnE,+BAA+B;gBAC/B,MAAM,OAAO,GAAwB,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACjE,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,uCAAuC,SAAS,SAAS,WAAW,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACxH,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvB,SAAS;gBACb,CAAC;gBAED,0JAA0J;gBAE1J,wBAAwB;gBACxB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;gBAC5H,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACnB,OAAO,CAAC,CAAC,CAAC;gBACd,CAAC;gBACD,SAAS,GAAG,YAAY,CAAC;gBACzB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QAED,2BAA2B;QAC3B,IAAI,iBAAiB,GAAG,SAAS,GAAG,eAAe,CAAC;QACpD,IAAI,iBAAiB,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC;YACzC,iBAAiB,GAAG,gBAAgB,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,gEAAgE;QAChE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,kBAAkB,aAAa,WAAW,CAAC,CAAC;YACxH,OAAO,CAAC,CAAC,CAAC;QACd,CAAC;QAED,yDAAyD;QACzD,MAAM,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,+BAA+B,gBAAgB,aAAa,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,aAAa,8BAA8B,CAAC,CAAC;gBAC/J,OAAO,eAAe,GAAC,iBAAiB,CAAC;YAC7C,CAAC;QACL,CAAC;QAED,kDAAkD;QAClD,IAAI,aAAa,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,+BAA+B,gBAAgB,kBAAkB,aAAa,2CAA2C,CAAC,CAAC;YACxI,OAAO,eAAe,GAAC,iBAAiB,CAAC;QAC7C,CAAC;QAED,mDAAmD;QACnD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;YACnE,wDAAwD;YACxD,MAAM,OAAO,GAAwB,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC;gBAChC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;oBACvB,IAAI,EAAE,OAAO,CAAC,CAAC;oBACf,YAAY,EAAE,IAAI;oBAClB,OAAO,EAAE,KAAK;oBACd,YAAY,EAAE,CAAC;oBACf,MAAM,EAAE,EAAE;oBACV,KAAK,EAAE,IAAA,wCAAuB,EAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/C,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC1B,MAAM,EAAE,CAAC,GAAG,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;oBACzE,aAAa,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBACrK,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;iBACtK,CAAC;YACN,CAAC;YAED,gDAAgD;YAChD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;YACzH,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACnB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YAC5D,CAAC;YAED,qBAAqB;YACrB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACrE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC1E,CAAC;QAED,iDAAiD;QACjD,6EAA6E;QAC7E,4EAA4E;QAC5E,MAAM,SAAS,GAAW,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3E,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;YAChC,8DAA8D;YAC9D,cAAc,CAAC,aAAa,GAAG,SAAS,CAAC;YACzC,cAAc,CAAC,mBAAmB,GAAG,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC;YAChF,cAAc,CAAC,iBAAiB,GAAG,WAAW,CAAC;YAC/C,cAAc,CAAC,aAAa,GAAG,IAAI,CAAC;YACpC,cAAc,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACJ,4CAA4C;YAC5C,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,iBAAiB,GAAG,CAAC,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,GAAG,gBAAgB,CAAC;gBAC9F,MAAM,KAAK,GAAG,cAAc,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnE,cAAc,CAAC,aAAa,GAAG,KAAK,GAAG,iBAAiB;sBACxB,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,cAAc,CAAC,aAAa,CAAC;YACjF,CAAC;iBAAM,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,iBAAiB,GAAG,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC;gBACzE,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;oBAC9D,cAAc,CAAC,aAAa,GAAG,iBAAiB,CAAC;gBACrD,CAAC;YACL,CAAC;YACD,cAAc,CAAC,iBAAiB,GAAG,WAAW,CAAC;YAC/C,cAAc,CAAC,mBAAmB,EAAE,CAAC;QACzC,CAAC;QAED,gEAAgE;QAChE,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YACrD,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAgB,KAAK,CAAC;gBACpC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,cAAc,CAAC,mBAAmB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,aAAa,CAAC;YAClF,6CAA6C;YAC7C,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3C,YAAY,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzD,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QACD,oEAAoE;QACpE,IAAI,cAAc,CAAC,aAAa,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACvD,cAAc,CAAC,mBAAmB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,gDAAgD;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;QAC3G,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACnB,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACxD,CAAC;QAED,yBAAyB;QACzB,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAClD,cAAc,CAAC,iBAAiB,IAAI,gBAAgB,CAAC;QAErD,6CAA6C;QAC7C,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAE3E,uCAAuC;QACvC,OAAO,eAAe,GAAC,iBAAiB,CAAC;IAC7C,CAAC;IAEO,kBAAkB,CAAC,gBAA4C,EAAE,aAAoC,EAAE,gBAAwB;QACnI,gEAAgE;QAChE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;YACnE,MAAM,OAAO,GAAwB,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAEjE,0CAA0C;YAC1C,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACtC,SAAS;YACb,CAAC;YAED,2CAA2C;YAC3C,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC;YAEvC,wDAAwD;YACxD,IAAI,CAAC,CAAC,kBAAkB,IAAI,aAAa,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,CAAC,CAAC,4BAA4B,kBAAkB,gBAAgB,CAAC,CAAC;gBACpH,SAAS;YACb,CAAC;YAED,kCAAkC;YAClC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,cAAc,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;YAEzD,uCAAuC;YACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC9D,SAAS;YACb,CAAC;YAED,kDAAkD;YAClD,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,MAAM,QAAQ,GAAG,SAAS,GAAG,gBAAgB,CAAC;YAE9C,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;gBAC9B,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC;oBACxC,yEAAyE;oBACzE,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG,gBAAgB,GAAG,CAAC,CAAC;oBAC/E,IAAI,kBAAkB,IAAI,CAAC,IAAI,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;wBAC/E,uFAAuF;wBACvF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;4BAC7C,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,wCAAwC;wBAChF,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,mBAAmB,CAAC,OAA4B,EAAE,SAAqB,EAAE,SAAiB,EAAE,eAAuB,EAAE,SAAiB;QAE1I,qCAAqC;QACrC,IAAI,cAAc,GAAG,SAAS,CAAC;QAC/B,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1F,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;QAChC,MAAM,gBAAgB,GAAG,IAAA,yBAAY,EAAC,aAAa,CAAC,CAAC;QAErD,mEAAmE;QACnE,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC3B,uDAAuD;YACvD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC5B,yDAAyD;gBACzD,MAAM,QAAQ,GAAG,gBAAgB,CAAC;gBAClC,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAE9C,sBAAsB;gBACtB,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAErB,0CAA0C;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzD,MAAM,SAAS,GAAG,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAClD,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAAC;wBAChC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC5C,CAAC;oBACD,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC;gBAED,2CAA2C;gBAC3C,SAAS,GAAG,YAAY,CAAC;gBACzB,cAAc,GAAG,CAAC,CAAC;gBACnB,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACJ,2CAA2C;gBAC3C,cAAc,GAAG,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC;YAClD,CAAC;YACD,cAAc,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,qCAAqC;QACrC,MAAM,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAC;QACrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3F,IAAI,cAAc,IAAI,kBAAkB,IAAI,UAAU,GAAG,kBAAkB,EAAE,CAAC;YAC1E,iGAAiG;YACjG,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,oBAAoB;QACpB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAEpE,kDAAkD;QAClD,MAAM,iBAAiB,GAAG,GAAG,IAAI,OAAO,IAAI,IAAA,iCAAgB,EAAC,aAAa,CAAC,CAAC;QAE5E,wCAAwC;QACxC,MAAM,YAAY,GAAG,IAAA,yBAAY,EAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC5G,IAAI,UAAU,GAAG,YAAmC,CAAC;QAErD,wFAAwF;QACxF,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QAEpE,6DAA6D;QAC7D,kCAAkC;QAClC,gEAAgE;QAChE,6CAA6C;QAC7C,iCAAiC;QACjC,yDAAyD;QACzD,eAAe;QACf,yCAAyC;QACzC,QAAQ;QACR,IAAI;QAEJ,qBAAqB;QACrB,IAAI,CAAC,eAAe,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAW,CAAC;YAC3F,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE,KAAgB,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7E,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,eAAe,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAW,CAAC;YAC3F,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAe,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,KAAgB,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC5I,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,eAAe,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,OAAO,CAAC,EAAY,CAAC;YACxC,MAAM,WAAW,GAAG,CAAC,IAAI,UAAU,CAAC;YACpC,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;gBAClB,MAAM,eAAe,GAAG,OAAO,CAAC,EAAY,CAAC;gBAC7C,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE,KAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,eAAe,GAAI,KAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5H,CAAC;iBAAM,CAAC;gBACJ,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE,KAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,CAAE,KAAgB,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC/H,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,eAAe,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAW,CAAC;YACrC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACf,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE,KAAgB,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;YACnF,CAAC;iBAAM,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACtB,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE,KAAgB,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,eAAe,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAW,CAAC;YACpC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAE,KAAgB,GAAG,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,eAAe,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAW,CAAC;YACrC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAE,KAAgB,GAAG,QAAQ,CAAC,CAAC;QACzE,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,eAAe,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACpE,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAU,EAAE;gBAC1C,kBAAkB;gBAClB,IAAI,KAAK,CAAC,KAAe,CAAC,EAAE,CAAC;oBACzB,OAAO,KAAe,CAAC;gBAC3B,CAAC;gBAED,mDAAmD;gBACnD,IAAI,YAAY,GAAkB,IAAI,CAAC;gBAEvC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC;oBAClC,kDAAkD;oBAClD,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;wBACf,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC;wBACrB,SAAS;oBACb,CAAC;oBAED,yBAAyB;oBACzB,IAAI,IAAI,CAAC,oBAAoB,CAAC,KAAe,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpD,OAAO,GAAG,CAAC,CAAC,CAAC;oBACjB,CAAC;gBACL,CAAC;gBAED,kDAAkD;gBAClD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;oBACxB,OAAO,YAAY,CAAC;gBACxB,CAAC;gBAED,oCAAoC;gBACpC,OAAO,KAAe,CAAC;YAC3B,CAAC,CAAC,CAAC;QACP,CAAC;QAED,iCAAiC;QAEjC,qDAAqD;QACrD,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAEnD,+MAA+M;QAE/M,8BAA8B;QAC9B,6EAA6E;QAC7E,IAAI;QAEJ,mBAAmB;QACnB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IAEO,UAAU,CAAC,KAAa,EAAE,IAAY;QAC1C,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,KAAK,GAAG,WAAW,CAAC;QAEpC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC,CAAE,qBAAqB;YACvC,MAAM,YAAY,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,KAAK,IAAI,YAAY,CAAC,CAAE,2BAA2B;QACvD,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,6BAA6B,CAAC,SAAqB,EAAE,SAAiB,EAAE,oBAAoC,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM;QAE9I,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAEpF,iDAAiD;QACjD,IAAI,SAAS,GAAG,IAAI,CAAC,0BAA0B,GAAG,gBAAgB,EAAE,CAAC;YACjE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAC7C,CAAC;QAED,sCAAsC;QACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzF,IAAI,WAAmB,CAAC;QACxB,IAAI,IAAI,CAAC,0BAA0B,KAAK,CAAC,EAAE,CAAC;YACxC,WAAW,GAAG,IAAA,yBAAY,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAW,GAAG,IAAI,CAAC,yBAAyB,CAAC;QAC7F,CAAC;aAAM,CAAC;YACJ,WAAW,GAAG,IAAA,yBAAY,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAW,GAAG,IAAI,CAAC,yBAAyB,CAAC;QAC7F,CAAC;QAED,6HAA6H;QAC7H,IAAI,WAAW,GAAG,KAAK,GAAG,oBAAoB,CAAC,qBAAqB,EAAG,CAAC;YACpE,oBAAoB,CAAC,uBAAuB,IAAI,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,yBAAyB,CAAC;QACjH,CAAC;QACD,oBAAoB,CAAC,qBAAqB,GAAG,WAAW,CAAC;QAEzD,mBAAmB;QACnB,WAAW,IAAI,oBAAoB,CAAC,uBAAuB,CAAC;QAE5D,oBAAoB;QACpB,SAAS,IAAI,IAAI,CAAC,0BAA0B,CAAC;QAE7C,uBAAuB;QACvB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAC9D,CAAC;IAED,+EAA+E;IACvE,oBAAoB,CAAC,KAAa,EAAE,QAAgB;QACxD,kCAAkC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEvC,mCAAmC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,4CAA4C;YAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAE3C,oBAAoB;gBACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnD,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC/C,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAEhD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,YAAY,IAAI,KAAK,IAAI,YAAY,IAAI,GAAG,EAAE,CAAC;oBAC/E,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;YACD,+BAA+B;iBAC1B,CAAC;gBACF,oBAAoB;gBACpB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnD,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAE5C,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAClD,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CAEJ;AA/fD,mCA+fC"}
@@ -16,9 +16,11 @@ export default class RaftChannelBLE implements RaftChannel {
16
16
  private readonly maxRetries;
17
17
  private _isConnected;
18
18
  private readonly _maxConnRetries;
19
+ private readonly _connRetryDelayMs;
19
20
  private _eventListenerFn;
20
21
  private _requestedBatchAckSize;
21
22
  private _requestedFileBlockSize;
23
+ private _maxBleWriteSize;
22
24
  fhBatchAckSize(): number;
23
25
  fhFileBlockSize(): number;
24
26
  setMsgHandler(raftMsgHandler: RaftMsgHandler): void;
@@ -29,10 +31,12 @@ export default class RaftChannelBLE implements RaftChannel {
29
31
  setOnConnEvent(connEventFn: RaftConnEventFn): void;
30
32
  onDisconnected(event: Event): void;
31
33
  getConnectedLocator(): string | object;
34
+ private disconnectGattBeforeRetry;
32
35
  connect(locator: string | object, _connectorOptions: ConnectorOptions): Promise<boolean>;
33
36
  disconnect(): Promise<void>;
34
37
  pauseConnection(pause: boolean): void;
35
38
  _onMsgRx(event: Event): void;
39
+ private _writeChunk;
36
40
  sendTxMsg(msg: Uint8Array): Promise<boolean>;
37
41
  sendTxMsgNoAwait(msg: Uint8Array): Promise<boolean>;
38
42
  sendTxMsgRaw(): boolean;
@@ -34,11 +34,16 @@ class RaftChannelBLE {
34
34
  // Connected flag and retries
35
35
  this._isConnected = false;
36
36
  this._maxConnRetries = 3;
37
+ this._connRetryDelayMs = 500;
37
38
  // Event listener fn
38
39
  this._eventListenerFn = null;
39
40
  // File Handler parameters
40
41
  this._requestedBatchAckSize = 10;
41
42
  this._requestedFileBlockSize = 500;
43
+ // Max bytes per BLE write - messages larger than this are split into chunks.
44
+ // Web Bluetooth doesn't expose the negotiated MTU, so use a conservative
45
+ // default that works with BLE 4.2+ (ATT_MTU 251 → payload 244).
46
+ this._maxBleWriteSize = 244;
42
47
  }
43
48
  fhBatchAckSize() {
44
49
  return this._requestedBatchAckSize;
@@ -93,6 +98,18 @@ class RaftChannelBLE {
93
98
  getConnectedLocator() {
94
99
  return this._bleDevice || "";
95
100
  }
101
+ async disconnectGattBeforeRetry() {
102
+ var _a, _b;
103
+ if (!((_b = (_a = this._bleDevice) === null || _a === void 0 ? void 0 : _a.gatt) === null || _b === void 0 ? void 0 : _b.connected)) {
104
+ return;
105
+ }
106
+ try {
107
+ await this._bleDevice.gatt.disconnect();
108
+ }
109
+ catch (error) {
110
+ RaftLog_1.default.warn(`RaftChannelBLE.connect - cannot disconnect before retry ${error}`);
111
+ }
112
+ }
96
113
  // Connect to a device
97
114
  async connect(locator, _connectorOptions) {
98
115
  // RaftLog.debug(`Selected device: ${deviceID}`);
@@ -124,8 +141,14 @@ class RaftChannelBLE {
124
141
  }
125
142
  }
126
143
  if (!service) {
127
- RaftLog_1.default.warn(`RaftChannelBLE.connect - cannot get primary service - giving up`);
128
- return false;
144
+ if (connRetry === this._maxConnRetries - 1) {
145
+ RaftLog_1.default.warn(`RaftChannelBLE.connect - cannot get primary service - attempt #${connRetry + 1} - giving up`);
146
+ return false;
147
+ }
148
+ RaftLog_1.default.warn(`RaftChannelBLE.connect - cannot get primary service - attempt #${connRetry + 1} - retrying`);
149
+ await this.disconnectGattBeforeRetry();
150
+ await new Promise(resolve => setTimeout(resolve, this._connRetryDelayMs));
151
+ continue;
129
152
  }
130
153
  RaftLog_1.default.debug(`RaftChannelBLE.connect - found service: ${service.uuid}`);
131
154
  try {
@@ -219,7 +242,22 @@ class RaftChannelBLE {
219
242
  }
220
243
  }
221
244
  }
222
- // Send a message
245
+ // Write a single chunk to the BLE characteristic
246
+ async _writeChunk(data) {
247
+ if (!this._characteristicTx)
248
+ return;
249
+ const bs = RaftUtils_1.default.toBufferSource(data);
250
+ if (this._characteristicTx.writeValueWithoutResponse) {
251
+ await this._characteristicTx.writeValueWithoutResponse(bs);
252
+ }
253
+ else if (this._characteristicTx.writeValue) {
254
+ await this._characteristicTx.writeValue(bs);
255
+ }
256
+ else if (this._characteristicTx.writeValueWithResponse) {
257
+ await this._characteristicTx.writeValueWithResponse(bs);
258
+ }
259
+ }
260
+ // Send a message, chunking if it exceeds the BLE write size
223
261
  async sendTxMsg(msg
224
262
  // _sendWithResponse: boolean
225
263
  ) {
@@ -234,18 +272,17 @@ class RaftChannelBLE {
234
272
  await new Promise((resolve) => setTimeout(resolve, 5));
235
273
  }
236
274
  this._msgTxTimeLast = Date.now();
237
- // Write to the characteristic
275
+ // Write to the characteristic, chunking if necessary
238
276
  try {
239
277
  if (this._characteristicTx) {
240
- const bs = RaftUtils_1.default.toBufferSource(msg);
241
- if (this._characteristicTx.writeValueWithoutResponse) {
242
- await this._characteristicTx.writeValueWithoutResponse(bs);
243
- }
244
- else if (this._characteristicTx.writeValue) {
245
- await this._characteristicTx.writeValue(bs);
278
+ if (msg.length <= this._maxBleWriteSize) {
279
+ await this._writeChunk(msg);
246
280
  }
247
- else if (this._characteristicTx.writeValueWithResponse) {
248
- await this._characteristicTx.writeValueWithResponse(bs);
281
+ else {
282
+ for (let offset = 0; offset < msg.length; offset += this._maxBleWriteSize) {
283
+ const chunk = msg.subarray(offset, Math.min(offset + this._maxBleWriteSize, msg.length));
284
+ await this._writeChunk(chunk);
285
+ }
249
286
  }
250
287
  }
251
288
  break;
@@ -271,17 +308,18 @@ class RaftChannelBLE {
271
308
  await new Promise((resolve) => setTimeout(resolve, 5));
272
309
  }
273
310
  this._msgTxTimeLast = Date.now();
274
- // Write to the characteristic
311
+ // Write to the characteristic, chunking if necessary
275
312
  if (this._characteristicTx) {
276
- const bs = RaftUtils_1.default.toBufferSource(msg);
277
- if (this._characteristicTx.writeValueWithoutResponse) {
278
- this._characteristicTx.writeValueWithoutResponse(bs);
279
- }
280
- else if (this._characteristicTx.writeValue) {
281
- this._characteristicTx.writeValue(bs);
313
+ if (msg.length <= this._maxBleWriteSize) {
314
+ this._writeChunk(msg);
282
315
  }
283
- else if (this._characteristicTx.writeValueWithResponse) {
284
- this._characteristicTx.writeValueWithResponse(bs);
316
+ else {
317
+ (async () => {
318
+ for (let offset = 0; offset < msg.length; offset += this._maxBleWriteSize) {
319
+ const chunk = msg.subarray(offset, Math.min(offset + this._maxBleWriteSize, msg.length));
320
+ await this._writeChunk(chunk);
321
+ }
322
+ })();
285
323
  }
286
324
  return true;
287
325
  }