@robdobsn/raftjs 1.1.1 → 1.3.2

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 (257) hide show
  1. package/README.md +2 -0
  2. package/dist/{RaftAttributeHandler.js → react-native/RaftAttributeHandler.js} +1 -1
  3. package/dist/react-native/RaftAttributeHandler.js.map +1 -0
  4. package/dist/react-native/RaftChannel.js.map +1 -0
  5. package/dist/react-native/RaftChannelBLE.native.d.ts +93 -0
  6. package/dist/react-native/RaftChannelBLE.native.js +455 -0
  7. package/dist/react-native/RaftChannelBLE.native.js.map +1 -0
  8. package/dist/{RaftChannelWebBLE.d.ts → react-native/RaftChannelBLE.web.d.ts} +3 -2
  9. package/dist/{RaftChannelWebBLE.js → react-native/RaftChannelBLE.web.js} +48 -28
  10. package/dist/react-native/RaftChannelBLE.web.js.map +1 -0
  11. package/dist/react-native/RaftChannelBLEFactory.d.ts +10 -0
  12. package/dist/react-native/RaftChannelBLEFactory.js +17 -0
  13. package/dist/react-native/RaftChannelBLEFactory.js.map +1 -0
  14. package/dist/react-native/RaftChannelBLEScanner.native.d.ts +18 -0
  15. package/dist/react-native/RaftChannelBLEScanner.native.js +146 -0
  16. package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -0
  17. package/dist/{RaftChannelWebSerial.js → react-native/RaftChannelWebSerial.js} +3 -2
  18. package/dist/react-native/RaftChannelWebSerial.js.map +1 -0
  19. package/dist/react-native/RaftChannelWebSocket.js.map +1 -0
  20. package/dist/react-native/RaftCommsStats.js.map +1 -0
  21. package/dist/{RaftConnEvents.d.ts → react-native/RaftConnEvents.d.ts} +10 -2
  22. package/dist/{RaftConnEvents.js → react-native/RaftConnEvents.js} +10 -0
  23. package/dist/react-native/RaftConnEvents.js.map +1 -0
  24. package/dist/{RaftConnector.d.ts → react-native/RaftConnector.d.ts} +6 -3
  25. package/dist/{RaftConnector.js → react-native/RaftConnector.js} +75 -74
  26. package/dist/react-native/RaftConnector.js.map +1 -0
  27. package/dist/react-native/RaftCustomAttrHandler.js.map +1 -0
  28. package/dist/{RaftDeviceInfo.d.ts → react-native/RaftDeviceInfo.d.ts} +5 -10
  29. package/dist/react-native/RaftDeviceInfo.js.map +1 -0
  30. package/dist/{RaftDeviceManager.d.ts → react-native/RaftDeviceManager.d.ts} +14 -16
  31. package/dist/{RaftDeviceManager.js → react-native/RaftDeviceManager.js} +116 -213
  32. package/dist/react-native/RaftDeviceManager.js.map +1 -0
  33. package/dist/react-native/RaftDeviceMgrIF.d.ts +12 -0
  34. package/dist/react-native/RaftDeviceMgrIF.js +11 -0
  35. package/dist/react-native/RaftDeviceMgrIF.js.map +1 -0
  36. package/dist/react-native/RaftDeviceMsg.js.map +1 -0
  37. package/dist/{RaftDeviceStates.d.ts → react-native/RaftDeviceStates.d.ts} +1 -1
  38. package/dist/react-native/RaftDeviceStates.js.map +1 -0
  39. package/dist/react-native/RaftFileHandler.js.map +1 -0
  40. package/dist/react-native/RaftLog.js.map +1 -0
  41. package/dist/{RaftMiniHDLC.js → react-native/RaftMiniHDLC.js} +1 -1
  42. package/dist/react-native/RaftMiniHDLC.js.map +1 -0
  43. package/dist/{RaftMsgHandler.js → react-native/RaftMsgHandler.js} +2 -2
  44. package/dist/react-native/RaftMsgHandler.js.map +1 -0
  45. package/dist/react-native/RaftMsgTrackInfo.js.map +1 -0
  46. package/dist/react-native/RaftProtocolDefs.js.map +1 -0
  47. package/dist/react-native/RaftStreamHandler.js.map +1 -0
  48. package/dist/{RaftSystemType.d.ts → react-native/RaftSystemType.d.ts} +4 -0
  49. package/dist/{RaftSystemType.js.map → react-native/RaftSystemType.js.map} +1 -1
  50. package/dist/react-native/RaftSystemUtils.js.map +1 -0
  51. package/dist/{RaftTypes.d.ts → react-native/RaftTypes.d.ts} +11 -0
  52. package/dist/{RaftTypes.js → react-native/RaftTypes.js} +34 -1
  53. package/dist/react-native/RaftTypes.js.map +1 -0
  54. package/dist/react-native/RaftUpdateEvents.js.map +1 -0
  55. package/dist/react-native/RaftUpdateManager.js.map +1 -0
  56. package/dist/{RaftUtils.js → react-native/RaftUtils.js} +1 -1
  57. package/dist/react-native/RaftUtils.js.map +1 -0
  58. package/dist/react-native/RaftWifiTypes.js.map +1 -0
  59. package/dist/react-native/main.d.ts +21 -0
  60. package/dist/{main.js → react-native/main.js} +7 -3
  61. package/dist/react-native/main.js.map +1 -0
  62. package/dist/web/RaftAttributeHandler.d.ts +12 -0
  63. package/dist/web/RaftAttributeHandler.js +241 -0
  64. package/dist/web/RaftAttributeHandler.js.map +1 -0
  65. package/dist/web/RaftChannel.d.ts +18 -0
  66. package/dist/web/RaftChannel.js +12 -0
  67. package/dist/web/RaftChannel.js.map +1 -0
  68. package/dist/web/RaftChannelBLE.web.d.ts +39 -0
  69. package/dist/web/RaftChannelBLE.web.js +294 -0
  70. package/dist/web/RaftChannelBLE.web.js.map +1 -0
  71. package/dist/web/RaftChannelBLEFactory.d.ts +10 -0
  72. package/dist/web/RaftChannelBLEFactory.js +17 -0
  73. package/dist/web/RaftChannelBLEFactory.js.map +1 -0
  74. package/dist/web/RaftChannelWebSerial.d.ts +37 -0
  75. package/dist/web/RaftChannelWebSerial.js +320 -0
  76. package/dist/web/RaftChannelWebSerial.js.map +1 -0
  77. package/dist/web/RaftChannelWebSocket.d.ts +28 -0
  78. package/dist/web/RaftChannelWebSocket.js +197 -0
  79. package/dist/web/RaftChannelWebSocket.js.map +1 -0
  80. package/dist/web/RaftCommsStats.d.ts +39 -0
  81. package/dist/web/RaftCommsStats.js +128 -0
  82. package/dist/web/RaftCommsStats.js.map +1 -0
  83. package/dist/web/RaftConnEvents.d.ts +39 -0
  84. package/dist/web/RaftConnEvents.js +54 -0
  85. package/dist/web/RaftConnEvents.js.map +1 -0
  86. package/dist/web/RaftConnector.d.ts +245 -0
  87. package/dist/web/RaftConnector.js +614 -0
  88. package/dist/web/RaftConnector.js.map +1 -0
  89. package/dist/web/RaftCustomAttrHandler.d.ts +4 -0
  90. package/dist/web/RaftCustomAttrHandler.js +50 -0
  91. package/dist/web/RaftCustomAttrHandler.js.map +1 -0
  92. package/dist/web/RaftDeviceInfo.d.ts +59 -0
  93. package/dist/web/RaftDeviceInfo.js +36 -0
  94. package/dist/web/RaftDeviceInfo.js.map +1 -0
  95. package/dist/web/RaftDeviceManager.d.ts +35 -0
  96. package/dist/web/RaftDeviceManager.js +353 -0
  97. package/dist/web/RaftDeviceManager.js.map +1 -0
  98. package/dist/web/RaftDeviceMgrIF.d.ts +12 -0
  99. package/dist/web/RaftDeviceMgrIF.js +11 -0
  100. package/dist/web/RaftDeviceMgrIF.js.map +1 -0
  101. package/dist/web/RaftDeviceMsg.d.ts +9 -0
  102. package/dist/web/RaftDeviceMsg.js +11 -0
  103. package/dist/web/RaftDeviceMsg.js.map +1 -0
  104. package/dist/web/RaftDeviceStates.d.ts +33 -0
  105. package/dist/web/RaftDeviceStates.js +60 -0
  106. package/dist/web/RaftDeviceStates.js.map +1 -0
  107. package/dist/web/RaftFileHandler.d.ts +52 -0
  108. package/dist/web/RaftFileHandler.js +502 -0
  109. package/dist/web/RaftFileHandler.js.map +1 -0
  110. package/dist/web/RaftLog.d.ts +22 -0
  111. package/dist/web/RaftLog.js +63 -0
  112. package/dist/web/RaftLog.js.map +1 -0
  113. package/dist/web/RaftMiniHDLC.d.ts +18 -0
  114. package/dist/web/RaftMiniHDLC.js +383 -0
  115. package/dist/web/RaftMiniHDLC.js.map +1 -0
  116. package/dist/web/RaftMsgHandler.d.ts +57 -0
  117. package/dist/web/RaftMsgHandler.js +480 -0
  118. package/dist/web/RaftMsgHandler.js.map +1 -0
  119. package/dist/web/RaftMsgTrackInfo.d.ts +17 -0
  120. package/dist/web/RaftMsgTrackInfo.js +42 -0
  121. package/dist/web/RaftMsgTrackInfo.js.map +1 -0
  122. package/dist/web/RaftProtocolDefs.d.ts +30 -0
  123. package/dist/web/RaftProtocolDefs.js +48 -0
  124. package/dist/web/RaftProtocolDefs.js.map +1 -0
  125. package/dist/web/RaftStreamHandler.d.ts +38 -0
  126. package/dist/web/RaftStreamHandler.js +257 -0
  127. package/dist/web/RaftStreamHandler.js.map +1 -0
  128. package/dist/web/RaftSystemType.d.ts +25 -0
  129. package/dist/web/RaftSystemType.js +3 -0
  130. package/dist/web/RaftSystemType.js.map +1 -0
  131. package/dist/web/RaftSystemUtils.d.ts +136 -0
  132. package/dist/web/RaftSystemUtils.js +410 -0
  133. package/dist/web/RaftSystemUtils.js.map +1 -0
  134. package/dist/web/RaftTypes.d.ts +195 -0
  135. package/dist/web/RaftTypes.js +190 -0
  136. package/dist/web/RaftTypes.js.map +1 -0
  137. package/dist/web/RaftUpdateEvents.d.ts +33 -0
  138. package/dist/web/RaftUpdateEvents.js +46 -0
  139. package/dist/web/RaftUpdateEvents.js.map +1 -0
  140. package/dist/web/RaftUpdateManager.d.ts +61 -0
  141. package/dist/web/RaftUpdateManager.js +618 -0
  142. package/dist/web/RaftUpdateManager.js.map +1 -0
  143. package/dist/web/RaftUtils.d.ts +125 -0
  144. package/dist/web/RaftUtils.js +454 -0
  145. package/dist/web/RaftUtils.js.map +1 -0
  146. package/dist/web/RaftWifiTypes.d.ts +23 -0
  147. package/dist/web/RaftWifiTypes.js +43 -0
  148. package/dist/web/RaftWifiTypes.js.map +1 -0
  149. package/dist/{main.d.ts → web/main.d.ts} +4 -1
  150. package/dist/web/main.js +46 -0
  151. package/dist/web/main.js.map +1 -0
  152. package/examples/dashboard/package.json +4 -0
  153. package/examples/dashboard/src/CommandPanel.tsx +147 -0
  154. package/examples/dashboard/src/ConnManager.ts +11 -12
  155. package/examples/dashboard/src/DeviceActionsForm.tsx +133 -0
  156. package/examples/dashboard/src/DeviceAttrsForm.tsx +49 -0
  157. package/examples/dashboard/src/DeviceLineChart.tsx +139 -0
  158. package/examples/dashboard/src/DevicePanel.tsx +135 -0
  159. package/examples/dashboard/src/DevicesPanel.tsx +57 -0
  160. package/examples/dashboard/src/DispLedGrid.tsx +110 -0
  161. package/examples/dashboard/src/DispOneLed.tsx +20 -0
  162. package/examples/dashboard/src/Main.tsx +53 -47
  163. package/examples/dashboard/src/{StatusScreen.tsx → StatusPanel.tsx} +13 -14
  164. package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +135 -122
  165. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +15 -8
  166. package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +0 -0
  167. package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +47 -1
  168. package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +4 -1
  169. package/examples/dashboard/src/styles.css +274 -10
  170. package/package.json +57 -48
  171. package/src/RaftAttributeHandler.ts +1 -1
  172. package/src/RaftChannelBLE.native.ts +583 -0
  173. package/src/{RaftChannelWebBLE.ts → RaftChannelBLE.web.ts} +60 -40
  174. package/src/RaftChannelBLEFactory.ts +13 -0
  175. package/src/RaftChannelBLEScanner.native.ts +190 -0
  176. package/src/RaftChannelWebSerial.ts +1 -0
  177. package/src/RaftConnEvents.ts +14 -2
  178. package/src/RaftConnector.ts +80 -88
  179. package/src/RaftDeviceInfo.ts +6 -12
  180. package/src/RaftDeviceManager.ts +139 -245
  181. package/src/RaftDeviceMgrIF.ts +28 -0
  182. package/src/RaftDeviceStates.ts +1 -2
  183. package/src/RaftMiniHDLC.ts +1 -1
  184. package/src/RaftMsgHandler.ts +2 -2
  185. package/src/RaftSystemType.ts +4 -0
  186. package/src/RaftTypes.ts +48 -17
  187. package/src/RaftUtils.ts +1 -1
  188. package/src/main.ts +8 -1
  189. package/tsconfig.json +5 -2
  190. package/tsconfig.react-native.json +29 -0
  191. package/dist/RaftAttributeHandler.js.map +0 -1
  192. package/dist/RaftChannel.js.map +0 -1
  193. package/dist/RaftChannelWebBLE.js.map +0 -1
  194. package/dist/RaftChannelWebSerial.js.map +0 -1
  195. package/dist/RaftChannelWebSocket.js.map +0 -1
  196. package/dist/RaftCommsStats.js.map +0 -1
  197. package/dist/RaftConnEvents.js.map +0 -1
  198. package/dist/RaftConnector.js.map +0 -1
  199. package/dist/RaftCustomAttrHandler.js.map +0 -1
  200. package/dist/RaftDeviceInfo.js.map +0 -1
  201. package/dist/RaftDeviceManager.js.map +0 -1
  202. package/dist/RaftDeviceMsg.js.map +0 -1
  203. package/dist/RaftDeviceStates.js.map +0 -1
  204. package/dist/RaftFileHandler.js.map +0 -1
  205. package/dist/RaftLog.js.map +0 -1
  206. package/dist/RaftMiniHDLC.js.map +0 -1
  207. package/dist/RaftMsgHandler.js.map +0 -1
  208. package/dist/RaftMsgTrackInfo.js.map +0 -1
  209. package/dist/RaftProtocolDefs.js.map +0 -1
  210. package/dist/RaftStreamHandler.js.map +0 -1
  211. package/dist/RaftSystemUtils.js.map +0 -1
  212. package/dist/RaftTypes.js.map +0 -1
  213. package/dist/RaftUpdateEvents.js.map +0 -1
  214. package/dist/RaftUpdateManager.js.map +0 -1
  215. package/dist/RaftUtils.js.map +0 -1
  216. package/dist/RaftWifiTypes.js.map +0 -1
  217. package/dist/TestDataGen.d.ts +0 -7
  218. package/dist/TestDataGen.js +0 -133
  219. package/dist/TestDataGen.js.map +0 -1
  220. package/dist/main.js.map +0 -1
  221. package/src/TestDataGen.ts +0 -157
  222. /package/dist/{RaftAttributeHandler.d.ts → react-native/RaftAttributeHandler.d.ts} +0 -0
  223. /package/dist/{RaftChannel.d.ts → react-native/RaftChannel.d.ts} +0 -0
  224. /package/dist/{RaftChannel.js → react-native/RaftChannel.js} +0 -0
  225. /package/dist/{RaftChannelWebSerial.d.ts → react-native/RaftChannelWebSerial.d.ts} +0 -0
  226. /package/dist/{RaftChannelWebSocket.d.ts → react-native/RaftChannelWebSocket.d.ts} +0 -0
  227. /package/dist/{RaftChannelWebSocket.js → react-native/RaftChannelWebSocket.js} +0 -0
  228. /package/dist/{RaftCommsStats.d.ts → react-native/RaftCommsStats.d.ts} +0 -0
  229. /package/dist/{RaftCommsStats.js → react-native/RaftCommsStats.js} +0 -0
  230. /package/dist/{RaftCustomAttrHandler.d.ts → react-native/RaftCustomAttrHandler.d.ts} +0 -0
  231. /package/dist/{RaftCustomAttrHandler.js → react-native/RaftCustomAttrHandler.js} +0 -0
  232. /package/dist/{RaftDeviceInfo.js → react-native/RaftDeviceInfo.js} +0 -0
  233. /package/dist/{RaftDeviceMsg.d.ts → react-native/RaftDeviceMsg.d.ts} +0 -0
  234. /package/dist/{RaftDeviceMsg.js → react-native/RaftDeviceMsg.js} +0 -0
  235. /package/dist/{RaftDeviceStates.js → react-native/RaftDeviceStates.js} +0 -0
  236. /package/dist/{RaftFileHandler.d.ts → react-native/RaftFileHandler.d.ts} +0 -0
  237. /package/dist/{RaftFileHandler.js → react-native/RaftFileHandler.js} +0 -0
  238. /package/dist/{RaftLog.d.ts → react-native/RaftLog.d.ts} +0 -0
  239. /package/dist/{RaftLog.js → react-native/RaftLog.js} +0 -0
  240. /package/dist/{RaftMiniHDLC.d.ts → react-native/RaftMiniHDLC.d.ts} +0 -0
  241. /package/dist/{RaftMsgHandler.d.ts → react-native/RaftMsgHandler.d.ts} +0 -0
  242. /package/dist/{RaftMsgTrackInfo.d.ts → react-native/RaftMsgTrackInfo.d.ts} +0 -0
  243. /package/dist/{RaftMsgTrackInfo.js → react-native/RaftMsgTrackInfo.js} +0 -0
  244. /package/dist/{RaftProtocolDefs.d.ts → react-native/RaftProtocolDefs.d.ts} +0 -0
  245. /package/dist/{RaftProtocolDefs.js → react-native/RaftProtocolDefs.js} +0 -0
  246. /package/dist/{RaftStreamHandler.d.ts → react-native/RaftStreamHandler.d.ts} +0 -0
  247. /package/dist/{RaftStreamHandler.js → react-native/RaftStreamHandler.js} +0 -0
  248. /package/dist/{RaftSystemType.js → react-native/RaftSystemType.js} +0 -0
  249. /package/dist/{RaftSystemUtils.d.ts → react-native/RaftSystemUtils.d.ts} +0 -0
  250. /package/dist/{RaftSystemUtils.js → react-native/RaftSystemUtils.js} +0 -0
  251. /package/dist/{RaftUpdateEvents.d.ts → react-native/RaftUpdateEvents.d.ts} +0 -0
  252. /package/dist/{RaftUpdateEvents.js → react-native/RaftUpdateEvents.js} +0 -0
  253. /package/dist/{RaftUpdateManager.d.ts → react-native/RaftUpdateManager.d.ts} +0 -0
  254. /package/dist/{RaftUpdateManager.js → react-native/RaftUpdateManager.js} +0 -0
  255. /package/dist/{RaftUtils.d.ts → react-native/RaftUtils.d.ts} +0 -0
  256. /package/dist/{RaftWifiTypes.d.ts → react-native/RaftWifiTypes.d.ts} +0 -0
  257. /package/dist/{RaftWifiTypes.js → react-native/RaftWifiTypes.js} +0 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @description
