@robdobsn/raftjs 1.3.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/react-native/RaftAttributeHandler.d.ts +1 -1
  2. package/dist/react-native/RaftAttributeHandler.js +13 -10
  3. package/dist/react-native/RaftAttributeHandler.js.map +1 -1
  4. package/dist/react-native/RaftChannelBLE.native.d.ts +9 -11
  5. package/dist/react-native/RaftChannelBLE.native.js +33 -40
  6. package/dist/react-native/RaftChannelBLE.native.js.map +1 -1
  7. package/dist/react-native/RaftChannelBLE.web.d.ts +3 -4
  8. package/dist/react-native/RaftChannelBLE.web.js +7 -8
  9. package/dist/react-native/RaftChannelBLE.web.js.map +1 -1
  10. package/dist/react-native/RaftChannelBLEScanner.native.d.ts +6 -6
  11. package/dist/react-native/RaftChannelBLEScanner.native.js +38 -46
  12. package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -1
  13. package/dist/react-native/RaftConnector.d.ts +3 -3
  14. package/dist/react-native/RaftConnector.js +3 -3
  15. package/dist/react-native/RaftConnector.js.map +1 -1
  16. package/dist/react-native/RaftCustomAttrHandler.d.ts +1 -1
  17. package/dist/react-native/RaftCustomAttrHandler.js +4 -4
  18. package/dist/react-native/RaftCustomAttrHandler.js.map +1 -1
  19. package/dist/react-native/RaftDeviceManager.d.ts +3 -3
  20. package/dist/react-native/RaftDeviceManager.js +12 -10
  21. package/dist/react-native/RaftDeviceManager.js.map +1 -1
  22. package/dist/react-native/RaftDeviceMgrIF.d.ts +2 -3
  23. package/dist/react-native/RaftDeviceStates.js +1 -1
  24. package/dist/react-native/RaftDeviceStates.js.map +1 -1
  25. package/dist/react-native/RaftMsgHandler.js +1 -2
  26. package/dist/react-native/RaftMsgHandler.js.map +1 -1
  27. package/dist/react-native/RaftStruct.d.ts +3 -0
  28. package/dist/react-native/RaftStruct.js +207 -0
  29. package/dist/react-native/RaftStruct.js.map +1 -0
  30. package/dist/react-native/RaftSysTypeManager.d.ts +14 -0
  31. package/dist/react-native/RaftSysTypeManager.js +53 -0
  32. package/dist/react-native/RaftSysTypeManager.js.map +1 -0
  33. package/dist/react-native/RaftSystemType.d.ts +3 -0
  34. package/dist/react-native/RaftTypes.d.ts +2 -2
  35. package/dist/react-native/RaftTypes.js +3 -3
  36. package/dist/react-native/RaftTypes.js.map +1 -1
  37. package/dist/react-native/RaftUpdateManager.js +6 -3
  38. package/dist/react-native/RaftUpdateManager.js.map +1 -1
  39. package/dist/react-native/RaftUtils.d.ts +1 -0
  40. package/dist/react-native/RaftUtils.js +17 -4
  41. package/dist/react-native/RaftUtils.js.map +1 -1
  42. package/dist/react-native/main.d.ts +1 -0
  43. package/dist/react-native/main.js +3 -1
  44. package/dist/react-native/main.js.map +1 -1
  45. package/dist/web/RaftAttributeHandler.d.ts +1 -1
  46. package/dist/web/RaftAttributeHandler.js +13 -10
  47. package/dist/web/RaftAttributeHandler.js.map +1 -1
  48. package/dist/web/RaftChannelBLE.web.d.ts +3 -4
  49. package/dist/web/RaftChannelBLE.web.js +7 -8
  50. package/dist/web/RaftChannelBLE.web.js.map +1 -1
  51. package/dist/web/RaftConnector.d.ts +3 -3
  52. package/dist/web/RaftConnector.js +3 -3
  53. package/dist/web/RaftConnector.js.map +1 -1
  54. package/dist/web/RaftCustomAttrHandler.d.ts +1 -1
  55. package/dist/web/RaftCustomAttrHandler.js +4 -4
  56. package/dist/web/RaftCustomAttrHandler.js.map +1 -1
  57. package/dist/web/RaftDeviceManager.d.ts +3 -3
  58. package/dist/web/RaftDeviceManager.js +12 -10
  59. package/dist/web/RaftDeviceManager.js.map +1 -1
  60. package/dist/web/RaftDeviceMgrIF.d.ts +2 -3
  61. package/dist/web/RaftDeviceStates.js +1 -1
  62. package/dist/web/RaftDeviceStates.js.map +1 -1
  63. package/dist/web/RaftMsgHandler.js +1 -2
  64. package/dist/web/RaftMsgHandler.js.map +1 -1
  65. package/dist/web/RaftStruct.d.ts +3 -0
  66. package/dist/web/RaftStruct.js +207 -0
  67. package/dist/web/RaftStruct.js.map +1 -0
  68. package/dist/web/RaftSysTypeManager.d.ts +14 -0
  69. package/dist/web/RaftSysTypeManager.js +53 -0
  70. package/dist/web/RaftSysTypeManager.js.map +1 -0
  71. package/dist/web/RaftSystemType.d.ts +3 -0
  72. package/dist/web/RaftTypes.d.ts +2 -2
  73. package/dist/web/RaftTypes.js +3 -3
  74. package/dist/web/RaftTypes.js.map +1 -1
  75. package/dist/web/RaftUpdateManager.js +6 -3
  76. package/dist/web/RaftUpdateManager.js.map +1 -1
  77. package/dist/web/RaftUtils.d.ts +1 -0
  78. package/dist/web/RaftUtils.js +17 -4
  79. package/dist/web/RaftUtils.js.map +1 -1
  80. package/dist/web/main.d.ts +1 -0
  81. package/dist/web/main.js +3 -1
  82. package/dist/web/main.js.map +1 -1
  83. package/examples/dashboard/package.json +2 -12
  84. package/examples/dashboard/src/ConnManager.ts +9 -16
  85. package/examples/dashboard/src/Main.tsx +13 -5
  86. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +3 -0
  87. package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +24 -0
  88. package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +87 -0
  89. package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +0 -0
  90. package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +3 -0
  91. package/examples/dashboard/src/index.tsx +0 -2
  92. package/package.json +2 -11
  93. package/src/RaftAttributeHandler.ts +17 -14
  94. package/src/RaftChannelBLE.native.ts +43 -51
  95. package/src/RaftChannelBLE.web.ts +8 -8
  96. package/src/RaftChannelBLEScanner.native.ts +37 -44
  97. package/src/RaftConnector.ts +3 -3
  98. package/src/RaftCustomAttrHandler.ts +5 -5
  99. package/src/RaftDeviceManager.ts +16 -15
  100. package/src/RaftDeviceMgrIF.ts +2 -3
  101. package/src/RaftDeviceStates.ts +1 -1
  102. package/src/RaftMsgHandler.ts +1 -2
  103. package/src/RaftStruct.ts +208 -0
  104. package/src/RaftSysTypeManager.ts +60 -0
  105. package/src/RaftSystemType.ts +3 -0
  106. package/src/RaftTypes.ts +2 -2
  107. package/src/RaftUpdateManager.ts +6 -3
  108. package/src/RaftUtils.ts +14 -4
  109. package/src/main.ts +1 -1
