Skip to content

Commit 4041d45

Browse files
committed
control-station working with zustand
1 parent 11b806d commit 4041d45

14 files changed

Lines changed: 91 additions & 90 deletions

File tree

common-front/lib/store/measurementsStore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Measurement, NumericMeasurement, isNumericMeasurement } from "../models";
1+
import { Measurement, NumericMeasurement } from "../models";
22
import {
33
getBooleanMeasurement,
44
getEnumMeasurement,

control-station/src/App.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@ import {
1111
WsHandlerProvider,
1212
createWsHandler,
1313
useConfig,
14+
useConnectionsStore,
1415
useFetchBack,
16+
useMeasurementsStore,
17+
usePodDataStore,
1518
} from "common";
16-
import { useDispatch } from "react-redux";
17-
import { initPodData } from "slices/podDataSlice";
18-
import { initMeasurements } from "slices/measurementsSlice";
19-
import { setWebSocketConnection } from "slices/connectionsSlice";
2019

2120
export const App = () => {
22-
const dispatch = useDispatch();
21+
const setBackendConnection = useConnectionsStore(store => store.setBackendConnection);
22+
const initPodData = usePodDataStore(store => store.initPodData);
23+
const initMeasurements = useMeasurementsStore(store => store.initMeasurements);
2324
const config = useConfig();
2425
const podDataDescriptionPromise = useFetchBack(
2526
import.meta.env.PROD,
@@ -36,12 +37,12 @@ export const App = () => {
3637
createWsHandler(
3738
WS_URL,
3839
true,
39-
() => dispatch(setWebSocketConnection(true)),
40-
() => dispatch(setWebSocketConnection(false))
40+
() => setBackendConnection(true),
41+
() => setBackendConnection(false)
4142
),
4243
podDataDescriptionPromise.then((adapter) => {
43-
dispatch(initPodData(adapter));
44-
dispatch(initMeasurements(adapter));
44+
initPodData(adapter);
45+
initMeasurements(adapter);
4546
}),
4647
]}
4748
LoadingView={<div>Loading</div>}

control-station/src/components/ValueData/ValueData.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import styles from "components/ValueData/ValueData.module.scss";
2-
import { Measurement, isNumericMeasurement } from "common";
2+
import { Measurement, isNumericMeasurement, useMeasurementsStore } from "common";
33
import { useTextUpdater } from "services/ImperativeUpdater/useTextUpdater";
44
import { memo } from "react";
5-
import { store } from "store";
65

76
type Props = {
87
measurement: Measurement;
98
};
109

1110
export const ValueData = memo(({ measurement }: Props) => {
11+
12+
const measurements = useMeasurementsStore(state => state.measurements);
13+
1214
const ref = useTextUpdater(() => {
1315
const storeMeas =
14-
store.getState().measurements.measurements[measurement.id];
16+
measurements[measurement.id];
1517

1618
if (!storeMeas) {
1719
return "Default";

control-station/src/main.tsx

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import "common/dist/style.css";
22
import React from "react";
33
import ReactDOM from "react-dom/client";
44
import { Provider } from "react-redux";
5-
import { store } from "store";
65
import {
76
createBrowserRouter,
87
Navigate,
@@ -30,15 +29,13 @@ const router = createBrowserRouter([
3029

3130
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
3231
<React.StrictMode>
33-
<Provider store={store}>
34-
<ConfigProvider
35-
devIp="127.0.0.1"
36-
prodIp="127.0.0.1"
37-
>
38-
<GlobalTicker fps={60}>
39-
<RouterProvider router={router}></RouterProvider>
40-
</GlobalTicker>
41-
</ConfigProvider>
42-
</Provider>
32+
<ConfigProvider
33+
devIp="127.0.0.1"
34+
prodIp="127.0.0.1"
35+
>
36+
<GlobalTicker fps={60}>
37+
<RouterProvider router={router}></RouterProvider>
38+
</GlobalTicker>
39+
</ConfigProvider>
4340
</React.StrictMode>
4441
);
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import { loadPodData } from "pages/VehiclePage/loadPodData";
21
import { TubePage } from "./TubePage";
32

43
export const tubeRoute = {
54
path: "/tube",
65
element: <TubePage />,
7-
loader: loadPodData,
86
};

control-station/src/pages/VehiclePage/Boards/BMSL/BMSL.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import { BarTag } from "components/BarTag/BarTag";
44
import { Window } from "components/Window/Window";
55
import { BmslMeasurements, NumericMeasurement } from "common";
66
import { ValueDataTag } from "components/ValueDataTag/ValueDataTag";
7-
import { useSelector } from "react-redux";
8-
import { RootState } from "store";
97

108
export const BMSL = (props: BmslMeasurements) => {
119
return (

control-station/src/pages/VehiclePage/Boards/LCU/CoilsInfo/CoilInfo/CurrentChart/CurrentChart.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { LinesChart, NumericMeasurement } from "common";
2-
import { store } from "store";
1+
import { LinesChart, NumericMeasurement, useMeasurementsStore } from "common";
32

43
type Props = {
54
current: NumericMeasurement;
65
currentRef: NumericMeasurement;
76
};
87

98
export const CurrentChart = ({ current }: Props) => {
9+
const getMeasurement = useMeasurementsStore((state) => state.getMeasurement);
10+
1011
return (
1112
<LinesChart
1213
width="8rem"
@@ -20,9 +21,7 @@ export const CurrentChart = ({ current }: Props) => {
2021
color: "red",
2122
getUpdate: () =>
2223
(
23-
store.getState().measurements.measurements[
24-
current.id
25-
] as NumericMeasurement
24+
getMeasurement(current.id) as NumericMeasurement
2625
).value.last,
2726
},
2827
]}

control-station/src/pages/VehiclePage/Boards/PCU/MotorInfo/MotorInfo.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import styles from "./MotorInfo.module.scss";
22
import {
33
LineDescription,
4+
Measurement,
5+
MeasurementId,
46
NumericMeasurement,
57
isNumericMeasurement,
8+
useMeasurementsStore,
69
} from "common";
710
import { ColorfulChart } from "common";
8-
import { store } from "store";
911

1012
type Props = {
1113
title: string;
@@ -20,34 +22,36 @@ export const MotorInfo = ({
2022
motorCurrentV,
2123
motorCurrentW,
2224
}: Props) => {
25+
const getMeasurement = useMeasurementsStore((state) => state.getMeasurement);
26+
2327
return (
2428
<div className={styles.motorInfoWrapper}>
2529
<ColorfulChart
2630
className={styles.chart}
2731
title={title}
2832
length={100}
2933
items={[
30-
getItemFromMeasurement(motorCurrentU),
31-
getItemFromMeasurement(motorCurrentV),
32-
getItemFromMeasurement(motorCurrentW),
34+
getItemFromMeasurement(motorCurrentU, getMeasurement),
35+
getItemFromMeasurement(motorCurrentV, getMeasurement),
36+
getItemFromMeasurement(motorCurrentW, getMeasurement),
3337
]}
3438
/>
3539
</div>
3640
);
3741
};
3842

39-
function getItemFromMeasurement(meas: NumericMeasurement): LineDescription {
43+
function getItemFromMeasurement(meas: NumericMeasurement, getMeasurement: (id: MeasurementId) => Measurement): LineDescription {
4044
return {
4145
id: meas.id,
4246
name: meas.name,
4347
color: "red",
44-
getUpdate: () => getMeasurementValue(meas.id),
48+
getUpdate: () => getMeasurementValue(meas.id, getMeasurement),
4549
range: meas.safeRange,
4650
};
4751
}
4852

49-
function getMeasurementValue(id: string): number {
50-
const measurement = store.getState().measurements.measurements[id];
53+
function getMeasurementValue(id: string, getMeasurement: (id: MeasurementId) => Measurement): number {
54+
const measurement = getMeasurement(id)
5155

5256
if (!measurement) {
5357
return 0;

control-station/src/pages/VehiclePage/BoardsPage/BoardsPage.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import styles from "./BoardsPage.module.scss";
2-
import { useMeasurements } from "../useMeasurements";
32
import { LCU } from "../Boards/LCU/LCU";
43
import { PCU } from "../Boards/PCU/PCU";
54
import { BMSL } from "../Boards/BMSL/BMSL";
@@ -12,10 +11,26 @@ import {
1211
selectObccuMeasurements,
1312
selectPcuMeasurements,
1413
selectVcuMeasurements,
14+
useGlobalTicker,
15+
useMeasurementsStore,
16+
useSubscribe,
1517
} from "common";
18+
import { useCallback, useState } from "react";
1619

1720
export const BoardsPage = () => {
18-
const measurements = useMeasurements();
21+
const measurements = useMeasurementsStore(state => state.measurements);
22+
const updateMeasurements = useMeasurementsStore(state => state.updateMeasurements);
23+
const [measurementsState, setMeasurementsState] = useState(measurements);
24+
25+
useSubscribe("podData/update", (msg) => {
26+
updateMeasurements(msg);
27+
});
28+
29+
const callback = useCallback(() => {
30+
setMeasurementsState(measurements);
31+
}, []);
32+
33+
useGlobalTicker(callback);
1934

2035
return (
2136
<div className={styles.boardsPage}>

control-station/src/pages/VehiclePage/VehiclePage.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,33 @@
1+
import { useMeasurementsStore } from "common";
12
import styles from "./VehiclePage.module.scss";
23

34
import { Pagination } from "components/Pagination/Pagination";
45
import { PageWrapper } from "pages/PageWrapper/PageWrapper";
56
import { Outlet } from "react-router-dom";
67
import { useOrders } from "useOrders";
8+
import { fetchFromBackend } from "services/HTTPHandler";
9+
import { useEffect, useState } from "react";
710

811
export const VehiclePage = () => {
12+
13+
const [podData, setPodData] = useState(null);
14+
const measurements = useMeasurementsStore(state => state.measurements);
15+
const initMeasurements = useMeasurementsStore(state => state.initMeasurements);
16+
17+
useEffect(() => {
18+
const fetchPodDataAsync = async () => {
19+
const data = await fetchPodData();
20+
setPodData(data);
21+
};
22+
fetchPodDataAsync();
23+
}, []);
24+
25+
useEffect(() => {
26+
if (podData) {
27+
initMeasurements(podData);
28+
}
29+
}, [podData, initMeasurements]);
30+
931
useOrders();
1032

1133
return (
@@ -17,3 +39,10 @@ export const VehiclePage = () => {
1739
</PageWrapper>
1840
);
1941
};
42+
43+
async function fetchPodData() {
44+
const response = await fetchFromBackend(
45+
import.meta.env.VITE_POD_DATA_DESCRIPTION_PATH
46+
);
47+
return response.json();
48+
}

0 commit comments

Comments
 (0)