@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.
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 +1 -1
  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 +19 -1
  131. package/dist/web/RaftDeviceManager.js +89 -3
  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,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
+ }