@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.
- package/dist/react-native/RaftAttributeHandler.d.ts +1 -1
- package/dist/react-native/RaftAttributeHandler.js +13 -10
- package/dist/react-native/RaftAttributeHandler.js.map +1 -1
- package/dist/react-native/RaftChannelBLE.native.d.ts +9 -11
- package/dist/react-native/RaftChannelBLE.native.js +33 -40
- package/dist/react-native/RaftChannelBLE.native.js.map +1 -1
- package/dist/react-native/RaftChannelBLE.web.d.ts +3 -4
- package/dist/react-native/RaftChannelBLE.web.js +7 -8
- package/dist/react-native/RaftChannelBLE.web.js.map +1 -1
- package/dist/react-native/RaftChannelBLEScanner.native.d.ts +6 -6
- package/dist/react-native/RaftChannelBLEScanner.native.js +38 -46
- package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -1
- package/dist/react-native/RaftConnector.d.ts +3 -3
- package/dist/react-native/RaftConnector.js +3 -3
- package/dist/react-native/RaftConnector.js.map +1 -1
- package/dist/react-native/RaftCustomAttrHandler.d.ts +1 -1
- package/dist/react-native/RaftCustomAttrHandler.js +4 -4
- package/dist/react-native/RaftCustomAttrHandler.js.map +1 -1
- package/dist/react-native/RaftDeviceManager.d.ts +3 -3
- package/dist/react-native/RaftDeviceManager.js +12 -10
- package/dist/react-native/RaftDeviceManager.js.map +1 -1
- package/dist/react-native/RaftDeviceMgrIF.d.ts +2 -3
- package/dist/react-native/RaftDeviceStates.js +1 -1
- package/dist/react-native/RaftDeviceStates.js.map +1 -1
- package/dist/react-native/RaftMsgHandler.js +1 -2
- package/dist/react-native/RaftMsgHandler.js.map +1 -1
- package/dist/react-native/RaftStruct.d.ts +3 -0
- package/dist/react-native/RaftStruct.js +207 -0
- package/dist/react-native/RaftStruct.js.map +1 -0
- package/dist/react-native/RaftSysTypeManager.d.ts +14 -0
- package/dist/react-native/RaftSysTypeManager.js +53 -0
- package/dist/react-native/RaftSysTypeManager.js.map +1 -0
- package/dist/react-native/RaftSystemType.d.ts +3 -0
- package/dist/react-native/RaftTypes.d.ts +2 -2
- package/dist/react-native/RaftTypes.js +3 -3
- package/dist/react-native/RaftTypes.js.map +1 -1
- package/dist/react-native/RaftUpdateManager.js +6 -3
- package/dist/react-native/RaftUpdateManager.js.map +1 -1
- package/dist/react-native/RaftUtils.d.ts +1 -0
- package/dist/react-native/RaftUtils.js +17 -4
- package/dist/react-native/RaftUtils.js.map +1 -1
- package/dist/react-native/main.d.ts +1 -0
- package/dist/react-native/main.js +3 -1
- package/dist/react-native/main.js.map +1 -1
- package/dist/web/RaftAttributeHandler.d.ts +1 -1
- package/dist/web/RaftAttributeHandler.js +13 -10
- package/dist/web/RaftAttributeHandler.js.map +1 -1
- package/dist/web/RaftChannelBLE.web.d.ts +3 -4
- package/dist/web/RaftChannelBLE.web.js +7 -8
- package/dist/web/RaftChannelBLE.web.js.map +1 -1
- package/dist/web/RaftConnector.d.ts +3 -3
- package/dist/web/RaftConnector.js +3 -3
- package/dist/web/RaftConnector.js.map +1 -1
- package/dist/web/RaftCustomAttrHandler.d.ts +1 -1
- package/dist/web/RaftCustomAttrHandler.js +4 -4
- package/dist/web/RaftCustomAttrHandler.js.map +1 -1
- package/dist/web/RaftDeviceManager.d.ts +3 -3
- package/dist/web/RaftDeviceManager.js +12 -10
- package/dist/web/RaftDeviceManager.js.map +1 -1
- package/dist/web/RaftDeviceMgrIF.d.ts +2 -3
- package/dist/web/RaftDeviceStates.js +1 -1
- package/dist/web/RaftDeviceStates.js.map +1 -1
- package/dist/web/RaftMsgHandler.js +1 -2
- package/dist/web/RaftMsgHandler.js.map +1 -1
- package/dist/web/RaftStruct.d.ts +3 -0
- package/dist/web/RaftStruct.js +207 -0
- package/dist/web/RaftStruct.js.map +1 -0
- package/dist/web/RaftSysTypeManager.d.ts +14 -0
- package/dist/web/RaftSysTypeManager.js +53 -0
- package/dist/web/RaftSysTypeManager.js.map +1 -0
- package/dist/web/RaftSystemType.d.ts +3 -0
- package/dist/web/RaftTypes.d.ts +2 -2
- package/dist/web/RaftTypes.js +3 -3
- package/dist/web/RaftTypes.js.map +1 -1
- package/dist/web/RaftUpdateManager.js +6 -3
- package/dist/web/RaftUpdateManager.js.map +1 -1
- package/dist/web/RaftUtils.d.ts +1 -0
- package/dist/web/RaftUtils.js +17 -4
- package/dist/web/RaftUtils.js.map +1 -1
- package/dist/web/main.d.ts +1 -0
- package/dist/web/main.js +3 -1
- package/dist/web/main.js.map +1 -1
- package/examples/dashboard/package.json +2 -12
- package/examples/dashboard/src/ConnManager.ts +9 -16
- package/examples/dashboard/src/Main.tsx +13 -5
- package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +3 -0
- package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +24 -0
- package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +87 -0
- package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +0 -0
- package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +3 -0
- package/examples/dashboard/src/index.tsx +0 -2
- package/package.json +2 -11
- package/src/RaftAttributeHandler.ts +17 -14
- package/src/RaftChannelBLE.native.ts +43 -51
- package/src/RaftChannelBLE.web.ts +8 -8
- package/src/RaftChannelBLEScanner.native.ts +37 -44
- package/src/RaftConnector.ts +3 -3
- package/src/RaftCustomAttrHandler.ts +5 -5
- package/src/RaftDeviceManager.ts +16 -15
- package/src/RaftDeviceMgrIF.ts +2 -3
- package/src/RaftDeviceStates.ts +1 -1
- package/src/RaftMsgHandler.ts +1 -2
- package/src/RaftStruct.ts +208 -0
- package/src/RaftSysTypeManager.ts +60 -0
- package/src/RaftSystemType.ts +3 -0
- package/src/RaftTypes.ts +2 -2
- package/src/RaftUpdateManager.ts +6 -3
- package/src/RaftUtils.ts +14 -4
- package/src/main.ts +1 -1
package/src/RaftDeviceManager.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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(
|
|
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(([
|
|
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
|
-
|
|
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
|
-
|
|
361
|
+
const writeBytes = action.t ? structPack(action.t, data) : new Uint8Array(0);
|
|
360
362
|
|
|
361
363
|
// Convert to hex string
|
|
362
|
-
let writeHexStr =
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
}
|
package/src/RaftDeviceMgrIF.ts
CHANGED
|
@@ -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:
|
|
27
|
-
sendCompoundAction(deviceKey: string, action: DeviceTypeAction, data:
|
|
25
|
+
sendAction(deviceKey: string, action: DeviceTypeAction, data: number[]): void;
|
|
26
|
+
sendCompoundAction(deviceKey: string, action: DeviceTypeAction, data: number[][]): void;
|
|
28
27
|
}
|
package/src/RaftDeviceStates.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
package/src/RaftMsgHandler.ts
CHANGED
|
@@ -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
|
-
//
|
|
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
|
+
}
|
package/src/RaftSystemType.ts
CHANGED
|
@@ -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
|
|
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
|
|
281
|
+
export type DiscoveredDevicesCB = (discoveredDevicess: DiscoveredDevice[]) => void;
|
package/src/RaftUpdateManager.ts
CHANGED
|
@@ -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
|
|
95
|
-
|
|
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
|
-
|
|
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
|
|
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';
|