@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.
Files changed (224) hide show
  1. package/.editorconfig +14 -0
  2. package/.gitattributes +11 -0
  3. package/.nvmrc +1 -0
  4. package/TODO.md +1 -0
  5. package/dist/react-native/RaftAttributeHandler.d.ts +14 -0
  6. package/dist/react-native/RaftAttributeHandler.js +375 -0
  7. package/dist/react-native/RaftAttributeHandler.js.map +1 -0
  8. package/dist/react-native/RaftChannel.d.ts +20 -0
  9. package/dist/react-native/RaftChannel.js +12 -0
  10. package/dist/react-native/RaftChannel.js.map +1 -0
  11. package/dist/react-native/RaftChannelBLE.native.d.ts +95 -0
  12. package/dist/react-native/RaftChannelBLE.native.js +483 -0
  13. package/dist/react-native/RaftChannelBLE.native.js.map +1 -0
  14. package/dist/react-native/RaftChannelBLE.web.d.ts +40 -0
  15. package/dist/react-native/RaftChannelBLE.web.js +302 -0
  16. package/dist/react-native/RaftChannelBLE.web.js.map +1 -0
  17. package/dist/react-native/RaftChannelBLEFactory.d.ts +10 -0
  18. package/dist/react-native/RaftChannelBLEFactory.js +17 -0
  19. package/dist/react-native/RaftChannelBLEFactory.js.map +1 -0
  20. package/dist/react-native/RaftChannelBLEScanner.native.d.ts +18 -0
  21. package/dist/react-native/RaftChannelBLEScanner.native.js +138 -0
  22. package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -0
  23. package/dist/react-native/RaftChannelSimulated.d.ts +42 -0
  24. package/dist/react-native/RaftChannelSimulated.js +1000 -0
  25. package/dist/react-native/RaftChannelSimulated.js.map +1 -0
  26. package/dist/react-native/RaftChannelWebSerial.d.ts +39 -0
  27. package/dist/react-native/RaftChannelWebSerial.js +329 -0
  28. package/dist/react-native/RaftChannelWebSerial.js.map +1 -0
  29. package/dist/react-native/RaftChannelWebSocket.d.ts +30 -0
  30. package/dist/react-native/RaftChannelWebSocket.js +222 -0
  31. package/dist/react-native/RaftChannelWebSocket.js.map +1 -0
  32. package/dist/react-native/RaftCommsStats.d.ts +39 -0
  33. package/dist/react-native/RaftCommsStats.js +128 -0
  34. package/dist/react-native/RaftCommsStats.js.map +1 -0
  35. package/dist/react-native/RaftConnEvents.d.ts +39 -0
  36. package/dist/react-native/RaftConnEvents.js +54 -0
  37. package/dist/react-native/RaftConnEvents.js.map +1 -0
  38. package/dist/react-native/RaftConnector.d.ts +248 -0
  39. package/dist/react-native/RaftConnector.js +658 -0
  40. package/dist/react-native/RaftConnector.js.map +1 -0
  41. package/dist/react-native/RaftCustomAttrHandler.d.ts +6 -0
  42. package/dist/react-native/RaftCustomAttrHandler.js +93 -0
  43. package/dist/react-native/RaftCustomAttrHandler.js.map +1 -0
  44. package/dist/react-native/RaftDeviceInfo.d.ts +71 -0
  45. package/dist/react-native/RaftDeviceInfo.js +50 -0
  46. package/dist/react-native/RaftDeviceInfo.js.map +1 -0
  47. package/dist/react-native/RaftDeviceManager.d.ts +61 -0
  48. package/dist/react-native/RaftDeviceManager.js +665 -0
  49. package/dist/react-native/RaftDeviceManager.js.map +1 -0
  50. package/dist/react-native/RaftDeviceMgrIF.d.ts +15 -0
  51. package/dist/react-native/RaftDeviceMgrIF.js +11 -0
  52. package/dist/react-native/RaftDeviceMgrIF.js.map +1 -0
  53. package/dist/react-native/RaftDeviceMsg.d.ts +9 -0
  54. package/dist/react-native/RaftDeviceMsg.js +11 -0
  55. package/dist/react-native/RaftDeviceMsg.js.map +1 -0
  56. package/dist/react-native/RaftDeviceStates.d.ts +37 -0
  57. package/dist/react-native/RaftDeviceStates.js +60 -0
  58. package/dist/react-native/RaftDeviceStates.js.map +1 -0
  59. package/dist/react-native/RaftFileHandler.d.ts +52 -0
  60. package/dist/react-native/RaftFileHandler.js +502 -0
  61. package/dist/react-native/RaftFileHandler.js.map +1 -0
  62. package/dist/react-native/RaftLog.d.ts +22 -0
  63. package/dist/react-native/RaftLog.js +63 -0
  64. package/dist/react-native/RaftLog.js.map +1 -0
  65. package/dist/react-native/RaftMiniHDLC.d.ts +18 -0
  66. package/dist/react-native/RaftMiniHDLC.js +383 -0
  67. package/dist/react-native/RaftMiniHDLC.js.map +1 -0
  68. package/dist/react-native/RaftMsgHandler.d.ts +62 -0
  69. package/dist/react-native/RaftMsgHandler.js +511 -0
  70. package/dist/react-native/RaftMsgHandler.js.map +1 -0
  71. package/dist/react-native/RaftMsgTrackInfo.d.ts +17 -0
  72. package/dist/react-native/RaftMsgTrackInfo.js +42 -0
  73. package/dist/react-native/RaftMsgTrackInfo.js.map +1 -0
  74. package/dist/react-native/RaftProtocolDefs.d.ts +30 -0
  75. package/dist/react-native/RaftProtocolDefs.js +48 -0
  76. package/dist/react-native/RaftProtocolDefs.js.map +1 -0
  77. package/dist/react-native/RaftStreamHandler.d.ts +38 -0
  78. package/dist/react-native/RaftStreamHandler.js +258 -0
  79. package/dist/react-native/RaftStreamHandler.js.map +1 -0
  80. package/dist/react-native/RaftStruct.d.ts +3 -0
  81. package/dist/react-native/RaftStruct.js +258 -0
  82. package/dist/react-native/RaftStruct.js.map +1 -0
  83. package/dist/react-native/RaftSysTypeManager.d.ts +16 -0
  84. package/dist/react-native/RaftSysTypeManager.js +78 -0
  85. package/dist/react-native/RaftSysTypeManager.js.map +1 -0
  86. package/dist/react-native/RaftSystemType.d.ts +30 -0
  87. package/dist/react-native/RaftSystemType.js +3 -0
  88. package/dist/react-native/RaftSystemType.js.map +1 -0
  89. package/dist/react-native/RaftSystemUtils.d.ts +136 -0
  90. package/dist/react-native/RaftSystemUtils.js +412 -0
  91. package/dist/react-native/RaftSystemUtils.js.map +1 -0
  92. package/dist/react-native/RaftTypes.d.ts +195 -0
  93. package/dist/react-native/RaftTypes.js +153 -0
  94. package/dist/react-native/RaftTypes.js.map +1 -0
  95. package/dist/react-native/RaftUpdateEvents.d.ts +33 -0
  96. package/dist/react-native/RaftUpdateEvents.js +46 -0
  97. package/dist/react-native/RaftUpdateEvents.js.map +1 -0
  98. package/dist/react-native/RaftUpdateManager.d.ts +61 -0
  99. package/dist/react-native/RaftUpdateManager.js +621 -0
  100. package/dist/react-native/RaftUpdateManager.js.map +1 -0
  101. package/dist/react-native/RaftUtils.d.ts +128 -0
  102. package/dist/react-native/RaftUtils.js +487 -0
  103. package/dist/react-native/RaftUtils.js.map +1 -0
  104. package/dist/react-native/RaftWifiTypes.d.ts +23 -0
  105. package/dist/react-native/RaftWifiTypes.js +43 -0
  106. package/dist/react-native/RaftWifiTypes.js.map +1 -0
  107. package/dist/react-native/main.d.ts +26 -0
  108. package/dist/react-native/main.js +51 -0
  109. package/dist/react-native/main.js.map +1 -0
  110. package/dist/web/RaftAttributeHandler.js +9 -6
  111. package/dist/web/RaftAttributeHandler.js.map +1 -1
  112. package/dist/web/RaftChannelBLE.web.js +8 -6
  113. package/dist/web/RaftChannelBLE.web.js.map +1 -1
  114. package/dist/web/RaftChannelSimulated.d.ts +10 -0
  115. package/dist/web/RaftChannelSimulated.js +662 -80
  116. package/dist/web/RaftChannelSimulated.js.map +1 -1
  117. package/dist/web/RaftChannelWebSerial.js +2 -2
  118. package/dist/web/RaftChannelWebSerial.js.map +1 -1
  119. package/dist/web/RaftChannelWebSocket.js +16 -1
  120. package/dist/web/RaftChannelWebSocket.js.map +1 -1
  121. package/dist/web/RaftConnector.d.ts +2 -0
  122. package/dist/web/RaftConnector.js +38 -15
  123. package/dist/web/RaftConnector.js.map +1 -1
  124. package/dist/web/RaftCustomAttrHandler.d.ts +2 -0
  125. package/dist/web/RaftCustomAttrHandler.js +54 -26
  126. package/dist/web/RaftCustomAttrHandler.js.map +1 -1
  127. package/dist/web/RaftDeviceInfo.d.ts +3 -1
  128. package/dist/web/RaftDeviceInfo.js +17 -3
  129. package/dist/web/RaftDeviceInfo.js.map +1 -1
  130. package/dist/web/RaftDeviceManager.d.ts +22 -1
  131. package/dist/web/RaftDeviceManager.js +210 -44
  132. package/dist/web/RaftDeviceManager.js.map +1 -1
  133. package/dist/web/RaftDeviceStates.d.ts +1 -1
  134. package/dist/web/RaftDeviceStates.js +2 -2
  135. package/dist/web/RaftDeviceStates.js.map +1 -1
  136. package/dist/web/RaftMsgHandler.js.map +1 -1
  137. package/dist/web/RaftStreamHandler.js +2 -1
  138. package/dist/web/RaftStreamHandler.js.map +1 -1
  139. package/dist/web/RaftStruct.js +197 -147
  140. package/dist/web/RaftStruct.js.map +1 -1
  141. package/dist/web/RaftUpdateManager.js +1 -1
  142. package/dist/web/RaftUpdateManager.js.map +1 -1
  143. package/dist/web/RaftUtils.d.ts +2 -0
  144. package/dist/web/RaftUtils.js +20 -0
  145. package/dist/web/RaftUtils.js.map +1 -1
  146. package/dist/web/main.d.ts +1 -0
  147. package/dist/web/main.js.map +1 -1
  148. package/eslint.config.mjs +33 -0
  149. package/examples/dashboard/package.json +36 -0
  150. package/examples/dashboard/src/CommandPanel.tsx +147 -0
  151. package/examples/dashboard/src/ConnManager.ts +166 -0
  152. package/examples/dashboard/src/DeviceActionsForm.tsx +133 -0
  153. package/examples/dashboard/src/DeviceAttrsForm.tsx +49 -0
  154. package/examples/dashboard/src/DeviceLineChart.tsx +163 -0
  155. package/examples/dashboard/src/DevicePanel.tsx +171 -0
  156. package/examples/dashboard/src/DevicesPanel.tsx +58 -0
  157. package/examples/dashboard/src/DispLedGrid.tsx +110 -0
  158. package/examples/dashboard/src/DispOneLed.tsx +20 -0
  159. package/examples/dashboard/src/LatencyTest.ts +130 -0
  160. package/examples/dashboard/src/LatencyTestPanel.tsx +92 -0
  161. package/examples/dashboard/src/Main.tsx +234 -0
  162. package/examples/dashboard/src/SettingsManager.ts +67 -0
  163. package/examples/dashboard/src/SettingsScreen.tsx +174 -0
  164. package/examples/dashboard/src/StatusPanel.tsx +71 -0
  165. package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +162 -0
  166. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +91 -0
  167. package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +30 -0
  168. package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +91 -0
  169. package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +70 -0
  170. package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +33 -0
  171. package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +342 -0
  172. package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +170 -0
  173. package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +123 -0
  174. package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +207 -0
  175. package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +464 -0
  176. package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +146 -0
  177. package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +97 -0
  178. package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +371 -0
  179. package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +20 -0
  180. package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +119 -0
  181. package/examples/dashboard/src/index.html +15 -0
  182. package/examples/dashboard/src/index.tsx +13 -0
  183. package/examples/dashboard/src/styles.css +408 -0
  184. package/examples/dashboard/tsconfig.json +18 -0
  185. package/jest.config.js +11 -0
  186. package/package.json +4 -7
  187. package/src/RaftAttributeHandler.ts +450 -0
  188. package/src/RaftChannel.ts +32 -0
  189. package/src/RaftChannelBLE.native.ts +617 -0
  190. package/src/RaftChannelBLE.web.ts +374 -0
  191. package/src/RaftChannelBLEFactory.ts +13 -0
  192. package/src/RaftChannelBLEScanner.native.ts +184 -0
  193. package/src/RaftChannelSimulated.ts +1176 -0
  194. package/src/RaftChannelWebSerial.ts +420 -0
  195. package/src/RaftChannelWebSocket.ts +272 -0
  196. package/src/RaftCommsStats.ts +142 -0
  197. package/src/RaftConnEvents.ts +58 -0
  198. package/src/RaftConnector.ts +785 -0
  199. package/src/RaftCustomAttrHandler.ts +117 -0
  200. package/src/RaftDeviceInfo.ts +125 -0
  201. package/src/RaftDeviceManager.ts +844 -0
  202. package/src/RaftDeviceMgrIF.ts +33 -0
  203. package/src/RaftDeviceMsg.ts +20 -0
  204. package/src/RaftDeviceStates.ts +92 -0
  205. package/src/RaftFileHandler.ts +668 -0
  206. package/src/RaftLog.ts +70 -0
  207. package/src/RaftMiniHDLC.ts +396 -0
  208. package/src/RaftMsgHandler.ts +812 -0
  209. package/src/RaftMsgTrackInfo.ts +51 -0
  210. package/src/RaftProtocolDefs.ts +46 -0
  211. package/src/RaftStreamHandler.ts +329 -0
  212. package/src/RaftStruct.ts +282 -0
  213. package/src/RaftSysTypeManager.ts +87 -0
  214. package/src/RaftSystemType.ts +34 -0
  215. package/src/RaftSystemUtils.ts +489 -0
  216. package/src/RaftTypes.ts +279 -0
  217. package/src/RaftUpdateEvents.ts +48 -0
  218. package/src/RaftUpdateManager.ts +781 -0
  219. package/src/RaftUtils.ts +514 -0
  220. package/src/RaftWifiTypes.ts +36 -0
  221. package/src/main.ts +39 -0
  222. package/testdata/TestDeviceTypeRecs.json +492 -0
  223. package/tsconfig.json +30 -0
  224. 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
+ }