@robdobsn/raftjs 1.7.1 → 1.7.3

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 (205) hide show
  1. package/dist/web/RaftAttributeHandler.js +5 -5
  2. package/dist/web/RaftAttributeHandler.js.map +1 -1
  3. package/dist/web/RaftChannel.d.ts +2 -0
  4. package/dist/web/RaftChannelBLE.web.d.ts +2 -0
  5. package/dist/web/RaftChannelBLE.web.js +10 -0
  6. package/dist/web/RaftChannelBLE.web.js.map +1 -1
  7. package/dist/{react-native/RaftChannelWebSocket.d.ts → web/RaftChannelSimulated.d.ts} +9 -5
  8. package/dist/web/RaftChannelSimulated.js +418 -0
  9. package/dist/web/RaftChannelSimulated.js.map +1 -0
  10. package/dist/web/RaftChannelWebSerial.d.ts +2 -0
  11. package/dist/web/RaftChannelWebSerial.js +10 -0
  12. package/dist/web/RaftChannelWebSerial.js.map +1 -1
  13. package/dist/web/RaftChannelWebSocket.d.ts +2 -0
  14. package/dist/web/RaftChannelWebSocket.js +10 -0
  15. package/dist/web/RaftChannelWebSocket.js.map +1 -1
  16. package/dist/web/RaftConnector.js +5 -0
  17. package/dist/web/RaftConnector.js.map +1 -1
  18. package/dist/web/RaftDeviceInfo.d.ts +1 -1
  19. package/dist/web/RaftMsgHandler.d.ts +5 -0
  20. package/dist/web/RaftMsgHandler.js +32 -0
  21. package/dist/web/RaftMsgHandler.js.map +1 -1
  22. package/dist/web/main.d.ts +1 -0
  23. package/dist/web/main.js +3 -1
  24. package/dist/web/main.js.map +1 -1
  25. package/package.json +5 -2
  26. package/.editorconfig +0 -14
  27. package/.gitattributes +0 -11
  28. package/.nvmrc +0 -1
  29. package/TODO.md +0 -1
  30. package/dist/react-native/RaftAttributeHandler.d.ts +0 -12
  31. package/dist/react-native/RaftAttributeHandler.js +0 -249
  32. package/dist/react-native/RaftAttributeHandler.js.map +0 -1
  33. package/dist/react-native/RaftChannel.d.ts +0 -18
  34. package/dist/react-native/RaftChannel.js +0 -12
  35. package/dist/react-native/RaftChannel.js.map +0 -1
  36. package/dist/react-native/RaftChannelBLE.native.d.ts +0 -93
  37. package/dist/react-native/RaftChannelBLE.native.js +0 -472
  38. package/dist/react-native/RaftChannelBLE.native.js.map +0 -1
  39. package/dist/react-native/RaftChannelBLE.web.d.ts +0 -38
  40. package/dist/react-native/RaftChannelBLE.web.js +0 -290
  41. package/dist/react-native/RaftChannelBLE.web.js.map +0 -1
  42. package/dist/react-native/RaftChannelBLEFactory.d.ts +0 -10
  43. package/dist/react-native/RaftChannelBLEFactory.js +0 -17
  44. package/dist/react-native/RaftChannelBLEFactory.js.map +0 -1
  45. package/dist/react-native/RaftChannelBLEScanner.native.d.ts +0 -18
  46. package/dist/react-native/RaftChannelBLEScanner.native.js +0 -138
  47. package/dist/react-native/RaftChannelBLEScanner.native.js.map +0 -1
  48. package/dist/react-native/RaftChannelWebSerial.d.ts +0 -37
  49. package/dist/react-native/RaftChannelWebSerial.js +0 -319
  50. package/dist/react-native/RaftChannelWebSerial.js.map +0 -1
  51. package/dist/react-native/RaftChannelWebSocket.js +0 -197
  52. package/dist/react-native/RaftChannelWebSocket.js.map +0 -1
  53. package/dist/react-native/RaftCommsStats.d.ts +0 -39
  54. package/dist/react-native/RaftCommsStats.js +0 -128
  55. package/dist/react-native/RaftCommsStats.js.map +0 -1
  56. package/dist/react-native/RaftConnEvents.d.ts +0 -39
  57. package/dist/react-native/RaftConnEvents.js +0 -54
  58. package/dist/react-native/RaftConnEvents.js.map +0 -1
  59. package/dist/react-native/RaftConnector.d.ts +0 -245
  60. package/dist/react-native/RaftConnector.js +0 -616
  61. package/dist/react-native/RaftConnector.js.map +0 -1
  62. package/dist/react-native/RaftCustomAttrHandler.d.ts +0 -4
  63. package/dist/react-native/RaftCustomAttrHandler.js +0 -50
  64. package/dist/react-native/RaftCustomAttrHandler.js.map +0 -1
  65. package/dist/react-native/RaftDeviceInfo.d.ts +0 -63
  66. package/dist/react-native/RaftDeviceInfo.js +0 -36
  67. package/dist/react-native/RaftDeviceInfo.js.map +0 -1
  68. package/dist/react-native/RaftDeviceManager.d.ts +0 -40
  69. package/dist/react-native/RaftDeviceManager.js +0 -499
  70. package/dist/react-native/RaftDeviceManager.js.map +0 -1
  71. package/dist/react-native/RaftDeviceMgrIF.d.ts +0 -15
  72. package/dist/react-native/RaftDeviceMgrIF.js +0 -11
  73. package/dist/react-native/RaftDeviceMgrIF.js.map +0 -1
  74. package/dist/react-native/RaftDeviceMsg.d.ts +0 -9
  75. package/dist/react-native/RaftDeviceMsg.js +0 -11
  76. package/dist/react-native/RaftDeviceMsg.js.map +0 -1
  77. package/dist/react-native/RaftDeviceStates.d.ts +0 -37
  78. package/dist/react-native/RaftDeviceStates.js +0 -60
  79. package/dist/react-native/RaftDeviceStates.js.map +0 -1
  80. package/dist/react-native/RaftFileHandler.d.ts +0 -52
  81. package/dist/react-native/RaftFileHandler.js +0 -502
  82. package/dist/react-native/RaftFileHandler.js.map +0 -1
  83. package/dist/react-native/RaftLog.d.ts +0 -22
  84. package/dist/react-native/RaftLog.js +0 -63
  85. package/dist/react-native/RaftLog.js.map +0 -1
  86. package/dist/react-native/RaftMiniHDLC.d.ts +0 -18
  87. package/dist/react-native/RaftMiniHDLC.js +0 -383
  88. package/dist/react-native/RaftMiniHDLC.js.map +0 -1
  89. package/dist/react-native/RaftMsgHandler.d.ts +0 -57
  90. package/dist/react-native/RaftMsgHandler.js +0 -479
  91. package/dist/react-native/RaftMsgHandler.js.map +0 -1
  92. package/dist/react-native/RaftMsgTrackInfo.d.ts +0 -17
  93. package/dist/react-native/RaftMsgTrackInfo.js +0 -42
  94. package/dist/react-native/RaftMsgTrackInfo.js.map +0 -1
  95. package/dist/react-native/RaftProtocolDefs.d.ts +0 -30
  96. package/dist/react-native/RaftProtocolDefs.js +0 -48
  97. package/dist/react-native/RaftProtocolDefs.js.map +0 -1
  98. package/dist/react-native/RaftStreamHandler.d.ts +0 -38
  99. package/dist/react-native/RaftStreamHandler.js +0 -257
  100. package/dist/react-native/RaftStreamHandler.js.map +0 -1
  101. package/dist/react-native/RaftStruct.d.ts +0 -3
  102. package/dist/react-native/RaftStruct.js +0 -208
  103. package/dist/react-native/RaftStruct.js.map +0 -1
  104. package/dist/react-native/RaftSysTypeManager.d.ts +0 -14
  105. package/dist/react-native/RaftSysTypeManager.js +0 -53
  106. package/dist/react-native/RaftSysTypeManager.js.map +0 -1
  107. package/dist/react-native/RaftSystemType.d.ts +0 -28
  108. package/dist/react-native/RaftSystemType.js +0 -3
  109. package/dist/react-native/RaftSystemType.js.map +0 -1
  110. package/dist/react-native/RaftSystemUtils.d.ts +0 -136
  111. package/dist/react-native/RaftSystemUtils.js +0 -410
  112. package/dist/react-native/RaftSystemUtils.js.map +0 -1
  113. package/dist/react-native/RaftTypes.d.ts +0 -194
  114. package/dist/react-native/RaftTypes.js +0 -153
  115. package/dist/react-native/RaftTypes.js.map +0 -1
  116. package/dist/react-native/RaftUpdateEvents.d.ts +0 -33
  117. package/dist/react-native/RaftUpdateEvents.js +0 -46
  118. package/dist/react-native/RaftUpdateEvents.js.map +0 -1
  119. package/dist/react-native/RaftUpdateManager.d.ts +0 -61
  120. package/dist/react-native/RaftUpdateManager.js +0 -621
  121. package/dist/react-native/RaftUpdateManager.js.map +0 -1
  122. package/dist/react-native/RaftUtils.d.ts +0 -126
  123. package/dist/react-native/RaftUtils.js +0 -467
  124. package/dist/react-native/RaftUtils.js.map +0 -1
  125. package/dist/react-native/RaftWifiTypes.d.ts +0 -23
  126. package/dist/react-native/RaftWifiTypes.js +0 -43
  127. package/dist/react-native/RaftWifiTypes.js.map +0 -1
  128. package/dist/react-native/main.d.ts +0 -24
  129. package/dist/react-native/main.js +0 -49
  130. package/dist/react-native/main.js.map +0 -1
  131. package/eslint.config.mjs +0 -33
  132. package/examples/dashboard/package.json +0 -36
  133. package/examples/dashboard/src/CommandPanel.tsx +0 -147
  134. package/examples/dashboard/src/ConnManager.ts +0 -164
  135. package/examples/dashboard/src/DeviceActionsForm.tsx +0 -133
  136. package/examples/dashboard/src/DeviceAttrsForm.tsx +0 -49
  137. package/examples/dashboard/src/DeviceLineChart.tsx +0 -163
  138. package/examples/dashboard/src/DevicePanel.tsx +0 -166
  139. package/examples/dashboard/src/DevicesPanel.tsx +0 -58
  140. package/examples/dashboard/src/DispLedGrid.tsx +0 -110
  141. package/examples/dashboard/src/DispOneLed.tsx +0 -20
  142. package/examples/dashboard/src/LatencyTest.ts +0 -130
  143. package/examples/dashboard/src/LatencyTestPanel.tsx +0 -92
  144. package/examples/dashboard/src/Main.tsx +0 -234
  145. package/examples/dashboard/src/SettingsManager.ts +0 -67
  146. package/examples/dashboard/src/SettingsScreen.tsx +0 -174
  147. package/examples/dashboard/src/StatusPanel.tsx +0 -71
  148. package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +0 -163
  149. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +0 -91
  150. package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +0 -30
  151. package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +0 -91
  152. package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +0 -70
  153. package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +0 -33
  154. package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +0 -342
  155. package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +0 -170
  156. package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +0 -123
  157. package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +0 -207
  158. package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +0 -464
  159. package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +0 -146
  160. package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +0 -97
  161. package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +0 -371
  162. package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +0 -20
  163. package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +0 -119
  164. package/examples/dashboard/src/index.html +0 -15
  165. package/examples/dashboard/src/index.tsx +0 -13
  166. package/examples/dashboard/src/styles.css +0 -408
  167. package/examples/dashboard/tsconfig.json +0 -18
  168. package/jest.config.js +0 -11
  169. package/src/RaftAttributeHandler.ts +0 -298
  170. package/src/RaftChannel.ts +0 -30
  171. package/src/RaftChannelBLE.native.ts +0 -604
  172. package/src/RaftChannelBLE.web.ts +0 -359
  173. package/src/RaftChannelBLEFactory.ts +0 -13
  174. package/src/RaftChannelBLEScanner.native.ts +0 -184
  175. package/src/RaftChannelWebSerial.ts +0 -408
  176. package/src/RaftChannelWebSocket.ts +0 -245
  177. package/src/RaftCommsStats.ts +0 -142
  178. package/src/RaftConnEvents.ts +0 -58
  179. package/src/RaftConnector.ts +0 -739
  180. package/src/RaftCustomAttrHandler.ts +0 -54
  181. package/src/RaftDeviceInfo.ts +0 -102
  182. package/src/RaftDeviceManager.ts +0 -607
  183. package/src/RaftDeviceMgrIF.ts +0 -33
  184. package/src/RaftDeviceMsg.ts +0 -20
  185. package/src/RaftDeviceStates.ts +0 -92
  186. package/src/RaftFileHandler.ts +0 -668
  187. package/src/RaftLog.ts +0 -70
  188. package/src/RaftMiniHDLC.ts +0 -396
  189. package/src/RaftMsgHandler.ts +0 -777
  190. package/src/RaftMsgTrackInfo.ts +0 -51
  191. package/src/RaftProtocolDefs.ts +0 -46
  192. package/src/RaftStreamHandler.ts +0 -328
  193. package/src/RaftStruct.ts +0 -209
  194. package/src/RaftSysTypeManager.ts +0 -60
  195. package/src/RaftSystemType.ts +0 -32
  196. package/src/RaftSystemUtils.ts +0 -487
  197. package/src/RaftTypes.ts +0 -278
  198. package/src/RaftUpdateEvents.ts +0 -48
  199. package/src/RaftUpdateManager.ts +0 -781
  200. package/src/RaftUtils.ts +0 -494
  201. package/src/RaftWifiTypes.ts +0 -36
  202. package/src/main.ts +0 -37
  203. package/testdata/TestDeviceTypeRecs.json +0 -492
  204. package/tsconfig.json +0 -30
  205. package/tsconfig.react-native.json +0 -29
