@robdobsn/raftjs 1.7.8 → 1.10.7
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/.editorconfig +14 -0
- package/.gitattributes +11 -0
- package/.nvmrc +1 -0
- package/TODO.md +1 -0
- package/dist/react-native/RaftAttributeHandler.d.ts +14 -0
- package/dist/react-native/RaftAttributeHandler.js +375 -0
- package/dist/react-native/RaftAttributeHandler.js.map +1 -0
- package/dist/react-native/RaftChannel.d.ts +20 -0
- package/dist/react-native/RaftChannel.js +12 -0
- package/dist/react-native/RaftChannel.js.map +1 -0
- package/dist/react-native/RaftChannelBLE.native.d.ts +95 -0
- package/dist/react-native/RaftChannelBLE.native.js +483 -0
- package/dist/react-native/RaftChannelBLE.native.js.map +1 -0
- package/dist/react-native/RaftChannelBLE.web.d.ts +40 -0
- package/dist/react-native/RaftChannelBLE.web.js +302 -0
- package/dist/react-native/RaftChannelBLE.web.js.map +1 -0
- package/dist/react-native/RaftChannelBLEFactory.d.ts +10 -0
- package/dist/react-native/RaftChannelBLEFactory.js +17 -0
- package/dist/react-native/RaftChannelBLEFactory.js.map +1 -0
- package/dist/react-native/RaftChannelBLEScanner.native.d.ts +18 -0
- package/dist/react-native/RaftChannelBLEScanner.native.js +138 -0
- package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -0
- package/dist/react-native/RaftChannelSimulated.d.ts +42 -0
- package/dist/react-native/RaftChannelSimulated.js +1000 -0
- package/dist/react-native/RaftChannelSimulated.js.map +1 -0
- package/dist/react-native/RaftChannelWebSerial.d.ts +39 -0
- package/dist/react-native/RaftChannelWebSerial.js +329 -0
- package/dist/react-native/RaftChannelWebSerial.js.map +1 -0
- package/dist/react-native/RaftChannelWebSocket.d.ts +30 -0
- package/dist/react-native/RaftChannelWebSocket.js +222 -0
- package/dist/react-native/RaftChannelWebSocket.js.map +1 -0
- package/dist/react-native/RaftCommsStats.d.ts +39 -0
- package/dist/react-native/RaftCommsStats.js +128 -0
- package/dist/react-native/RaftCommsStats.js.map +1 -0
- package/dist/react-native/RaftConnEvents.d.ts +39 -0
- package/dist/react-native/RaftConnEvents.js +54 -0
- package/dist/react-native/RaftConnEvents.js.map +1 -0
- package/dist/react-native/RaftConnector.d.ts +248 -0
- package/dist/react-native/RaftConnector.js +658 -0
- package/dist/react-native/RaftConnector.js.map +1 -0
- package/dist/react-native/RaftCustomAttrHandler.d.ts +6 -0
- package/dist/react-native/RaftCustomAttrHandler.js +93 -0
- package/dist/react-native/RaftCustomAttrHandler.js.map +1 -0
- package/dist/react-native/RaftDeviceInfo.d.ts +71 -0
- package/dist/react-native/RaftDeviceInfo.js +50 -0
- package/dist/react-native/RaftDeviceInfo.js.map +1 -0
- package/dist/react-native/RaftDeviceManager.d.ts +61 -0
- package/dist/react-native/RaftDeviceManager.js +665 -0
- package/dist/react-native/RaftDeviceManager.js.map +1 -0
- package/dist/react-native/RaftDeviceMgrIF.d.ts +15 -0
- package/dist/react-native/RaftDeviceMgrIF.js +11 -0
- package/dist/react-native/RaftDeviceMgrIF.js.map +1 -0
- package/dist/react-native/RaftDeviceMsg.d.ts +9 -0
- package/dist/react-native/RaftDeviceMsg.js +11 -0
- package/dist/react-native/RaftDeviceMsg.js.map +1 -0
- package/dist/react-native/RaftDeviceStates.d.ts +37 -0
- package/dist/react-native/RaftDeviceStates.js +60 -0
- package/dist/react-native/RaftDeviceStates.js.map +1 -0
- package/dist/react-native/RaftFileHandler.d.ts +52 -0
- package/dist/react-native/RaftFileHandler.js +502 -0
- package/dist/react-native/RaftFileHandler.js.map +1 -0
- package/dist/react-native/RaftLog.d.ts +22 -0
- package/dist/react-native/RaftLog.js +63 -0
- package/dist/react-native/RaftLog.js.map +1 -0
- package/dist/react-native/RaftMiniHDLC.d.ts +18 -0
- package/dist/react-native/RaftMiniHDLC.js +383 -0
- package/dist/react-native/RaftMiniHDLC.js.map +1 -0
- package/dist/react-native/RaftMsgHandler.d.ts +62 -0
- package/dist/react-native/RaftMsgHandler.js +511 -0
- package/dist/react-native/RaftMsgHandler.js.map +1 -0
- package/dist/react-native/RaftMsgTrackInfo.d.ts +17 -0
- package/dist/react-native/RaftMsgTrackInfo.js +42 -0
- package/dist/react-native/RaftMsgTrackInfo.js.map +1 -0
- package/dist/react-native/RaftProtocolDefs.d.ts +30 -0
- package/dist/react-native/RaftProtocolDefs.js +48 -0
- package/dist/react-native/RaftProtocolDefs.js.map +1 -0
- package/dist/react-native/RaftStreamHandler.d.ts +38 -0
- package/dist/react-native/RaftStreamHandler.js +258 -0
- package/dist/react-native/RaftStreamHandler.js.map +1 -0
- package/dist/react-native/RaftStruct.d.ts +3 -0
- package/dist/react-native/RaftStruct.js +258 -0
- package/dist/react-native/RaftStruct.js.map +1 -0
- package/dist/react-native/RaftSysTypeManager.d.ts +16 -0
- package/dist/react-native/RaftSysTypeManager.js +78 -0
- package/dist/react-native/RaftSysTypeManager.js.map +1 -0
- package/dist/react-native/RaftSystemType.d.ts +30 -0
- package/dist/react-native/RaftSystemType.js +3 -0
- package/dist/react-native/RaftSystemType.js.map +1 -0
- package/dist/react-native/RaftSystemUtils.d.ts +136 -0
- package/dist/react-native/RaftSystemUtils.js +412 -0
- package/dist/react-native/RaftSystemUtils.js.map +1 -0
- package/dist/react-native/RaftTypes.d.ts +195 -0
- package/dist/react-native/RaftTypes.js +153 -0
- package/dist/react-native/RaftTypes.js.map +1 -0
- package/dist/react-native/RaftUpdateEvents.d.ts +33 -0
- package/dist/react-native/RaftUpdateEvents.js +46 -0
- package/dist/react-native/RaftUpdateEvents.js.map +1 -0
- package/dist/react-native/RaftUpdateManager.d.ts +61 -0
- package/dist/react-native/RaftUpdateManager.js +621 -0
- package/dist/react-native/RaftUpdateManager.js.map +1 -0
- package/dist/react-native/RaftUtils.d.ts +128 -0
- package/dist/react-native/RaftUtils.js +487 -0
- package/dist/react-native/RaftUtils.js.map +1 -0
- package/dist/react-native/RaftWifiTypes.d.ts +23 -0
- package/dist/react-native/RaftWifiTypes.js +43 -0
- package/dist/react-native/RaftWifiTypes.js.map +1 -0
- package/dist/react-native/main.d.ts +26 -0
- package/dist/react-native/main.js +51 -0
- package/dist/react-native/main.js.map +1 -0
- package/dist/web/RaftAttributeHandler.js +9 -6
- package/dist/web/RaftAttributeHandler.js.map +1 -1
- package/dist/web/RaftChannelBLE.web.js +8 -6
- package/dist/web/RaftChannelBLE.web.js.map +1 -1
- package/dist/web/RaftChannelSimulated.d.ts +10 -0
- package/dist/web/RaftChannelSimulated.js +662 -80
- package/dist/web/RaftChannelSimulated.js.map +1 -1
- package/dist/web/RaftChannelWebSerial.js +2 -2
- package/dist/web/RaftChannelWebSerial.js.map +1 -1
- package/dist/web/RaftChannelWebSocket.js +16 -1
- package/dist/web/RaftChannelWebSocket.js.map +1 -1
- package/dist/web/RaftConnector.d.ts +2 -0
- package/dist/web/RaftConnector.js +38 -15
- package/dist/web/RaftConnector.js.map +1 -1
- package/dist/web/RaftCustomAttrHandler.d.ts +2 -0
- package/dist/web/RaftCustomAttrHandler.js +54 -26
- package/dist/web/RaftCustomAttrHandler.js.map +1 -1
- package/dist/web/RaftDeviceInfo.d.ts +3 -1
- package/dist/web/RaftDeviceInfo.js +17 -3
- package/dist/web/RaftDeviceInfo.js.map +1 -1
- package/dist/web/RaftDeviceManager.d.ts +22 -1
- package/dist/web/RaftDeviceManager.js +210 -44
- package/dist/web/RaftDeviceManager.js.map +1 -1
- package/dist/web/RaftDeviceStates.d.ts +1 -1
- package/dist/web/RaftDeviceStates.js +2 -2
- package/dist/web/RaftDeviceStates.js.map +1 -1
- package/dist/web/RaftMsgHandler.js.map +1 -1
- package/dist/web/RaftStreamHandler.js +2 -1
- package/dist/web/RaftStreamHandler.js.map +1 -1
- package/dist/web/RaftStruct.js +197 -147
- package/dist/web/RaftStruct.js.map +1 -1
- package/dist/web/RaftUpdateManager.js +1 -1
- package/dist/web/RaftUpdateManager.js.map +1 -1
- package/dist/web/RaftUtils.d.ts +2 -0
- package/dist/web/RaftUtils.js +20 -0
- package/dist/web/RaftUtils.js.map +1 -1
- package/dist/web/main.d.ts +1 -0
- package/dist/web/main.js.map +1 -1
- package/eslint.config.mjs +33 -0
- package/examples/dashboard/package.json +36 -0
- package/examples/dashboard/src/CommandPanel.tsx +147 -0
- package/examples/dashboard/src/ConnManager.ts +166 -0
- package/examples/dashboard/src/DeviceActionsForm.tsx +133 -0
- package/examples/dashboard/src/DeviceAttrsForm.tsx +49 -0
- package/examples/dashboard/src/DeviceLineChart.tsx +163 -0
- package/examples/dashboard/src/DevicePanel.tsx +171 -0
- package/examples/dashboard/src/DevicesPanel.tsx +58 -0
- package/examples/dashboard/src/DispLedGrid.tsx +110 -0
- package/examples/dashboard/src/DispOneLed.tsx +20 -0
- package/examples/dashboard/src/LatencyTest.ts +130 -0
- package/examples/dashboard/src/LatencyTestPanel.tsx +92 -0
- package/examples/dashboard/src/Main.tsx +234 -0
- package/examples/dashboard/src/SettingsManager.ts +67 -0
- package/examples/dashboard/src/SettingsScreen.tsx +174 -0
- package/examples/dashboard/src/StatusPanel.tsx +71 -0
- package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +162 -0
- package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +91 -0
- package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +30 -0
- package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +91 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +70 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +33 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +342 -0
- package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +170 -0
- package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +123 -0
- package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +207 -0
- package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +464 -0
- package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +146 -0
- package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +97 -0
- package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +371 -0
- package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +20 -0
- package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +119 -0
- package/examples/dashboard/src/index.html +15 -0
- package/examples/dashboard/src/index.tsx +13 -0
- package/examples/dashboard/src/styles.css +408 -0
- package/examples/dashboard/tsconfig.json +18 -0
- package/jest.config.js +11 -0
- package/package.json +4 -7
- package/src/RaftAttributeHandler.ts +450 -0
- package/src/RaftChannel.ts +32 -0
- package/src/RaftChannelBLE.native.ts +617 -0
- package/src/RaftChannelBLE.web.ts +374 -0
- package/src/RaftChannelBLEFactory.ts +13 -0
- package/src/RaftChannelBLEScanner.native.ts +184 -0
- package/src/RaftChannelSimulated.ts +1176 -0
- package/src/RaftChannelWebSerial.ts +420 -0
- package/src/RaftChannelWebSocket.ts +272 -0
- package/src/RaftCommsStats.ts +142 -0
- package/src/RaftConnEvents.ts +58 -0
- package/src/RaftConnector.ts +785 -0
- package/src/RaftCustomAttrHandler.ts +117 -0
- package/src/RaftDeviceInfo.ts +125 -0
- package/src/RaftDeviceManager.ts +844 -0
- package/src/RaftDeviceMgrIF.ts +33 -0
- package/src/RaftDeviceMsg.ts +20 -0
- package/src/RaftDeviceStates.ts +92 -0
- package/src/RaftFileHandler.ts +668 -0
- package/src/RaftLog.ts +70 -0
- package/src/RaftMiniHDLC.ts +396 -0
- package/src/RaftMsgHandler.ts +812 -0
- package/src/RaftMsgTrackInfo.ts +51 -0
- package/src/RaftProtocolDefs.ts +46 -0
- package/src/RaftStreamHandler.ts +329 -0
- package/src/RaftStruct.ts +282 -0
- package/src/RaftSysTypeManager.ts +87 -0
- package/src/RaftSystemType.ts +34 -0
- package/src/RaftSystemUtils.ts +489 -0
- package/src/RaftTypes.ts +279 -0
- package/src/RaftUpdateEvents.ts +48 -0
- package/src/RaftUpdateManager.ts +781 -0
- package/src/RaftUtils.ts +514 -0
- package/src/RaftWifiTypes.ts +36 -0
- package/src/main.ts +39 -0
- package/testdata/TestDeviceTypeRecs.json +492 -0
- package/tsconfig.json +30 -0
- package/tsconfig.react-native.json +29 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { RICHWElem } from "./RICHWElem";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RICAddOn
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* Information about an add-on
|
|
8
|
+
*
|
|
9
|
+
* @field name: string - Name of add-on
|
|
10
|
+
* @field SN: string - Serial number
|
|
11
|
+
* @field poll: string - polling type ("status")
|
|
12
|
+
* @field pollRd: string - hex data most recently read
|
|
13
|
+
* @field pollHz: number - rate of polling
|
|
14
|
+
*/
|
|
15
|
+
export type RICAddOn = {
|
|
16
|
+
name: string;
|
|
17
|
+
SN: string;
|
|
18
|
+
poll: string;
|
|
19
|
+
pollRd: number;
|
|
20
|
+
pollHz: number;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export class RICConfiguredAddOns {
|
|
24
|
+
req = '';
|
|
25
|
+
rslt = 'ok';
|
|
26
|
+
addons: Array<RICAddOn> = [];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* AddOnElemAndConfig
|
|
31
|
+
*
|
|
32
|
+
* @description
|
|
33
|
+
* Carrier of information about an add-on combining
|
|
34
|
+
* the add-on element and the add-on configuration
|
|
35
|
+
*
|
|
36
|
+
* @field addOnConfig: RICAddOn - Add-on configuration
|
|
37
|
+
* @field hwElemRec: RICHWElem - Add-on element
|
|
38
|
+
* @field elemIdx: number - Index of the add-on element
|
|
39
|
+
*/
|
|
40
|
+
export class AddOnElemAndConfig {
|
|
41
|
+
constructor(
|
|
42
|
+
addOnConfig: RICAddOn | null,
|
|
43
|
+
hwElemRec: RICHWElem | null,
|
|
44
|
+
elemIdx: number,
|
|
45
|
+
) {
|
|
46
|
+
this.isConfigured = addOnConfig !== null;
|
|
47
|
+
this.isConnected = hwElemRec !== null;
|
|
48
|
+
if (addOnConfig != null) {
|
|
49
|
+
this.SN = addOnConfig.SN;
|
|
50
|
+
this.name = addOnConfig.name;
|
|
51
|
+
} else if (hwElemRec != null) {
|
|
52
|
+
this.SN = hwElemRec.SN;
|
|
53
|
+
this.name = hwElemRec.name;
|
|
54
|
+
}
|
|
55
|
+
this.addOnConfig = addOnConfig;
|
|
56
|
+
this.hwElemRec = hwElemRec;
|
|
57
|
+
this.id = elemIdx.toString();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Fields from config (stored in RIC NVS using addon REST API)
|
|
61
|
+
addOnConfig: RICAddOn | null = null;
|
|
62
|
+
// Fields from HWElem (from hwstatus command)
|
|
63
|
+
hwElemRec: RICHWElem | null = null;
|
|
64
|
+
// Fields allocated when combining records
|
|
65
|
+
name = '';
|
|
66
|
+
SN = '';
|
|
67
|
+
id = '0';
|
|
68
|
+
isConnected = false;
|
|
69
|
+
isConfigured = false;
|
|
70
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// RICJS
|
|
4
|
+
// Communications Library
|
|
5
|
+
//
|
|
6
|
+
// Rob Dobson & Chris Greening 2020-2022
|
|
7
|
+
// (C) 2020-2022
|
|
8
|
+
//
|
|
9
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
|
|
11
|
+
import { RaftReportMsg } from '../../../../src/RaftTypes';
|
|
12
|
+
import { ROSSerialAddOnStatus } from './RICROSSerial';
|
|
13
|
+
|
|
14
|
+
export default abstract class RICAddOnBase {
|
|
15
|
+
_name = '';
|
|
16
|
+
_typeName = '';
|
|
17
|
+
_whoAmI = "";
|
|
18
|
+
_whoAmITypeCode = "";
|
|
19
|
+
_isStatic = false;
|
|
20
|
+
_initCmd: string | null = null;
|
|
21
|
+
constructor(name: string, typeName: string, whoAmI: string, whoAmITypeCode: string) {
|
|
22
|
+
this._name = name;
|
|
23
|
+
this._typeName = typeName;
|
|
24
|
+
this._whoAmI = whoAmI;
|
|
25
|
+
this._whoAmITypeCode = whoAmITypeCode;
|
|
26
|
+
}
|
|
27
|
+
abstract processInit(_dataReceived: RaftReportMsg): void;
|
|
28
|
+
abstract processPublishedData(
|
|
29
|
+
addOnID: number,
|
|
30
|
+
statusByte: number,
|
|
31
|
+
rawData: Uint8Array,
|
|
32
|
+
): ROSSerialAddOnStatus;
|
|
33
|
+
}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// RICJS
|
|
4
|
+
// Communications Library
|
|
5
|
+
//
|
|
6
|
+
// Rob Dobson & Chris Greening 2020-2022
|
|
7
|
+
// (C) 2020-2022
|
|
8
|
+
//
|
|
9
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
|
|
11
|
+
import RaftLog from "../../../../src/RaftLog";
|
|
12
|
+
import RaftMsgHandler from "../../../../src/RaftMsgHandler";
|
|
13
|
+
import { Dictionary, RaftOKFail, RaftReportMsg } from "../../../../src/RaftTypes";
|
|
14
|
+
import RICAddOnBase from "./RICAddOnBase";
|
|
15
|
+
import { RICHWElem } from "./RICHWElem";
|
|
16
|
+
import { ROSSerialAddOnStatus } from "./RICROSSerial";
|
|
17
|
+
|
|
18
|
+
export type RICAddOnCreator = (
|
|
19
|
+
name: string,
|
|
20
|
+
addOnFamily: string,
|
|
21
|
+
whoAmI: string,
|
|
22
|
+
whoAmITypeCode: string
|
|
23
|
+
) => RICAddOnBase;
|
|
24
|
+
|
|
25
|
+
class AddOnFactoryElem {
|
|
26
|
+
typeName: string;
|
|
27
|
+
addOnFamily: string;
|
|
28
|
+
whoAmI: string;
|
|
29
|
+
factoryFn: RICAddOnCreator;
|
|
30
|
+
constructor(
|
|
31
|
+
typeName: string,
|
|
32
|
+
addOnFamily: string,
|
|
33
|
+
whoAmI: string,
|
|
34
|
+
factoryFn: RICAddOnCreator
|
|
35
|
+
) {
|
|
36
|
+
this.addOnFamily = addOnFamily;
|
|
37
|
+
this.typeName = typeName;
|
|
38
|
+
this.whoAmI = whoAmI;
|
|
39
|
+
this.factoryFn = factoryFn;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface RICAddOnRegistry {
|
|
44
|
+
registerHWElemType(
|
|
45
|
+
typeName: string,
|
|
46
|
+
addOnFamily: string,
|
|
47
|
+
whoAmI: string,
|
|
48
|
+
factoryFn: RICAddOnCreator
|
|
49
|
+
): void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* RICAddOnManager
|
|
54
|
+
*
|
|
55
|
+
* @description
|
|
56
|
+
* Handles the creation and management of RIC Add-Ons
|
|
57
|
+
*
|
|
58
|
+
*/
|
|
59
|
+
export default class RICAddOnManager implements RICAddOnRegistry {
|
|
60
|
+
|
|
61
|
+
// Message handler, etc
|
|
62
|
+
private _msgHandler: RaftMsgHandler | null = null;
|
|
63
|
+
|
|
64
|
+
// Add-on factory map
|
|
65
|
+
private _addOnFactoryMap: Dictionary<AddOnFactoryElem> = {};
|
|
66
|
+
|
|
67
|
+
// Configured add-ons
|
|
68
|
+
private _configuredAddOns: Dictionary<RICAddOnBase> = {};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Setup the RIC Add-On Manager
|
|
72
|
+
*/
|
|
73
|
+
setup(msgHandler: RaftMsgHandler): void {
|
|
74
|
+
this._msgHandler = msgHandler;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
*
|
|
79
|
+
* @param typeName Register HWElem type
|
|
80
|
+
* @param addOnFamily
|
|
81
|
+
* @param whoAmI
|
|
82
|
+
* @param factoryFn
|
|
83
|
+
*/
|
|
84
|
+
registerHWElemType(
|
|
85
|
+
typeName: string,
|
|
86
|
+
addOnFamily: string,
|
|
87
|
+
whoAmI: string,
|
|
88
|
+
factoryFn: RICAddOnCreator
|
|
89
|
+
): void {
|
|
90
|
+
RaftLog.debug(`registerHWElemType ${whoAmI} ${typeName}`);
|
|
91
|
+
const lookupStr = addOnFamily + "_" + whoAmI;
|
|
92
|
+
this._addOnFactoryMap[lookupStr] = new AddOnFactoryElem(
|
|
93
|
+
typeName,
|
|
94
|
+
addOnFamily,
|
|
95
|
+
whoAmI,
|
|
96
|
+
factoryFn
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Mark: Set AddOn config -----------------------------------------------------------
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
*
|
|
104
|
+
* setAddOnConfig - set a specified add-on's configuration
|
|
105
|
+
* @param serialNo used to identify the add-on
|
|
106
|
+
* @param newName name to refer to add-on by
|
|
107
|
+
* @returns Promise<RaftOKFail>
|
|
108
|
+
*
|
|
109
|
+
*/
|
|
110
|
+
async setAddOnConfig(serialNo: string, newName: string): Promise<RaftOKFail> {
|
|
111
|
+
try {
|
|
112
|
+
if (this._msgHandler) {
|
|
113
|
+
const msgRslt = await this._msgHandler.sendRICRESTURL<RaftOKFail>(
|
|
114
|
+
`addon/set?SN=${serialNo}&name=${newName}`,
|
|
115
|
+
);
|
|
116
|
+
return msgRslt;
|
|
117
|
+
}
|
|
118
|
+
} catch (error) {
|
|
119
|
+
}
|
|
120
|
+
return new RaftOKFail();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* deleteAddOn - remove an addon from the addonlist on RIC
|
|
125
|
+
* @param serialNo used to identify the add-on
|
|
126
|
+
* @returns Promise<RaftOKFail>
|
|
127
|
+
*/
|
|
128
|
+
async deleteAddOn(serialNo: string): Promise<RaftOKFail> {
|
|
129
|
+
try {
|
|
130
|
+
if (this._msgHandler) {
|
|
131
|
+
const msgRslt = await this._msgHandler.sendRICRESTURL<RaftOKFail>(
|
|
132
|
+
`addon/del?SN=${serialNo}`,
|
|
133
|
+
);
|
|
134
|
+
return msgRslt;
|
|
135
|
+
}
|
|
136
|
+
} catch (error) {
|
|
137
|
+
}
|
|
138
|
+
return new RaftOKFail();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Mark: Identify AddOn -----------------------------------------------------------
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
*
|
|
145
|
+
* identifyAddOn - send the 'identify' command to a specified add-on
|
|
146
|
+
* @param name used to identify the add-on
|
|
147
|
+
* @returns Promise<RaftOKFail>
|
|
148
|
+
*
|
|
149
|
+
*/
|
|
150
|
+
async identifyAddOn(name: string): Promise<RaftOKFail> {
|
|
151
|
+
try {
|
|
152
|
+
if (this._msgHandler) {
|
|
153
|
+
const msgRslt = await this._msgHandler.sendRICRESTURL<RaftOKFail>(
|
|
154
|
+
`elem/${name}/json?cmd=raw&hexWr=F8`,
|
|
155
|
+
);
|
|
156
|
+
return msgRslt;
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
}
|
|
160
|
+
return new RaftOKFail();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @function getStaticAddonIds
|
|
165
|
+
* Get the ids of the add-ons that are static
|
|
166
|
+
* (their data do not get published from ricjs, eg buspixel ledeyes)
|
|
167
|
+
* @returns {Array<number>} the ids of the static add-ons
|
|
168
|
+
*/
|
|
169
|
+
getStaticAddonIds(): Array<number> {
|
|
170
|
+
// at this point we will create the buspixel addon for the batch 4 ledeye,
|
|
171
|
+
// as their data is not published the same way the RSAddOn do
|
|
172
|
+
// to do so, however, we need to know if the batch 4 ledeye is connected
|
|
173
|
+
const staticAddonIds = [];
|
|
174
|
+
for (const addOnId in this._configuredAddOns) {
|
|
175
|
+
const addon = this._configuredAddOns[addOnId];
|
|
176
|
+
if (addon._isStatic) {
|
|
177
|
+
staticAddonIds.push(+addOnId);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return staticAddonIds;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* @function getStaticAddons
|
|
185
|
+
* Get the add-ons that are static
|
|
186
|
+
* (their data do not get published from ricjs, eg buspixel ledeyes)
|
|
187
|
+
* @returns {Array<RICAddOnBase>} the static add-ons unprocessed
|
|
188
|
+
*/
|
|
189
|
+
getStaticAddons(): Array<RICAddOnBase> {
|
|
190
|
+
const staticAddons = [];
|
|
191
|
+
for (const addOnId in this._configuredAddOns) {
|
|
192
|
+
const addon = this._configuredAddOns[addOnId];
|
|
193
|
+
if (addon._isStatic) {
|
|
194
|
+
staticAddons.push(addon);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return staticAddons;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* @function getProcessedStaticAddons
|
|
202
|
+
* Get the add-ons that are static
|
|
203
|
+
* (their data do not get published from ricjs, eg buspixel ledeyes)
|
|
204
|
+
* @returns {Array<ROSSerialAddOnStatus>} the static add-ons processed
|
|
205
|
+
*/
|
|
206
|
+
getProcessedStaticAddons(): Array<ROSSerialAddOnStatus> {
|
|
207
|
+
const ids = this.getStaticAddonIds();
|
|
208
|
+
const staticAddons: ROSSerialAddOnStatus[] = [];
|
|
209
|
+
ids.forEach((id) => {
|
|
210
|
+
const processedAddon = this.processPublishedData(
|
|
211
|
+
id,
|
|
212
|
+
0,
|
|
213
|
+
new Uint8Array(0)
|
|
214
|
+
);
|
|
215
|
+
if (processedAddon) {
|
|
216
|
+
staticAddons.push(processedAddon);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
return staticAddons;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* @function setHWElems
|
|
224
|
+
* Set the hardware elements from a list of RICHWElem
|
|
225
|
+
* @param hwElems
|
|
226
|
+
*
|
|
227
|
+
*/
|
|
228
|
+
setHWElems(hwElems: Array<RICHWElem>): void {
|
|
229
|
+
this._configuredAddOns = this.configureAddOns(hwElems);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
clear(): void {
|
|
233
|
+
this._configuredAddOns = {};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
configureAddOns(hwElems: Array<RICHWElem>): Dictionary<RICAddOnBase> {
|
|
237
|
+
const addOnMap: Dictionary<RICAddOnBase> = {};
|
|
238
|
+
// Iterate HWElems to find addons
|
|
239
|
+
for (const hwElem of hwElems) {
|
|
240
|
+
RaftLog.debug(`configureAddOns whoAmITypeCode ${hwElem.whoAmI}`);
|
|
241
|
+
|
|
242
|
+
// Lookup the add-on
|
|
243
|
+
const lookupStr = hwElem.type + "_" + hwElem.whoAmI;
|
|
244
|
+
if (lookupStr in this._addOnFactoryMap) {
|
|
245
|
+
const addOnFactoryElem = this._addOnFactoryMap[lookupStr];
|
|
246
|
+
const whoAmILen = hwElem.whoAmITypeCode.length;
|
|
247
|
+
hwElem.whoAmITypeCode = hwElem.whoAmITypeCode.slice(
|
|
248
|
+
whoAmILen - 2,
|
|
249
|
+
whoAmILen
|
|
250
|
+
);
|
|
251
|
+
const addOn = addOnFactoryElem.factoryFn(
|
|
252
|
+
hwElem.name,
|
|
253
|
+
hwElem.type,
|
|
254
|
+
hwElem.whoAmI,
|
|
255
|
+
hwElem.whoAmITypeCode
|
|
256
|
+
);
|
|
257
|
+
if (addOn !== null) {
|
|
258
|
+
addOnMap[hwElem.IDNo.toString()] = addOn;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return addOnMap;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
getHWElemTypeStr(
|
|
266
|
+
whoAmITypeCode: string | undefined,
|
|
267
|
+
whoAmI: string | undefined
|
|
268
|
+
) {
|
|
269
|
+
RaftLog.debug(`getting type code for ${whoAmITypeCode}`);
|
|
270
|
+
if (whoAmITypeCode === undefined) {
|
|
271
|
+
return `Undefined whoamiTypeCode`;
|
|
272
|
+
}
|
|
273
|
+
if (whoAmITypeCode in this._addOnFactoryMap) {
|
|
274
|
+
return this._addOnFactoryMap[whoAmITypeCode].typeName;
|
|
275
|
+
}
|
|
276
|
+
return `Unknown (${whoAmI} - ${whoAmITypeCode})`;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
processPublishedData(
|
|
280
|
+
addOnID: number,
|
|
281
|
+
statusByte: number,
|
|
282
|
+
rawData: Uint8Array
|
|
283
|
+
): ROSSerialAddOnStatus | null {
|
|
284
|
+
// Lookup in map
|
|
285
|
+
const addOnIdStr = addOnID.toString();
|
|
286
|
+
if (addOnIdStr in this._configuredAddOns) {
|
|
287
|
+
const addOnHandler = this._configuredAddOns[addOnIdStr];
|
|
288
|
+
const data = addOnHandler.processPublishedData(
|
|
289
|
+
addOnID,
|
|
290
|
+
statusByte,
|
|
291
|
+
rawData
|
|
292
|
+
);
|
|
293
|
+
return data;
|
|
294
|
+
}
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
getIDNoFromName(name: string): string | null {
|
|
298
|
+
for (const key in this._configuredAddOns) {
|
|
299
|
+
if (key in this._configuredAddOns) {
|
|
300
|
+
if (this._configuredAddOns[key]._name == name) return key;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
getInitCmds(): Array<string> {
|
|
307
|
+
const cmds: Array<string> = [];
|
|
308
|
+
for (const key in this._configuredAddOns) {
|
|
309
|
+
if (key in this._configuredAddOns) {
|
|
310
|
+
const initCmd = this._configuredAddOns[key]._initCmd;
|
|
311
|
+
if (initCmd) {
|
|
312
|
+
cmds.push(initCmd);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return cmds;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
processReportMsg(reportMsgs: Array<RaftReportMsg>, timeInitStart: number) {
|
|
320
|
+
for (const reportID in reportMsgs) {
|
|
321
|
+
const report = reportMsgs[reportID];
|
|
322
|
+
//RaftLog.debug(`Report message: ${JSON.stringify(report)}`);
|
|
323
|
+
if (report.timeReceived && report.timeReceived < timeInitStart) {
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
if (report.elemName) {
|
|
327
|
+
let hwElemIDNoStr = "";
|
|
328
|
+
if (report.IDNo) {
|
|
329
|
+
hwElemIDNoStr = report.IDNo.toString();
|
|
330
|
+
} else if (report.elemName) {
|
|
331
|
+
const maybeIdno = this.getIDNoFromName(report.elemName);
|
|
332
|
+
if (maybeIdno) {
|
|
333
|
+
hwElemIDNoStr = maybeIdno;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (hwElemIDNoStr.length > 0) {
|
|
337
|
+
this._configuredAddOns[hwElemIDNoStr].processInit(report);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// RICJS
|
|
4
|
+
// Communications Library
|
|
5
|
+
//
|
|
6
|
+
// Rob Dobson & Chris Greening 2020-2022
|
|
7
|
+
// (C) 2020-2022
|
|
8
|
+
//
|
|
9
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
|
|
11
|
+
export default class RICCommsStats {
|
|
12
|
+
|
|
13
|
+
_msgSmartServos = 0;
|
|
14
|
+
_msgIMU = 0;
|
|
15
|
+
_msgPowerStatus = 0;
|
|
16
|
+
_msgAddOnPub = 0;
|
|
17
|
+
_msgRobotStatus = 0;
|
|
18
|
+
|
|
19
|
+
_msgSmartServosPS = 0;
|
|
20
|
+
_msgIMUPS = 0;
|
|
21
|
+
_msgPowerStatusPS = 0;
|
|
22
|
+
_msgAddOnPubPS = 0;
|
|
23
|
+
_msgRobotStatusPS = 0;
|
|
24
|
+
|
|
25
|
+
_msgSmartServosCountInWindow = 0;
|
|
26
|
+
_msgIMUCountInWindow = 0;
|
|
27
|
+
_msgPowerStatusCountInWindow = 0;
|
|
28
|
+
_msgAddOnPubCountInWindow = 0;
|
|
29
|
+
_msgRobotStatusCountInWindow = 0;
|
|
30
|
+
|
|
31
|
+
_msgSmartServosLastCalcMs = 0;
|
|
32
|
+
_msgIMULastCalcMs = 0;
|
|
33
|
+
_msgPowerStatusLastCalcMs = 0;
|
|
34
|
+
_msgAddOnPubLastCalcMs = 0;
|
|
35
|
+
_msgRobotStatusLastCalcMs = 0;
|
|
36
|
+
|
|
37
|
+
_msgOtherTopic = 0;
|
|
38
|
+
|
|
39
|
+
_rosSerialRxRate = 0;
|
|
40
|
+
_rosSerialRxTotalBytes = 0;
|
|
41
|
+
_rosSerialRxTotalTimeMs = 0;
|
|
42
|
+
|
|
43
|
+
clear() {
|
|
44
|
+
this._msgSmartServos = 0;
|
|
45
|
+
this._msgIMU = 0;
|
|
46
|
+
this._msgPowerStatus = 0;
|
|
47
|
+
this._msgAddOnPub = 0;
|
|
48
|
+
this._msgRobotStatus = 0;
|
|
49
|
+
this._msgSmartServosPS = 0;
|
|
50
|
+
this._msgIMUPS = 0;
|
|
51
|
+
this._msgPowerStatusPS = 0;
|
|
52
|
+
this._msgAddOnPubPS = 0;
|
|
53
|
+
this._msgRobotStatusPS = 0;
|
|
54
|
+
this._msgSmartServosCountInWindow = 0;
|
|
55
|
+
this._msgIMUCountInWindow = 0;
|
|
56
|
+
this._msgPowerStatusCountInWindow = 0;
|
|
57
|
+
this._msgAddOnPubCountInWindow = 0;
|
|
58
|
+
this._msgRobotStatusCountInWindow = 0;
|
|
59
|
+
this._msgSmartServosLastCalcMs = Date.now();
|
|
60
|
+
this._msgIMULastCalcMs = Date.now();
|
|
61
|
+
this._msgPowerStatusLastCalcMs = Date.now();
|
|
62
|
+
this._msgAddOnPubLastCalcMs = Date.now();
|
|
63
|
+
this._msgRobotStatusLastCalcMs = Date.now();
|
|
64
|
+
this._rosSerialRxRate = 0;
|
|
65
|
+
this._rosSerialRxTotalBytes = 0;
|
|
66
|
+
this._rosSerialRxTotalTimeMs = 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
getSmartServosRate(): number {
|
|
70
|
+
if (this._msgSmartServosLastCalcMs + 1000 < Date.now()) {
|
|
71
|
+
this._msgSmartServosPS =
|
|
72
|
+
(1000.0 * this._msgSmartServosCountInWindow) /
|
|
73
|
+
(Date.now() - this._msgSmartServosLastCalcMs);
|
|
74
|
+
this._msgSmartServosLastCalcMs = Date.now();
|
|
75
|
+
this._msgSmartServosCountInWindow = 0;
|
|
76
|
+
}
|
|
77
|
+
return this._msgSmartServosPS;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
getIMURate(): number {
|
|
81
|
+
if (this._msgIMULastCalcMs + 1000 < Date.now()) {
|
|
82
|
+
this._msgIMUPS =
|
|
83
|
+
(1000.0 * this._msgIMUCountInWindow) /
|
|
84
|
+
(Date.now() - this._msgIMULastCalcMs);
|
|
85
|
+
this._msgIMULastCalcMs = Date.now();
|
|
86
|
+
this._msgIMUCountInWindow = 0;
|
|
87
|
+
}
|
|
88
|
+
return this._msgIMUPS;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
getPowerStatusRate(): number {
|
|
92
|
+
if (this._msgPowerStatusLastCalcMs + 1000 < Date.now()) {
|
|
93
|
+
this._msgPowerStatusPS =
|
|
94
|
+
(1000.0 * this._msgPowerStatusCountInWindow) /
|
|
95
|
+
(Date.now() - this._msgPowerStatusLastCalcMs);
|
|
96
|
+
this._msgPowerStatusLastCalcMs = Date.now();
|
|
97
|
+
this._msgPowerStatusCountInWindow = 0;
|
|
98
|
+
}
|
|
99
|
+
return this._msgPowerStatusPS;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
getAddOnPubRate(): number {
|
|
103
|
+
if (this._msgAddOnPubLastCalcMs + 1000 < Date.now()) {
|
|
104
|
+
this._msgAddOnPubPS =
|
|
105
|
+
(1000.0 * this._msgAddOnPubCountInWindow) /
|
|
106
|
+
(Date.now() - this._msgAddOnPubLastCalcMs);
|
|
107
|
+
this._msgAddOnPubLastCalcMs = Date.now();
|
|
108
|
+
this._msgAddOnPubCountInWindow = 0;
|
|
109
|
+
}
|
|
110
|
+
return this._msgAddOnPubPS;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
getRobotStatusRate(): number {
|
|
114
|
+
if (this._msgRobotStatusLastCalcMs + 1000 < Date.now()) {
|
|
115
|
+
this._msgRobotStatusPS =
|
|
116
|
+
(1000.0 * this._msgRobotStatusCountInWindow) /
|
|
117
|
+
(Date.now() - this._msgRobotStatusLastCalcMs);
|
|
118
|
+
this._msgRobotStatusLastCalcMs = Date.now();
|
|
119
|
+
this._msgRobotStatusCountInWindow = 0;
|
|
120
|
+
}
|
|
121
|
+
return this._msgRobotStatusPS;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
getROSSerialRate(): number {
|
|
125
|
+
if (this._rosSerialRxTotalTimeMs > 0) {
|
|
126
|
+
return (
|
|
127
|
+
(1000.0 * this._rosSerialRxTotalBytes) / this._rosSerialRxTotalTimeMs
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
recordSmartServos(): void {
|
|
134
|
+
this._msgSmartServos++;
|
|
135
|
+
this._msgSmartServosCountInWindow++;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
recordIMU(): void {
|
|
139
|
+
this._msgIMU++;
|
|
140
|
+
this._msgIMUCountInWindow++;
|
|
141
|
+
// Don't call msgRx() as double counting msgs with smartServos
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
recordPowerStatus(): void {
|
|
145
|
+
this._msgPowerStatus++;
|
|
146
|
+
this._msgPowerStatusCountInWindow++;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
recordAddOnPub(): void {
|
|
150
|
+
this._msgAddOnPub++;
|
|
151
|
+
this._msgAddOnPubCountInWindow++;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
recordRobotStatus(): void {
|
|
155
|
+
this._msgRobotStatus++;
|
|
156
|
+
this._msgRobotStatusCountInWindow++;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
recordOtherTopic(): void {
|
|
160
|
+
this._msgOtherTopic++;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
updateROSSerialRxRate(frameLen: number, timeMs: number): void {
|
|
164
|
+
if ((frameLen != 0) && (timeMs != 0)) {
|
|
165
|
+
this._rosSerialRxRate = (1000*frameLen) / timeMs;
|
|
166
|
+
this._rosSerialRxTotalTimeMs += timeMs;
|
|
167
|
+
this._rosSerialRxTotalBytes += frameLen;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|