@robdobsn/raftjs 1.8.5 → 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 +1 -1
- 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 +19 -1
- package/dist/web/RaftDeviceManager.js +89 -3
- 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,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
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RICHWElem
|
|
3
|
+
*
|
|
4
|
+
* @description
|
|
5
|
+
* Information about a hardware element
|
|
6
|
+
*
|
|
7
|
+
* @field name: string - element name
|
|
8
|
+
* @field type: string - element type
|
|
9
|
+
* @field busName: string - name of bus (e.g. I2C) attached to
|
|
10
|
+
* @field addr: string - address of element on the bus
|
|
11
|
+
* @field addrValid: number - 1 if address is valid
|
|
12
|
+
* @field IDNo: string - unique identifier of element
|
|
13
|
+
* @field whoAmI: string - name of element type
|
|
14
|
+
* @field whoAmITypeCode: string - number of element type
|
|
15
|
+
* @field SN: string - Serial number
|
|
16
|
+
* @field versionStr: string - Version
|
|
17
|
+
* @field commsOk: number - 1 if communications OK, 0 if not, -1 if device is invalid
|
|
18
|
+
*/
|
|
19
|
+
export type RICHWElem = {
|
|
20
|
+
name: string;
|
|
21
|
+
type: string;
|
|
22
|
+
busName: string;
|
|
23
|
+
addr: string;
|
|
24
|
+
addrValid: number;
|
|
25
|
+
IDNo: string;
|
|
26
|
+
whoAmI: string;
|
|
27
|
+
whoAmITypeCode: string;
|
|
28
|
+
SN: string;
|
|
29
|
+
versionStr: string;
|
|
30
|
+
commsOk: number;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export class RICHWElemList {
|
|
34
|
+
req = '';
|
|
35
|
+
rslt = 'ok';
|
|
36
|
+
hw: Array<RICHWElem> = [];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Minimum key length version of RICHWElem
|
|
40
|
+
export type RICHWElem_Min = {
|
|
41
|
+
n: string;
|
|
42
|
+
t: string;
|
|
43
|
+
I: string;
|
|
44
|
+
w: string;
|
|
45
|
+
W: string;
|
|
46
|
+
S: string;
|
|
47
|
+
v: string;
|
|
48
|
+
c: number;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export class RICHWElemList_Min {
|
|
52
|
+
// Members
|
|
53
|
+
req = '';
|
|
54
|
+
rslt = 'ok';
|
|
55
|
+
hw: Array<RICHWElem_Min> = [];
|
|
56
|
+
|
|
57
|
+
// Method to convert to RICHWElemList
|
|
58
|
+
static expand(hwMin: RICHWElemList_Min): RICHWElemList {
|
|
59
|
+
const hwList = new RICHWElemList();
|
|
60
|
+
for (const hwElem of hwMin.hw) {
|
|
61
|
+
hwList.hw.push({
|
|
62
|
+
name: hwElem.n,
|
|
63
|
+
type: hwElem.t,
|
|
64
|
+
busName: '',
|
|
65
|
+
addr: '',
|
|
66
|
+
addrValid: 0,
|
|
67
|
+
IDNo: hwElem.I,
|
|
68
|
+
whoAmI: hwElem.w,
|
|
69
|
+
whoAmITypeCode: hwElem.W,
|
|
70
|
+
SN: hwElem.S,
|
|
71
|
+
versionStr: hwElem.v,
|
|
72
|
+
commsOk: hwElem.c,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return hwList;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Single encoded string version of RICHWElem
|
|
80
|
+
export type RICHWElem_Str = {
|
|
81
|
+
a: string;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export type RICHWElemList_Name = {
|
|
85
|
+
rslt: string;
|
|
86
|
+
hw: Array<string>;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// RICHWElemList containing coded strings for each HWElem field
|
|
90
|
+
export class RICHWElemList_Str {
|
|
91
|
+
req = '';
|
|
92
|
+
rslt = 'ok';
|
|
93
|
+
hw: Array<RICHWElem_Str> = [];
|
|
94
|
+
|
|
95
|
+
// Method to convert to RICHWElemList
|
|
96
|
+
static expand(hwStr: RICHWElemList_Str): RICHWElemList {
|
|
97
|
+
const hwList = new RICHWElemList();
|
|
98
|
+
for (const hwElem of hwStr.hw) {
|
|
99
|
+
if (hwElem.a) {
|
|
100
|
+
const hwElemStr = hwElem.a.split('|');
|
|
101
|
+
hwList.hw.push({
|
|
102
|
+
name: RICHWElemList_Str.unesc(hwElemStr[0]),
|
|
103
|
+
type: RICHWElemList_Str.unesc(hwElemStr[1]),
|
|
104
|
+
busName: "",
|
|
105
|
+
addr: "",
|
|
106
|
+
addrValid: 0,
|
|
107
|
+
IDNo: RICHWElemList_Str.unesc(hwElemStr[2]),
|
|
108
|
+
whoAmI: RICHWElemList_Str.unesc(hwElemStr[3]),
|
|
109
|
+
whoAmITypeCode: RICHWElemList_Str.unesc(hwElemStr[4]),
|
|
110
|
+
SN: RICHWElemList_Str.unesc(hwElemStr[5]),
|
|
111
|
+
versionStr: RICHWElemList_Str.unesc(hwElemStr[6]),
|
|
112
|
+
commsOk: Number(hwElemStr[7]),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return hwList;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Method to unescape a pipe character
|
|
120
|
+
static unesc(s: string): string {
|
|
121
|
+
return s.replace(/\/x7c/g, '|');
|
|
122
|
+
}
|
|
123
|
+
}
|