@@ -1,781 +0,0 @@
1
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
- //
3
- // RaftUpdateManager
4
- // Part of RaftJS
5
- //
6
- // Rob Dobson & Chris Greening 2020-2024
7
- // (C) 2020-2024 All rights reserved
8
- //
9
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
-
11
- import RaftChannel from "./RaftChannel";
12
- import RaftFileHandler from "./RaftFileHandler";
13
- import RaftLog from "./RaftLog";
14
- import RaftMsgHandler from "./RaftMsgHandler";
15
- import RaftSystemUtils from "./RaftSystemUtils";
16
- import { RaftFWInfo, RaftFileDownloadFn, RaftFileSendType, RaftHWFWUpdRslt, RaftOKFail, RaftSystemInfo, RaftUpdateInfo } from "./RaftTypes";
17
- import { RaftUpdateEvent, RaftUpdateEventFn } from "./RaftUpdateEvents";
18
- import RaftUtils from "./RaftUtils";
19
- import { RaftSystemType } from "./RaftSystemType";
20
-
21
- export default class RICUpdateManager {
22
- // Version info
23
- private _latestVersionInfo: RaftUpdateInfo | null = null;
24
- private _updateESPRequired = false;
25
- private _updateElemsRequired = false;
26
-
27
- // FW update
28
- private readonly FW_UPDATE_CHECKS_BEFORE_ASSUME_FAILED = 10;
29
- private readonly ELEM_FW_CHECK_LOOPS = 36;
30
-
31
- // Progress levels
32
- private _progressAfterDownload = 0.1;
33
- private _progressDuringUpload = 0.8;
34
- private _progressDuringRestart = 0.015;
35
-
36
- // Raft info
37
- private _idToConnectTo: string | null = null;
38
- private _nameToConnectTo: string | null = null;
39
-
40
- // TODO - decide what to do with RICHwRevNo
41
- private _ricHwRevNo: number | null = null;
42
-
43
- // TESTS - set to true for testing OTA updates ONLY
44
- private readonly TEST_TRUNCATE_ESP_FILE = false;
45
- private readonly TEST_PRETEND_ELEM_UPDATE_REQD = false;
46
- public TEST_PRETEND_INITIAL_VERSIONS_DIFFER = false; // this is public so it can be set from the front-end to force an update
47
- private readonly TEST_PRETEND_FINAL_VERSIONS_MATCH = false;
48
- private readonly TEST_SKIP_FW_UPDATE = false;
49
-
50
- constructor(
51
- private _systemType: RaftSystemType | null,
52
- private _msgHandler: RaftMsgHandler,
53
- private _raftFileHandler: RaftFileHandler,
54
- private _raftSystemUtils: RaftSystemUtils,
55
- private _eventListener: RaftUpdateEventFn,
56
- private _firmwareTypeStrForMainFw: string,
57
- private _currentAppVersion: string,
58
- private _fileDownloader: RaftFileDownloadFn,
59
- private _firmwareUpdateURL: string,
60
- private _firmwareBaseURL: string,
61
- private _raftChannel: RaftChannel | null
62
- ) {}
63
-
64
-
65
- async checkForUpdate(
66
- systemInfo: RaftSystemInfo | null
67
- ): Promise<RaftUpdateEvent> {
68
- if (systemInfo === null) {
69
- return RaftUpdateEvent.UPDATE_NOT_AVAILABLE;
70
- }
71
-
72
- this._latestVersionInfo = null;
73
- try {
74
- // handle url modifications
75
- let updateURL = this._firmwareUpdateURL;
76
- const raftSystemInfo = this._raftSystemUtils.getCachedSystemInfo();
77
-
78
- // TODO - decide what to do with ricHWRevNo - several times below
79
-
80
- if (!raftSystemInfo || !raftSystemInfo.RicHwRevNo){
81
- RaftLog.debug("checkForUpdate failed to get Raft info, either no channel or no system info");
82
- RaftLog.debug("raftSystemInfo:" + JSON.stringify(raftSystemInfo));
83
- RaftLog.debug("ricHwRevNo:" + raftSystemInfo!.RicHwRevNo);
84
- return RaftUpdateEvent.UPDATE_FAILED;
85
- }
86
- updateURL = updateURL.replace(
87
- "{HWRevNo}",
88
- raftSystemInfo.RicHwRevNo.toString()
89
- );
90
-
91
- // debug
92
- RaftLog.debug(`Update URL: ${updateURL}`);
93
- const response = await fetch(updateURL, { method: 'GET' });
94
- if (!response.ok) {
95
- RaftLog.debug(`HTTP error! status: ${response.status}`);
96
- return RaftUpdateEvent.UPDATE_CANT_REACH_SERVER;
97
- }
98
- this._latestVersionInfo = await response.json();
99
- } catch (error) {
100
- RaftLog.debug(`Failed to get latest version from internet ${error}`);
101
- }
102
- if (this._latestVersionInfo === null) {
103
- return RaftUpdateEvent.UPDATE_CANT_REACH_SERVER;
104
- }
105
-
106
- // Check the version and incomplete previous hw-elem update if needed
107
- try {
108
- const updateRequired = await this._isUpdateRequired(
109
- this._latestVersionInfo,
110
- systemInfo
111
- );
112
- RaftLog.debug(
113
- `checkForUpdate systemVersion ${systemInfo?.SystemVersion} available online ${this._latestVersionInfo?.firmwareVersion} updateRequired ${updateRequired}`
114
- );
115
- if (updateRequired) {
116
- if (
117
- RaftUtils.isVersionGreater(
118
- this._latestVersionInfo.minimumUpdaterVersion.ota,
119
- this._currentAppVersion
120
- )
121
- ) {
122
- RaftLog.debug(
123
- `App version ${this._currentAppVersion} but version ${this._latestVersionInfo.minimumUpdaterVersion.ota} required`
124
- );
125
- return RaftUpdateEvent.UPDATE_APP_UPDATE_REQUIRED;
126
- } else {
127
- return RaftUpdateEvent.UPDATE_IS_AVAILABLE;
128
- }
129
- } else {
130
- return RaftUpdateEvent.UPDATE_NOT_AVAILABLE;
131
- }
132
- } catch (error) {
133
- RaftLog.debug(`checkForUpdate failed ${error}`);
134
- }
135
- return RaftUpdateEvent.UPDATE_CANT_REACH_SERVER;
136
- }
137
-
138
- async _isUpdateRequired(
139
- latestVersion: RaftUpdateInfo,
140
- systemInfo: RaftSystemInfo
141
- ): Promise<boolean> {
142
- this._updateESPRequired = false;
143
- this._updateElemsRequired = false;
144
-
145
- // Perform the version check
146
- this._updateESPRequired = RaftUtils.isVersionGreater(
147
- latestVersion.firmwareVersion,
148
- systemInfo.SystemVersion
149
- );
150
-
151
- // Test ONLY pretend an update is needed
152
- if (this.TEST_PRETEND_INITIAL_VERSIONS_DIFFER) {
153
- this._updateESPRequired = true;
154
- }
155
-
156
- // TODO: check if elem updates are required using elemsUpdatesRequired()
157
-
158
- // Check if a previous hw-elem update didn't complete - but no point if we would update anyway
159
- if (!this._updateESPRequired) {
160
- try {
161
- const elUpdRslt =
162
- await this._msgHandler.sendRICRESTURL<RaftHWFWUpdRslt>("hwfwupd");
163
-
164
- // Check result
165
- this._updateElemsRequired =
166
- elUpdRslt.rslt === "ok" && elUpdRslt.st.i === 1;
167
-
168
- // Debug
169
- if (this._updateElemsRequired) {
170
- RaftLog.debug("isUpdateRequired - prev incomplete");
171
- } else {
172
- RaftLog.debug("isUpdateRequired - prev complete");
173
- }
174
-
175
- // Test ONLY pretend an element update is needed
176
- if (this.TEST_PRETEND_ELEM_UPDATE_REQD) {
177
- this._updateElemsRequired = true;
178
- }
179
- } catch (error) {
180
- RaftLog.debug(
181
- `isUpdateRequired - failed to get hw-elem firmware update status ${error}`
182
- );
183
- }
184
- } else {
185
- this._updateElemsRequired = true;
186
- }
187
- return this._updateESPRequired || this._updateElemsRequired;
188
- }
189
-
190
-
191
- // Mark: Firmware update ------------------------------------------------------------------------------------------------
192
- elemUpdateRequired(expectedVersion: string, actualVersion: string, dtid: number, addr: number, elemType: string){
193
- if (elemType != "SmartServo" && elemType != "RSAddOn") return false;
194
- const outdated = RaftUtils.isVersionGreater(expectedVersion, actualVersion);
195
- if (!outdated) return false;
196
- // if stm32, we only want to update the base elems
197
- const stm32_dtid_mask = 0xFFFFFF00
198
- const stm32_dtid_id = 0x00000100
199
- const stm32_base_elems = [0x10, 0x13, 0x16];
200
- if ((dtid & stm32_dtid_mask) == stm32_dtid_id){
201
- return stm32_base_elems.includes(addr);
202
- }
203
- return true;
204
- }
205
-
206
- getExpectedVersion(firmwareVersions: any, dtid: number){
207
- if (Object.prototype.hasOwnProperty.call(firmwareVersions["dtid"], dtid)){
208
- return firmwareVersions["dtid"][dtid]["version"];
209
- }
210
- return null;
211
- }
212
-
213
- async elemUpdatesRequired(): Promise<Array<any> | null> {
214
- const elemsToUpdate = [];
215
-
216
- const firmwareVersionsUrl = `${this._firmwareBaseURL}/firmware/firmwareVersions.json`;
217
-
218
- // get elem firmware expected versions
219
- const firmwareVersionResponse = await fetch(firmwareVersionsUrl);
220
- if (!firmwareVersionResponse.ok) return null;
221
- const firmwareVersionsJson = await firmwareVersionResponse.json();
222
- RaftLog.debug(`firmwareVersions response ${JSON.stringify(firmwareVersionsJson)}`);
223
-
224
- // get connected elements
225
- const hwstatus: any = await this._msgHandler.sendRICRESTURL("hwstatus");
226
- RaftLog.debug(`hwstatus response: ${JSON.stringify(hwstatus)}`);
227
- const hwElems = hwstatus["hw"];
228
- // TODO: check if hwstatus is reporting versions as "0.0.0", if so pause and retry as robot is probably still starting up
229
-
230
- for (const elem in hwElems){
231
- // TODO: use RaftHWElem type
232
- const dtid = parseInt(hwElems[elem]["whoAmITypeCode"], 16);
233
- const expectedVersion = this.getExpectedVersion(firmwareVersionsJson, dtid);
234
- const actualVersion = hwElems[elem]["versionStr"];
235
- const addr = parseInt(hwElems[elem]["addr"], 16);
236
- const elemType = hwElems[elem]["type"];
237
- const elemName = hwElems[elem]["name"];
238
- RaftLog.debug(`hwElem ${elemName} dtid ${dtid} addr ${addr} type ${elemType} expectedVersion ${expectedVersion} actual version ${actualVersion}`);
239
- if (expectedVersion){
240
- hwElems[elem]["expectedVersion"] = expectedVersion;
241
- if (this.elemUpdateRequired(expectedVersion, actualVersion, dtid, addr, elemType))
242
- elemsToUpdate.push(hwElems[elem]);
243
- }
244
- }
245
- return elemsToUpdate;
246
- }
247
-
248
- async firmwareUpdate(): Promise<RaftUpdateEvent> {
249
- // Check valid
250
- if (this._latestVersionInfo === null)
251
- return RaftUpdateEvent.UPDATE_NOT_CONFIGURED;
252
-
253
- // save Raft info for later restarts
254
- const raftSystemInfo = this._raftSystemUtils.getCachedSystemInfo();
255
- if (this._raftChannel && raftSystemInfo !== null) {
256
- const deviceInfo: BluetoothDevice =
257
- this._raftChannel.getConnectedLocator() as BluetoothDevice;
258
- this._idToConnectTo = deviceInfo.id;
259
-
260
- // TODO - decide what to do with this - used to say "Marty"
261
- this._nameToConnectTo = deviceInfo.name || "Raft";
262
-
263
- //Decide what to do with RICHwRevNo - should use HwRev if it exists
264
-
265
- // Convert raftSystemInfo.RicHwRevNo to a number
266
- const hwRev = raftSystemInfo.RicHwRevNo;
267
- this._ricHwRevNo = hwRev === undefined ? 0 : (typeof hwRev === "string" ? parseInt(hwRev) : hwRev);
268
- RaftLog.debug("iDToConnectTo " + this._idToConnectTo);
269
- RaftLog.debug("nameToConnectTo " + this._nameToConnectTo);
270
- RaftLog.debug("HW Rev " + this._ricHwRevNo.toString());
271
- } else {
272
- RaftLog.debug(
273
- "firmwareUpdate failed to get Raft info, either no channel or no system info"
274
- );
275
- return RaftUpdateEvent.UPDATE_FAILED;
276
- }
277
-
278
- // Update started
279
- this._eventListener(RaftUpdateEvent.UPDATE_STARTED);
280
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
281
- stage: "Downloading firmware",
282
- progress: 0,
283
- updatingFilesystem: false,
284
- });
285
-
286
- // parse version file to extract only "ota" files
287
- const firmwareList: Array<RaftFWInfo> = [];
288
- let mainFwInfo: RaftFWInfo | null = null;
289
- this._latestVersionInfo.files.forEach((fileInfo) => {
290
- if (fileInfo.updaters.indexOf("ota") != -1) {
291
- fileInfo.downloadUrl = fileInfo.firmware || fileInfo.downloadUrl;
292
- if (fileInfo.elemType === this._firmwareTypeStrForMainFw) {
293
- mainFwInfo = fileInfo;
294
- } else {
295
- firmwareList.push(fileInfo);
296
- }
297
- RaftLog.debug(
298
- `fwUpdate selected file ${fileInfo.destname} for download`
299
- );
300
- }
301
- });
302
-
303
- // Add the main firware if it is required
304
- if (this._updateESPRequired && mainFwInfo != null) {
305
- firmwareList.unshift(mainFwInfo); // add to front of array so it's downloaded first
306
- }
307
-
308
- // Binary data downloaded from the internet
309
- const firmwareData = new Array<Uint8Array>();
310
-
311
- // Iterate through the firmware entities
312
- const numFw = firmwareList.length;
313
- try {
314
- for (let fwIdx = 0; fwIdx < firmwareList.length; fwIdx++) {
315
- // Download the firmware
316
- RaftLog.debug(
317
- `fwUpdate downloading file URI ${firmwareList[fwIdx].downloadUrl}`
318
- );
319
- const downloadResult = await this._fileDownloader(
320
- firmwareList[fwIdx].downloadUrl,
321
- (received: number, total: number) => {
322
- const currentProgress =
323
- ((fwIdx + received / total) / numFw) *
324
- this._progressAfterDownload;
325
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
326
- stage: "Downloading firmware",
327
- progress: currentProgress,
328
- updatingFilesystem: false,
329
- });
330
- }
331
- );
332
- if (downloadResult.downloadedOk && downloadResult.fileData != null) {
333
- firmwareData.push(downloadResult.fileData);
334
- } else {
335
- this._eventListener(RaftUpdateEvent.UPDATE_FAILED);
336
- throw Error("file download res null");
337
- }
338
- }
339
- } catch (error: unknown) {
340
- RaftLog.debug(`fwUpdate error ${error}`);
341
- this._eventListener(RaftUpdateEvent.UPDATE_FAILED);
342
- return RaftUpdateEvent.UPDATE_FAILED;
343
- }
344
-
345
- // Test ONLY truncate the main firmware
346
- if (
347
- this._updateESPRequired &&
348
- mainFwInfo != null &&
349
- this.TEST_TRUNCATE_ESP_FILE
350
- ) {
351
- firmwareData[0] = new Uint8Array(500);
352
- }
353
-
354
- // Calculate total length of data
355
- let totalBytes = 0;
356
- for (const fileData of firmwareData) {
357
- totalBytes += fileData.length;
358
- }
359
-
360
- // Debug
361
- RaftLog.debug(
362
- `fwUpdate got ok ${firmwareData.length} files total ${totalBytes} bytes`
363
- );
364
-
365
- // Start uploading
366
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
367
- stage: "Starting firmware upload",
368
- progress: this._progressAfterDownload,
369
- updatingFilesystem: false,
370
- });
371
-
372
- // Upload each file
373
- let updateStage =
374
- "Uploading new firmware\nThis may take a while, please be patient";
375
- let updatingFilesystem = false;
376
- try {
377
- let sentBytes = 0;
378
- for (let fwIdx = 0; fwIdx < firmwareData.length; fwIdx++) {
379
- RaftLog.debug(
380
- `fwUpdate uploading file name ${firmwareList[fwIdx].destname} len ${firmwareData[fwIdx].length}`
381
- );
382
- let updatingItemType = RaftFileSendType.NORMAL_FILE;
383
- if (firmwareList[fwIdx].elemType === this._firmwareTypeStrForMainFw) {
384
- updatingItemType = RaftFileSendType.FIRMWARE_UPDATE;
385
- }
386
- let percComplete =
387
- (sentBytes / totalBytes) * this._progressDuringUpload +
388
- this._progressAfterDownload;
389
-
390
- if (
391
- !updatingFilesystem &&
392
- updatingItemType == RaftFileSendType.NORMAL_FILE
393
- ) {
394
- // start of filesystem updates
395
- updateStage =
396
- "Updating system files\nThis may take a while, please be patient\nUpdate cannot be cancelled during this stage\n";
397
- updatingFilesystem = true;
398
- // emit event so app can deactivate cancel button
399
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
400
- stage: updateStage,
401
- progress: percComplete,
402
- updatingFilesystem: updatingFilesystem,
403
- });
404
-
405
- // TODO - Decide how to handle this
406
- if (this._ricHwRevNo == 1) {
407
- // the spiffs filesystem used on rev 1 doesn't delete files properly and has issues being more than 75% full
408
- // it must be formatted to prevent issues after multiple OTA updates
409
- // Reformat filesystem. This will take a few seconds so set a long timeout for the response
410
- RaftLog.debug(`Beginning file system update. Reformatting FS.`);
411
- await this._msgHandler.sendRICRESTURL<RaftOKFail>(
412
- "reformatfs",
413
- undefined,
414
- 15000
415
- );
416
- // trigger and wait for reboot
417
- RaftLog.debug(`Restarting RIC`);
418
- try {
419
- await this._msgHandler.sendRICRESTURL<RaftOKFail>("reset");
420
- } catch (error) {
421
- RaftLog.debug(`fwUpdate reset failed ${error}`);
422
- }
423
- if (!(await this.waitForRestart(percComplete))) {
424
- this._eventListener(RaftUpdateEvent.UPDATE_FAILED);
425
- return RaftUpdateEvent.UPDATE_FAILED;
426
- }
427
- }
428
- }
429
-
430
- if (
431
- updatingItemType == RaftFileSendType.FIRMWARE_UPDATE &&
432
- this.TEST_SKIP_FW_UPDATE
433
- ) {
434
- RaftLog.debug("fwUpdate: Skipping FW update");
435
- } else {
436
- await this.fileSend(
437
- firmwareList[fwIdx].destname,
438
- updatingItemType,
439
- firmwareData[fwIdx],
440
- (_, __, progress) => {
441
- let percComplete =
442
- ((sentBytes + progress * firmwareData[fwIdx].length) /
443
- totalBytes) *
444
- this._progressDuringUpload +
445
- this._progressAfterDownload;
446
- if (updatingItemType == RaftFileSendType.NORMAL_FILE)
447
- percComplete += this._progressDuringRestart * 2;
448
- if (percComplete > 1.0) percComplete = 1.0;
449
- RaftLog.debug(
450
- `fwUpdate progress ${progress.toFixed(
451
- 2
452
- )} sent ${sentBytes} len ${
453
- firmwareData[fwIdx].length
454
- } total ${totalBytes} propComplete ${percComplete.toFixed(2)}`
455
- );
456
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
457
- stage: updateStage,
458
- progress: percComplete,
459
- updatingFilesystem: updatingFilesystem,
460
- });
461
- }
462
- );
463
- }
464
- sentBytes += firmwareData[fwIdx].length;
465
- if (updatingItemType == RaftFileSendType.FIRMWARE_UPDATE) {
466
- percComplete =
467
- (sentBytes / totalBytes) * this._progressDuringUpload +
468
- this._progressAfterDownload;
469
- // if the element was firmware, Raft app will now restart automatically
470
- if (
471
- !(await this.waitForRestart(
472
- percComplete,
473
- this._latestVersionInfo?.firmwareVersion
474
- ))
475
- ) {
476
- this._eventListener(RaftUpdateEvent.UPDATE_FAILED);
477
- return RaftUpdateEvent.UPDATE_FAILED;
478
- }
479
- }
480
- }
481
- } catch (error) {
482
- RaftLog.debug(`fwUpdate error ${error}`);
483
- this._eventListener(RaftUpdateEvent.UPDATE_FAILED);
484
- return RaftUpdateEvent.UPDATE_FAILED;
485
- }
486
-
487
- // TODO: check this is working
488
- const allElemsUpdatedOk = await this.updateElems();
489
-
490
- /*
491
- // Issue requests for hw-elem firmware updates
492
- let elemFwIdx = 0;
493
- let allElemsUpdatedOk = true;
494
- for (const elemFw of firmwareList) {
495
- // Update progress
496
- const percComplete =
497
- this._progressAfterUpload +
498
- ((1 - this._progressAfterUpload) * elemFwIdx) / firmwareList.length;
499
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
500
- stage: "Updating elements",
501
- progress: percComplete,
502
- updatingFilesystem: true,
503
- });
504
- elemFwIdx++;
505
-
506
- // Check element is not main
507
- if (elemFw.elemType === this._firmwareTypeStrForMainFw) continue;
508
-
509
- // Non-firmware elemTypes
510
- if (this._nonFirmwareElemTypes.includes(elemFw.elemType)) continue;
511
-
512
- await this.updateElem(elemFw);
513
- }
514
- */
515
-
516
- // Done update
517
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
518
- stage: "Finished",
519
- progress: 1,
520
- updatingFilesystem: false,
521
- });
522
- let updateResult = RaftUpdateEvent.UPDATE_SUCCESS_ALL;
523
- if (allElemsUpdatedOk) {
524
- this._eventListener(updateResult, this._raftSystemUtils.getCachedSystemInfo());
525
- } else {
526
- updateResult = RaftUpdateEvent.UPDATE_SUCCESS_MAIN_ONLY;
527
- this._eventListener(updateResult, this._raftSystemUtils.getCachedSystemInfo());
528
- }
529
- return updateResult;
530
- }
531
-
532
- async updateElems(elemsToUpdate: Array<any> | null = null): Promise<boolean>{
533
- let allElemsUpdatedOk = true;
534
- if (elemsToUpdate === null)
535
- elemsToUpdate = await this.elemUpdatesRequired();
536
- if (elemsToUpdate === null) return false;
537
-
538
- let progress = this._progressAfterDownload +
539
- this._progressDuringUpload +
540
- 2 * this._progressDuringRestart;
541
- const progressPerElem = (1 - progress) / elemsToUpdate.length;
542
-
543
- const updatedDtids: Array<number> = [];
544
- for (const elem in elemsToUpdate){
545
- const dtid = parseInt(elemsToUpdate[elem]["whoAmITypeCode"], 16);
546
- const expectedVersion = elemsToUpdate[elem]["expectedVersion"];
547
- const actualVersion = elemsToUpdate[elem]["versionStr"];
548
- const elemType = elemsToUpdate[elem]["type"];
549
- const elemName = elemsToUpdate[elem]["name"];
550
- RaftLog.debug(`hwElem ${elemsToUpdate[elem]["name"]} dtid ${dtid} type ${elemType} expectedVersion ${expectedVersion} actual version ${actualVersion}`);
551
- if (expectedVersion){
552
- // only need to send each firmware file once
553
- const sendFile = updatedDtids.includes(dtid) ? false : true;
554
- if (!await this.updateHWElem(elemName, dtid, elemType, expectedVersion, sendFile))
555
- allElemsUpdatedOk = false;
556
- updatedDtids.push(dtid);
557
-
558
- progress += progressPerElem;
559
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
560
- stage: "Updating elements",
561
- progress: progress,
562
- updatingFilesystem: true,
563
- });
564
- }
565
- }
566
-
567
- return allElemsUpdatedOk;
568
- }
569
-
570
- async updateHWElem(elemName: string, dtid: number, elemType: string, expectedVersion: string, sendFile: boolean){
571
- const dtidStr = dtid.toString(16).padStart(8, "0");
572
- const destFwFilename = `fw${dtidStr}.rfw`;
573
- if (sendFile){
574
- const firmwareUrl = `${this._firmwareBaseURL}/firmware/${dtidStr}/fw${dtidStr}-${expectedVersion}.rfw`;
575
- const firmware = await this._fileDownloader(firmwareUrl, (received, total)=>{RaftLog.debug(`download received ${received} of total ${total}`)});
576
- if (!firmware.downloadedOk || !firmware.fileData) return false;
577
- if (!await this.fileSend(destFwFilename, RaftFileSendType.NORMAL_FILE, firmware.fileData, (sent, total, progress)=>{console.log(`sent ${sent} total ${total} progress ${progress}`)}))
578
- return false;
579
- }
580
- // double check file on Raft has the correct version
581
- const fwResp = await this._msgHandler.sendRICRESTURL<RaftHWFWUpdRslt>(`hwfwupd//${destFwFilename}`);
582
- if (fwResp.st.v != expectedVersion) return false;
583
-
584
- const fwInfo: RaftFWInfo = {
585
- elemType: elemType,
586
- destname: destFwFilename,
587
- version: "",
588
- md5: "",
589
- releaseNotes: "",
590
- comments: "",
591
- updaters: [],
592
- downloadUrl: ""
593
- };
594
- return await this.updateElem(fwInfo, elemName);
595
- }
596
-
597
- async updateElem(elemFw: RaftFWInfo, elemNameOrAll = "all") {
598
- // Start hw-elem update
599
- const updateCmd = `hwfwupd/${elemFw.elemType}/${elemFw.destname}/${elemNameOrAll}`;
600
- try {
601
- await this._msgHandler.sendRICRESTURL<RaftOKFail>(updateCmd);
602
- } catch (error) {
603
- RaftLog.debug(
604
- `fwUpdate failed to start hw-elem firmware update cmd ${updateCmd} error ${error}`
605
- );
606
- return false;
607
- }
608
-
609
- let allElemsUpdatedOk = false;
610
- // Check the status
611
- for (
612
- let updateCheckLoop = 0;
613
- updateCheckLoop < this.ELEM_FW_CHECK_LOOPS;
614
- updateCheckLoop++
615
- ) {
616
- try {
617
- // Wait for process to start on ESP32
618
- await new Promise((resolve) => setTimeout(resolve, 5000));
619
-
620
- // Get result (or status)
621
- const elUpdRslt =
622
- await this._msgHandler.sendRICRESTURL<RaftHWFWUpdRslt>("hwfwupd");
623
-
624
- // Check result
625
- if (
626
- elUpdRslt.rslt === "ok" &&
627
- (elUpdRslt.st.s === "idle" || elUpdRslt.st.s === "done")
628
- ) {
629
- RaftLog.debug(
630
- `fwUpdate hw-elem firmware updated ok - status ${elUpdRslt.st.s} rsltmsg ${elUpdRslt.st.m}`
631
- );
632
-
633
- // Check if any update outstanding (incomplete === 0)
634
- allElemsUpdatedOk = elUpdRslt.st.i === 0;
635
- break;
636
- }
637
- } catch (error) {
638
- RaftLog.debug(`failed to get hw-elem firmware update status ${error}`);
639
- }
640
- }
641
- return allElemsUpdatedOk;
642
- }
643
-
644
- async manualReconnect() {
645
- return this._raftChannel?.connect({
646
- name: this._nameToConnectTo,
647
- localName: this._nameToConnectTo,
648
- id: this._idToConnectTo || "",
649
- rssi: 0,
650
- }, {});
651
- }
652
-
653
- async waitForRestart(
654
- percComplete: number,
655
- checkFwVersion: string | null = null
656
- ) {
657
- RaftLog.debug(
658
- `fwUpdate: Waiting for restart. percComplete ${percComplete}, checkFwVersion: ${checkFwVersion}`
659
- );
660
- // sending the appropriate disconnect event to the UI so it knows that the device is disconnected
661
- this._eventListener(RaftUpdateEvent.UPDATE_DISCONNECTED);
662
-
663
- // Wait for firmware update to complete, restart to occur
664
- // and BLE reconnection to happen
665
- const waitTime = 5000;
666
- const iterations = 3;
667
- for (let i = 0; i < iterations; i++) {
668
- await new Promise((resolve) => setTimeout(resolve, waitTime));
669
- this._eventListener(RaftUpdateEvent.UPDATE_PROGRESS, {
670
- stage: "Restarting " + (this._systemType ? this._systemType.nameForDialogs : ""),
671
- progress: percComplete + (this._progressDuringRestart * i) / 3,
672
- updatingFilesystem: true,
673
- });
674
- RaftLog.debug(
675
- "fwUpdate waiting for reset, seconds: " +
676
- i * waitTime +
677
- " / " +
678
- iterations * waitTime
679
- );
680
- }
681
-
682
- // Attempt to get status from main ESP32 update
683
- // The ESP32 will power cycle at this point so we need to wait a while
684
- let versionConfirmed = false;
685
- for (
686
- let fwUpdateCheckCount = 0;
687
- fwUpdateCheckCount < this.FW_UPDATE_CHECKS_BEFORE_ASSUME_FAILED;
688
- fwUpdateCheckCount++
689
- ) {
690
- try {
691
- // Get version
692
- RaftLog.debug(
693
- `fwUpdate attempting to get Raft version attempt ${fwUpdateCheckCount}`
694
- );
695
- const systemInfo = await this._raftSystemUtils.getSystemInfo(true);
696
- RaftLog.debug(
697
- `fwUpdate version rslt "${systemInfo.rslt}" System Version ${systemInfo.SystemVersion}`
698
- );
699
-
700
- if (systemInfo.rslt !== "ok") {
701
- let shouldContiue = true; // if this is not the last attempt, or if the manual reconnect fails, we should continue the loop
702
- if (fwUpdateCheckCount === this.FW_UPDATE_CHECKS_BEFORE_ASSUME_FAILED - 1) {
703
- // we have failed to get the version after the last attempt, so we need to fallback to manually reconnecting
704
- const didConnect = await this.manualReconnect();
705
- if (didConnect) shouldContiue = false;
706
- }
707
- if (shouldContiue) continue;
708
- }
709
-
710
- // at this point we are connected to BLE again, so we can send to the UI the appropriate events
711
- this._eventListener(RaftUpdateEvent.UPDATE_RECONNECTED);
712
-
713
- if (checkFwVersion != null) {
714
- // Check version
715
- versionConfirmed = RaftUtils.isVersionEqual(
716
- checkFwVersion,
717
- systemInfo.SystemVersion
718
- );
719
- RaftLog.debug(`fwUpdate got version rslt ${versionConfirmed}`);
720
- } else {
721
- versionConfirmed = true;
722
- }
723
-
724
- // Test fiddle to say it worked!
725
- if (this.TEST_PRETEND_FINAL_VERSIONS_MATCH) {
726
- versionConfirmed = true;
727
- }
728
- break;
729
- } catch (error) {
730
- RaftLog.debug(
731
- `fwUpdate failed to get version attempt', ${fwUpdateCheckCount} error ${error}`
732
- );
733
- }
734
- }
735
-
736
- return versionConfirmed;
737
- }
738
-
739
- async firmwareUpdateCancel() {
740
- this._eventListener(RaftUpdateEvent.UPDATE_CANCELLING);
741
-
742
- await this.fileSendCancel();
743
- }
744
-
745
- // Mark: File Transfer ------------------------------------------------------------------------------------
746
-
747
- /**
748
- *
749
- * fileSend - start file transfer
750
- * @param fileName name of file to send
751
- * @param fileType normal file or firmware
752
- * @param fileDest destination on the system (fs or fw generally)
753
- * @param fileContents contenst of the file (binary object)
754
- * @returns Promise<boolean>
755
- *
756
- */
757
- async fileSend(
758
- fileName: string,
759
- fileType: RaftFileSendType,
760
- fileContents: Uint8Array,
761
- progressCallback: (sent: number, total: number, progress: number) => void
762
- ): Promise<boolean> {
763
-
764
- // Get the destination
765
- let fileDest = this._systemType ? this._systemType.normalFileDestName : "fs";
766
- if (fileType === RaftFileSendType.FIRMWARE_UPDATE) {
767
- fileDest = this._systemType ? this._systemType.firmwareDestName : "fw";
768
- }
769
- return await this._raftFileHandler.fileSend(
770
- fileName,
771
- fileType,
772
- fileDest,
773
- fileContents,
774
- progressCallback
775
- );
776
- }
777
-
778
- fileSendCancel() {
779
- return this._raftFileHandler.fileSendCancel();
780
- }
781
- }