@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.
- package/README.md +2 -0
- package/dist/{RaftAttributeHandler.js → react-native/RaftAttributeHandler.js} +1 -1
- package/dist/react-native/RaftAttributeHandler.js.map +1 -0
- package/dist/react-native/RaftChannel.js.map +1 -0
- package/dist/react-native/RaftChannelBLE.native.d.ts +93 -0
- package/dist/react-native/RaftChannelBLE.native.js +455 -0
- package/dist/react-native/RaftChannelBLE.native.js.map +1 -0
- package/dist/{RaftChannelWebBLE.d.ts → react-native/RaftChannelBLE.web.d.ts} +3 -2
- package/dist/{RaftChannelWebBLE.js → react-native/RaftChannelBLE.web.js} +48 -28
- package/dist/react-native/RaftChannelBLE.web.js.map +1 -0
- package/dist/react-native/RaftChannelBLEFactory.d.ts +10 -0
- package/dist/react-native/RaftChannelBLEFactory.js +17 -0
- package/dist/react-native/RaftChannelBLEFactory.js.map +1 -0
- package/dist/react-native/RaftChannelBLEScanner.native.d.ts +18 -0
- package/dist/react-native/RaftChannelBLEScanner.native.js +146 -0
- package/dist/react-native/RaftChannelBLEScanner.native.js.map +1 -0
- package/dist/{RaftChannelWebSerial.js → react-native/RaftChannelWebSerial.js} +3 -2
- package/dist/react-native/RaftChannelWebSerial.js.map +1 -0
- package/dist/react-native/RaftChannelWebSocket.js.map +1 -0
- package/dist/react-native/RaftCommsStats.js.map +1 -0
- package/dist/{RaftConnEvents.d.ts → react-native/RaftConnEvents.d.ts} +10 -2
- package/dist/{RaftConnEvents.js → react-native/RaftConnEvents.js} +10 -0
- package/dist/react-native/RaftConnEvents.js.map +1 -0
- package/dist/{RaftConnector.d.ts → react-native/RaftConnector.d.ts} +6 -3
- package/dist/{RaftConnector.js → react-native/RaftConnector.js} +75 -74
- package/dist/react-native/RaftConnector.js.map +1 -0
- package/dist/react-native/RaftCustomAttrHandler.js.map +1 -0
- package/dist/{RaftDeviceInfo.d.ts → react-native/RaftDeviceInfo.d.ts} +5 -10
- package/dist/react-native/RaftDeviceInfo.js.map +1 -0
- package/dist/{RaftDeviceManager.d.ts → react-native/RaftDeviceManager.d.ts} +14 -16
- package/dist/{RaftDeviceManager.js → react-native/RaftDeviceManager.js} +116 -213
- package/dist/react-native/RaftDeviceManager.js.map +1 -0
- package/dist/react-native/RaftDeviceMgrIF.d.ts +12 -0
- package/dist/react-native/RaftDeviceMgrIF.js +11 -0
- package/dist/react-native/RaftDeviceMgrIF.js.map +1 -0
- package/dist/react-native/RaftDeviceMsg.js.map +1 -0
- package/dist/{RaftDeviceStates.d.ts → react-native/RaftDeviceStates.d.ts} +1 -1
- package/dist/react-native/RaftDeviceStates.js.map +1 -0
- package/dist/react-native/RaftFileHandler.js.map +1 -0
- package/dist/react-native/RaftLog.js.map +1 -0
- package/dist/{RaftMiniHDLC.js → react-native/RaftMiniHDLC.js} +1 -1
- package/dist/react-native/RaftMiniHDLC.js.map +1 -0
- package/dist/{RaftMsgHandler.js → react-native/RaftMsgHandler.js} +2 -2
- package/dist/react-native/RaftMsgHandler.js.map +1 -0
- package/dist/react-native/RaftMsgTrackInfo.js.map +1 -0
- package/dist/react-native/RaftProtocolDefs.js.map +1 -0
- package/dist/react-native/RaftStreamHandler.js.map +1 -0
- package/dist/{RaftSystemType.d.ts → react-native/RaftSystemType.d.ts} +4 -0
- package/dist/{RaftSystemType.js.map → react-native/RaftSystemType.js.map} +1 -1
- package/dist/react-native/RaftSystemUtils.js.map +1 -0
- package/dist/{RaftTypes.d.ts → react-native/RaftTypes.d.ts} +11 -0
- package/dist/{RaftTypes.js → react-native/RaftTypes.js} +34 -1
- package/dist/react-native/RaftTypes.js.map +1 -0
- package/dist/react-native/RaftUpdateEvents.js.map +1 -0
- package/dist/react-native/RaftUpdateManager.js.map +1 -0
- package/dist/{RaftUtils.js → react-native/RaftUtils.js} +1 -1
- package/dist/react-native/RaftUtils.js.map +1 -0
- package/dist/react-native/RaftWifiTypes.js.map +1 -0
- package/dist/react-native/main.d.ts +21 -0
- package/dist/{main.js → react-native/main.js} +7 -3
- package/dist/react-native/main.js.map +1 -0
- package/dist/web/RaftAttributeHandler.d.ts +12 -0
- package/dist/web/RaftAttributeHandler.js +241 -0
- package/dist/web/RaftAttributeHandler.js.map +1 -0
- package/dist/web/RaftChannel.d.ts +18 -0
- package/dist/web/RaftChannel.js +12 -0
- package/dist/web/RaftChannel.js.map +1 -0
- package/dist/web/RaftChannelBLE.web.d.ts +39 -0
- package/dist/web/RaftChannelBLE.web.js +294 -0
- package/dist/web/RaftChannelBLE.web.js.map +1 -0
- package/dist/web/RaftChannelBLEFactory.d.ts +10 -0
- package/dist/web/RaftChannelBLEFactory.js +17 -0
- package/dist/web/RaftChannelBLEFactory.js.map +1 -0
- package/dist/web/RaftChannelWebSerial.d.ts +37 -0
- package/dist/web/RaftChannelWebSerial.js +320 -0
- package/dist/web/RaftChannelWebSerial.js.map +1 -0
- package/dist/web/RaftChannelWebSocket.d.ts +28 -0
- package/dist/web/RaftChannelWebSocket.js +197 -0
- package/dist/web/RaftChannelWebSocket.js.map +1 -0
- package/dist/web/RaftCommsStats.d.ts +39 -0
- package/dist/web/RaftCommsStats.js +128 -0
- package/dist/web/RaftCommsStats.js.map +1 -0
- package/dist/web/RaftConnEvents.d.ts +39 -0
- package/dist/web/RaftConnEvents.js +54 -0
- package/dist/web/RaftConnEvents.js.map +1 -0
- package/dist/web/RaftConnector.d.ts +245 -0
- package/dist/web/RaftConnector.js +614 -0
- package/dist/web/RaftConnector.js.map +1 -0
- package/dist/web/RaftCustomAttrHandler.d.ts +4 -0
- package/dist/web/RaftCustomAttrHandler.js +50 -0
- package/dist/web/RaftCustomAttrHandler.js.map +1 -0
- package/dist/web/RaftDeviceInfo.d.ts +59 -0
- package/dist/web/RaftDeviceInfo.js +36 -0
- package/dist/web/RaftDeviceInfo.js.map +1 -0
- package/dist/web/RaftDeviceManager.d.ts +35 -0
- package/dist/web/RaftDeviceManager.js +353 -0
- package/dist/web/RaftDeviceManager.js.map +1 -0
- package/dist/web/RaftDeviceMgrIF.d.ts +12 -0
- package/dist/web/RaftDeviceMgrIF.js +11 -0
- package/dist/web/RaftDeviceMgrIF.js.map +1 -0
- package/dist/web/RaftDeviceMsg.d.ts +9 -0
- package/dist/web/RaftDeviceMsg.js +11 -0
- package/dist/web/RaftDeviceMsg.js.map +1 -0
- package/dist/web/RaftDeviceStates.d.ts +33 -0
- package/dist/web/RaftDeviceStates.js +60 -0
- package/dist/web/RaftDeviceStates.js.map +1 -0
- package/dist/web/RaftFileHandler.d.ts +52 -0
- package/dist/web/RaftFileHandler.js +502 -0
- package/dist/web/RaftFileHandler.js.map +1 -0
- package/dist/web/RaftLog.d.ts +22 -0
- package/dist/web/RaftLog.js +63 -0
- package/dist/web/RaftLog.js.map +1 -0
- package/dist/web/RaftMiniHDLC.d.ts +18 -0
- package/dist/web/RaftMiniHDLC.js +383 -0
- package/dist/web/RaftMiniHDLC.js.map +1 -0
- package/dist/web/RaftMsgHandler.d.ts +57 -0
- package/dist/web/RaftMsgHandler.js +480 -0
- package/dist/web/RaftMsgHandler.js.map +1 -0
- package/dist/web/RaftMsgTrackInfo.d.ts +17 -0
- package/dist/web/RaftMsgTrackInfo.js +42 -0
- package/dist/web/RaftMsgTrackInfo.js.map +1 -0
- package/dist/web/RaftProtocolDefs.d.ts +30 -0
- package/dist/web/RaftProtocolDefs.js +48 -0
- package/dist/web/RaftProtocolDefs.js.map +1 -0
- package/dist/web/RaftStreamHandler.d.ts +38 -0
- package/dist/web/RaftStreamHandler.js +257 -0
- package/dist/web/RaftStreamHandler.js.map +1 -0
- package/dist/web/RaftSystemType.d.ts +25 -0
- package/dist/web/RaftSystemType.js +3 -0
- package/dist/web/RaftSystemType.js.map +1 -0
- package/dist/web/RaftSystemUtils.d.ts +136 -0
- package/dist/web/RaftSystemUtils.js +410 -0
- package/dist/web/RaftSystemUtils.js.map +1 -0
- package/dist/web/RaftTypes.d.ts +195 -0
- package/dist/web/RaftTypes.js +190 -0
- package/dist/web/RaftTypes.js.map +1 -0
- package/dist/web/RaftUpdateEvents.d.ts +33 -0
- package/dist/web/RaftUpdateEvents.js +46 -0
- package/dist/web/RaftUpdateEvents.js.map +1 -0
- package/dist/web/RaftUpdateManager.d.ts +61 -0
- package/dist/web/RaftUpdateManager.js +618 -0
- package/dist/web/RaftUpdateManager.js.map +1 -0
- package/dist/web/RaftUtils.d.ts +125 -0
- package/dist/web/RaftUtils.js +454 -0
- package/dist/web/RaftUtils.js.map +1 -0
- package/dist/web/RaftWifiTypes.d.ts +23 -0
- package/dist/web/RaftWifiTypes.js +43 -0
- package/dist/web/RaftWifiTypes.js.map +1 -0
- package/dist/{main.d.ts → web/main.d.ts} +4 -1
- package/dist/web/main.js +46 -0
- package/dist/web/main.js.map +1 -0
- package/examples/dashboard/package.json +4 -0
- package/examples/dashboard/src/CommandPanel.tsx +147 -0
- package/examples/dashboard/src/ConnManager.ts +11 -12
- package/examples/dashboard/src/DeviceActionsForm.tsx +133 -0
- package/examples/dashboard/src/DeviceAttrsForm.tsx +49 -0
- package/examples/dashboard/src/DeviceLineChart.tsx +139 -0
- package/examples/dashboard/src/DevicePanel.tsx +135 -0
- package/examples/dashboard/src/DevicesPanel.tsx +57 -0
- package/examples/dashboard/src/DispLedGrid.tsx +110 -0
- package/examples/dashboard/src/DispOneLed.tsx +20 -0
- package/examples/dashboard/src/Main.tsx +53 -47
- package/examples/dashboard/src/{StatusScreen.tsx → StatusPanel.tsx} +13 -14
- package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +135 -122
- package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +15 -8
- package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +0 -0
- package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +47 -1
- package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +4 -1
- package/examples/dashboard/src/styles.css +274 -10
- package/package.json +57 -48
- package/src/RaftAttributeHandler.ts +1 -1
- package/src/RaftChannelBLE.native.ts +583 -0
- package/src/{RaftChannelWebBLE.ts → RaftChannelBLE.web.ts} +60 -40
- package/src/RaftChannelBLEFactory.ts +13 -0
- package/src/RaftChannelBLEScanner.native.ts +190 -0
- package/src/RaftChannelWebSerial.ts +1 -0
- package/src/RaftConnEvents.ts +14 -2
- package/src/RaftConnector.ts +80 -88
- package/src/RaftDeviceInfo.ts +6 -12
- package/src/RaftDeviceManager.ts +139 -245
- package/src/RaftDeviceMgrIF.ts +28 -0
- package/src/RaftDeviceStates.ts +1 -2
- package/src/RaftMiniHDLC.ts +1 -1
- package/src/RaftMsgHandler.ts +2 -2
- package/src/RaftSystemType.ts +4 -0
- package/src/RaftTypes.ts +48 -17
- package/src/RaftUtils.ts +1 -1
- package/src/main.ts +8 -1
- package/tsconfig.json +5 -2
- package/tsconfig.react-native.json +29 -0
- package/dist/RaftAttributeHandler.js.map +0 -1
- package/dist/RaftChannel.js.map +0 -1
- package/dist/RaftChannelWebBLE.js.map +0 -1
- package/dist/RaftChannelWebSerial.js.map +0 -1
- package/dist/RaftChannelWebSocket.js.map +0 -1
- package/dist/RaftCommsStats.js.map +0 -1
- package/dist/RaftConnEvents.js.map +0 -1
- package/dist/RaftConnector.js.map +0 -1
- package/dist/RaftCustomAttrHandler.js.map +0 -1
- package/dist/RaftDeviceInfo.js.map +0 -1
- package/dist/RaftDeviceManager.js.map +0 -1
- package/dist/RaftDeviceMsg.js.map +0 -1
- package/dist/RaftDeviceStates.js.map +0 -1
- package/dist/RaftFileHandler.js.map +0 -1
- package/dist/RaftLog.js.map +0 -1
- package/dist/RaftMiniHDLC.js.map +0 -1
- package/dist/RaftMsgHandler.js.map +0 -1
- package/dist/RaftMsgTrackInfo.js.map +0 -1
- package/dist/RaftProtocolDefs.js.map +0 -1
- package/dist/RaftStreamHandler.js.map +0 -1
- package/dist/RaftSystemUtils.js.map +0 -1
- package/dist/RaftTypes.js.map +0 -1
- package/dist/RaftUpdateEvents.js.map +0 -1
- package/dist/RaftUpdateManager.js.map +0 -1
- package/dist/RaftUtils.js.map +0 -1
- package/dist/RaftWifiTypes.js.map +0 -1
- package/dist/TestDataGen.d.ts +0 -7
- package/dist/TestDataGen.js +0 -133
- package/dist/TestDataGen.js.map +0 -1
- package/dist/main.js.map +0 -1
- package/src/TestDataGen.ts +0 -157
- /package/dist/{RaftAttributeHandler.d.ts → react-native/RaftAttributeHandler.d.ts} +0 -0
- /package/dist/{RaftChannel.d.ts → react-native/RaftChannel.d.ts} +0 -0
- /package/dist/{RaftChannel.js → react-native/RaftChannel.js} +0 -0
- /package/dist/{RaftChannelWebSerial.d.ts → react-native/RaftChannelWebSerial.d.ts} +0 -0
- /package/dist/{RaftChannelWebSocket.d.ts → react-native/RaftChannelWebSocket.d.ts} +0 -0
- /package/dist/{RaftChannelWebSocket.js → react-native/RaftChannelWebSocket.js} +0 -0
- /package/dist/{RaftCommsStats.d.ts → react-native/RaftCommsStats.d.ts} +0 -0
- /package/dist/{RaftCommsStats.js → react-native/RaftCommsStats.js} +0 -0
- /package/dist/{RaftCustomAttrHandler.d.ts → react-native/RaftCustomAttrHandler.d.ts} +0 -0
- /package/dist/{RaftCustomAttrHandler.js → react-native/RaftCustomAttrHandler.js} +0 -0
- /package/dist/{RaftDeviceInfo.js → react-native/RaftDeviceInfo.js} +0 -0
- /package/dist/{RaftDeviceMsg.d.ts → react-native/RaftDeviceMsg.d.ts} +0 -0
- /package/dist/{RaftDeviceMsg.js → react-native/RaftDeviceMsg.js} +0 -0
- /package/dist/{RaftDeviceStates.js → react-native/RaftDeviceStates.js} +0 -0
- /package/dist/{RaftFileHandler.d.ts → react-native/RaftFileHandler.d.ts} +0 -0
- /package/dist/{RaftFileHandler.js → react-native/RaftFileHandler.js} +0 -0
- /package/dist/{RaftLog.d.ts → react-native/RaftLog.d.ts} +0 -0
- /package/dist/{RaftLog.js → react-native/RaftLog.js} +0 -0
- /package/dist/{RaftMiniHDLC.d.ts → react-native/RaftMiniHDLC.d.ts} +0 -0
- /package/dist/{RaftMsgHandler.d.ts → react-native/RaftMsgHandler.d.ts} +0 -0
- /package/dist/{RaftMsgTrackInfo.d.ts → react-native/RaftMsgTrackInfo.d.ts} +0 -0
- /package/dist/{RaftMsgTrackInfo.js → react-native/RaftMsgTrackInfo.js} +0 -0
- /package/dist/{RaftProtocolDefs.d.ts → react-native/RaftProtocolDefs.d.ts} +0 -0
- /package/dist/{RaftProtocolDefs.js → react-native/RaftProtocolDefs.js} +0 -0
- /package/dist/{RaftStreamHandler.d.ts → react-native/RaftStreamHandler.d.ts} +0 -0
- /package/dist/{RaftStreamHandler.js → react-native/RaftStreamHandler.js} +0 -0
- /package/dist/{RaftSystemType.js → react-native/RaftSystemType.js} +0 -0
- /package/dist/{RaftSystemUtils.d.ts → react-native/RaftSystemUtils.d.ts} +0 -0
- /package/dist/{RaftSystemUtils.js → react-native/RaftSystemUtils.js} +0 -0
- /package/dist/{RaftUpdateEvents.d.ts → react-native/RaftUpdateEvents.d.ts} +0 -0
- /package/dist/{RaftUpdateEvents.js → react-native/RaftUpdateEvents.js} +0 -0
- /package/dist/{RaftUpdateManager.d.ts → react-native/RaftUpdateManager.d.ts} +0 -0
- /package/dist/{RaftUpdateManager.js → react-native/RaftUpdateManager.js} +0 -0
- /package/dist/{RaftUtils.d.ts → react-native/RaftUtils.d.ts} +0 -0
- /package/dist/{RaftWifiTypes.d.ts → react-native/RaftWifiTypes.d.ts} +0 -0
- /package/dist/{RaftWifiTypes.js → react-native/RaftWifiTypes.js} +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
declare const raftChannel: typeof import("./RaftChannelBLE.web").default;
|
|
2
|
+
export { raftChannel as RaftChannelBLE };
|
|
1
3
|
export { default as RaftCommsStats } from './RaftCommsStats';
|
|
2
4
|
export { default as RaftConnector } from './RaftConnector';
|
|
3
5
|
export { default as RaftChannel } from './RaftChannel';
|
|
4
|
-
export { default as RaftChannelWebBLE } from './RaftChannelWebBLE';
|
|
5
6
|
export { default as RaftChannelWebSocket } from './RaftChannelWebSocket';
|
|
6
7
|
export { default as RaftFileHandler } from './RaftFileHandler';
|
|
7
8
|
export { default as RaftLog } from './RaftLog';
|
|
@@ -10,9 +11,11 @@ export { default as RaftMsgHandler } from './RaftMsgHandler';
|
|
|
10
11
|
export { default as RaftStreamHandler } from './RaftStreamHandler';
|
|
11
12
|
export { default as RaftSystemUtils } from './RaftSystemUtils';
|
|
12
13
|
export { default as RaftUtils } from './RaftUtils';
|
|
14
|
+
export { DeviceManager as RaftDeviceManager } from './RaftDeviceManager';
|
|
13
15
|
export * from './RaftTypes';
|
|
14
16
|
export * from './RaftSystemType';
|
|
15
17
|
export * from './RaftWifiTypes';
|
|
16
18
|
export * from './RaftConnEvents';
|
|
17
19
|
export * from './RaftUpdateEvents';
|
|
18
20
|
export * from "./RaftProtocolDefs";
|
|
21
|
+
export * from "./RaftDeviceStates";
|
package/dist/web/main.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
3
|
+
//
|
|
4
|
+
// RaftJS
|
|
5
|
+
// Commms library for the Raft ESP32 application framework supporting BLE, WebSockets and Serial
|
|
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
|
+
exports.RaftDeviceManager = exports.RaftUtils = exports.RaftSystemUtils = exports.RaftStreamHandler = exports.RaftMsgHandler = exports.RaftMiniHDLC = exports.RaftLog = exports.RaftFileHandler = exports.RaftChannelWebSocket = exports.RaftConnector = exports.RaftCommsStats = exports.RaftChannelBLE = void 0;
|
|
13
|
+
const tslib_1 = require("tslib");
|
|
14
|
+
const RaftChannelBLEFactory_1 = require("./RaftChannelBLEFactory");
|
|
15
|
+
const raftChannel = (0, RaftChannelBLEFactory_1.createBLEChannel)();
|
|
16
|
+
exports.RaftChannelBLE = raftChannel;
|
|
17
|
+
var RaftCommsStats_1 = require("./RaftCommsStats");
|
|
18
|
+
Object.defineProperty(exports, "RaftCommsStats", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftCommsStats_1).default; } });
|
|
19
|
+
var RaftConnector_1 = require("./RaftConnector");
|
|
20
|
+
Object.defineProperty(exports, "RaftConnector", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftConnector_1).default; } });
|
|
21
|
+
var RaftChannelWebSocket_1 = require("./RaftChannelWebSocket");
|
|
22
|
+
Object.defineProperty(exports, "RaftChannelWebSocket", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftChannelWebSocket_1).default; } });
|
|
23
|
+
var RaftFileHandler_1 = require("./RaftFileHandler");
|
|
24
|
+
Object.defineProperty(exports, "RaftFileHandler", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftFileHandler_1).default; } });
|
|
25
|
+
var RaftLog_1 = require("./RaftLog");
|
|
26
|
+
Object.defineProperty(exports, "RaftLog", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftLog_1).default; } });
|
|
27
|
+
var RaftMiniHDLC_1 = require("./RaftMiniHDLC");
|
|
28
|
+
Object.defineProperty(exports, "RaftMiniHDLC", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftMiniHDLC_1).default; } });
|
|
29
|
+
var RaftMsgHandler_1 = require("./RaftMsgHandler");
|
|
30
|
+
Object.defineProperty(exports, "RaftMsgHandler", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftMsgHandler_1).default; } });
|
|
31
|
+
var RaftStreamHandler_1 = require("./RaftStreamHandler");
|
|
32
|
+
Object.defineProperty(exports, "RaftStreamHandler", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftStreamHandler_1).default; } });
|
|
33
|
+
var RaftSystemUtils_1 = require("./RaftSystemUtils");
|
|
34
|
+
Object.defineProperty(exports, "RaftSystemUtils", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftSystemUtils_1).default; } });
|
|
35
|
+
var RaftUtils_1 = require("./RaftUtils");
|
|
36
|
+
Object.defineProperty(exports, "RaftUtils", { enumerable: true, get: function () { return tslib_1.__importDefault(RaftUtils_1).default; } });
|
|
37
|
+
var RaftDeviceManager_1 = require("./RaftDeviceManager");
|
|
38
|
+
Object.defineProperty(exports, "RaftDeviceManager", { enumerable: true, get: function () { return RaftDeviceManager_1.DeviceManager; } });
|
|
39
|
+
tslib_1.__exportStar(require("./RaftTypes"), exports);
|
|
40
|
+
tslib_1.__exportStar(require("./RaftSystemType"), exports);
|
|
41
|
+
tslib_1.__exportStar(require("./RaftWifiTypes"), exports);
|
|
42
|
+
tslib_1.__exportStar(require("./RaftConnEvents"), exports);
|
|
43
|
+
tslib_1.__exportStar(require("./RaftUpdateEvents"), exports);
|
|
44
|
+
tslib_1.__exportStar(require("./RaftProtocolDefs"), exports);
|
|
45
|
+
tslib_1.__exportStar(require("./RaftDeviceStates"), exports);
|
|
46
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AAAA,iHAAiH;AACjH,EAAE;AACF,SAAS;AACT,gGAAgG;AAChG,EAAE;AACF,wCAAwC;AACxC,oCAAoC;AACpC,EAAE;AACF,iHAAiH;;;;AAEjH,mEAA2D;AAC3D,MAAM,WAAW,GAAG,IAAA,wCAAgB,GAAE,CAAC;AACf,qCAAc;AAEtC,mDAA6D;AAApD,yIAAA,OAAO,OAAkB;AAClC,iDAA2D;AAAlD,uIAAA,OAAO,OAAiB;AAEjC,+DAAyE;AAAhE,qJAAA,OAAO,OAAwB;AACxC,qDAA+D;AAAtD,2IAAA,OAAO,OAAmB;AACnC,qCAA+C;AAAtC,2HAAA,OAAO,OAAW;AAC3B,+CAAyD;AAAhD,qIAAA,OAAO,OAAgB;AAChC,mDAA4D;AAAnD,yIAAA,OAAO,OAAkB;AAClC,yDAAmE;AAA1D,+IAAA,OAAO,OAAqB;AACrC,qDAA+D;AAAtD,2IAAA,OAAO,OAAmB;AACnC,yCAAmD;AAA1C,+HAAA,OAAO,OAAa;AAC7B,yDAAyE;AAAhE,sHAAA,aAAa,OAAqB;AAG3C,sDAA4B;AAC5B,2DAAiC;AACjC,0DAAgC;AAChC,2DAAiC;AACjC,6DAAmC;AACnC,6DAAmC;AACnC,6DAAmC"}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"@types/node": "^20.12.7",
|
|
17
17
|
"@types/python-struct": "^1.0.4",
|
|
18
18
|
"@types/react": "^18.2.48",
|
|
19
|
+
"@types/react-color": "^3.0.12",
|
|
19
20
|
"@types/react-dom": "^18.2.18",
|
|
20
21
|
"assert": "^2.1.0",
|
|
21
22
|
"buffer": "^6.0.3",
|
|
@@ -28,7 +29,10 @@
|
|
|
28
29
|
"util": "^0.12.5"
|
|
29
30
|
},
|
|
30
31
|
"dependencies": {
|
|
32
|
+
"chart.js": "^4.4.4",
|
|
33
|
+
"python-struct": "^1.1.3",
|
|
31
34
|
"react": "^18.2.0",
|
|
35
|
+
"react-chartjs-2": "^5.2.0",
|
|
32
36
|
"react-color": "^2.19.3",
|
|
33
37
|
"react-dom": "^18.2.0"
|
|
34
38
|
},
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import ConnManager from './ConnManager';
|
|
3
|
+
|
|
4
|
+
const connManager = ConnManager.getInstance();
|
|
5
|
+
|
|
6
|
+
const examplesJson = {
|
|
7
|
+
"sections": [
|
|
8
|
+
{
|
|
9
|
+
"name": "LEDs (ind,ring,button)",
|
|
10
|
+
"examples": [
|
|
11
|
+
{ "label": "Button red", "api": "/led/button/set/0/#ff0000" },
|
|
12
|
+
{ "label": "Ring pattern RainbowSnake", "api": "/led/ring/pattern/RainbowSnake" },
|
|
13
|
+
{ "label": "Ring pattern clear", "api": "/led/ring/pattern" }
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "Audio",
|
|
18
|
+
"examples": [
|
|
19
|
+
{ "label": "Play Halloween", "api": "/audio/rtttl/Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6" },
|
|
20
|
+
{ "label": "Stop", "api": "/audio/stop" },
|
|
21
|
+
{ "label": "Volume 50%", "api": "/audio/vol/50" }
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default function CommandPanel() {
|
|
28
|
+
const [command, setCommand] = useState('');
|
|
29
|
+
const [commandHistory, setCommandHistory] = useState<string[]>([]); // Command history state
|
|
30
|
+
const [historyIndex, setHistoryIndex] = useState<number>(-1); // Track position in history
|
|
31
|
+
const [openSections, setOpenSections] = useState<{ [key: string]: boolean }>({});
|
|
32
|
+
|
|
33
|
+
// Handler to send command when button is clicked or Enter is pressed
|
|
34
|
+
const handleSendCommand = (cmd: string) => {
|
|
35
|
+
if (cmd) {
|
|
36
|
+
connManager.getConnector().sendRICRESTMsg(cmd, {}).then(response => {
|
|
37
|
+
console.log(`Command sent: ${cmd}, Response:`, response);
|
|
38
|
+
|
|
39
|
+
// Update history only if the command is not the same as the last one
|
|
40
|
+
if (commandHistory.length === 0 || commandHistory[commandHistory.length - 1] !== cmd) {
|
|
41
|
+
setCommandHistory((prevHistory) => [...prevHistory, cmd]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Reset the history index and clear the command
|
|
45
|
+
setHistoryIndex(-1);
|
|
46
|
+
setCommand('');
|
|
47
|
+
}).catch(error => {
|
|
48
|
+
console.error(`Error sending command: ${cmd}`, error);
|
|
49
|
+
});
|
|
50
|
+
} else {
|
|
51
|
+
console.error("Command is empty.");
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// Handler for key press events in the input box
|
|
56
|
+
const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
|
|
57
|
+
if (e.key === 'Enter') {
|
|
58
|
+
handleSendCommand(command);
|
|
59
|
+
} else if (e.key === 'ArrowUp') {
|
|
60
|
+
// Navigate to previous command in history
|
|
61
|
+
if (historyIndex < commandHistory.length - 1) {
|
|
62
|
+
const newIndex = historyIndex + 1;
|
|
63
|
+
setHistoryIndex(newIndex);
|
|
64
|
+
setCommand(commandHistory[commandHistory.length - 1 - newIndex]);
|
|
65
|
+
}
|
|
66
|
+
} else if (e.key === 'ArrowDown') {
|
|
67
|
+
// Navigate to next command in history
|
|
68
|
+
if (historyIndex > 0) {
|
|
69
|
+
const newIndex = historyIndex - 1;
|
|
70
|
+
setHistoryIndex(newIndex);
|
|
71
|
+
setCommand(commandHistory[commandHistory.length - 1 - newIndex]);
|
|
72
|
+
} else if (historyIndex === 0) {
|
|
73
|
+
// Clear the command input when navigating past the most recent command
|
|
74
|
+
setHistoryIndex(-1);
|
|
75
|
+
setCommand('');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// Handler to set the command in the input box
|
|
81
|
+
const handleLoadCommand = (api: string) => {
|
|
82
|
+
setCommand(api);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Toggle the open/close state of a section
|
|
86
|
+
const toggleSection = (sectionName: string) => {
|
|
87
|
+
setOpenSections((prevOpenSections) => ({
|
|
88
|
+
...prevOpenSections,
|
|
89
|
+
[sectionName]: !prevOpenSections[sectionName]
|
|
90
|
+
}));
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<div className="info-boxes">
|
|
95
|
+
<div className="info-box">
|
|
96
|
+
<div className="info-columns">
|
|
97
|
+
{/* Command Input and Button in Left Column */}
|
|
98
|
+
<div className="info-column command-input-column">
|
|
99
|
+
<h3>Command Panel</h3>
|
|
100
|
+
<input
|
|
101
|
+
type="text"
|
|
102
|
+
className="command-input"
|
|
103
|
+
value={command}
|
|
104
|
+
placeholder="Enter Command"
|
|
105
|
+
onChange={(e) => setCommand(e.target.value)}
|
|
106
|
+
onKeyDown={handleKeyDown} // Add onKeyDown event handler
|
|
107
|
+
/>
|
|
108
|
+
<button className="send-command-button" onClick={() => handleSendCommand(command)}>
|
|
109
|
+
Send Command
|
|
110
|
+
</button>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
{/* Example Commands in Right Column */}
|
|
114
|
+
<div className="info-column example-commands-column">
|
|
115
|
+
<h4>Example Commands</h4>
|
|
116
|
+
|
|
117
|
+
{examplesJson.sections.map((section) => (
|
|
118
|
+
<div className="collapsible-section" key={section.name}>
|
|
119
|
+
<button
|
|
120
|
+
className="collapsible-header"
|
|
121
|
+
onClick={() => toggleSection(section.name)}
|
|
122
|
+
>
|
|
123
|
+
{section.name} {openSections[section.name] ? "▲" : "▼"}
|
|
124
|
+
</button>
|
|
125
|
+
{openSections[section.name] && (
|
|
126
|
+
<div className="collapsible-content">
|
|
127
|
+
{section.examples.map((example, index) => (
|
|
128
|
+
<div className="example-command" key={index} title={example.api}>
|
|
129
|
+
{example.label}
|
|
130
|
+
<button
|
|
131
|
+
className="example-load-button"
|
|
132
|
+
onClick={() => handleLoadCommand(example.api)}
|
|
133
|
+
>
|
|
134
|
+
Load
|
|
135
|
+
</button>
|
|
136
|
+
</div>
|
|
137
|
+
))}
|
|
138
|
+
</div>
|
|
139
|
+
)}
|
|
140
|
+
</div>
|
|
141
|
+
))}
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RaftChannelBLE, RaftConnector, RaftEventFn, RaftLog, RaftSystemUtils } from "../../../src/main";
|
|
2
2
|
import SystemTypeCog from "./SystemTypeCog/SystemTypeCog";
|
|
3
3
|
import SystemTypeMarty from "./SystemTypeMarty/SystemTypeMarty";
|
|
4
4
|
|
|
@@ -46,12 +46,12 @@ export default class ConnManager {
|
|
|
46
46
|
return this._connector;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
private async getBleDevice(): Promise<BluetoothDevice | null> {
|
|
49
|
+
private async getBleDevice(uuid?: string): Promise<BluetoothDevice | null> {
|
|
50
|
+
const uuids = uuid ? [uuid] : [RaftChannelBLE.RICServiceUUID, RaftChannelBLE.CogServiceUUID];
|
|
51
|
+
const filtersArray = uuids.map((uuid) => ({ services: [uuid] }));
|
|
50
52
|
try {
|
|
51
53
|
const dev = await navigator.bluetooth.requestDevice({
|
|
52
|
-
filters:
|
|
53
|
-
{ services: [RaftChannelWebBLE.ServiceUUID] }
|
|
54
|
-
],
|
|
54
|
+
filters: filtersArray,
|
|
55
55
|
optionalServices: []
|
|
56
56
|
});
|
|
57
57
|
return dev;
|
|
@@ -62,21 +62,20 @@ export default class ConnManager {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
// Connect
|
|
65
|
-
public async connect(method: string, locator: string | object): Promise<boolean> {
|
|
66
|
-
|
|
67
|
-
// Hook up the connector
|
|
65
|
+
public async connect(method: string, locator: string | object, uuid: string): Promise<boolean> {
|
|
68
66
|
this._connector.setEventListener((evtType, eventEnum, eventName, eventData) => {
|
|
69
|
-
RaftLog.
|
|
67
|
+
RaftLog.verbose(`ConnManager - event ${eventName}`);
|
|
70
68
|
if (this._onConnectionEvent) {
|
|
71
69
|
this._onConnectionEvent(evtType, eventEnum, eventName, eventData);
|
|
72
70
|
}
|
|
73
71
|
});
|
|
72
|
+
await this._connector.initializeChannel(method);
|
|
74
73
|
// Set the connector websocket suffix
|
|
75
74
|
if (method === "WebBLE") {
|
|
76
|
-
const dev = await this.getBleDevice();
|
|
77
|
-
return this._connector.connect(
|
|
75
|
+
const dev = await this.getBleDevice(uuid);
|
|
76
|
+
return this._connector.connect(dev as object);
|
|
78
77
|
}
|
|
79
|
-
return this._connector.connect(
|
|
78
|
+
return this._connector.connect(locator);
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
// Disconnect
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import ConnManager from './ConnManager';
|
|
3
|
+
import { DeviceTypeAction } from '../../../src/RaftDeviceInfo';
|
|
4
|
+
import DispLEDGrid from './DispLedGrid';
|
|
5
|
+
|
|
6
|
+
const connManager = ConnManager.getInstance();
|
|
7
|
+
|
|
8
|
+
type DeviceActionsTableProps = {
|
|
9
|
+
deviceKey: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
interface InputValues {
|
|
13
|
+
[key: string]: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const DeviceActionsForm: React.FC<DeviceActionsTableProps> = ({ deviceKey }) => {
|
|
17
|
+
const deviceManager = connManager.getConnector().getSystemType()?.deviceMgrIF;
|
|
18
|
+
const [deviceActions, setDeviceActions] = useState<DeviceTypeAction[]>([]);
|
|
19
|
+
const [inputValues, setInputValues] = useState<InputValues>({});
|
|
20
|
+
const [lastSentValues, setLastSentValues] = useState<InputValues>({});
|
|
21
|
+
const sendTimer = useRef<NodeJS.Timeout | null>(null);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!deviceManager) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const deviceState = deviceManager.getDeviceState(deviceKey);
|
|
28
|
+
const { deviceTypeInfo } = deviceState;
|
|
29
|
+
const actions: DeviceTypeAction[] = deviceTypeInfo?.actions || [];
|
|
30
|
+
setDeviceActions(actions);
|
|
31
|
+
// Initialize input values
|
|
32
|
+
const initialValues: InputValues = actions.reduce((acc, action) => {
|
|
33
|
+
acc = { ...acc, [action.n]: action.d ? action.d : (action.r ? action.r[0] | 0 : 0) };
|
|
34
|
+
return acc;
|
|
35
|
+
}, {});
|
|
36
|
+
setInputValues(initialValues);
|
|
37
|
+
queueSendAction(initialValues);
|
|
38
|
+
}, [deviceKey]);
|
|
39
|
+
|
|
40
|
+
const handleInputChange = (name: string, value: number) => {
|
|
41
|
+
const newValues = { ...inputValues, [name]: value };
|
|
42
|
+
setInputValues(newValues);
|
|
43
|
+
queueSendAction(newValues);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const queueSendAction = (newValues: InputValues) => {
|
|
47
|
+
if (sendTimer.current) {
|
|
48
|
+
clearTimeout(sendTimer.current);
|
|
49
|
+
}
|
|
50
|
+
// console.log(`queueSendAction new values ${JSON.stringify(newValues)}`);
|
|
51
|
+
sendTimer.current = setTimeout(() => {
|
|
52
|
+
deviceActions.forEach(action => {
|
|
53
|
+
const currentValue = newValues[action.n];
|
|
54
|
+
const lastSentValue = lastSentValues[action.n];
|
|
55
|
+
if (currentValue !== lastSentValue) {
|
|
56
|
+
// console.log(`queueSendAction timeout ${action.n} ${currentValue}`);
|
|
57
|
+
handleSendAction(action, currentValue);
|
|
58
|
+
setLastSentValues(prev => ({ ...prev, [action.n]: currentValue }));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}, 300);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const handleSendAction = (action: DeviceTypeAction, value: number) => {
|
|
65
|
+
// Send action to device
|
|
66
|
+
if (!deviceManager) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
deviceManager.sendAction(deviceKey, action, [value]);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
if (deviceActions.length === 0) {
|
|
73
|
+
return <></>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<div className="device-actions-form">
|
|
78
|
+
<table>
|
|
79
|
+
<thead>
|
|
80
|
+
<tr>
|
|
81
|
+
<th>Name</th>
|
|
82
|
+
<th>Value</th>
|
|
83
|
+
<th>Send</th>
|
|
84
|
+
</tr>
|
|
85
|
+
</thead>
|
|
86
|
+
<tbody>
|
|
87
|
+
{deviceActions.map((action) => {
|
|
88
|
+
if (action.f === "LEDPIX") {
|
|
89
|
+
return (
|
|
90
|
+
<tr key={action.n}>
|
|
91
|
+
<td>{action.n}</td>
|
|
92
|
+
<td colSpan={2}>
|
|
93
|
+
<DispLEDGrid
|
|
94
|
+
rows={action.NY || 1}
|
|
95
|
+
cols={action.NX || 1}
|
|
96
|
+
deviceKey={deviceKey}
|
|
97
|
+
deviceAction={action}
|
|
98
|
+
/>
|
|
99
|
+
</td>
|
|
100
|
+
</tr>
|
|
101
|
+
);
|
|
102
|
+
} else {
|
|
103
|
+
return (
|
|
104
|
+
<tr key={action.n}>
|
|
105
|
+
<td>{action.n}</td>
|
|
106
|
+
<td>
|
|
107
|
+
{action.t ?
|
|
108
|
+
<input type="number"
|
|
109
|
+
min={action.r?.[0] ?? 0}
|
|
110
|
+
max={action.r?.[1] ?? 100}
|
|
111
|
+
value={inputValues[action.n]}
|
|
112
|
+
onChange={e => {
|
|
113
|
+
console.log(`input change ${action.n} ${e.target.value}`)
|
|
114
|
+
handleInputChange(action.n, parseInt(e.target.value));
|
|
115
|
+
}}
|
|
116
|
+
/>
|
|
117
|
+
: <></>
|
|
118
|
+
}
|
|
119
|
+
</td>
|
|
120
|
+
<td>
|
|
121
|
+
<button onClick={() => handleSendAction(action, inputValues[action.n])}>Send</button>
|
|
122
|
+
</td>
|
|
123
|
+
</tr>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
})}
|
|
127
|
+
</tbody>
|
|
128
|
+
</table>
|
|
129
|
+
</div>
|
|
130
|
+
);
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export default DeviceActionsForm;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { deviceAttrGetLatestFormatted, DeviceState } from '../../../src/RaftDeviceStates';
|
|
3
|
+
import ConnManager from './ConnManager';
|
|
4
|
+
|
|
5
|
+
const connManager = ConnManager.getInstance();
|
|
6
|
+
|
|
7
|
+
type DeviceAttributesTableProps = {
|
|
8
|
+
deviceKey: string;
|
|
9
|
+
lastUpdated: number;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const DeviceAttrsForm: React.FC<DeviceAttributesTableProps> = ({ deviceKey, lastUpdated }) => {
|
|
13
|
+
const deviceManager = connManager.getConnector().getSystemType()?.deviceMgrIF;
|
|
14
|
+
const deviceState: DeviceState | undefined = deviceManager?.getDeviceState(deviceKey);
|
|
15
|
+
|
|
16
|
+
if (!deviceState || Object.keys(deviceState.deviceAttributes).length === 0) {
|
|
17
|
+
return <></>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<div className="device-attrs-form">
|
|
22
|
+
<table>
|
|
23
|
+
<thead>
|
|
24
|
+
<tr>
|
|
25
|
+
<th>Name</th>
|
|
26
|
+
<th>Value</th>
|
|
27
|
+
<th>Units</th>
|
|
28
|
+
</tr>
|
|
29
|
+
</thead>
|
|
30
|
+
<tbody>
|
|
31
|
+
{Object.entries(deviceState.deviceAttributes)
|
|
32
|
+
.filter(([attributeName, attributeDetails]) => attributeDetails.visibleForm !== false)
|
|
33
|
+
.map(([attributeName, attributeDetails]) => {
|
|
34
|
+
const valStr = deviceAttrGetLatestFormatted(attributeDetails)
|
|
35
|
+
return (
|
|
36
|
+
<tr key={attributeName}>
|
|
37
|
+
<td>{attributeName}</td>
|
|
38
|
+
<td>{valStr}</td>
|
|
39
|
+
<td>{attributeDetails.units}</td>
|
|
40
|
+
</tr>
|
|
41
|
+
);
|
|
42
|
+
})}
|
|
43
|
+
</tbody>
|
|
44
|
+
</table>
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export default DeviceAttrsForm;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import React, { useEffect, useState, memo, useRef } from "react";
|
|
2
|
+
import { Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, ArcElement, Tooltip, Legend } from 'chart.js';
|
|
3
|
+
import { Line } from "react-chartjs-2";
|
|
4
|
+
import ConnManager from "./ConnManager";
|
|
5
|
+
import { DeviceState } from "../../../src/RaftDeviceStates";
|
|
6
|
+
|
|
7
|
+
const connManager = ConnManager.getInstance();
|
|
8
|
+
|
|
9
|
+
ChartJS.register(
|
|
10
|
+
CategoryScale,
|
|
11
|
+
LinearScale,
|
|
12
|
+
PointElement,
|
|
13
|
+
LineElement,
|
|
14
|
+
ArcElement,
|
|
15
|
+
Tooltip,
|
|
16
|
+
Legend
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
export interface DeviceLineChartProps {
|
|
20
|
+
deviceKey: string;
|
|
21
|
+
lastUpdated: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface ChartJSData {
|
|
25
|
+
labels: string[];
|
|
26
|
+
datasets: {
|
|
27
|
+
label: string;
|
|
28
|
+
data: number[];
|
|
29
|
+
fill: boolean;
|
|
30
|
+
borderColor: string;
|
|
31
|
+
backgroundColor: string;
|
|
32
|
+
yAxisID: string;
|
|
33
|
+
}[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const DeviceLineChart: React.FC<DeviceLineChartProps> = memo(({ deviceKey, lastUpdated }) => {
|
|
37
|
+
|
|
38
|
+
const deviceManager = connManager.getConnector().getSystemType()?.deviceMgrIF;
|
|
39
|
+
const deviceState: DeviceState | undefined = deviceManager?.getDeviceState(deviceKey);
|
|
40
|
+
// const { deviceAttributes, deviceTimeline } = deviceState;
|
|
41
|
+
const [chartData, setChartData] = useState<ChartJSData>({
|
|
42
|
+
labels: [],
|
|
43
|
+
datasets: []
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const options = {
|
|
47
|
+
responsive: true,
|
|
48
|
+
maintainAspectRatio: false,
|
|
49
|
+
animation: {
|
|
50
|
+
duration: 1, // default is 1000ms
|
|
51
|
+
},
|
|
52
|
+
scales: {}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const colourMapRef = useRef<{ [key: string]: string }>({
|
|
56
|
+
prox: "hsl(60, 70%, 60%)",
|
|
57
|
+
als: "hsl(0, 70%, 60%)",
|
|
58
|
+
white: "hsl(120, 70%, 60%)",
|
|
59
|
+
x: "hsl(240, 70%, 60%)",
|
|
60
|
+
y: "hsl(300, 70%, 60%)",
|
|
61
|
+
z: "hsl(0, 70%, 60%)",
|
|
62
|
+
dist: "hsl(60, 70%, 60%)",
|
|
63
|
+
temperature: "hsl(360, 70%, 60%)",
|
|
64
|
+
humidity: "hsl(200, 70%, 60%)",
|
|
65
|
+
Red: "hsl(0, 70%, 60%)",
|
|
66
|
+
Green: "hsl(120, 70%, 60%)",
|
|
67
|
+
Blue: "hsl(240, 70%, 60%)",
|
|
68
|
+
IR: "hsl(300, 70%, 60%)",
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (!deviceState)
|
|
73
|
+
return;
|
|
74
|
+
const maxChartDataPoints = 50;
|
|
75
|
+
const labels = deviceState.deviceTimeline.timestampsUs.slice(maxChartDataPoints).map(time => {
|
|
76
|
+
const seconds = time / 1e6; // Convert microseconds to seconds
|
|
77
|
+
const secondsStr = seconds.toFixed(3); // Format decimal places
|
|
78
|
+
return secondsStr;
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const uniqueAxes = new Map<string, { range: [number, number], units: string }>();
|
|
82
|
+
const datasets = Object.entries(deviceState.deviceAttributes)
|
|
83
|
+
.filter(([attributeName, attributeDetails]) => attributeDetails.visibleSeries !== false)
|
|
84
|
+
.map(([attributeName, attributeDetails]) => {
|
|
85
|
+
const data = attributeDetails.values.slice(maxChartDataPoints);
|
|
86
|
+
let colour = colourMapRef.current[attributeName];
|
|
87
|
+
if (!colour) {
|
|
88
|
+
colour = `hsl(${Math.random() * 360}, 70%, 60%)`;
|
|
89
|
+
colourMapRef.current[attributeName] = colour;
|
|
90
|
+
}
|
|
91
|
+
let rangeEnds: [number,number] = [Math.min(...attributeDetails.range), Math.max(...attributeDetails.range)];
|
|
92
|
+
const axisKey = `${rangeEnds[0]}-${rangeEnds[1]}-${attributeDetails.units}`;
|
|
93
|
+
if (!uniqueAxes.has(axisKey)) {
|
|
94
|
+
uniqueAxes.set(axisKey, { range: rangeEnds, units: attributeDetails.units });
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
label: attributeName,
|
|
98
|
+
data: data,
|
|
99
|
+
fill: false,
|
|
100
|
+
borderColor: colour,
|
|
101
|
+
backgroundColor: colour,
|
|
102
|
+
yAxisID: axisKey
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const scales: { [key: string]: any } = {};
|
|
107
|
+
uniqueAxes.forEach((axis, key) => {
|
|
108
|
+
scales[key] = {
|
|
109
|
+
type: 'linear',
|
|
110
|
+
display: true,
|
|
111
|
+
position: 'left',
|
|
112
|
+
scaleLabel: {
|
|
113
|
+
display: true,
|
|
114
|
+
labelString: axis.units
|
|
115
|
+
},
|
|
116
|
+
ticks: {
|
|
117
|
+
min: axis.range[0],
|
|
118
|
+
max: axis.range[1]
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
options.scales = scales;
|
|
124
|
+
setChartData({ labels, datasets });
|
|
125
|
+
}
|
|
126
|
+
, [lastUpdated]);
|
|
127
|
+
|
|
128
|
+
if (!deviceState || Object.keys(deviceState.deviceAttributes).length === 0) {
|
|
129
|
+
return <></>;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return (
|
|
133
|
+
<div className="device-line-chart">
|
|
134
|
+
<Line data={chartData} options={options} />
|
|
135
|
+
</div>
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
export default DeviceLineChart;
|