@robdobsn/raftjs 1.7.2 → 1.7.5
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/dist/web/RaftAttributeHandler.d.ts +2 -0
- package/dist/web/RaftAttributeHandler.js +107 -5
- package/dist/web/RaftAttributeHandler.js.map +1 -1
- package/dist/web/RaftConnector.d.ts +2 -1
- package/dist/web/RaftConnector.js +14 -0
- package/dist/web/RaftConnector.js.map +1 -1
- package/dist/web/RaftDeviceInfo.d.ts +6 -0
- package/dist/web/RaftMsgHandler.d.ts +1 -1
- package/dist/web/RaftMsgHandler.js +1 -1
- package/dist/web/RaftMsgHandler.js.map +1 -1
- package/dist/web/RaftTypes.d.ts +2 -1
- package/dist/web/RaftTypes.js.map +1 -1
- package/package.json +5 -2
- package/.editorconfig +0 -14
- package/.gitattributes +0 -11
- package/.nvmrc +0 -1
- package/TODO.md +0 -1
- package/dist/react-native/RaftAttributeHandler.d.ts +0 -12
- package/dist/react-native/RaftAttributeHandler.js +0 -249
- package/dist/react-native/RaftAttributeHandler.js.map +0 -1
- package/dist/react-native/RaftChannel.d.ts +0 -20
- package/dist/react-native/RaftChannel.js +0 -12
- package/dist/react-native/RaftChannel.js.map +0 -1
- package/dist/react-native/RaftChannelBLE.native.d.ts +0 -95
- package/dist/react-native/RaftChannelBLE.native.js +0 -482
- package/dist/react-native/RaftChannelBLE.native.js.map +0 -1
- package/dist/react-native/RaftChannelBLE.web.d.ts +0 -40
- package/dist/react-native/RaftChannelBLE.web.js +0 -300
- package/dist/react-native/RaftChannelBLE.web.js.map +0 -1
- package/dist/react-native/RaftChannelBLEFactory.d.ts +0 -10
- package/dist/react-native/RaftChannelBLEFactory.js +0 -17
- package/dist/react-native/RaftChannelBLEFactory.js.map +0 -1
- package/dist/react-native/RaftChannelBLEScanner.native.d.ts +0 -18
- package/dist/react-native/RaftChannelBLEScanner.native.js +0 -138
- package/dist/react-native/RaftChannelBLEScanner.native.js.map +0 -1
- package/dist/react-native/RaftChannelSimulated.d.ts +0 -32
- package/dist/react-native/RaftChannelSimulated.js +0 -418
- package/dist/react-native/RaftChannelSimulated.js.map +0 -1
- package/dist/react-native/RaftChannelWebSerial.d.ts +0 -39
- package/dist/react-native/RaftChannelWebSerial.js +0 -329
- package/dist/react-native/RaftChannelWebSerial.js.map +0 -1
- package/dist/react-native/RaftChannelWebSocket.d.ts +0 -30
- package/dist/react-native/RaftChannelWebSocket.js +0 -207
- package/dist/react-native/RaftChannelWebSocket.js.map +0 -1
- package/dist/react-native/RaftCommsStats.d.ts +0 -39
- package/dist/react-native/RaftCommsStats.js +0 -128
- package/dist/react-native/RaftCommsStats.js.map +0 -1
- package/dist/react-native/RaftConnEvents.d.ts +0 -39
- package/dist/react-native/RaftConnEvents.js +0 -54
- package/dist/react-native/RaftConnEvents.js.map +0 -1
- package/dist/react-native/RaftConnector.d.ts +0 -245
- package/dist/react-native/RaftConnector.js +0 -621
- package/dist/react-native/RaftConnector.js.map +0 -1
- package/dist/react-native/RaftCustomAttrHandler.d.ts +0 -4
- package/dist/react-native/RaftCustomAttrHandler.js +0 -50
- package/dist/react-native/RaftCustomAttrHandler.js.map +0 -1
- package/dist/react-native/RaftDeviceInfo.d.ts +0 -63
- package/dist/react-native/RaftDeviceInfo.js +0 -36
- package/dist/react-native/RaftDeviceInfo.js.map +0 -1
- package/dist/react-native/RaftDeviceManager.d.ts +0 -40
- package/dist/react-native/RaftDeviceManager.js +0 -499
- package/dist/react-native/RaftDeviceManager.js.map +0 -1
- package/dist/react-native/RaftDeviceMgrIF.d.ts +0 -15
- package/dist/react-native/RaftDeviceMgrIF.js +0 -11
- package/dist/react-native/RaftDeviceMgrIF.js.map +0 -1
- package/dist/react-native/RaftDeviceMsg.d.ts +0 -9
- package/dist/react-native/RaftDeviceMsg.js +0 -11
- package/dist/react-native/RaftDeviceMsg.js.map +0 -1
- package/dist/react-native/RaftDeviceStates.d.ts +0 -37
- package/dist/react-native/RaftDeviceStates.js +0 -60
- package/dist/react-native/RaftDeviceStates.js.map +0 -1
- package/dist/react-native/RaftFileHandler.d.ts +0 -52
- package/dist/react-native/RaftFileHandler.js +0 -502
- package/dist/react-native/RaftFileHandler.js.map +0 -1
- package/dist/react-native/RaftLog.d.ts +0 -22
- package/dist/react-native/RaftLog.js +0 -63
- package/dist/react-native/RaftLog.js.map +0 -1
- package/dist/react-native/RaftMiniHDLC.d.ts +0 -18
- package/dist/react-native/RaftMiniHDLC.js +0 -383
- package/dist/react-native/RaftMiniHDLC.js.map +0 -1
- package/dist/react-native/RaftMsgHandler.d.ts +0 -62
- package/dist/react-native/RaftMsgHandler.js +0 -511
- package/dist/react-native/RaftMsgHandler.js.map +0 -1
- package/dist/react-native/RaftMsgTrackInfo.d.ts +0 -17
- package/dist/react-native/RaftMsgTrackInfo.js +0 -42
- package/dist/react-native/RaftMsgTrackInfo.js.map +0 -1
- package/dist/react-native/RaftProtocolDefs.d.ts +0 -30
- package/dist/react-native/RaftProtocolDefs.js +0 -48
- package/dist/react-native/RaftProtocolDefs.js.map +0 -1
- package/dist/react-native/RaftStreamHandler.d.ts +0 -38
- package/dist/react-native/RaftStreamHandler.js +0 -257
- package/dist/react-native/RaftStreamHandler.js.map +0 -1
- package/dist/react-native/RaftStruct.d.ts +0 -3
- package/dist/react-native/RaftStruct.js +0 -208
- package/dist/react-native/RaftStruct.js.map +0 -1
- package/dist/react-native/RaftSysTypeManager.d.ts +0 -14
- package/dist/react-native/RaftSysTypeManager.js +0 -53
- package/dist/react-native/RaftSysTypeManager.js.map +0 -1
- package/dist/react-native/RaftSystemType.d.ts +0 -28
- package/dist/react-native/RaftSystemType.js +0 -3
- package/dist/react-native/RaftSystemType.js.map +0 -1
- package/dist/react-native/RaftSystemUtils.d.ts +0 -136
- package/dist/react-native/RaftSystemUtils.js +0 -410
- package/dist/react-native/RaftSystemUtils.js.map +0 -1
- package/dist/react-native/RaftTypes.d.ts +0 -194
- package/dist/react-native/RaftTypes.js +0 -153
- package/dist/react-native/RaftTypes.js.map +0 -1
- package/dist/react-native/RaftUpdateEvents.d.ts +0 -33
- package/dist/react-native/RaftUpdateEvents.js +0 -46
- package/dist/react-native/RaftUpdateEvents.js.map +0 -1
- package/dist/react-native/RaftUpdateManager.d.ts +0 -61
- package/dist/react-native/RaftUpdateManager.js +0 -621
- package/dist/react-native/RaftUpdateManager.js.map +0 -1
- package/dist/react-native/RaftUtils.d.ts +0 -126
- package/dist/react-native/RaftUtils.js +0 -467
- package/dist/react-native/RaftUtils.js.map +0 -1
- package/dist/react-native/RaftWifiTypes.d.ts +0 -23
- package/dist/react-native/RaftWifiTypes.js +0 -43
- package/dist/react-native/RaftWifiTypes.js.map +0 -1
- package/dist/react-native/main.d.ts +0 -25
- package/dist/react-native/main.js +0 -51
- package/dist/react-native/main.js.map +0 -1
- package/eslint.config.mjs +0 -33
- package/examples/dashboard/package.json +0 -36
- package/examples/dashboard/src/CommandPanel.tsx +0 -147
- package/examples/dashboard/src/ConnManager.ts +0 -164
- package/examples/dashboard/src/DeviceActionsForm.tsx +0 -133
- package/examples/dashboard/src/DeviceAttrsForm.tsx +0 -49
- package/examples/dashboard/src/DeviceLineChart.tsx +0 -163
- package/examples/dashboard/src/DevicePanel.tsx +0 -166
- package/examples/dashboard/src/DevicesPanel.tsx +0 -58
- package/examples/dashboard/src/DispLedGrid.tsx +0 -110
- package/examples/dashboard/src/DispOneLed.tsx +0 -20
- package/examples/dashboard/src/LatencyTest.ts +0 -130
- package/examples/dashboard/src/LatencyTestPanel.tsx +0 -92
- package/examples/dashboard/src/Main.tsx +0 -234
- package/examples/dashboard/src/SettingsManager.ts +0 -67
- package/examples/dashboard/src/SettingsScreen.tsx +0 -174
- package/examples/dashboard/src/StatusPanel.tsx +0 -71
- package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +0 -163
- package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +0 -91
- package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +0 -30
- package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +0 -91
- package/examples/dashboard/src/SystemTypeMarty/RICAddOn.ts +0 -70
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnBase.ts +0 -33
- package/examples/dashboard/src/SystemTypeMarty/RICAddOnManager.ts +0 -342
- package/examples/dashboard/src/SystemTypeMarty/RICCommsStats.ts +0 -170
- package/examples/dashboard/src/SystemTypeMarty/RICHWElem.ts +0 -123
- package/examples/dashboard/src/SystemTypeMarty/RICLEDPatternChecker.ts +0 -207
- package/examples/dashboard/src/SystemTypeMarty/RICROSSerial.ts +0 -464
- package/examples/dashboard/src/SystemTypeMarty/RICServoFaultDetector.ts +0 -146
- package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +0 -97
- package/examples/dashboard/src/SystemTypeMarty/RICSystemUtils.ts +0 -371
- package/examples/dashboard/src/SystemTypeMarty/RICTypes.ts +0 -20
- package/examples/dashboard/src/SystemTypeMarty/SystemTypeMarty.ts +0 -119
- package/examples/dashboard/src/index.html +0 -15
- package/examples/dashboard/src/index.tsx +0 -13
- package/examples/dashboard/src/styles.css +0 -408
- package/examples/dashboard/tsconfig.json +0 -18
- package/jest.config.js +0 -11
- package/src/RaftAttributeHandler.ts +0 -298
- package/src/RaftChannel.ts +0 -32
- package/src/RaftChannelBLE.native.ts +0 -616
- package/src/RaftChannelBLE.web.ts +0 -372
- package/src/RaftChannelBLEFactory.ts +0 -13
- package/src/RaftChannelBLEScanner.native.ts +0 -184
- package/src/RaftChannelSimulated.ts +0 -482
- package/src/RaftChannelWebSerial.ts +0 -420
- package/src/RaftChannelWebSocket.ts +0 -258
- package/src/RaftCommsStats.ts +0 -142
- package/src/RaftConnEvents.ts +0 -58
- package/src/RaftConnector.ts +0 -743
- package/src/RaftCustomAttrHandler.ts +0 -54
- package/src/RaftDeviceInfo.ts +0 -102
- package/src/RaftDeviceManager.ts +0 -607
- package/src/RaftDeviceMgrIF.ts +0 -33
- package/src/RaftDeviceMsg.ts +0 -20
- package/src/RaftDeviceStates.ts +0 -92
- package/src/RaftFileHandler.ts +0 -668
- package/src/RaftLog.ts +0 -70
- package/src/RaftMiniHDLC.ts +0 -396
- package/src/RaftMsgHandler.ts +0 -813
- package/src/RaftMsgTrackInfo.ts +0 -51
- package/src/RaftProtocolDefs.ts +0 -46
- package/src/RaftStreamHandler.ts +0 -328
- package/src/RaftStruct.ts +0 -209
- package/src/RaftSysTypeManager.ts +0 -60
- package/src/RaftSystemType.ts +0 -32
- package/src/RaftSystemUtils.ts +0 -487
- package/src/RaftTypes.ts +0 -278
- package/src/RaftUpdateEvents.ts +0 -48
- package/src/RaftUpdateManager.ts +0 -781
- package/src/RaftUtils.ts +0 -494
- package/src/RaftWifiTypes.ts +0 -36
- package/src/main.ts +0 -38
- package/testdata/TestDeviceTypeRecs.json +0 -492
- package/tsconfig.json +0 -30
- package/tsconfig.react-native.json +0 -29
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
// src/LatencyTestPanel.tsx
|
|
2
|
-
import React, { useEffect, useState } from 'react';
|
|
3
|
-
import './styles.css';
|
|
4
|
-
import ConnManager from "./ConnManager";
|
|
5
|
-
import LatencyTest from './LatencyTest';
|
|
6
|
-
import SettingsManager from './SettingsManager';
|
|
7
|
-
import { DeviceAttributeState, DeviceState } from '../../../src/RaftDeviceStates';
|
|
8
|
-
|
|
9
|
-
const connManager = ConnManager.getInstance();
|
|
10
|
-
const settingsManager = SettingsManager.getInstance();
|
|
11
|
-
|
|
12
|
-
const LatencyTestPanel = () => {
|
|
13
|
-
|
|
14
|
-
const latencyTest = LatencyTest.getInstance();
|
|
15
|
-
const [stats, setStats] = useState(latencyTest.getLatencyStats());
|
|
16
|
-
const [isWhite, setIsWhite] = useState<boolean>(true);
|
|
17
|
-
|
|
18
|
-
const attributeName = settingsManager.getSetting('latencyAttributeName');
|
|
19
|
-
|
|
20
|
-
useEffect(() => {
|
|
21
|
-
const deviceManager = connManager.getConnector().getSystemType()?.deviceMgrIF;
|
|
22
|
-
if (!deviceManager) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const onNewDevice = (deviceKey: string, newDeviceState: DeviceState) => {
|
|
27
|
-
console.log(`New device: ${deviceKey}`);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const onNewAttribute = (deviceKey: string, attribute: DeviceAttributeState) => {
|
|
31
|
-
console.log(`New attribute: ${deviceKey}`);
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const onNewAttributeData = (deviceKey: string, attribute: DeviceAttributeState) => {
|
|
35
|
-
// console.log(`New attribute data: ${deviceKey}`);
|
|
36
|
-
if (attribute.name === attributeName) {
|
|
37
|
-
latencyTest.processAttrValues(attribute, Date.now());
|
|
38
|
-
setStats(latencyTest.getLatencyStats());
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
deviceManager.addNewDeviceCallback(onNewDevice);
|
|
43
|
-
deviceManager.addNewAttributeCallback(onNewAttribute);
|
|
44
|
-
deviceManager.addAttributeDataCallback(onNewAttributeData);
|
|
45
|
-
|
|
46
|
-
// Cleanup callbacks when the component unmounts
|
|
47
|
-
return () => {
|
|
48
|
-
deviceManager.removeNewDeviceCallback(onNewDevice);
|
|
49
|
-
deviceManager.removeNewAttributeCallback(onNewAttribute);
|
|
50
|
-
deviceManager.removeAttributeDataCallback(onNewAttributeData);
|
|
51
|
-
};
|
|
52
|
-
}, [latencyTest, attributeName]);
|
|
53
|
-
|
|
54
|
-
useEffect(() => {
|
|
55
|
-
const interval = setInterval(() => {
|
|
56
|
-
// Toggle `isWhite` and record the color change
|
|
57
|
-
setIsWhite((prevIsWhite) => {
|
|
58
|
-
const newColor = !prevIsWhite ? 'white' : 'black';
|
|
59
|
-
latencyTest.recordColorChange(newColor, new Date().getTime());
|
|
60
|
-
return !prevIsWhite;
|
|
61
|
-
});
|
|
62
|
-
}, 2500);
|
|
63
|
-
return () => clearInterval(interval);
|
|
64
|
-
}, []);
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<div className="info-boxes">
|
|
68
|
-
<div className="info-box">
|
|
69
|
-
<h3>Latency Stats</h3>
|
|
70
|
-
<div style={{ display: 'flex', alignItems: 'center' }}>
|
|
71
|
-
<div
|
|
72
|
-
className="latency-test-panel"
|
|
73
|
-
style={{
|
|
74
|
-
width: '200px',
|
|
75
|
-
height: '150px',
|
|
76
|
-
backgroundColor: isWhite ? '#fff' : '#000',
|
|
77
|
-
border: '1px solid #666',
|
|
78
|
-
borderRadius: '8px',
|
|
79
|
-
marginRight: '20px',
|
|
80
|
-
}}
|
|
81
|
-
/>
|
|
82
|
-
<div>
|
|
83
|
-
<div>Mean Latency: {stats.meanLatency ? `${stats.meanLatency.toFixed(1)} ms` : 'N/A'}</div>
|
|
84
|
-
<div>Std Dev: {stats.stdDevLatency ? `${stats.stdDevLatency.toFixed(1)} ms` : 'N/A'}</div>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
export default LatencyTestPanel;
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
-
import './styles.css';
|
|
3
|
-
import SettingsScreen from './SettingsScreen';
|
|
4
|
-
import ConnManager from './ConnManager';
|
|
5
|
-
import {
|
|
6
|
-
RaftConnEvent,
|
|
7
|
-
RaftUpdateEvent,
|
|
8
|
-
RaftPublishEvent,
|
|
9
|
-
RaftSysTypeManager,
|
|
10
|
-
} from '../../../src/main';
|
|
11
|
-
import StatusPanel from './StatusPanel';
|
|
12
|
-
import DevicesPanel from './DevicesPanel';
|
|
13
|
-
import CommandPanel from './CommandPanel';
|
|
14
|
-
import LatencyTestPanel from './LatencyTestPanel';
|
|
15
|
-
import SettingsManager from './SettingsManager';
|
|
16
|
-
|
|
17
|
-
const sysTypeManager = RaftSysTypeManager.getInstance();
|
|
18
|
-
const connManager = ConnManager.getInstance();
|
|
19
|
-
|
|
20
|
-
export default function Main() {
|
|
21
|
-
const [connectionStatus, setConnectionStatus] = useState<RaftConnEvent>(
|
|
22
|
-
RaftConnEvent.CONN_DISCONNECTED
|
|
23
|
-
);
|
|
24
|
-
const [connectionTime, setConnectionTime] = useState<Date | null>(null);
|
|
25
|
-
const [elapsedTime, setElapsedTime] = useState<string | null>(null);
|
|
26
|
-
const [menuOpen, setMenuOpen] = useState(false);
|
|
27
|
-
const [showSettings, setShowSettings] = useState(false);
|
|
28
|
-
const menuRef = useRef<HTMLDivElement>(null);
|
|
29
|
-
const settingsManager = SettingsManager.getInstance();
|
|
30
|
-
const [latencyTestEnabled, setLatencyTestEnabled] = useState(
|
|
31
|
-
settingsManager.getSetting('latencyTest')
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
const [ipAddress, setIpAddress] = useState<string>(
|
|
35
|
-
localStorage.getItem('lastIpAddress') || ''
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
const [serialNo, setSerialNo] = useState<string>('');
|
|
39
|
-
|
|
40
|
-
const handleConnect = () => {
|
|
41
|
-
if (ipAddress.trim() === '') {
|
|
42
|
-
console.error('No IP address entered');
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
connManager.connect('WebSocket', ipAddress, [], null);
|
|
46
|
-
localStorage.setItem('lastIpAddress', ipAddress);
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
|
|
50
|
-
if (event.key === 'Enter') {
|
|
51
|
-
handleConnect();
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
useEffect(() => {
|
|
56
|
-
const listener = (
|
|
57
|
-
eventType: string,
|
|
58
|
-
eventEnum: RaftConnEvent | RaftUpdateEvent | RaftPublishEvent,
|
|
59
|
-
eventName: string,
|
|
60
|
-
data?: object | string | null
|
|
61
|
-
) => {
|
|
62
|
-
if (eventType === 'conn') {
|
|
63
|
-
if (
|
|
64
|
-
eventEnum === RaftConnEvent.CONN_CONNECTED ||
|
|
65
|
-
eventEnum === RaftConnEvent.CONN_DISCONNECTED
|
|
66
|
-
) {
|
|
67
|
-
setConnectionStatus(eventEnum);
|
|
68
|
-
setConnectionTime(new Date());
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
connManager.setConnectionEventListener(listener);
|
|
74
|
-
|
|
75
|
-
return () => {
|
|
76
|
-
connManager.setConnectionEventListener(() => { });
|
|
77
|
-
};
|
|
78
|
-
}, []);
|
|
79
|
-
|
|
80
|
-
useEffect(() => {
|
|
81
|
-
const handleClickOutside = (event: MouseEvent) => {
|
|
82
|
-
if (menuRef.current && !menuRef.current.contains(event.target as Node)) {
|
|
83
|
-
setMenuOpen(false);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
document.addEventListener('mousedown', handleClickOutside);
|
|
87
|
-
return () => {
|
|
88
|
-
document.removeEventListener('mousedown', handleClickOutside);
|
|
89
|
-
};
|
|
90
|
-
}, []);
|
|
91
|
-
|
|
92
|
-
useEffect(() => {
|
|
93
|
-
const interval = setInterval(() => {
|
|
94
|
-
setLatencyTestEnabled(settingsManager.getSetting('latencyTest'));
|
|
95
|
-
}, 100);
|
|
96
|
-
return () => clearInterval(interval);
|
|
97
|
-
}, []);
|
|
98
|
-
|
|
99
|
-
useEffect(() => {
|
|
100
|
-
if (connectionStatus === RaftConnEvent.CONN_CONNECTED && connectionTime) {
|
|
101
|
-
const interval = setInterval(() => {
|
|
102
|
-
const now = new Date();
|
|
103
|
-
const elapsed = now.getTime() - connectionTime.getTime();
|
|
104
|
-
|
|
105
|
-
const hours = Math.floor(elapsed / 3600000).toString().padStart(2, '0');
|
|
106
|
-
const minutes = Math.floor((elapsed % 3600000) / 60000).toString().padStart(2, '0');
|
|
107
|
-
const seconds = Math.floor((elapsed % 60000) / 1000).toString().padStart(2, '0');
|
|
108
|
-
const milliseconds = (elapsed % 1000).toString().padStart(3, '0');
|
|
109
|
-
|
|
110
|
-
setElapsedTime(`${hours}:${minutes}:${seconds}:${milliseconds}`);
|
|
111
|
-
}, 50);
|
|
112
|
-
|
|
113
|
-
return () => clearInterval(interval);
|
|
114
|
-
} else {
|
|
115
|
-
setElapsedTime(null);
|
|
116
|
-
}
|
|
117
|
-
}, [connectionStatus, connectionTime]);
|
|
118
|
-
|
|
119
|
-
return (
|
|
120
|
-
<div className="content-outer">
|
|
121
|
-
{showSettings ? (
|
|
122
|
-
<SettingsScreen onBack={() => setShowSettings(false)} />
|
|
123
|
-
) : (
|
|
124
|
-
<>
|
|
125
|
-
<div className="header">
|
|
126
|
-
<h1>RaftJS Dashboard</h1>
|
|
127
|
-
<div
|
|
128
|
-
className="menu-icon header-menu-icon"
|
|
129
|
-
onClick={() => setMenuOpen(!menuOpen)}
|
|
130
|
-
>
|
|
131
|
-
☰
|
|
132
|
-
</div>
|
|
133
|
-
{menuOpen && (
|
|
134
|
-
<div className="dropdown-menu" ref={menuRef}>
|
|
135
|
-
<div
|
|
136
|
-
className="menu-item"
|
|
137
|
-
onClick={() => {
|
|
138
|
-
setMenuOpen(false);
|
|
139
|
-
setShowSettings(true);
|
|
140
|
-
}}
|
|
141
|
-
>
|
|
142
|
-
Settings
|
|
143
|
-
</div>
|
|
144
|
-
</div>
|
|
145
|
-
)}
|
|
146
|
-
</div>
|
|
147
|
-
<div className="content-body">
|
|
148
|
-
{connectionStatus === RaftConnEvent.CONN_CONNECTED ? (
|
|
149
|
-
<>
|
|
150
|
-
<div className="connected-panel">
|
|
151
|
-
<div className="info-boxes">
|
|
152
|
-
<div className="info-box">
|
|
153
|
-
<div className="conn-indication">
|
|
154
|
-
<h3>Connected</h3>
|
|
155
|
-
</div>
|
|
156
|
-
<div>
|
|
157
|
-
<button
|
|
158
|
-
className="action-button"
|
|
159
|
-
onClick={() => connManager.disconnect()}
|
|
160
|
-
>
|
|
161
|
-
Disconnect
|
|
162
|
-
</button>
|
|
163
|
-
</div>
|
|
164
|
-
<div>
|
|
165
|
-
{elapsedTime && <p>{elapsedTime}</p>}
|
|
166
|
-
</div>
|
|
167
|
-
</div>
|
|
168
|
-
</div>
|
|
169
|
-
<StatusPanel />
|
|
170
|
-
{latencyTestEnabled && <LatencyTestPanel />}
|
|
171
|
-
<CommandPanel />
|
|
172
|
-
</div>
|
|
173
|
-
<DevicesPanel />
|
|
174
|
-
</>
|
|
175
|
-
) : (
|
|
176
|
-
<>
|
|
177
|
-
<div className="info-boxes">
|
|
178
|
-
<div className="info-box">
|
|
179
|
-
<h3>WebSocket</h3>
|
|
180
|
-
<input
|
|
181
|
-
className="ip-addr-input"
|
|
182
|
-
id="ip-addr"
|
|
183
|
-
type="text"
|
|
184
|
-
placeholder="IP Address"
|
|
185
|
-
value={ipAddress}
|
|
186
|
-
onChange={(e) => setIpAddress(e.target.value)}
|
|
187
|
-
onKeyDown={handleKeyDown}
|
|
188
|
-
/>
|
|
189
|
-
<button
|
|
190
|
-
className="action-button"
|
|
191
|
-
onClick={handleConnect}
|
|
192
|
-
>
|
|
193
|
-
Connect
|
|
194
|
-
</button>
|
|
195
|
-
</div>
|
|
196
|
-
<div className="info-box">
|
|
197
|
-
<h3>WebBLE</h3>
|
|
198
|
-
<input
|
|
199
|
-
className="serial-no-input"
|
|
200
|
-
id="serial-no"
|
|
201
|
-
type="text"
|
|
202
|
-
placeholder="Serial No (ignored if empty)"
|
|
203
|
-
value={serialNo}
|
|
204
|
-
onChange={(e) => setSerialNo(e.target.value)}
|
|
205
|
-
/>
|
|
206
|
-
<button
|
|
207
|
-
className="action-button"
|
|
208
|
-
onClick={() => {
|
|
209
|
-
connManager.connect('WebBLE', '', sysTypeManager.getAllServiceUUIDs(), serialNo);
|
|
210
|
-
}}
|
|
211
|
-
>
|
|
212
|
-
Connect
|
|
213
|
-
</button>
|
|
214
|
-
</div>
|
|
215
|
-
<div className="info-box">
|
|
216
|
-
<h3>WebSerial</h3>
|
|
217
|
-
<button
|
|
218
|
-
className="action-button"
|
|
219
|
-
onClick={() => {
|
|
220
|
-
connManager.connect('WebSerial', '', [], null);
|
|
221
|
-
}}
|
|
222
|
-
>
|
|
223
|
-
Connect
|
|
224
|
-
</button>
|
|
225
|
-
</div>
|
|
226
|
-
</div>
|
|
227
|
-
</>
|
|
228
|
-
)}
|
|
229
|
-
</div>
|
|
230
|
-
</>
|
|
231
|
-
)}
|
|
232
|
-
</div>
|
|
233
|
-
);
|
|
234
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
export type Settings = {
|
|
2
|
-
showCharts: boolean;
|
|
3
|
-
maxChartDataPoints: number;
|
|
4
|
-
maxDatapointsToStore: number;
|
|
5
|
-
latencyTest: boolean;
|
|
6
|
-
latencyAttributeName: string;
|
|
7
|
-
latencyChangeThreshold: number;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
class SettingsManager {
|
|
11
|
-
private static instance: SettingsManager;
|
|
12
|
-
private settings: Settings;
|
|
13
|
-
private storageKey = "RaftJS_Settings";
|
|
14
|
-
private maxChartDataPoints_default = 50;
|
|
15
|
-
private maxDatapointsToStore_default = 1000;
|
|
16
|
-
|
|
17
|
-
private constructor() {
|
|
18
|
-
// Load settings from localStorage or use default values
|
|
19
|
-
const savedSettings = localStorage.getItem(this.storageKey);
|
|
20
|
-
this.settings = savedSettings
|
|
21
|
-
? JSON.parse(savedSettings)
|
|
22
|
-
: {
|
|
23
|
-
latencyTest: false,
|
|
24
|
-
showCharts: true,
|
|
25
|
-
maxChartDataPoints: this.maxChartDataPoints_default,
|
|
26
|
-
maxDatapointsToStore: this.maxDatapointsToStore_default,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
static getInstance(): SettingsManager {
|
|
31
|
-
if (!SettingsManager.instance) {
|
|
32
|
-
SettingsManager.instance = new SettingsManager();
|
|
33
|
-
}
|
|
34
|
-
return SettingsManager.instance;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
getSetting<K extends keyof Settings>(key: K): Settings[K] {
|
|
38
|
-
return this.settings[key];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
setSetting<K extends keyof Settings>(key: K, value: Settings[K]): void {
|
|
42
|
-
this.settings[key] = value;
|
|
43
|
-
this.saveSettings();
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
getAllSettings(): Settings {
|
|
47
|
-
return this.settings;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Save settings to localStorage
|
|
51
|
-
private saveSettings(): void {
|
|
52
|
-
localStorage.setItem(this.storageKey, JSON.stringify(this.settings));
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Reset to default settings
|
|
56
|
-
resetSettings(): void {
|
|
57
|
-
this.settings = {
|
|
58
|
-
latencyTest: false,
|
|
59
|
-
showCharts: true,
|
|
60
|
-
maxChartDataPoints: this.maxChartDataPoints_default,
|
|
61
|
-
maxDatapointsToStore: this.maxDatapointsToStore_default,
|
|
62
|
-
};
|
|
63
|
-
this.saveSettings();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export default SettingsManager;
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
// src/SettingsScreen.tsx
|
|
2
|
-
import React, { useState, useEffect } from 'react';
|
|
3
|
-
import SettingsManager from './SettingsManager';
|
|
4
|
-
import ConnManager from './ConnManager';
|
|
5
|
-
|
|
6
|
-
const connManager = ConnManager.getInstance();
|
|
7
|
-
|
|
8
|
-
const SettingsScreen = ({ onBack }: { onBack: () => void }) => {
|
|
9
|
-
const settingsManager = SettingsManager.getInstance();
|
|
10
|
-
|
|
11
|
-
const [latencyTest, setLatencyTest] = useState<boolean>(
|
|
12
|
-
settingsManager.getSetting('latencyTest')
|
|
13
|
-
);
|
|
14
|
-
const [showCharts, setShowCharts] = useState<boolean>(
|
|
15
|
-
settingsManager.getSetting('showCharts')
|
|
16
|
-
);
|
|
17
|
-
const [maxChartDataPoints, setMaxChartDataPoints] = useState<number>(
|
|
18
|
-
settingsManager.getSetting('maxChartDataPoints')
|
|
19
|
-
);
|
|
20
|
-
const [maxDatapointsToStore, setMaxDatapointsToStore] = useState<number>(
|
|
21
|
-
settingsManager.getSetting('maxDatapointsToStore')
|
|
22
|
-
);
|
|
23
|
-
const [latencyAttributeName, setLatencyAttributeName] = useState<string>(
|
|
24
|
-
settingsManager.getSetting('latencyAttributeName') || 'amb0'
|
|
25
|
-
);
|
|
26
|
-
const [latencyChangeThreshold, setLatencyChangeThreshold] = useState<number>(
|
|
27
|
-
settingsManager.getSetting('latencyChangeThreshold') || 100
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
const handleSaveAndReturn = () => {
|
|
31
|
-
// Save settings to SettingsManager
|
|
32
|
-
settingsManager.setSetting('latencyTest', latencyTest);
|
|
33
|
-
settingsManager.setSetting('showCharts', showCharts);
|
|
34
|
-
settingsManager.setSetting('maxChartDataPoints', maxChartDataPoints);
|
|
35
|
-
settingsManager.setSetting('maxDatapointsToStore', maxDatapointsToStore);
|
|
36
|
-
|
|
37
|
-
// Log and update maxDatapointsToStore in DeviceManager
|
|
38
|
-
console.log(
|
|
39
|
-
`Set maxDatapointsToStore to ${maxDatapointsToStore} ` +
|
|
40
|
-
`${connManager.getConnector().getSystemType()} ` +
|
|
41
|
-
`${connManager.getConnector().getSystemType()?.deviceMgrIF}` +
|
|
42
|
-
`${connManager.getConnector().getSystemType()?.deviceMgrIF?.setMaxDataPointsToStore}`
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
connManager.getConnector().getSystemType()?.deviceMgrIF?.setMaxDataPointsToStore(maxDatapointsToStore);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (latencyTest) {
|
|
49
|
-
settingsManager.setSetting('latencyAttributeName', latencyAttributeName);
|
|
50
|
-
settingsManager.setSetting('latencyChangeThreshold', latencyChangeThreshold);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
onBack();
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
return (
|
|
57
|
-
<div className="content-outer">
|
|
58
|
-
<div className="header">
|
|
59
|
-
<h1>RaftJS Dashboard Settings</h1>
|
|
60
|
-
</div>
|
|
61
|
-
<div className="content-body">
|
|
62
|
-
<div className="info-boxes">
|
|
63
|
-
<div className="info-box">
|
|
64
|
-
|
|
65
|
-
<div className="settings-item">
|
|
66
|
-
<label>
|
|
67
|
-
<input
|
|
68
|
-
type="checkbox"
|
|
69
|
-
checked={showCharts}
|
|
70
|
-
onChange={(e) => setShowCharts(e.target.checked)}
|
|
71
|
-
/>
|
|
72
|
-
Show Charts
|
|
73
|
-
</label>
|
|
74
|
-
</div>
|
|
75
|
-
|
|
76
|
-
<div className="settings-item">
|
|
77
|
-
<label>
|
|
78
|
-
Max Chart Points
|
|
79
|
-
<input
|
|
80
|
-
type="number"
|
|
81
|
-
min="1"
|
|
82
|
-
max="500"
|
|
83
|
-
value={maxChartDataPoints}
|
|
84
|
-
onChange={(e) =>
|
|
85
|
-
setMaxChartDataPoints(
|
|
86
|
-
Math.min(parseInt(e.target.value, 10) || 1, 500)
|
|
87
|
-
)
|
|
88
|
-
}
|
|
89
|
-
style={{ width: '50px', marginLeft: '10px' }}
|
|
90
|
-
/>
|
|
91
|
-
</label>
|
|
92
|
-
</div>
|
|
93
|
-
|
|
94
|
-
<div className="settings-item">
|
|
95
|
-
<label>
|
|
96
|
-
Max Stored Points
|
|
97
|
-
<input
|
|
98
|
-
type="number"
|
|
99
|
-
min="1"
|
|
100
|
-
max="100000"
|
|
101
|
-
value={maxDatapointsToStore}
|
|
102
|
-
onChange={(e) =>
|
|
103
|
-
setMaxDatapointsToStore(
|
|
104
|
-
Math.min(parseInt(e.target.value, 10) || 1, 100000)
|
|
105
|
-
)
|
|
106
|
-
}
|
|
107
|
-
style={{ width: '50px', marginLeft: '10px' }}
|
|
108
|
-
/>
|
|
109
|
-
</label>
|
|
110
|
-
</div>
|
|
111
|
-
|
|
112
|
-
<div className="settings-item">
|
|
113
|
-
<label>
|
|
114
|
-
<input
|
|
115
|
-
type="checkbox"
|
|
116
|
-
checked={latencyTest}
|
|
117
|
-
onChange={(e) => setLatencyTest(e.target.checked)}
|
|
118
|
-
/>
|
|
119
|
-
Latency Test
|
|
120
|
-
</label>
|
|
121
|
-
</div>
|
|
122
|
-
|
|
123
|
-
{latencyTest && (
|
|
124
|
-
<>
|
|
125
|
-
<div className="settings-item">
|
|
126
|
-
<label>
|
|
127
|
-
Attribute Name
|
|
128
|
-
<input
|
|
129
|
-
type="text"
|
|
130
|
-
value={latencyAttributeName}
|
|
131
|
-
onChange={(e) => setLatencyAttributeName(e.target.value)}
|
|
132
|
-
style={{ marginLeft: '10px' }}
|
|
133
|
-
/>
|
|
134
|
-
</label>
|
|
135
|
-
</div>
|
|
136
|
-
<div className="settings-item">
|
|
137
|
-
<label>
|
|
138
|
-
Change Threshold
|
|
139
|
-
<input
|
|
140
|
-
type="number"
|
|
141
|
-
min="1"
|
|
142
|
-
value={latencyChangeThreshold}
|
|
143
|
-
onChange={(e) =>
|
|
144
|
-
setLatencyChangeThreshold(parseInt(e.target.value, 10) || 1)
|
|
145
|
-
}
|
|
146
|
-
style={{ width: '60px', marginLeft: '10px' }}
|
|
147
|
-
/>
|
|
148
|
-
</label>
|
|
149
|
-
</div>
|
|
150
|
-
</>
|
|
151
|
-
)}
|
|
152
|
-
|
|
153
|
-
<button className="action-button" onClick={handleSaveAndReturn}>
|
|
154
|
-
Save and Return
|
|
155
|
-
</button>
|
|
156
|
-
|
|
157
|
-
<button
|
|
158
|
-
className="action-button"
|
|
159
|
-
style={{ marginTop: '10px' }}
|
|
160
|
-
onClick={() => {
|
|
161
|
-
settingsManager.resetSettings();
|
|
162
|
-
window.location.reload();
|
|
163
|
-
}}
|
|
164
|
-
>
|
|
165
|
-
Reset to Defaults
|
|
166
|
-
</button>
|
|
167
|
-
</div>
|
|
168
|
-
</div>
|
|
169
|
-
</div>
|
|
170
|
-
</div>
|
|
171
|
-
);
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
export default SettingsScreen;
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
2
|
-
import './styles.css';
|
|
3
|
-
import { RaftSystemInfo } from "../../../src/main";
|
|
4
|
-
import ConnManager from "./ConnManager";
|
|
5
|
-
|
|
6
|
-
const connManager = ConnManager.getInstance();
|
|
7
|
-
|
|
8
|
-
export default function StatusPanel() {
|
|
9
|
-
const [systemInfo, setSystemInfo] = useState<RaftSystemInfo>(new RaftSystemInfo());
|
|
10
|
-
|
|
11
|
-
// Use useEffect to fetch system info when the component mounts
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
if (connManager.isConnected()) {
|
|
14
|
-
connManager.getConnector().getRaftSystemUtils().getSystemInfo().then((sysInfo: RaftSystemInfo) => {
|
|
15
|
-
console.log(`System Info: ${JSON.stringify(sysInfo)}`);
|
|
16
|
-
setSystemInfo(sysInfo);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
}, []); // Empty dependency == on component mount
|
|
20
|
-
|
|
21
|
-
return (
|
|
22
|
-
<div className="info-boxes">
|
|
23
|
-
|
|
24
|
-
<div className="info-box">
|
|
25
|
-
<h3>SysInfo</h3>
|
|
26
|
-
{
|
|
27
|
-
(systemInfo !== undefined) && (systemInfo.validMs) && (systemInfo.validMs > 0) ?
|
|
28
|
-
<div className="info">
|
|
29
|
-
<div className="info-line">
|
|
30
|
-
<div className="info-label">System Name:</div>
|
|
31
|
-
<div className="info-value">{systemInfo.SystemName}</div>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<div className="info-line">
|
|
35
|
-
<div className="info-label">System Version:</div>
|
|
36
|
-
<div className="info-value">{systemInfo.SystemVersion}</div>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<div className="info-line">
|
|
40
|
-
<div className="info-label">HwRev:</div>
|
|
41
|
-
<div className="info-value">{systemInfo.HwRev}</div>
|
|
42
|
-
</div>
|
|
43
|
-
|
|
44
|
-
<div className="info-line">
|
|
45
|
-
<div className="info-label">MAC:</div>
|
|
46
|
-
<div className="info-value">{systemInfo.MAC}</div>
|
|
47
|
-
</div>
|
|
48
|
-
|
|
49
|
-
<div className="info-line">
|
|
50
|
-
<div className="info-label">SerialNo:</div>
|
|
51
|
-
<div className="info-value">{systemInfo.SerialNo}</div>
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<div className="info-line">
|
|
55
|
-
<div className="info-label">Friendly:</div>
|
|
56
|
-
<div className="info-value">{systemInfo.Friendly}</div>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
:
|
|
60
|
-
<div className="info">
|
|
61
|
-
<div className="info-line">
|
|
62
|
-
<div className="info-label">System Info:</div>
|
|
63
|
-
<div className="info-value">Not available</div>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
}
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
}
|