@robdobsn/raftjs 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +14 -0
- package/.gitattributes +11 -0
- package/.nvmrc +1 -0
- package/LICENSE +22 -0
- package/README.md +11 -0
- package/TODO.md +1 -0
- package/dist/RaftAttributeHandler.d.ts +12 -0
- package/dist/RaftAttributeHandler.js +241 -0
- package/dist/RaftAttributeHandler.js.map +1 -0
- package/dist/RaftChannel.d.ts +18 -0
- package/dist/RaftChannel.js +12 -0
- package/dist/RaftChannel.js.map +1 -0
- package/dist/RaftChannelWebBLE.d.ts +38 -0
- package/dist/RaftChannelWebBLE.js +274 -0
- package/dist/RaftChannelWebBLE.js.map +1 -0
- package/dist/RaftChannelWebSerial.d.ts +37 -0
- package/dist/RaftChannelWebSerial.js +319 -0
- package/dist/RaftChannelWebSerial.js.map +1 -0
- package/dist/RaftChannelWebSocket.d.ts +28 -0
- package/dist/RaftChannelWebSocket.js +197 -0
- package/dist/RaftChannelWebSocket.js.map +1 -0
- package/dist/RaftCommsStats.d.ts +39 -0
- package/dist/RaftCommsStats.js +128 -0
- package/dist/RaftCommsStats.js.map +1 -0
- package/dist/RaftConnEvents.d.ts +31 -0
- package/dist/RaftConnEvents.js +44 -0
- package/dist/RaftConnEvents.js.map +1 -0
- package/dist/RaftConnector.d.ts +242 -0
- package/dist/RaftConnector.js +613 -0
- package/dist/RaftConnector.js.map +1 -0
- package/dist/RaftCustomAttrHandler.d.ts +4 -0
- package/dist/RaftCustomAttrHandler.js +50 -0
- package/dist/RaftCustomAttrHandler.js.map +1 -0
- package/dist/RaftDeviceInfo.d.ts +64 -0
- package/dist/RaftDeviceInfo.js +36 -0
- package/dist/RaftDeviceInfo.js.map +1 -0
- package/dist/RaftDeviceManager.d.ts +37 -0
- package/dist/RaftDeviceManager.js +450 -0
- package/dist/RaftDeviceManager.js.map +1 -0
- package/dist/RaftDeviceMsg.d.ts +9 -0
- package/dist/RaftDeviceMsg.js +11 -0
- package/dist/RaftDeviceMsg.js.map +1 -0
- package/dist/RaftDeviceStates.d.ts +33 -0
- package/dist/RaftDeviceStates.js +60 -0
- package/dist/RaftDeviceStates.js.map +1 -0
- package/dist/RaftFileHandler.d.ts +52 -0
- package/dist/RaftFileHandler.js +502 -0
- package/dist/RaftFileHandler.js.map +1 -0
- package/dist/RaftLog.d.ts +22 -0
- package/dist/RaftLog.js +63 -0
- package/dist/RaftLog.js.map +1 -0
- package/dist/RaftMiniHDLC.d.ts +18 -0
- package/dist/RaftMiniHDLC.js +383 -0
- package/dist/RaftMiniHDLC.js.map +1 -0
- package/dist/RaftMsgHandler.d.ts +57 -0
- package/dist/RaftMsgHandler.js +480 -0
- package/dist/RaftMsgHandler.js.map +1 -0
- package/dist/RaftMsgTrackInfo.d.ts +17 -0
- package/dist/RaftMsgTrackInfo.js +42 -0
- package/dist/RaftMsgTrackInfo.js.map +1 -0
- package/dist/RaftProtocolDefs.d.ts +30 -0
- package/dist/RaftProtocolDefs.js +48 -0
- package/dist/RaftProtocolDefs.js.map +1 -0
- package/dist/RaftStreamHandler.d.ts +38 -0
- package/dist/RaftStreamHandler.js +257 -0
- package/dist/RaftStreamHandler.js.map +1 -0
- package/dist/RaftSystemType.d.ts +21 -0
- package/dist/RaftSystemType.js +3 -0
- package/dist/RaftSystemType.js.map +1 -0
- package/dist/RaftSystemUtils.d.ts +136 -0
- package/dist/RaftSystemUtils.js +410 -0
- package/dist/RaftSystemUtils.js.map +1 -0
- package/dist/RaftTypes.d.ts +184 -0
- package/dist/RaftTypes.js +157 -0
- package/dist/RaftTypes.js.map +1 -0
- package/dist/RaftUpdateEvents.d.ts +33 -0
- package/dist/RaftUpdateEvents.js +46 -0
- package/dist/RaftUpdateEvents.js.map +1 -0
- package/dist/RaftUpdateManager.d.ts +61 -0
- package/dist/RaftUpdateManager.js +618 -0
- package/dist/RaftUpdateManager.js.map +1 -0
- package/dist/RaftUtils.d.ts +125 -0
- package/dist/RaftUtils.js +454 -0
- package/dist/RaftUtils.js.map +1 -0
- package/dist/RaftWifiTypes.d.ts +23 -0
- package/dist/RaftWifiTypes.js +43 -0
- package/dist/RaftWifiTypes.js.map +1 -0
- package/dist/TestDataGen.d.ts +7 -0
- package/dist/TestDataGen.js +133 -0
- package/dist/TestDataGen.js.map +1 -0
- package/dist/main.d.ts +18 -0
- package/dist/main.js +42 -0
- package/dist/main.js.map +1 -0
- package/eslint.config.mjs +33 -0
- package/examples/dashboard/package.json +39 -0
- package/examples/dashboard/src/ConnManager.ts +86 -0
- package/examples/dashboard/src/Main.tsx +100 -0
- package/examples/dashboard/src/StatusScreen.tsx +72 -0
- package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +144 -0
- package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +77 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +70 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +33 -0
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +342 -0
- package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +170 -0
- package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +123 -0
- package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +207 -0
- package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +464 -0
- package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +146 -0
- package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +32 -0
- package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +371 -0
- package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +20 -0
- package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +113 -0
- package/examples/dashboard/src/index.html +15 -0
- package/examples/dashboard/src/index.tsx +15 -0
- package/examples/dashboard/src/styles.css +122 -0
- package/examples/dashboard/tsconfig.json +18 -0
- package/jest.config.js +11 -0
- package/package.json +50 -0
- package/src/RaftAttributeHandler.ts +289 -0
- package/src/RaftChannel.ts +30 -0
- package/src/RaftChannelWebBLE.ts +342 -0
- package/src/RaftChannelWebSerial.ts +408 -0
- package/src/RaftChannelWebSocket.ts +245 -0
- package/src/RaftCommsStats.ts +142 -0
- package/src/RaftConnEvents.ts +46 -0
- package/src/RaftConnector.ts +745 -0
- package/src/RaftCustomAttrHandler.ts +54 -0
- package/src/RaftDeviceInfo.ts +104 -0
- package/src/RaftDeviceManager.ts +542 -0
- package/src/RaftDeviceMsg.ts +20 -0
- package/src/RaftDeviceStates.ts +89 -0
- package/src/RaftFileHandler.ts +668 -0
- package/src/RaftLog.ts +70 -0
- package/src/RaftMiniHDLC.ts +396 -0
- package/src/RaftMsgHandler.ts +778 -0
- package/src/RaftMsgTrackInfo.ts +51 -0
- package/src/RaftProtocolDefs.ts +46 -0
- package/src/RaftStreamHandler.ts +328 -0
- package/src/RaftSystemType.ts +25 -0
- package/src/RaftSystemUtils.ts +487 -0
- package/src/RaftTypes.ts +250 -0
- package/src/RaftUpdateEvents.ts +48 -0
- package/src/RaftUpdateManager.ts +778 -0
- package/src/RaftUtils.ts +484 -0
- package/src/RaftWifiTypes.ts +36 -0
- package/src/TestDataGen.ts +157 -0
- package/src/main.ts +28 -0
- package/testdata/TestDeviceTypeRecs.json +492 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
3
|
+
//
|
|
4
|
+
// RaftConnector
|
|
5
|
+
// Part of RaftJS
|
|
6
|
+
//
|
|
7
|
+
// Rob Dobson & Chris Greening 2020-2024
|
|
8
|
+
// (C) 2020-2024 All rights reserved
|
|
9
|
+
//
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const tslib_1 = require("tslib");
|
|
13
|
+
const RaftChannelWebBLE_1 = tslib_1.__importDefault(require("./RaftChannelWebBLE"));
|
|
14
|
+
const RaftMsgHandler_1 = tslib_1.__importDefault(require("./RaftMsgHandler"));
|
|
15
|
+
const RaftChannelWebSocket_1 = tslib_1.__importDefault(require("./RaftChannelWebSocket"));
|
|
16
|
+
const RaftChannelWebSerial_1 = tslib_1.__importDefault(require("./RaftChannelWebSerial"));
|
|
17
|
+
const RaftCommsStats_1 = tslib_1.__importDefault(require("./RaftCommsStats"));
|
|
18
|
+
const RaftTypes_1 = require("./RaftTypes");
|
|
19
|
+
const RaftSystemUtils_1 = tslib_1.__importDefault(require("./RaftSystemUtils"));
|
|
20
|
+
const RaftFileHandler_1 = tslib_1.__importDefault(require("./RaftFileHandler"));
|
|
21
|
+
const RaftStreamHandler_1 = tslib_1.__importDefault(require("./RaftStreamHandler"));
|
|
22
|
+
const RaftLog_1 = tslib_1.__importDefault(require("./RaftLog"));
|
|
23
|
+
const RaftConnEvents_1 = require("./RaftConnEvents");
|
|
24
|
+
const RaftUpdateEvents_1 = require("./RaftUpdateEvents");
|
|
25
|
+
const RaftUpdateManager_1 = tslib_1.__importDefault(require("./RaftUpdateManager"));
|
|
26
|
+
class RaftConnector {
|
|
27
|
+
/**
|
|
28
|
+
* RaftConnector constructor
|
|
29
|
+
* @param getSystemTypeCB - callback to get system type
|
|
30
|
+
*/
|
|
31
|
+
constructor(getSystemTypeCB = null) {
|
|
32
|
+
// Get system type callback
|
|
33
|
+
this._getSystemTypeCB = null;
|
|
34
|
+
// System type
|
|
35
|
+
this._systemType = null;
|
|
36
|
+
// Channel
|
|
37
|
+
this._raftChannel = null;
|
|
38
|
+
// Channel connection method and locator
|
|
39
|
+
this._channelConnMethod = "";
|
|
40
|
+
this._channelConnLocator = "";
|
|
41
|
+
// Comms stats
|
|
42
|
+
this._commsStats = new RaftCommsStats_1.default();
|
|
43
|
+
// Message handler
|
|
44
|
+
this._raftMsgHandler = new RaftMsgHandler_1.default(this._commsStats);
|
|
45
|
+
// RaftSystem
|
|
46
|
+
this._raftSystemUtils = new RaftSystemUtils_1.default(this._raftMsgHandler);
|
|
47
|
+
// Connection performance checker
|
|
48
|
+
this._testConnPerfBlockSize = 500;
|
|
49
|
+
this._testConnPerfNumBlocks = 50;
|
|
50
|
+
this._connPerfRsltDelayMs = 4000;
|
|
51
|
+
// Retry connection if lost
|
|
52
|
+
this._retryIfLostEnabled = true;
|
|
53
|
+
this._retryIfLostForSecs = 10;
|
|
54
|
+
this._retryIfLostIsConnected = false;
|
|
55
|
+
this._retryIfLostDisconnectTime = null;
|
|
56
|
+
this._retryIfLostRetryDelayMs = 500;
|
|
57
|
+
// File handler
|
|
58
|
+
this._raftFileHandler = new RaftFileHandler_1.default(this._raftMsgHandler, this._commsStats);
|
|
59
|
+
// Stream handler
|
|
60
|
+
this._raftStreamHandler = new RaftStreamHandler_1.default(this._raftMsgHandler, this._commsStats, this);
|
|
61
|
+
// Event listener
|
|
62
|
+
this._onEventFn = null;
|
|
63
|
+
// Update manager
|
|
64
|
+
this._raftUpdateManager = null;
|
|
65
|
+
// Get system type callback
|
|
66
|
+
this._getSystemTypeCB = getSystemTypeCB;
|
|
67
|
+
// Debug
|
|
68
|
+
RaftLog_1.default.debug('RaftConnector starting up');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Configure the file handler
|
|
72
|
+
* @param fileBlockSize - size of file blocks to send
|
|
73
|
+
* @param batchAckSize - number of blocks to send before waiting for ack
|
|
74
|
+
* @returns void
|
|
75
|
+
*/
|
|
76
|
+
configureFileHandler(fileBlockSize, batchAckSize) {
|
|
77
|
+
this._raftFileHandler.setRequestedFileBlockSize(fileBlockSize);
|
|
78
|
+
this._raftFileHandler.setRequestedBatchAckSize(batchAckSize);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set event listener
|
|
82
|
+
* @param onEventFn - event listener
|
|
83
|
+
* @returns void
|
|
84
|
+
* */
|
|
85
|
+
setEventListener(onEventFn) {
|
|
86
|
+
this._onEventFn = onEventFn;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* isConnected
|
|
90
|
+
* @returns boolean - true if connected
|
|
91
|
+
* */
|
|
92
|
+
isConnected() {
|
|
93
|
+
// Check if connected
|
|
94
|
+
const isConnected = this._retryIfLostIsConnected || (this._raftChannel ? this._raftChannel.isConnected() : false);
|
|
95
|
+
return isConnected;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Set try to reconnect if connection lost
|
|
99
|
+
* @param enableRetry - true to enable retry
|
|
100
|
+
* @param retryForSecs - retry for this many seconds
|
|
101
|
+
* @returns void
|
|
102
|
+
* */
|
|
103
|
+
setRetryConnectionIfLost(enableRetry, retryForSecs) {
|
|
104
|
+
this._retryIfLostEnabled = enableRetry;
|
|
105
|
+
this._retryIfLostForSecs = retryForSecs;
|
|
106
|
+
if (!this._retryIfLostEnabled) {
|
|
107
|
+
this._retryIfLostIsConnected = false;
|
|
108
|
+
}
|
|
109
|
+
RaftLog_1.default.debug(`setRetryConnectionIfLost ${enableRetry} retry for ${retryForSecs}`);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get Raft system type (the type of hardware connected to - determined using the getSystemInfo API)
|
|
113
|
+
* @returns RaftSystemType | null - Raft system type
|
|
114
|
+
* */
|
|
115
|
+
getSystemType() {
|
|
116
|
+
return this._systemType;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get connection method
|
|
120
|
+
* @returns string - connection method
|
|
121
|
+
* */
|
|
122
|
+
getConnMethod() {
|
|
123
|
+
return this._channelConnMethod;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get connection locator
|
|
127
|
+
* @returns string | object - connection locator
|
|
128
|
+
* */
|
|
129
|
+
getConnLocator() {
|
|
130
|
+
return this._raftChannel ? this._raftChannel.getConnectedLocator() : null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get Raft channel (this is the channel used for commuinications with the Raft application)
|
|
134
|
+
* @returns RaftChannel | null - Raft channel
|
|
135
|
+
* */
|
|
136
|
+
getRaftChannel() {
|
|
137
|
+
return this._raftChannel;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get Raft system utils (access to system information and control)
|
|
141
|
+
* @returns RaftSystemUtils - Raft system utils
|
|
142
|
+
* */
|
|
143
|
+
getRaftSystemUtils() {
|
|
144
|
+
return this._raftSystemUtils;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get communication stats
|
|
148
|
+
* @returns RaftCommsStats - communication stats
|
|
149
|
+
* */
|
|
150
|
+
getCommsStats() {
|
|
151
|
+
return this._commsStats;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get Raft message handler (to allow message sending and receiving)
|
|
155
|
+
* @returns RaftMsgHandler - Raft message handler
|
|
156
|
+
* */
|
|
157
|
+
getRaftMsgHandler() {
|
|
158
|
+
return this._raftMsgHandler;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Pause connection
|
|
162
|
+
* @param pause - true to pause, false to resume
|
|
163
|
+
*/
|
|
164
|
+
pauseConnection(pause = true) {
|
|
165
|
+
if (this._raftChannel)
|
|
166
|
+
this._raftChannel.pauseConnection(pause);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Connect to a Raft application
|
|
170
|
+
*
|
|
171
|
+
* @param {string} method - can be "WebBLE", "WebSocket" or "WebSerial"
|
|
172
|
+
* @param {string | object} locator - either a string (WebSocket URL or serial port) or an object (WebBLE)
|
|
173
|
+
* @returns Promise<boolean>
|
|
174
|
+
*
|
|
175
|
+
*/
|
|
176
|
+
async connect(method, locator) {
|
|
177
|
+
// Ensure disconnected
|
|
178
|
+
try {
|
|
179
|
+
await this.disconnect();
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
RaftLog_1.default.error('RaftConnector.connect - error: ' + err);
|
|
183
|
+
// Ignore
|
|
184
|
+
}
|
|
185
|
+
// Check connection method
|
|
186
|
+
let connMethod = "";
|
|
187
|
+
if (method === 'WebBLE' && typeof locator === 'object' && locator !== null) {
|
|
188
|
+
// Create channel
|
|
189
|
+
this._raftChannel = new RaftChannelWebBLE_1.default();
|
|
190
|
+
connMethod = 'WebBLE';
|
|
191
|
+
}
|
|
192
|
+
else if (((method === 'WebSocket') || (method === 'wifi')) && (typeof locator === 'string')) {
|
|
193
|
+
// Create channel
|
|
194
|
+
this._raftChannel = new RaftChannelWebSocket_1.default();
|
|
195
|
+
connMethod = 'WebSocket';
|
|
196
|
+
}
|
|
197
|
+
else if (((method === 'WebSerial'))) {
|
|
198
|
+
this._raftChannel = new RaftChannelWebSerial_1.default();
|
|
199
|
+
connMethod = 'WebSerial';
|
|
200
|
+
}
|
|
201
|
+
RaftLog_1.default.debug(`connecting with connMethod ${connMethod}`);
|
|
202
|
+
// Check channel established
|
|
203
|
+
let connOk = false;
|
|
204
|
+
if (this._raftChannel !== null) {
|
|
205
|
+
// Connection method and locator
|
|
206
|
+
this._channelConnMethod = connMethod;
|
|
207
|
+
this._channelConnLocator = locator;
|
|
208
|
+
// Set message handler
|
|
209
|
+
this._raftChannel.setMsgHandler(this._raftMsgHandler);
|
|
210
|
+
this._raftChannel.setOnConnEvent(this.onConnEvent.bind(this));
|
|
211
|
+
// Message handling in and out
|
|
212
|
+
this._raftMsgHandler.registerForResults(this);
|
|
213
|
+
this._raftMsgHandler.registerMsgSender(this._raftChannel);
|
|
214
|
+
// Connect
|
|
215
|
+
try {
|
|
216
|
+
// Event
|
|
217
|
+
this.onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_CONNECTING);
|
|
218
|
+
// Connect
|
|
219
|
+
connOk = await this._connectToChannel();
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
RaftLog_1.default.error('RaftConnector.connect - error: ' + err);
|
|
223
|
+
}
|
|
224
|
+
// Check ok
|
|
225
|
+
if (connOk) {
|
|
226
|
+
// Get system type
|
|
227
|
+
if (this._getSystemTypeCB) {
|
|
228
|
+
// Get system type
|
|
229
|
+
this._systemType = await this._getSystemTypeCB(this._raftSystemUtils);
|
|
230
|
+
// Set defaults
|
|
231
|
+
if (this._systemType) {
|
|
232
|
+
this._raftSystemUtils.setDefaultWiFiHostname(this._systemType.defaultWiFiHostname);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Setup system type
|
|
236
|
+
if (this._systemType) {
|
|
237
|
+
this._systemType.setup(this._raftSystemUtils, this._onEventFn);
|
|
238
|
+
}
|
|
239
|
+
// Check if subscription required
|
|
240
|
+
if (this._systemType &&
|
|
241
|
+
this._systemType.subscribeForUpdates &&
|
|
242
|
+
this._raftChannel.requiresSubscription()) {
|
|
243
|
+
try {
|
|
244
|
+
// Subscription
|
|
245
|
+
await this._systemType.subscribeForUpdates(this._raftSystemUtils, true);
|
|
246
|
+
RaftLog_1.default.info(`connect subscribed for updates`);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
RaftLog_1.default.warn(`connect subscribe for updates failed ${error}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Send connected event
|
|
253
|
+
this.onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_CONNECTED);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// Failed Event
|
|
257
|
+
this.onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_CONNECTION_FAILED);
|
|
258
|
+
}
|
|
259
|
+
// configure file handler
|
|
260
|
+
this.configureFileHandler(this._raftChannel.fhFileBlockSize(), this._raftChannel.fhBatchAckSize());
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
this._channelConnMethod = "";
|
|
264
|
+
}
|
|
265
|
+
return connOk;
|
|
266
|
+
}
|
|
267
|
+
async disconnect() {
|
|
268
|
+
// Disconnect
|
|
269
|
+
this._retryIfLostIsConnected = false;
|
|
270
|
+
if (this._raftChannel) {
|
|
271
|
+
// Check if there is a RICREST command to send before disconnecting
|
|
272
|
+
const ricRestCommand = this._raftChannel.ricRestCmdBeforeDisconnect();
|
|
273
|
+
console.log(`sending RICREST command before disconnect: ${ricRestCommand}`);
|
|
274
|
+
if (ricRestCommand) {
|
|
275
|
+
await this.sendRICRESTMsg(ricRestCommand, {});
|
|
276
|
+
}
|
|
277
|
+
// await this.sendRICRESTMsg("bledisc", {});
|
|
278
|
+
await this._raftChannel.disconnect();
|
|
279
|
+
this._raftChannel = null;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Mark: Tx Message handling -----------------------------------------------------------------------------------------
|
|
283
|
+
/**
|
|
284
|
+
*
|
|
285
|
+
* sendRICRESTMsg
|
|
286
|
+
* @param commandName command API string
|
|
287
|
+
* @param params parameters (simple name value pairs only) to parameterize trajectory
|
|
288
|
+
* @returns Promise<RaftOKFail>
|
|
289
|
+
*
|
|
290
|
+
*/
|
|
291
|
+
async sendRICRESTMsg(commandName, params, bridgeID = undefined) {
|
|
292
|
+
try {
|
|
293
|
+
// Format the paramList as query string
|
|
294
|
+
const paramEntries = Object.entries(params);
|
|
295
|
+
let paramQueryStr = '';
|
|
296
|
+
for (const param of paramEntries) {
|
|
297
|
+
if (paramQueryStr.length > 0)
|
|
298
|
+
paramQueryStr += '&';
|
|
299
|
+
paramQueryStr += param[0] + '=' + param[1];
|
|
300
|
+
}
|
|
301
|
+
// Format the url to send
|
|
302
|
+
if (paramQueryStr.length > 0)
|
|
303
|
+
commandName += '?' + paramQueryStr;
|
|
304
|
+
return await this._raftMsgHandler.sendRICRESTURL(commandName, bridgeID);
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
RaftLog_1.default.warn(`sendRICRESTMsg failed ${error}`);
|
|
308
|
+
return new RaftTypes_1.RaftOKFail();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Mark: Rx Message handling -----------------------------------------------------------------------------------------
|
|
312
|
+
/**
|
|
313
|
+
* onRxReply - handle a reply message
|
|
314
|
+
* @param msgHandle number indicating the message that is being replied to (from the original message)
|
|
315
|
+
* @param msgRsltCode result code
|
|
316
|
+
* @param msgRsltJsonObj result object
|
|
317
|
+
*/
|
|
318
|
+
onRxReply(msgHandle, msgRsltCode, msgRsltJsonObj) {
|
|
319
|
+
RaftLog_1.default.verbose(`onRxReply msgHandle ${msgHandle} rsltCode ${msgRsltCode} obj ${JSON.stringify(msgRsltJsonObj)}`);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* onRxUnnumberedMsg - handle an unnumbered message
|
|
323
|
+
* @param msgRsltJsonObj result object
|
|
324
|
+
*/
|
|
325
|
+
onRxUnnumberedMsg(msgRsltJsonObj) {
|
|
326
|
+
RaftLog_1.default.verbose(`onRxUnnumberedMsg rsltCode obj ${JSON.stringify(msgRsltJsonObj)}`);
|
|
327
|
+
// Inform the file handler
|
|
328
|
+
if ('okto' in msgRsltJsonObj) {
|
|
329
|
+
this._raftFileHandler.onOktoMsg(msgRsltJsonObj.okto);
|
|
330
|
+
}
|
|
331
|
+
else if ('sokto' in msgRsltJsonObj) {
|
|
332
|
+
this._raftStreamHandler.onSoktoMsg(msgRsltJsonObj.sokto);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* onRxFileBlock - handle a file block
|
|
337
|
+
* @param filePos file position
|
|
338
|
+
* @param fileBlockData file block data
|
|
339
|
+
*/
|
|
340
|
+
onRxFileBlock(filePos, fileBlockData) {
|
|
341
|
+
// RaftLog.info(`onRxFileBlock filePos ${filePos} fileBlockData ${RaftUtils.bufferToHex(fileBlockData)}`);
|
|
342
|
+
this._raftFileHandler.onFileBlock(filePos, fileBlockData);
|
|
343
|
+
}
|
|
344
|
+
// Mark: Handling of other message types -----------------------------------------------------------------------------------------
|
|
345
|
+
/**
|
|
346
|
+
* onRxOtherMsgType - handle other message types
|
|
347
|
+
* @param payload message payload
|
|
348
|
+
* @param frameTimeMs time of frame
|
|
349
|
+
*/
|
|
350
|
+
onRxOtherMsgType(payload, _frameTimeMs) {
|
|
351
|
+
// RaftLog.debug(`onRxOtherMsgType payload ${RaftUtils.bufferToHex(payload)}`);
|
|
352
|
+
RaftLog_1.default.verbose(`onRxOtherMsgType payloadLen ${payload.length}`);
|
|
353
|
+
// Handle other messages
|
|
354
|
+
if (this._systemType && this._systemType.rxOtherMsgType) {
|
|
355
|
+
this._systemType.rxOtherMsgType(payload, _frameTimeMs);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Mark: File sending --------------------------------------------------------------------------------
|
|
359
|
+
/**
|
|
360
|
+
* sendFile - send a file
|
|
361
|
+
* @param fileName name of file to send
|
|
362
|
+
* @param fileContents file contents
|
|
363
|
+
* @param progressCallback callback to receive progress updates
|
|
364
|
+
* @returns Promise<boolean> - true if file sent successfully
|
|
365
|
+
*/
|
|
366
|
+
async sendFile(fileName, fileContents, progressCallback) {
|
|
367
|
+
return this._raftFileHandler.fileSend(fileName, RaftTypes_1.RaftFileSendType.NORMAL_FILE, "fs", fileContents, progressCallback);
|
|
368
|
+
}
|
|
369
|
+
// Mark: Streaming --------------------------------------------------------------------------------
|
|
370
|
+
/**
|
|
371
|
+
* streamAudio - stream audio
|
|
372
|
+
* @param streamContents audio data
|
|
373
|
+
* @param clearExisting true to clear existing audio
|
|
374
|
+
* @param duration duration of audio
|
|
375
|
+
*/
|
|
376
|
+
streamAudio(streamContents, clearExisting, duration) {
|
|
377
|
+
if (this._raftStreamHandler && this.isConnected()) {
|
|
378
|
+
this._raftStreamHandler.streamAudio(streamContents, clearExisting, duration);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* isStreamStarting - check if stream is starting
|
|
383
|
+
*/
|
|
384
|
+
isStreamStarting() {
|
|
385
|
+
return this._raftStreamHandler.isStreamStarting();
|
|
386
|
+
}
|
|
387
|
+
// Mark: File system --------------------------------------------------------------------------------
|
|
388
|
+
/**
|
|
389
|
+
* fsGetContents - get file contents
|
|
390
|
+
* @param fileName name of file to get
|
|
391
|
+
* @param fileSource source of file to get (e.g. "fs" or "bridgeserial1", if omitted defaults to "fs")
|
|
392
|
+
* @param progressCallback callback to receive progress updates
|
|
393
|
+
* @returns Promise<RaftFileDownloadResult>
|
|
394
|
+
*/
|
|
395
|
+
async fsGetContents(fileName, fileSource, progressCallback) {
|
|
396
|
+
return await this._raftFileHandler.fileReceive(fileName, fileSource, progressCallback);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* setLegacySoktoMode - set legacy sokto mode
|
|
400
|
+
* @param legacyMode true to set legacy mode
|
|
401
|
+
*/
|
|
402
|
+
setLegacySoktoMode(legacyMode) {
|
|
403
|
+
return this._raftStreamHandler.setLegacySoktoMode(legacyMode);
|
|
404
|
+
}
|
|
405
|
+
// Mark: Bridge serial --------------------------------------------------------------------------------
|
|
406
|
+
/**
|
|
407
|
+
* createCommsBridge - create a comms bridge
|
|
408
|
+
* @param bridgeSource source of bridge (e.g. "Serial1")
|
|
409
|
+
* @param bridgeName name of bridge
|
|
410
|
+
* @param idleCloseSecs idle close time seconds
|
|
411
|
+
* @returns Promise<RaftBridgeSetupResp>
|
|
412
|
+
*/
|
|
413
|
+
async createCommsBridge(bridgeSource, bridgeName, idleCloseSecs = 0) {
|
|
414
|
+
return await this._raftMsgHandler.createCommsBridge(bridgeSource, bridgeName, idleCloseSecs);
|
|
415
|
+
}
|
|
416
|
+
// Mark: Connection performance--------------------------------------------------------------------------
|
|
417
|
+
/**
|
|
418
|
+
* ParkMiller random number generator
|
|
419
|
+
* @param seed
|
|
420
|
+
* @returns number
|
|
421
|
+
*/
|
|
422
|
+
parkmiller_next(seed) {
|
|
423
|
+
const hi = Math.round(16807 * (seed & 0xffff));
|
|
424
|
+
let lo = Math.round(16807 * (seed >> 16));
|
|
425
|
+
lo += (hi & 0x7fff) << 16;
|
|
426
|
+
lo += hi >> 15;
|
|
427
|
+
if (lo > 0x7fffffff)
|
|
428
|
+
lo -= 0x7fffffff;
|
|
429
|
+
return lo;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* checkConnPerformance - check connection performance
|
|
433
|
+
* @returns Promise<number | undefined> - connection performance
|
|
434
|
+
*/
|
|
435
|
+
async checkConnPerformance() {
|
|
436
|
+
// Sends a magic sequence of bytes followed by blocks of random data
|
|
437
|
+
// these will be ignored by the Raft library (as it recognises magic sequence)
|
|
438
|
+
// and is used performance evaluation
|
|
439
|
+
let prbsState = 1;
|
|
440
|
+
const testData = new Uint8Array(this._testConnPerfBlockSize);
|
|
441
|
+
for (let i = 0; i < this._testConnPerfNumBlocks; i++) {
|
|
442
|
+
testData.set([0, (i >> 24) & 0xff, (i >> 16) & 0xff, (i >> 8) & 0xff, i & 0xff, 0x1f, 0x9d, 0xf4, 0x7a, 0xb5]);
|
|
443
|
+
for (let j = 10; j < this._testConnPerfBlockSize; j++) {
|
|
444
|
+
prbsState = this.parkmiller_next(prbsState);
|
|
445
|
+
testData[j] = prbsState & 0xff;
|
|
446
|
+
}
|
|
447
|
+
if (this._raftChannel) {
|
|
448
|
+
await this._raftChannel.sendTxMsg(testData, false);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Wait a little to allow the Raft app to process the data
|
|
452
|
+
await new Promise(resolve => setTimeout(resolve, this._connPerfRsltDelayMs));
|
|
453
|
+
// Get performance
|
|
454
|
+
const blePerf = await this._raftSystemUtils.getSysModInfoBLEMan();
|
|
455
|
+
if (blePerf) {
|
|
456
|
+
console.log(`checkConnPerformance result rate = ${blePerf.tBPS}BytesPS`);
|
|
457
|
+
return blePerf.tBPS;
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
throw new Error('checkConnPerformance: failed to get BLE performance');
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// Mark: Connection event --------------------------------------------------------------------------
|
|
464
|
+
/**
|
|
465
|
+
* onConnEvent - handle connection event
|
|
466
|
+
* @param eventEnum connection event enumeration
|
|
467
|
+
* @param data data associated with event
|
|
468
|
+
* @returns void
|
|
469
|
+
*/
|
|
470
|
+
onConnEvent(eventEnum, data = undefined) {
|
|
471
|
+
// Handle information clearing on disconnect
|
|
472
|
+
switch (eventEnum) {
|
|
473
|
+
case RaftConnEvents_1.RaftConnEvent.CONN_DISCONNECTED:
|
|
474
|
+
// Disconnect time
|
|
475
|
+
this._retryIfLostDisconnectTime = Date.now();
|
|
476
|
+
// Check if retry required
|
|
477
|
+
if (this._retryIfLostIsConnected && this._retryIfLostEnabled) {
|
|
478
|
+
// Indicate connection disrupted
|
|
479
|
+
if (this._onEventFn) {
|
|
480
|
+
this._onEventFn("conn", RaftConnEvents_1.RaftConnEvent.CONN_ISSUE_DETECTED, RaftConnEvents_1.RaftConnEventNames[RaftConnEvents_1.RaftConnEvent.CONN_ISSUE_DETECTED]);
|
|
481
|
+
}
|
|
482
|
+
// Retry connection
|
|
483
|
+
this._retryConnection();
|
|
484
|
+
// Don't allow disconnection to propagate until retries have occurred
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
// Invalidate connection details
|
|
488
|
+
this._raftSystemUtils.invalidate();
|
|
489
|
+
// Invalidate system-type info
|
|
490
|
+
if (this._systemType && this._systemType.stateIsInvalid) {
|
|
491
|
+
this._systemType.stateIsInvalid();
|
|
492
|
+
}
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
// Notify
|
|
496
|
+
if (this._onEventFn) {
|
|
497
|
+
this._onEventFn("conn", eventEnum, RaftConnEvents_1.RaftConnEventNames[eventEnum], data);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Retry connection
|
|
502
|
+
*/
|
|
503
|
+
_retryConnection() {
|
|
504
|
+
// Check timeout
|
|
505
|
+
if ((this._retryIfLostDisconnectTime !== null) &&
|
|
506
|
+
(Date.now() - this._retryIfLostDisconnectTime < this._retryIfLostForSecs * 1000)) {
|
|
507
|
+
// Set timer to try to reconnect
|
|
508
|
+
setTimeout(async () => {
|
|
509
|
+
// Try to connect
|
|
510
|
+
const isConn = await this._connectToChannel();
|
|
511
|
+
if (!isConn) {
|
|
512
|
+
this._retryConnection();
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
// No longer retrying
|
|
516
|
+
this._retryIfLostDisconnectTime = null;
|
|
517
|
+
// Indicate connection problem resolved
|
|
518
|
+
if (this._onEventFn) {
|
|
519
|
+
this._onEventFn("conn", RaftConnEvents_1.RaftConnEvent.CONN_ISSUE_RESOLVED, RaftConnEvents_1.RaftConnEventNames[RaftConnEvents_1.RaftConnEvent.CONN_ISSUE_RESOLVED]);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}, this._retryIfLostRetryDelayMs);
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
// No longer connected after retry timeout
|
|
526
|
+
this._retryIfLostIsConnected = false;
|
|
527
|
+
// Indicate disconnection
|
|
528
|
+
if (this._onEventFn) {
|
|
529
|
+
this._onEventFn("conn", RaftConnEvents_1.RaftConnEvent.CONN_DISCONNECTED, RaftConnEvents_1.RaftConnEventNames[RaftConnEvents_1.RaftConnEvent.CONN_DISCONNECTED]);
|
|
530
|
+
}
|
|
531
|
+
// Invalidate connection details
|
|
532
|
+
this._raftSystemUtils.invalidate();
|
|
533
|
+
// Invalidate system-type info
|
|
534
|
+
if (this._systemType && this._systemType.stateIsInvalid) {
|
|
535
|
+
this._systemType.stateIsInvalid();
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Connect to channel
|
|
541
|
+
* @returns Promise<boolean> - true if connected
|
|
542
|
+
*/
|
|
543
|
+
async _connectToChannel() {
|
|
544
|
+
// Connect
|
|
545
|
+
try {
|
|
546
|
+
if (this._raftChannel) {
|
|
547
|
+
const connected = await this._raftChannel.connect(this._channelConnLocator, this._systemType ? this._systemType.connectorOptions : {});
|
|
548
|
+
if (connected) {
|
|
549
|
+
this._retryIfLostIsConnected = true;
|
|
550
|
+
return true;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
catch (error) {
|
|
555
|
+
RaftLog_1.default.error(`RaftConnector.connect() error: ${error}`);
|
|
556
|
+
}
|
|
557
|
+
return false;
|
|
558
|
+
}
|
|
559
|
+
// Mark: OTA Update -----------------------------------------------------------------------------------------
|
|
560
|
+
/**
|
|
561
|
+
* onUpdateEvent - handle update event
|
|
562
|
+
* @param eventEnum
|
|
563
|
+
* @param data
|
|
564
|
+
*/
|
|
565
|
+
_onUpdateEvent(eventEnum, data = undefined) {
|
|
566
|
+
// Notify
|
|
567
|
+
if (this._onEventFn) {
|
|
568
|
+
this._onEventFn("ota", eventEnum, RaftUpdateEvents_1.RaftUpdateEventNames[eventEnum], data);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* otaUpdateCheck - check for OTA update
|
|
573
|
+
* @returns Promise<RaftUpdateEvent> - update event
|
|
574
|
+
* */
|
|
575
|
+
async otaUpdateCheck() {
|
|
576
|
+
if (!this._raftUpdateManager)
|
|
577
|
+
return RaftUpdateEvents_1.RaftUpdateEvent.UPDATE_NOT_CONFIGURED;
|
|
578
|
+
return await this._raftUpdateManager.checkForUpdate(this._raftSystemUtils.getCachedSystemInfo());
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* otaUpdateStart - start OTA update
|
|
582
|
+
* @returns Promise<RaftUpdateEvent> - update event
|
|
583
|
+
* */
|
|
584
|
+
async otaUpdateStart() {
|
|
585
|
+
if (!this._raftUpdateManager)
|
|
586
|
+
return RaftUpdateEvents_1.RaftUpdateEvent.UPDATE_NOT_CONFIGURED;
|
|
587
|
+
return await this._raftUpdateManager.firmwareUpdate();
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* otaUpdateCancel - cancel OTA update
|
|
591
|
+
* @returns Promise<void>
|
|
592
|
+
* */
|
|
593
|
+
async otaUpdateCancel() {
|
|
594
|
+
if (!this._raftUpdateManager)
|
|
595
|
+
return;
|
|
596
|
+
return await this._raftUpdateManager.firmwareUpdateCancel();
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* setupUpdateManager - setup the update manager
|
|
600
|
+
* @param appVersion - app version
|
|
601
|
+
* @param appUpdateURL - app update URL
|
|
602
|
+
* @param firmwareBaseURL - firmware base URL
|
|
603
|
+
* @param fileDownloader - file downloader
|
|
604
|
+
* @returns void
|
|
605
|
+
* */
|
|
606
|
+
setupUpdateManager(appVersion, appUpdateURL, firmwareBaseURL, fileDownloader) {
|
|
607
|
+
// Setup update manager
|
|
608
|
+
const firmwareTypeStrForMainFw = 'main';
|
|
609
|
+
this._raftUpdateManager = new RaftUpdateManager_1.default(this._systemType, this._raftMsgHandler, this._raftFileHandler, this._raftSystemUtils, this._onUpdateEvent.bind(this), firmwareTypeStrForMainFw, appVersion, fileDownloader, appUpdateURL, firmwareBaseURL, this._raftChannel);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
exports.default = RaftConnector;
|
|
613
|
+
//# sourceMappingURL=RaftConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RaftConnector.js","sourceRoot":"","sources":["../src/RaftConnector.ts"],"names":[],"mappings":"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"}
|