3
+ * This file is used to create a new instance of the RaftChannelBLE class.
4
+ * RaftChannelBLE exists in 2 files: RaftChannelBLE.native.ts and RaftChannelBLE.web.ts
5
+ * each of these files contains the same class but with different implementations (native and web).
6
+ * The import statement at the top of the file will import the correct implementation based on the platform
7
+ * (depending on the build configuration).
8
+ */
9
+ import RaftChannelBLE from './RaftChannelBLE';
10
+ export declare function createBLEChannel(): typeof RaftChannelBLE;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBLEChannel = createBLEChannel;
4
+ const tslib_1 = require("tslib");
5
+ /**
6
+ * @description
7
+ * This file is used to create a new instance of the RaftChannelBLE class.
8
+ * RaftChannelBLE exists in 2 files: RaftChannelBLE.native.ts and RaftChannelBLE.web.ts
9
+ * each of these files contains the same class but with different implementations (native and web).
10
+ * The import statement at the top of the file will import the correct implementation based on the platform
11
+ * (depending on the build configuration).
12
+ */
13
+ const RaftChannelBLE_1 = tslib_1.__importDefault(require("./RaftChannelBLE"));
14
+ function createBLEChannel() {
15
+ return RaftChannelBLE_1.default;
16
+ }
17
+ //# sourceMappingURL=RaftChannelBLEFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RaftChannelBLEFactory.js","sourceRoot":"","sources":["../../src/RaftChannelBLEFactory.ts"],"names":[],"mappings":";;AAUA,4CAEC;;AAZD;;;;;;;GAOG;AACH,8EAA8C;AAE9C,SAAgB,gBAAgB;IAC9B,OAAO,wBAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import RaftChannel from "./RaftChannel";
2
+ import RaftMsgHandler from "./RaftMsgHandler";
3
+ import { RaftConnEventFn } from "./RaftConnEvents";
4
+ import { ConnectorOptions } from "./RaftSystemType";
5
+ export default class RaftChannelWebSerial implements RaftChannel {
6
+ private _raftMsgHandler;
7
+ private _port;
8
+ private _reader?;
9
+ private _isConnected;
10
+ private _connPaused;
11
+ private _serialBuffer;
12
+ private _escapeSeqCode;
13
+ private _OVERASCII_ESCAPE_1;
14
+ private _OVERASCII_ESCAPE_2;
15
+ private _OVERASCII_ESCAPE_3;
16
+ private _OVERASCII_MOD_CODE;
17
+ private _onConnEvent;
18
+ private _requestedBatchAckSize;
19
+ private _requestedFileBlockSize;
20
+ fhBatchAckSize(): number;
21
+ fhFileBlockSize(): number;
22
+ isConnected(): boolean;
23
+ setMsgHandler(raftMsgHandler: RaftMsgHandler): void;
24
+ requiresSubscription(): boolean;
25
+ ricRestCmdBeforeDisconnect(): string | null;
26
+ setOnConnEvent(connEventFn: RaftConnEventFn): void;
27
+ getConnectedLocator(): string | object;
28
+ connect(locator: string | object, _connectorOptions: ConnectorOptions): Promise<boolean>;
29
+ disconnect(): Promise<void>;
30
+ pauseConnection(pause: boolean): void;
31
+ private _overasciiDecodeByte;
32
+ private _overasciiEncode;
33
+ _onMsgRx(msg: Uint8Array | null): void;
34
+ sendTxMsg(msg: Uint8Array, sendWithResponse: boolean): Promise<boolean>;
35
+ sendTxMsgNoAwait(msg: Uint8Array, sendWithResponse: boolean): Promise<boolean>;
36
+ _readLoop(): Promise<void>;
37
+ }
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3
+ //
4
+ // RaftChannelWebSerial
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 RaftLog_1 = tslib_1.__importDefault(require("./RaftLog"));
14
+ const RaftConnEvents_1 = require("./RaftConnEvents");
15
+ const text_encoding_1 = require("text-encoding");
16
+ class RaftChannelWebSerial {
17
+ constructor() {
18
+ // Message handler
19
+ this._raftMsgHandler = null;
20
+ this._port = null;
21
+ // Last message tx time
22
+ // private _msgTxTimeLast = Date.now();
23
+ // private _msgTxMinTimeBetweenMs = 15;
24
+ // Is connected
25
+ this._isConnected = false;
26
+ this._connPaused = false;
27
+ this._serialBuffer = [];
28
+ this._escapeSeqCode = 0;
29
+ this._OVERASCII_ESCAPE_1 = 0x85;
30
+ this._OVERASCII_ESCAPE_2 = 0x8E;
31
+ this._OVERASCII_ESCAPE_3 = 0x8F;
32
+ this._OVERASCII_MOD_CODE = 0x20;
33
+ // Conn event fn
34
+ this._onConnEvent = null;
35
+ // File Handler parameters
36
+ this._requestedBatchAckSize = 1;
37
+ this._requestedFileBlockSize = 1200;
38
+ }
39
+ fhBatchAckSize() { return this._requestedBatchAckSize; }
40
+ fhFileBlockSize() { return this._requestedFileBlockSize; }
41
+ // isConnected
42
+ isConnected() {
43
+ return this._isConnected;
44
+ }
45
+ // Set message handler
46
+ setMsgHandler(raftMsgHandler) {
47
+ this._raftMsgHandler = raftMsgHandler;
48
+ }
49
+ // Serial interface will require subscription, but don't start it by default
50
+ requiresSubscription() {
51
+ return false;
52
+ }
53
+ // RICREST command before disconnect
54
+ ricRestCmdBeforeDisconnect() {
55
+ return null;
56
+ }
57
+ // Set onConnEvent handler
58
+ setOnConnEvent(connEventFn) {
59
+ this._onConnEvent = connEventFn;
60
+ }
61
+ // Get connected locator
62
+ getConnectedLocator() {
63
+ return this._port || "";
64
+ }
65
+ // Connect to a device
66
+ async connect(locator, _connectorOptions) {
67
+ console.log("_connectorOptions", _connectorOptions);
68
+ // Debug
69
+ RaftLog_1.default.debug("RaftChannelWebSerial.connect " + locator.toString());
70
+ // Check already connected
71
+ if (await this.isConnected()) {
72
+ return true;
73
+ }
74
+ try {
75
+ if (('serial' in navigator) && (!this._port || locator != "reusePort")) {
76
+ const port = await navigator.serial.requestPort();
77
+ this._port = port;
78
+ }
79
+ // Connect
80
+ if (!this._port)
81
+ return false;
82
+ try {
83
+ RaftLog_1.default.info("opening port");
84
+ await this._port.open({ baudRate: 115200 });
85
+ }
86
+ catch (err) {
87
+ if (err.name == "InvalidStateError") {
88
+ RaftLog_1.default.debug(`Opening port failed - already open ${err}`);
89
+ }
90
+ else {
91
+ RaftLog_1.default.error(`Opening port failed: ${err}`);
92
+ throw err;
93
+ }
94
+ }
95
+ this._isConnected = true;
96
+ // start read loop
97
+ this._readLoop();
98
+ this._port.addEventListener('disconnect', (event) => {
99
+ RaftLog_1.default.debug("WebSerial disconnect " + JSON.stringify(event));
100
+ if (this._onConnEvent)
101
+ this._onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_DISCONNECTED);
102
+ });
103
+ // TODO: handle errors
104
+ }
105
+ catch (err) {
106
+ RaftLog_1.default.error("RaftChannelWebSerial.connect fail. Error: " + JSON.stringify(err));
107
+ return false;
108
+ }
109
+ return true;
110
+ }
111
+ // Disconnect
112
+ async disconnect() {
113
+ // Not connected
114
+ this._isConnected = false;
115
+ RaftLog_1.default.debug(`RaftChannelWebSerial.disconnect attempting to close webserial`);
116
+ while (this._reader) {
117
+ await new Promise((resolve) => setTimeout(resolve, 100));
118
+ }
119
+ // Disconnect webserial
120
+ try {
121
+ if (this._port)
122
+ await this._port.close();
123
+ }
124
+ catch (err) {
125
+ console.debug(`Error closing port ${err}`);
126
+ }
127
+ if (this._onConnEvent)
128
+ this._onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_DISCONNECTED);
129
+ RaftLog_1.default.debug("WebSerial port closed");
130
+ return;
131
+ }
132
+ pauseConnection(pause) {
133
+ this._connPaused = pause;
134
+ }
135
+ _overasciiDecodeByte(ch) {
136
+ // Check if in escape sequence
137
+ if (this._escapeSeqCode != 0) {
138
+ const prevEscCode = this._escapeSeqCode;
139
+ this._escapeSeqCode = 0;
140
+ if (prevEscCode == 1) {
141
+ return (ch ^ this._OVERASCII_MOD_CODE) & 0x7f;
142
+ }
143
+ else if (prevEscCode == 2) {
144
+ return ch ^ this._OVERASCII_MOD_CODE;
145
+ }
146
+ return ch;
147
+ }
148
+ else if (ch == this._OVERASCII_ESCAPE_1) {
149
+ this._escapeSeqCode = 1;
150
+ return -1;
151
+ }
152
+ else if (ch == this._OVERASCII_ESCAPE_2) {
153
+ this._escapeSeqCode = 2;
154
+ return -1;
155
+ }
156
+ else if (ch == this._OVERASCII_ESCAPE_3) {
157
+ this._escapeSeqCode = 3;
158
+ return -1;
159
+ }
160
+ else {
161
+ return ch & 0x7f;
162
+ }
163
+ }
164
+ _overasciiEncode(inData) {
165
+ /*
166
+ Encode frame
167
+ Values 0x00-0x0F map to ESCAPE_CODE_1, VALUE_XOR_20H_AND_MSB_SET
168
+ Values 0x10-0x7f map to VALUE_WITH_MSB_SET
169
+ Values 0x80-0x8F map to ESCAPE_CODE_2, VALUE_XOR_20H
170
+ Values 0x90-0xff map to ESCAPE_CODE_3, VALUE
171
+ Value ESCAPE_CODE_1 maps to ESCAPE_CODE_1 + VALUE
172
+ Args:
173
+ inData: data to encode (bytes)
174
+ Returns:
175
+ encoded frame (bytes)
176
+ */
177
+ // Iterate over frame
178
+ const encodedFrame = [];
179
+ for (let i = 0; i < inData.length; i++) {
180
+ if (inData[i] <= 0x0f) {
181
+ encodedFrame.push(this._OVERASCII_ESCAPE_1);
182
+ encodedFrame.push((inData[i] ^ this._OVERASCII_MOD_CODE) | 0x80);
183
+ }
184
+ else if ((inData[i] >= 0x10) && (inData[i] <= 0x7f)) {
185
+ encodedFrame.push(inData[i] | 0x80);
186
+ }
187
+ else if ((inData[i] >= 0x80) && (inData[i] <= 0x8f)) {
188
+ encodedFrame.push(this._OVERASCII_ESCAPE_2);
189
+ encodedFrame.push(inData[i] ^ this._OVERASCII_MOD_CODE);
190
+ }
191
+ else {
192
+ encodedFrame.push(this._OVERASCII_ESCAPE_3);
193
+ encodedFrame.push(inData[i]);
194
+ }
195
+ }
196
+ return new Uint8Array(encodedFrame);
197
+ }
198
+ // Handle notifications
199
+ _onMsgRx(msg) {
200
+ if (msg === null)
201
+ return;
202
+ // Debug
203
+ //const decoder = new TextDecoder();
204
+ //RaftLog.debug(`RaftChannelWebSerial._onMsgRx ${decoder.decode(msg)}`);
205
+ const overasciiBuffer = [];
206
+ for (let i = 0; i < msg.length; i++) {
207
+ if (msg[i] > 127) {
208
+ const ch = this._overasciiDecodeByte(msg[i]);
209
+ if (ch != -1) {
210
+ overasciiBuffer.push(ch);
211
+ }
212
+ }
213
+ else {
214
+ this._serialBuffer.push(msg[i]);
215
+ }
216
+ }
217
+ if (this._raftMsgHandler)
218
+ this._raftMsgHandler.handleNewRxMsg(new Uint8Array(overasciiBuffer));
219
+ // any output over the non overascii channel will be delimited by a new line character
220
+ // scan for this, and log any lines as they occur before removing them from the buffer
221
+ if (this._serialBuffer.includes(0x0a)) {
222
+ const decoder = new text_encoding_1.TextDecoder();
223
+ RaftLog_1.default.debug(decoder.decode(new Uint8Array(this._serialBuffer.slice(0, this._serialBuffer.indexOf(0x0a)))));
224
+ this._serialBuffer.splice(0, this._serialBuffer.indexOf(0x0a) + 1);
225
+ }
226
+ }
227
+ // Send a message
228
+ async sendTxMsg(msg, sendWithResponse) {
229
+ // Check connected
230
+ if (!this._isConnected || !this._port)
231
+ return false;
232
+ // Debug
233
+ const decoder = new text_encoding_1.TextDecoder();
234
+ RaftLog_1.default.verbose(`RaftChannelWebSerial.sendTxMsg ${msg.toString()} ${decoder.decode(msg)} sendWithResp ${sendWithResponse.toString()}`);
235
+ try {
236
+ if (this._port.writable != null) {
237
+ const writer = this._port.writable.getWriter();
238
+ await writer.write(this._overasciiEncode(msg));
239
+ writer.releaseLock();
240
+ }
241
+ }
242
+ catch (err) {
243
+ RaftLog_1.default.warn("sendMsg error: " + JSON.stringify(err));
244
+ return false;
245
+ }
246
+ return true;
247
+ }
248
+ async sendTxMsgNoAwait(msg, sendWithResponse) {
249
+ // Check connected
250
+ if (!this._isConnected || !this._port)
251
+ return false;
252
+ // Debug
253
+ RaftLog_1.default.verbose(`RaftChannelWebSerial.sendTxMsgNoAwait ${msg.toString()} sendWithResp ${sendWithResponse.toString()}`);
254
+ try {
255
+ if (this._port.writable != null) {
256
+ const writer = this._port.writable.getWriter();
257
+ writer.write(msg).then(() => { writer.releaseLock(); });
258
+ }
259
+ }
260
+ catch (err) {
261
+ RaftLog_1.default.error("sendMsg error: " + JSON.stringify(err));
262
+ }
263
+ return true;
264
+ }
265
+ async _readLoop() {
266
+ RaftLog_1.default.debug("Starting read loop");
267
+ if (!this._port)
268
+ return;
269
+ let retries = 10;
270
+ try {
271
+ if (!this._port.readable) {
272
+ RaftLog_1.default.error("RaftChannelWebSerial _readLoop port is not readble");
273
+ return;
274
+ }
275
+ this._reader = this._port.readable.getReader();
276
+ while (this._port.readable && this._isConnected) {
277
+ if (this._connPaused) {
278
+ if (this._reader) {
279
+ this._reader.releaseLock();
280
+ this._reader = undefined;
281
+ }
282
+ await new Promise(resolve => setTimeout(resolve, 100));
283
+ continue;
284
+ }
285
+ try {
286
+ if (!this._reader)
287
+ this._reader = this._port.readable.getReader();
288
+ const { value, done } = await this._reader.read();
289
+ if (done) {
290
+ this._reader.releaseLock();
291
+ break;
292
+ }
293
+ if (!value || value.length === 0) {
294
+ continue;
295
+ }
296
+ this._onMsgRx(new Uint8Array(value));
297
+ }
298
+ catch (err) {
299
+ RaftLog_1.default.error("read loop issue: " + JSON.stringify(err));
300
+ retries -= 1;
301
+ if (!retries)
302
+ break;
303
+ await new Promise(resolve => setTimeout(resolve, 100));
304
+ this._reader = this._port.readable.getReader();
305
+ }
306
+ }
307
+ if (this._reader)
308
+ this._reader.releaseLock();
309
+ this._reader = undefined;
310
+ }
311
+ catch (err) {
312
+ RaftLog_1.default.error("Read loop got disconnected. err: " + JSON.stringify(err));
313
+ }
314
+ // Disconnected!
315
+ this._isConnected = false;
316
+ RaftLog_1.default.debug("Finished read loop");
317
+ }
318
+ }
319
+ exports.default = RaftChannelWebSerial;
320
+ //# sourceMappingURL=RaftChannelWebSerial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RaftChannelWebSerial.js","sourceRoot":"","sources":["../../src/RaftChannelWebSerial.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import RaftChannel from "./RaftChannel";
2
+ import RaftMsgHandler from "./RaftMsgHandler";
3
+ import { RaftConnEventFn } from "./RaftConnEvents";
4
+ import { ConnectorOptions } from "./RaftSystemType";
5
+ export default class RaftChannelWebSocket implements RaftChannel {
6
+ private _raftMsgHandler;
7
+ private _webSocket;
8
+ private _isConnected;
9
+ private _onConnEvent;
10
+ private _requestedBatchAckSize;
11
+ private _requestedFileBlockSize;
12
+ fhBatchAckSize(): number;
13
+ fhFileBlockSize(): number;
14
+ isConnected(): boolean;
15
+ setMsgHandler(raftMsgHandler: RaftMsgHandler): void;
16
+ requiresSubscription(): boolean;
17
+ ricRestCmdBeforeDisconnect(): string | null;
18
+ setOnConnEvent(connEventFn: RaftConnEventFn): void;
19
+ getConnectedLocator(): string | object;
20
+ connect(locator: string | object, connectorOptions: ConnectorOptions): Promise<boolean>;
21
+ disconnect(): Promise<void>;
22
+ pauseConnection(pause: boolean): void;
23
+ _onMsgRx(msg: Uint8Array | null): void;
24
+ sendTxMsg(msg: Uint8Array, sendWithResponse: boolean): Promise<boolean>;
25
+ sendTxMsgNoAwait(msg: Uint8Array, sendWithResponse: boolean): Promise<boolean>;
26
+ _wsConnect(locator: string | object): Promise<boolean>;
27
+ private _webSocketOpen;
28
+ }
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3
+ //
4
+ // RaftChannelWebSockets
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 isomorphic_ws_1 = tslib_1.__importDefault(require("isomorphic-ws"));
14
+ const RaftLog_1 = tslib_1.__importDefault(require("./RaftLog"));
15
+ const RaftUtils_1 = tslib_1.__importDefault(require("./RaftUtils"));
16
+ const RaftConnEvents_1 = require("./RaftConnEvents");
17
+ class RaftChannelWebSocket {
18
+ constructor() {
19
+ // Message handler
20
+ this._raftMsgHandler = null;
21
+ // Websocket we are connected to
22
+ this._webSocket = null;
23
+ // Last message tx time
24
+ // private _msgTxTimeLast = Date.now();
25
+ // private _msgTxMinTimeBetweenMs = 15;
26
+ // Is connected
27
+ this._isConnected = false;
28
+ // Conn event fn
29
+ this._onConnEvent = null;
30
+ // File Handler parameters
31
+ this._requestedBatchAckSize = 10;
32
+ this._requestedFileBlockSize = 500;
33
+ }
34
+ fhBatchAckSize() { return this._requestedBatchAckSize; }
35
+ fhFileBlockSize() { return this._requestedFileBlockSize; }
36
+ // isConnected
37
+ isConnected() {
38
+ return this._isConnected;
39
+ }
40
+ // Set message handler
41
+ setMsgHandler(raftMsgHandler) {
42
+ this._raftMsgHandler = raftMsgHandler;
43
+ }
44
+ // WebSocket interfaces require subscription to published messages
45
+ requiresSubscription() {
46
+ return true;
47
+ }
48
+ // RICREST command before disconnect
49
+ ricRestCmdBeforeDisconnect() {
50
+ return null;
51
+ }
52
+ // Set onConnEvent handler
53
+ setOnConnEvent(connEventFn) {
54
+ this._onConnEvent = connEventFn;
55
+ }
56
+ // Get connected locator
57
+ getConnectedLocator() {
58
+ return this._webSocket;
59
+ }
60
+ // Connect to a device
61
+ async connect(locator, connectorOptions) {
62
+ // Debug
63
+ RaftLog_1.default.debug("RaftChannelWebSocket.connect " + locator.toString());
64
+ // Get ws suffix
65
+ const wsSuffix = connectorOptions ? (connectorOptions.wsSuffix ? connectorOptions.wsSuffix : "ws") : "ws";
66
+ // Connect
67
+ const connOk = await this._wsConnect("ws://" + locator + "/" + wsSuffix);
68
+ return connOk;
69
+ }
70
+ // Disconnect
71
+ async disconnect() {
72
+ var _a;
73
+ // Not connected
74
+ this._isConnected = false;
75
+ // Disconnect websocket
76
+ (_a = this._webSocket) === null || _a === void 0 ? void 0 : _a.close(1000);
77
+ // Debug
78
+ RaftLog_1.default.debug(`RaftChannelWebSocket.disconnect attempting to close websocket`);
79
+ }
80
+ pauseConnection(pause) { RaftLog_1.default.verbose(`pauseConnection ${pause} - no effect for this channel type`); return; }
81
+ // Handle notifications
82
+ _onMsgRx(msg) {
83
+ // Debug
84
+ if (msg !== null) {
85
+ RaftLog_1.default.verbose(`RaftChannelWebSocket._onMsgRx ${RaftUtils_1.default.bufferToHex(msg)}`);
86
+ }
87
+ // Handle message
88
+ if (msg !== null && this._raftMsgHandler) {
89
+ this._raftMsgHandler.handleNewRxMsg(msg);
90
+ }
91
+ }
92
+ // Send a message
93
+ async sendTxMsg(msg, sendWithResponse) {
94
+ var _a;
95
+ // Check connected
96
+ if (!this._isConnected)
97
+ return false;
98
+ // Debug
99
+ RaftLog_1.default.verbose(`RaftChannelWebSocket.sendTxMsg ${msg.toString()} sendWithResp ${sendWithResponse.toString()}`);
100
+ // Send over websocket
101
+ try {
102
+ await ((_a = this._webSocket) === null || _a === void 0 ? void 0 : _a.send(msg));
103
+ }
104
+ catch (error) {
105
+ RaftLog_1.default.warn(`RaftChannelWebSocket.sendTxMsg - send failed ${error}`);
106
+ return false;
107
+ }
108
+ return true;
109
+ }
110
+ async sendTxMsgNoAwait(msg, sendWithResponse) {
111
+ var _a;
112
+ // Check connected
113
+ if (!this._isConnected)
114
+ return false;
115
+ // Debug
116
+ RaftLog_1.default.verbose(`RaftChannelWebSocket.sendTxMsgNoAwait ${msg.toString()} sendWithResp ${sendWithResponse.toString()}`);
117
+ // Send over websocket
118
+ (_a = this._webSocket) === null || _a === void 0 ? void 0 : _a.send(msg);
119
+ return true;
120
+ }
121
+ async _wsConnect(locator) {
122
+ // Check already connected
123
+ if (await this.isConnected()) {
124
+ return true;
125
+ }
126
+ // Form websocket address
127
+ const wsURL = locator.toString();
128
+ // Connect to websocket
129
+ // try {
130
+ // this._webSocket = await this._webSocketOpen(wsURL);
131
+ // } catch (error: any) {
132
+ // RaftLog.debug(`Unable to create WebSocket ${error.toString()}`);
133
+ // return false;
134
+ // }
135
+ this._webSocket = null;
136
+ return new Promise((resolve, reject) => {
137
+ this._webSocketOpen(wsURL).then((ws) => {
138
+ this._webSocket = ws;
139
+ RaftLog_1.default.debug(`_wsConnect - opened connection`);
140
+ // Handle messages
141
+ this._webSocket.onmessage = (evt) => {
142
+ // RaftLog.debug("WebSocket rx");
143
+ if (evt.data instanceof ArrayBuffer) {
144
+ const msg = new Uint8Array(evt.data);
145
+ this._onMsgRx(msg);
146
+ }
147
+ };
148
+ // Handle close event
149
+ this._webSocket.onclose = (evt) => {
150
+ RaftLog_1.default.info(`_wsConnect - closed code ${evt.code} wasClean ${evt.wasClean} reason ${evt.reason}`);
151
+ this._webSocket = null;
152
+ this._isConnected = false;
153
+ // Event handler
154
+ if (this._onConnEvent) {
155
+ this._onConnEvent(RaftConnEvents_1.RaftConnEvent.CONN_DISCONNECTED);
156
+ }
157
+ };
158
+ // Resolve the promise - success
159
+ resolve(true);
160
+ }).catch((err) => {
161
+ if (err instanceof Error) {
162
+ RaftLog_1.default.verbose(`WS open failed ${err.toString()}`);
163
+ }
164
+ // Resolve - failed
165
+ reject(false);
166
+ });
167
+ });
168
+ }
169
+ async _webSocketOpen(url) {
170
+ return new Promise((resolve, reject) => {
171
+ // Debug
172
+ // RaftLog.debug('Attempting WebSocket connection');
173
+ // Open the socket
174
+ try {
175
+ const webSocket = new isomorphic_ws_1.default(url);
176
+ // Open socket
177
+ webSocket.binaryType = "arraybuffer";
178
+ webSocket.onopen = (_evt) => {
179
+ RaftLog_1.default.debug(`RaftChannelWebSocket._webSocketOpen - onopen ${_evt.toString()}`);
180
+ // // We're connected
181
+ this._isConnected = true;
182
+ resolve(webSocket);
183
+ };
184
+ webSocket.onerror = function (evt) {
185
+ RaftLog_1.default.warn(`RaftChannelWebSocket._webSocketOpen - onerror: ${evt.message}`);
186
+ reject(evt);
187
+ };
188
+ }
189
+ catch (error) {
190
+ RaftLog_1.default.warn(`RaftChannelWebSocket._webSocketOpen - open failed ${error}`);
191
+ reject(error);
192
+ }
193
+ });
194
+ }
195
+ }
196
+ exports.default = RaftChannelWebSocket;
197
+ //# sourceMappingURL=RaftChannelWebSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RaftChannelWebSocket.js","sourceRoot":"","sources":["../../src/RaftChannelWebSocket.ts"],"names":[],"mappings":"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"}