@@ -11,11 +11,10 @@ import { DeviceAttributeState, DevicesState, DeviceState, getDeviceKey } from ".
11
11
  import { DeviceMsgJson } from "./RaftDeviceMsg";
12
12
  import { RaftOKFail } from './RaftTypes';
13
13
  import { DeviceTypeInfo, DeviceTypeAction, DeviceTypeInfoRecs, RaftDevTypeInfoResponse } from "./RaftDeviceInfo";
14
- import struct, { DataType } from 'python-struct';
15
14
  import AttributeHandler from "./RaftAttributeHandler";
16
15
  import RaftSystemUtils from "./RaftSystemUtils";
17
16
  import RaftDeviceMgrIF from "./RaftDeviceMgrIF";
18
- import { Buffer } from 'buffer';
17
+ import { structPack } from "./RaftStruct";
19
18
 
20
19
  export class DeviceManager implements RaftDeviceMgrIF{
21
20
 
@@ -130,7 +129,7 @@ export class DeviceManager implements RaftDeviceMgrIF{
130
129
 
131
130
  public handleClientMsgJson(jsonMsg: string) {
132
131
 
133
- let data = JSON.parse(jsonMsg) as DeviceMsgJson;
132
+ const data = JSON.parse(jsonMsg) as DeviceMsgJson;
134
133
  // console.log(`DeviceManager websocket message ${JSON.stringify(data)}`);
135
134
 
136
135
  // Iterate over the buses
@@ -221,9 +220,6 @@ export class DeviceManager implements RaftDeviceMgrIF{
221
220
  // Convert the hex string to an arraybuffer by converting each pair of hex chars to a byte
222
221
  const msgBytes = this.hexToBytes(msgHexStr);
223
222
 
224
- // Convert to a Buffer
225
- const msgBuffer = Buffer.from(msgBytes);
226
-
227
223
  // Work through the message which may contain multiple data instances
228
224
  let msgBufIdx = 0;
229
225
 
@@ -234,7 +230,7 @@ export class DeviceManager implements RaftDeviceMgrIF{
234
230
  while (msgBufIdx < msgBytes.length) {
235
231
 
236
232
  const curTimelineLen = deviceState.deviceTimeline.timestampsUs.length;
237
- const newMsgBufIdx = this._attributeHandler.processMsgAttrGroup(msgBuffer, msgBufIdx,
233
+ const newMsgBufIdx = this._attributeHandler.processMsgAttrGroup(msgBytes, msgBufIdx,
238
234
  deviceState.deviceTimeline, pollRespMetadata,
239
235
  deviceState.deviceAttributes,
240
236
  this._maxDatapointsToStore);
@@ -284,7 +280,7 @@ export class DeviceManager implements RaftDeviceMgrIF{
284
280
  }
285
281
 
286
282
  // Iterate over the attributes
287
- Object.entries(deviceState.deviceAttributes).forEach(([_attrKey, attrState]) => {
283
+ Object.entries(deviceState.deviceAttributes).forEach(([, attrState]): void => {
288
284
  if (attrState.newAttribute) {
289
285
  if (this._callbackNewDeviceAttribute) {
290
286
  this._callbackNewDeviceAttribute(
@@ -352,14 +348,20 @@ export class DeviceManager implements RaftDeviceMgrIF{
352
348
  // Send action to device
353
349
  ////////////////////////////////////////////////////////////////////////////
354
350
 
355
- public async sendAction(deviceKey: string, action: DeviceTypeAction, data: DataType[]): Promise<boolean> {
351
+ private toHex(data: Uint8Array): string {
352
+ return Array.from(data)
353
+ .map(byte => byte.toString(16).padStart(2, "0"))
354
+ .join("");
355
+ }
356
+
357
+ public async sendAction(deviceKey: string, action: DeviceTypeAction, data: number[]): Promise<boolean> {
356
358
  // console.log(`DeviceManager sendAction ${deviceKey} action name ${action.n} value ${value} prefix ${action.w}`);
357
359
 
358
360
  // Form the write bytes
359
- let writeBytes = action.t ? struct.pack(action.t, data) : Buffer.from([]);
361
+ const writeBytes = action.t ? structPack(action.t, data) : new Uint8Array(0);
360
362
 
361
363
  // Convert to hex string
362
- let writeHexStr = Buffer.from(writeBytes).toString('hex');
364
+ let writeHexStr = this.toHex(writeBytes);
363
365
 
364
366
  // Add prefix
365
367
  writeHexStr = action.w + writeHexStr;
@@ -393,13 +395,13 @@ export class DeviceManager implements RaftDeviceMgrIF{
393
395
  // Send a compound action to the device
394
396
  ////////////////////////////////////////////////////////////////////////////
395
397
 
396
- public async sendCompoundAction(deviceKey: string, action: DeviceTypeAction, data: DataType[][]): Promise<boolean> {
398
+ public async sendCompoundAction(deviceKey: string, action: DeviceTypeAction, data: number[][]): Promise<boolean> {
397
399
  // console.log(`DeviceManager sendAction ${deviceKey} action name ${action.n} value ${value} prefix ${action.w}`);
398
400
 
399
401
  // Check if all data to be sent at once
400
402
  if (action.concat) {
401
403
  // Form a single list by flattening data
402
- let dataToWrite: DataType[] = [];
404
+ let dataToWrite: number[] = [];
403
405
  for (let dataIdx = 0; dataIdx < data.length; dataIdx++) {
404
406
  dataToWrite = dataToWrite.concat(data[dataIdx]);
405
407
  }
@@ -412,7 +414,7 @@ export class DeviceManager implements RaftDeviceMgrIF{
412
414
  for (let dataIdx = 0; dataIdx < data.length; dataIdx++) {
413
415
 
414
416
  // Create the data to write by prepending the index to the data for this index
415
- let dataToWrite = [dataIdx as DataType].concat(data[dataIdx]);
417
+ const dataToWrite = [dataIdx as number].concat(data[dataIdx]);
416
418
 
417
419
  // Use sendAction to send this
418
420
  allOk = allOk && await this.sendAction(deviceKey, action, dataToWrite);
@@ -432,5 +434,4 @@ export class DeviceManager implements RaftDeviceMgrIF{
432
434
  }
433
435
  return bytes;
434
436
  }
435
-
436
437
  }
@@ -7,7 +7,6 @@
7
7
  //
8
8
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9
9
 
10
- import { DataType } from "python-struct";
11
10
  import { DeviceTypeAction } from "./RaftDeviceInfo";
12
11
  import { DeviceAttributeState, DevicesState, DeviceState } from "./RaftDeviceStates";
13
12
 
@@ -23,6 +22,6 @@ export default interface RaftDeviceMgrIF {
23
22
  onNewAttributeData(callback: (deviceKey: string, attrState: DeviceAttributeState) => void): void;
24
23
 
25
24
  // Send action to device
26
- sendAction(deviceKey: string, action: DeviceTypeAction, data: DataType[]): void;
27
- sendCompoundAction(deviceKey: string, action: DeviceTypeAction, data: DataType[][]): void;
25
+ sendAction(deviceKey: string, action: DeviceTypeAction, data: number[]): void;
26
+ sendCompoundAction(deviceKey: string, action: DeviceTypeAction, data: number[][]): void;
28
27
  }
@@ -30,7 +30,7 @@ export function deviceAttrGetLatestFormatted(attrState: DeviceAttributeState): s
30
30
  decimalPlaces = parseInt(parts[1], 10);
31
31
  }
32
32
  const formattedNumber = value.toFixed(decimalPlaces);
33
- let fieldWidth = parseInt(parts[0], 10);
33
+ const fieldWidth = parseInt(parts[0], 10);
34
34
  return fieldWidth ? formattedNumber.padStart(fieldWidth, ' ') : formattedNumber;
35
35
  } else if (format.endsWith('x')) {
36
36
  // Hexadecimal formatting
@@ -571,7 +571,6 @@ export default class RaftMsgHandler {
571
571
  // if (msgRsltCode === RaftMsgResultCode.MESSAGE_RESULT_OK) {
572
572
  const resolve = this._msgTrackInfos[msgNum].resolve;
573
573
  if (resolve) {
574
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
575
574
  RaftLog.verbose(`_msgCompleted msgNum ${msgNum} result ${msgRsltCode.toString()} ${JSON.stringify(msgRsltObj)}`);
576
575
  (resolve as ((arg: object | null) => void))(msgRsltObj);
577
576
  }
@@ -679,7 +678,7 @@ export default class RaftMsgHandler {
679
678
  // RICREST protocol
680
679
  msgBuf[msgBufPos++] = RICRESTElemCode.RICREST_ELEM_CODE_FILEBLOCK;
681
680
 
682
- // Buffer header
681
+ // Header
683
682
  msgBuf[msgBufPos++] = streamID & 0xff;
684
683
  msgBuf[msgBufPos++] = (blockStart >> 16) & 0xff;
685
684
  msgBuf[msgBufPos++] = (blockStart >> 8) & 0xff;
@@ -0,0 +1,208 @@
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // RaftStruct
4
+ // Part of RaftJS
5
+ //
6
+ // Rob Dobson 2024
7
+ // (C) 2024 All rights reserved
8
+ //
9
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
+
11
+ export function structUnpack(format: string, data: Uint8Array): number[] {
12
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
13
+ const results: number[] = [];
14
+ let offset = 0;
15
+ let littleEndian = false;
16
+
17
+ for (const char of format) {
18
+ switch (char) {
19
+ case "<":
20
+ littleEndian = true;
21
+ break;
22
+ case ">":
23
+ littleEndian = false;
24
+ break;
25
+ case "x": // Padding byte
26
+ offset += 1;
27
+ break;
28
+ case "c": // Char
29
+ results.push(view.getUint8(offset));
30
+ offset += 1;
31
+ break;
32
+ case "b": // Signed 8-bit integer
33
+ results.push(view.getInt8(offset));
34
+ offset += 1;
35
+ break;
36
+ case "B": // Unsigned 8-bit integer
37
+ results.push(view.getUint8(offset));
38
+ offset += 1;
39
+ break;
40
+ case "h": // Signed 16-bit integer
41
+ results.push(view.getInt16(offset, littleEndian));
42
+ offset += 2;
43
+ break;
44
+ case "H": // Unsigned 16-bit integer (big-endian)
45
+ results.push(view.getUint16(offset, littleEndian));
46
+ offset += 2;
47
+ break;
48
+ case "i": // Signed 32-bit integer (big-endian)
49
+ results.push(view.getInt32(offset, littleEndian));
50
+ offset += 4;
51
+ break;
52
+ case "I": // Unsigned 32-bit integer (big-endian)
53
+ results.push(view.getUint32(offset, littleEndian));
54
+ offset += 4;
55
+ break;
56
+ case "l": // Signed 32-bit integer (big-endian)
57
+ results.push(view.getInt32(offset, littleEndian));
58
+ offset += 4;
59
+ break;
60
+ case "L": // Unsigned 32-bit integer (big-endian)
61
+ results.push(view.getUint32(offset, littleEndian));
62
+ offset += 4;
63
+ break;
64
+ // case "q": // Signed 64-bit integer (big-endian)
65
+ // results.push(view.getBigInt64(offset, littleEndian));
66
+ // offset += 8;
67
+ // break;
68
+ // case "Q": // Unsigned 64-bit integer (big-endian)
69
+ // results.push(view.getBigUint64(offset, littleEndian));
70
+ // offset += 8;
71
+ // break;
72
+ case "f": // 32-bit float (big-endian)
73
+ results.push(view.getFloat32(offset, littleEndian));
74
+ offset += 4;
75
+ break;
76
+ case "d": // 64-bit float (big-endian)
77
+ results.push(view.getFloat64(offset, littleEndian));
78
+ offset += 8;
79
+ break;
80
+ default:
81
+ throw new Error(`Unknown format character: ${char}`);
82
+ }
83
+ }
84
+
85
+ return results;
86
+ }
87
+
88
+ export function structSizeOf(format: string): number {
89
+ let size = 0;
90
+ for (const char of format) {
91
+ switch (char) {
92
+ case "<":
93
+ case ">":
94
+ break;
95
+ case "x": // Padding byte
96
+ size += 1;
97
+ break;
98
+ case "c": // Char
99
+ case "b": // Signed 8-bit integer
100
+ case "B": // Unsigned 8-bit integer
101
+ size += 1;
102
+ break;
103
+ case "h": // Signed 16-bit integer
104
+ case "H": // Unsigned 16-bit integer
105
+ size += 2;
106
+ break;
107
+ case "i": // Signed 32-bit integer
108
+ case "I": // Unsigned 32-bit integer
109
+ case "l": // Signed 32-bit integer
110
+ case "L": // Unsigned 32-bit integer
111
+ size += 4;
112
+ break;
113
+ // case "q": // Signed 64-bit integer
114
+ // case "Q": // Unsigned 64-bit integer
115
+ // size += 8;
116
+ // break;
117
+ case "f": // 32-bit float
118
+ size += 4;
119
+ break;
120
+ case "d": // 64-bit float
121
+ size += 8;
122
+ break;
123
+ default:
124
+ throw new Error(`Unknown format character: ${char}`);
125
+ }
126
+ }
127
+ return size;
128
+ }
129
+
130
+ export function structPack(format: string, values: number[]): Uint8Array {
131
+ const size = structSizeOf(format);
132
+ const buffer = new ArrayBuffer(size);
133
+ const view = new DataView(buffer);
134
+ let offset = 0;
135
+ let littleEndian = false;
136
+
137
+ for (let i = 0; i < format.length; i++) {
138
+ const char = format[i];
139
+ const value = values[i];
140
+ switch (char) {
141
+ case "<":
142
+ littleEndian = true;
143
+ break;
144
+ case ">":
145
+ littleEndian = false;
146
+ break;
147
+ case "x": // Padding byte
148
+ offset += 1;
149
+ break;
150
+ case "c": // Char
151
+ view.setInt8(offset, value);
152
+ offset += 1;
153
+ break;
154
+ case "b": // Signed 8-bit integer
155
+ view.setInt8(offset, value);
156
+ offset += 1;
157
+ break;
158
+ case "B": // Unsigned 8-bit integer
159
+ view.setUint8(offset, value);
160
+ offset += 1;
161
+ break;
162
+ case "h": // Signed 16-bit integer
163
+ view.setInt16(offset, value, littleEndian);
164
+ offset += 2;
165
+ break;
166
+ case "H": // Unsigned 16-bit integer
167
+ view.setUint16(offset, value, littleEndian);
168
+ offset += 2;
169
+ break;
170
+ case "i": // Signed 32-bit integer
171
+ view.setInt32(offset, value, littleEndian);
172
+ offset += 4;
173
+ break;
174
+ case "I": // Unsigned 32-bit integer
175
+ view.setUint32(offset, value, littleEndian);
176
+ offset += 4;
177
+ break;
178
+ case "l": // Signed 32-bit integer
179
+ view.setInt32(offset, value, littleEndian);
180
+ offset += 4;
181
+ break;
182
+ case "L": // Unsigned 32-bit integer
183
+ view.setUint32(offset, value, littleEndian);
184
+ offset += 4;
185
+ break;
186
+ // case "q": // Signed 64-bit integer
187
+ // view.setBigInt64(offset, BigInt(value), littleEndian);
188
+ // offset += 8;
189
+ // break;
190
+ // case "Q": // Unsigned 64-bit integer
191
+ // view.setBigUint64(offset, BigInt(value), littleEndian);
192
+ // offset += 8;
193
+ // break;
194
+ case "f": // 32-bit float
195
+ view.setFloat32(offset, value, littleEndian);
196
+ offset += 4;
197
+ break;
198
+ case "d": // 64-bit float
199
+ view.setFloat64(offset, value, littleEndian);
200
+ offset += 8;
201
+ break;
202
+ default:
203
+ throw new Error(`Unknown format character: ${char}`);
204
+ }
205
+ }
206
+
207
+ return new Uint8Array(buffer);
208
+ }
@@ -0,0 +1,60 @@
1
+ import { RaftSystemType } from "./RaftSystemType";
2
+
3
+ type RaftSystemTypeCreator = () => RaftSystemType;
4
+
5
+ export default class RaftSysTypeManager {
6
+ // Singleton instance
7
+ private static _instance: RaftSysTypeManager;
8
+
9
+ // System type map
10
+ private _sysTypes: Map<string, RaftSystemTypeCreator> = new Map();
11
+ private _defaultSysTypeFactory: RaftSystemTypeCreator | null = null;
12
+
13
+ // Get instance (Singleton)
14
+ public static getInstance(): RaftSysTypeManager {
15
+ if (!RaftSysTypeManager._instance) {
16
+ RaftSysTypeManager._instance = new RaftSysTypeManager();
17
+ }
18
+ return RaftSysTypeManager._instance;
19
+ }
20
+
21
+ // Add a system type by name with its factory
22
+ public addSystemType(sysType: string, factory: RaftSystemTypeCreator): void {
23
+ if (this._sysTypes.has(sysType)) {
24
+ throw new Error(`System type '${sysType}' is already registered.`);
25
+ }
26
+ this._sysTypes.set(sysType, factory);
27
+ }
28
+
29
+ // Set the default system type factory
30
+ public addDefaultSystemType(factory: RaftSystemTypeCreator): void {
31
+ this._defaultSysTypeFactory = factory;
32
+ }
33
+
34
+ // Create a system type by name
35
+ public createSystemType(sysType: string): RaftSystemType | null {
36
+ const factory = this._sysTypes.get(sysType);
37
+ if (!factory) {
38
+ return null;
39
+ }
40
+ return factory();
41
+ }
42
+
43
+ // Create the default system type
44
+ public createDefaultSystemType(): RaftSystemType | null {
45
+ if (!this._defaultSysTypeFactory) {
46
+ return null;
47
+ }
48
+ return this._defaultSysTypeFactory();
49
+ }
50
+
51
+ // Get a list of all unique BLE service UUIDs
52
+ getAllServiceUUIDs(): string[] {
53
+ const serviceUUIDs = new Set<string>();
54
+ this._sysTypes.forEach((factory) => {
55
+ const sysType = factory();
56
+ sysType.BLEServiceUUIDs.forEach((uuid) => serviceUUIDs.add(uuid));
57
+ });
58
+ return Array.from(serviceUUIDs);
59
+ }
60
+ }
@@ -16,6 +16,9 @@ export interface ConnectorOptions {
16
16
  export interface RaftSystemType {
17
17
  nameForDialogs: string;
18
18
  defaultWiFiHostname: string;
19
+ BLEServiceUUIDs: string[];
20
+ BLECmdUUID: string;
21
+ BLERespUUID: string;
19
22
  firmwareDestName: string;
20
23
  normalFileDestName: string;
21
24
  connectorOptions: ConnectorOptions;
package/src/RaftTypes.ts CHANGED
@@ -248,7 +248,7 @@ export type PystatusMsgType = {
248
248
  };
249
249
 
250
250
  // Phone BLE
251
- export class DiscoveredRIC {
251
+ export class DiscoveredDevice {
252
252
  _localName = '';
253
253
  _name = '';
254
254
  _id = '';
@@ -278,4 +278,4 @@ export class DiscoveredRIC {
278
278
  }
279
279
  }
280
280
 
281
- export type DiscoveredRICsCB = (discoveredRICs: DiscoveredRIC[]) => void;
281
+ export type DiscoveredDevicesCB = (discoveredDevicess: DiscoveredDevice[]) => void;
@@ -8,7 +8,6 @@
8
8
  //
9
9
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
10
 
11
- import axios from "axios";
12
11
  import RaftChannel from "./RaftChannel";
13
12
  import RaftFileHandler from "./RaftFileHandler";
14
13
  import RaftLog from "./RaftLog";
@@ -91,8 +90,12 @@ export default class RICUpdateManager {
91
90
 
92
91
  // debug
93
92
  RaftLog.debug(`Update URL: ${updateURL}`);
94
- const response = await axios.get(updateURL);
95
- this._latestVersionInfo = response.data;
93
+ const response = await fetch(updateURL, { method: 'GET' });
94
+ if (!response.ok) {
95
+ RaftLog.debug(`HTTP error! status: ${response.status}`);
96
+ return RaftUpdateEvent.UPDATE_CANT_REACH_SERVER;
97
+ }
98
+ this._latestVersionInfo = await response.json();
96
99
  } catch (error) {
97
100
  RaftLog.debug(`Failed to get latest version from internet ${error}`);
98
101
  }
package/src/RaftUtils.ts CHANGED
@@ -9,8 +9,6 @@
9
9
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
10
 
11
11
  import RaftLog from "./RaftLog";
12
- import semverGt from "semver/functions/gt";
13
- import semverEq from "semver/functions/eq";
14
12
 
15
13
  export default class RaftUtils {
16
14
  static _isEndianSet = false;
@@ -446,9 +444,21 @@ export default class RaftUtils {
446
444
  }
447
445
  }
448
446
 
447
+ static semverGt(v1: string, v2: string): boolean {
448
+ const [major1, minor1, patch1] = v1.split('.').map(Number);
449
+ const [major2, minor2, patch2] = v2.split('.').map(Number);
450
+ if (major1 !== major2) return major1 > major2;
451
+ if (minor1 !== minor2) return minor1 > minor2;
452
+ return patch1 > patch2;
453
+ }
454
+
449
455
  static isVersionGreater(v1: string, v2: string) {
450
456
  try {
451
- return semverGt(v1, v2);
457
+ const [major1, minor1, patch1] = v1.split('.').map(Number);
458
+ const [major2, minor2, patch2] = v2.split('.').map(Number);
459
+ if (major1 !== major2) return major1 > major2;
460
+ if (minor1 !== minor2) return minor1 > minor2;
461
+ return patch1 > patch2;
452
462
  } catch (e) {
453
463
  // one of the two versions is invalid, return true
454
464
  RaftLog.warn(`isVersionGreater - invalid version ${v1} or ${v2} ${e}`);
@@ -458,7 +468,7 @@ export default class RaftUtils {
458
468
 
459
469
  static isVersionEqual(v1: string, v2: string) {
460
470
  try {
461
- return semverEq(v1, v2);
471
+ return v1 === v2;
462
472
  } catch (e) {
463
473
  // one of the two versions is invalid, return false
464
474
  RaftLog.error(`isVersionEqual - invalid version ${v1} or ${v2} ${e}`);
package/src/main.ts CHANGED
@@ -23,9 +23,9 @@ export { default as RaftMsgHandler } from './RaftMsgHandler'
23
23
  export { default as RaftStreamHandler } from './RaftStreamHandler';
24
24
  export { default as RaftSystemUtils } from './RaftSystemUtils';
25
25
  export { default as RaftUtils } from './RaftUtils';
26
+ export { default as RaftSysTypeManager } from './RaftSysTypeManager';
26
27
  export { DeviceManager as RaftDeviceManager } from './RaftDeviceManager';
27
28
 
28
-
29
29
  export * from './RaftTypes';
30
30
  export * from './RaftSystemType';
31
31
  export * from './RaftWifiTypes';