Skip to content

Commit 375d024

Browse files
committed
Replace develop with demonstration branch
1 parent 2a3c393 commit 375d024

23 files changed

Lines changed: 455 additions & 1766 deletions

File tree

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

Lines changed: 6 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
stateToColor,
77
stateToColorBackground,
88
} from 'state';
9-
import { memo, useContext, useEffect, useRef, useState, useMemo } from 'react';
9+
import { memo, useContext, useEffect, useRef, useState } from 'react';
1010
import { LostConnectionContext } from 'services/connections';
1111

1212
interface Props {
@@ -37,88 +37,17 @@ export const BarIndicator = memo(
3737
backgroundColor,
3838
className,
3939
}: Props) => {
40-
const [valueState, setValueState] = useState<number | null>(0);
40+
const [valueState, setValueState] = useState<number>(0);
4141
const lostConnection = useContext(LostConnectionContext);
42-
43-
// Delta tracking state
44-
const deltaTrackingRef = useRef<{
45-
value: number | null;
46-
lastSampleTime: number;
47-
lastChangeTime: number;
48-
displayValue: number | null;
49-
isStale: boolean;
50-
} | null>(null);
5142

52-
// Create delta-tracked getter with memoization
53-
const getDeltaTrackedValue = useMemo(() => {
54-
return () => {
55-
const now = Date.now();
56-
const prevData = deltaTrackingRef.current;
57-
58-
// Check if 400ms have passed since last sample
59-
if (prevData && now - prevData.lastSampleTime < 400) {
60-
// Not enough time passed, return current value if not stale, otherwise null
61-
const currentValue = getValue();
62-
return prevData.isStale ? null : currentValue;
63-
}
64-
65-
// 400ms have passed or no previous data, get fresh value
66-
const currentValue = getValue();
67-
68-
// Initialize if no previous data
69-
if (!prevData) {
70-
deltaTrackingRef.current = {
71-
value: currentValue,
72-
lastSampleTime: now,
73-
lastChangeTime: now,
74-
displayValue: currentValue,
75-
isStale: false,
76-
};
77-
return currentValue;
78-
}
79-
80-
// Check for delta with tolerance
81-
const prevValue = prevData.value;
82-
const tolerance = 0.01; // Small tolerance for numeric values
83-
const hasChanged = prevValue === null || currentValue === null
84-
? prevValue !== currentValue
85-
: Math.abs(prevValue - currentValue) > tolerance;
86-
87-
if (hasChanged) {
88-
// Value changed significantly, update everything
89-
deltaTrackingRef.current = {
90-
value: currentValue,
91-
lastSampleTime: now,
92-
lastChangeTime: now,
93-
displayValue: currentValue,
94-
isStale: false,
95-
};
96-
return currentValue;
97-
} else {
98-
// Value hasn't changed significantly, check if it's been stale for too long
99-
const staleDuration = now - prevData.lastChangeTime;
100-
const isStale = staleDuration > 100; // 100ms grace period
101-
102-
deltaTrackingRef.current = {
103-
value: currentValue,
104-
lastSampleTime: now,
105-
lastChangeTime: prevData.lastChangeTime,
106-
displayValue: isStale ? null : currentValue,
107-
isStale: isStale,
108-
};
109-
return isStale ? null : currentValue;
110-
}
111-
};
112-
}, [getValue]);
113-
114-
const percentage = lostConnection || valueState === null
43+
const percentage = lostConnection
11544
? 100
11645
: getPercentageFromRange(
11746
valueState,
11847
warningRangeMin,
11948
warningRangeMax
12049
);
121-
const state = lostConnection || valueState === null
50+
const state = lostConnection
12251
? 'fault'
12352
: getStateFromRange(
12453
valueState,
@@ -129,8 +58,7 @@ export const BarIndicator = memo(
12958
);
13059

13160
useGlobalTicker(() => {
132-
const value = getDeltaTrackedValue();
133-
setValueState(value);
61+
setValueState(getValue());
13462
});
13563

13664
return (
@@ -157,7 +85,7 @@ export const BarIndicator = memo(
15785
</div>
15886
<div className={styles.value_display}>
15987
<p className={styles.value}>
160-
{lostConnection || valueState === null ? '-.--' : valueState.toFixed(2)}
88+
{lostConnection ? '-.--' : valueState?.toFixed(2)}
16189
</p>
16290
<p className={styles.units}>{units}</p>
16391
{/* <div className={styles.min_max}>

control-station/src/components/BatteriesModules/BatteriesModule.tsx

Lines changed: 18 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import React, { useState, useContext, useRef, useMemo } from "react";
1+
import React, { useState, useContext } from "react";
22
import styles from "./BatteriesModule.module.scss";
33
import { useGlobalTicker, useMeasurementsStore, usePodDataStore } from "common";
44
import { LostConnectionContext } from "services/connections";
5-
import { DELTA_SAMPLE_PERIOD, DELTA_GRACE_PERIOD } from "constants/deltaTracking";
65

76
interface CellProps {
8-
value: number | null;
7+
value: number;
98
min: number;
109
max: number;
1110
}
1211

1312
interface TemperatureProps {
14-
value: number | null;
13+
value: number;
1514
min: number;
1615
max: number;
1716
label: string;
@@ -29,81 +28,10 @@ const BatteriesModule: React.FC<{ id: string | number }> = ({ id }) => {
2928
const podData = usePodDataStore((state) => state.podData);
3029
const lostConnection = useContext(LostConnectionContext);
3130

32-
const [cellValues, setCellValues] = useState<(number | null)[]>(Array(6).fill(0));
33-
const [temperature1, setTemperature1] = useState<number | null>(0);
34-
const [temperature2, setTemperature2] = useState<number | null>(0);
31+
const [cellValues, setCellValues] = useState<number[]>(Array(6).fill(0));
32+
const [temperature1, setTemperature1] = useState<number>(0);
33+
const [temperature2, setTemperature2] = useState<number>(0);
3534
const [hasReceivedData, setHasReceivedData] = useState(false);
36-
37-
// Delta tracking state for all values
38-
const deltaTrackingRef = useRef<{
39-
[key: string]: {
40-
value: number | null;
41-
lastSampleTime: number;
42-
lastChangeTime: number;
43-
isStale: boolean;
44-
};
45-
}>({});
46-
47-
// Create delta-tracked getter for numeric values
48-
const createDeltaTrackedGetter = useMemo(() => {
49-
return (key: string, originalGetter: () => number) => {
50-
return () => {
51-
const now = Date.now();
52-
const prevData = deltaTrackingRef.current[key];
53-
54-
// Check if sample period has passed since last sample
55-
if (prevData && now - prevData.lastSampleTime < DELTA_SAMPLE_PERIOD) {
56-
// Not enough time passed, return current value if not stale, otherwise null
57-
const currentValue = originalGetter();
58-
return prevData.isStale ? null : currentValue;
59-
}
60-
61-
// Sample period has passed or no previous data, get fresh value
62-
const currentValue = originalGetter();
63-
64-
// Initialize if no previous data
65-
if (!prevData) {
66-
deltaTrackingRef.current[key] = {
67-
value: currentValue,
68-
lastSampleTime: now,
69-
lastChangeTime: now,
70-
isStale: false,
71-
};
72-
return currentValue;
73-
}
74-
75-
// Check for delta with tolerance
76-
const prevValue = prevData.value;
77-
const tolerance = 0.01; // Small tolerance for battery values
78-
const hasChanged = prevValue === null || currentValue === null
79-
? prevValue !== currentValue
80-
: Math.abs(prevValue - currentValue) > tolerance;
81-
82-
if (hasChanged) {
83-
// Value changed significantly, update everything
84-
deltaTrackingRef.current[key] = {
85-
value: currentValue,
86-
lastSampleTime: now,
87-
lastChangeTime: now,
88-
isStale: false,
89-
};
90-
return currentValue;
91-
} else {
92-
// Value hasn't changed significantly, check if it's been stale for too long
93-
const staleDuration = now - prevData.lastChangeTime;
94-
const isStale = staleDuration > DELTA_GRACE_PERIOD; // Grace period
95-
96-
deltaTrackingRef.current[key] = {
97-
value: currentValue,
98-
lastSampleTime: now,
99-
lastChangeTime: prevData.lastChangeTime,
100-
isStale: isStale,
101-
};
102-
return isStale ? null : currentValue;
103-
}
104-
};
105-
};
106-
}, []);
10735

10836
useGlobalTicker(() => {
10937
const boardName = 'HVSCU';
@@ -117,29 +45,16 @@ const BatteriesModule: React.FC<{ id: string | number }> = ({ id }) => {
11745
setCellValues(
11846
Array.from({ length: 6 }, (_, i) => {
11947
const variableName = `HVSCU/battery${id}_cell${i + 1}`;
120-
const measurementInfo = getNumericMeasurementInfo(variableName);
121-
if (!measurementInfo) return null;
122-
const deltaTrackedGetter = createDeltaTrackedGetter(variableName, measurementInfo.getUpdate);
123-
return deltaTrackedGetter();
48+
return getNumericMeasurementInfo(variableName)?.getUpdate() ?? 0;
12449
})
12550
);
12651

127-
const temp1Info = getNumericMeasurementInfo(temp1VariableName);
128-
const temp2Info = getNumericMeasurementInfo(temp2VariableName);
129-
130-
if (temp1Info) {
131-
const temp1Getter = createDeltaTrackedGetter(temp1VariableName, temp1Info.getUpdate);
132-
setTemperature1(temp1Getter());
133-
}
134-
135-
if (temp2Info) {
136-
const temp2Getter = createDeltaTrackedGetter(temp2VariableName, temp2Info.getUpdate);
137-
setTemperature2(temp2Getter());
138-
}
52+
setTemperature1(getNumericMeasurementInfo(temp1VariableName)?.getUpdate() ?? 0);
53+
setTemperature2(getNumericMeasurementInfo(temp2VariableName)?.getUpdate() ?? 0);
13954
});
14055

141-
const getColorFromValue = (value: number | null, min: number, max: number, showDisconnected: boolean) => {
142-
if (showDisconnected || value === null) return styles.disconnected;
56+
const getColorFromValue = (value: number, min: number, max: number, showDisconnected: boolean) => {
57+
if (showDisconnected) return styles.disconnected;
14358
if (value < min) return styles.yellow;
14459
if (value > max) return styles.red;
14560
return styles.green;
@@ -148,30 +63,26 @@ const BatteriesModule: React.FC<{ id: string | number }> = ({ id }) => {
14863
const showDisconnected = lostConnection || !hasReceivedData;
14964

15065
const Cell: React.FC<CellProps> = ({ value, min, max }) => {
151-
const isStale = value === null;
152-
const colorClass = getColorFromValue(value, min, max, showDisconnected || isStale);
153-
const displayValue = value !== null ? value : 0;
154-
const formattedValue = isStale || showDisconnected ? "-.---" : Math.max(0, Math.min(9.999, displayValue)).toFixed(3);
66+
const colorClass = getColorFromValue(value, min, max, showDisconnected);
67+
const formattedValue = Math.max(0, Math.min(9.999, value)).toFixed(3);
15568
return (
15669
<div
15770
className={`${styles.cell} ${colorClass}`}
158-
title={showDisconnected || isStale ? "DISCONNECTED" : `${displayValue.toFixed(3)} V`}
71+
title={showDisconnected ? "DISCONNECTED" : `${value.toFixed(3)} V`}
15972
>
160-
<span className={styles.cellText}>{formattedValue}{(showDisconnected || isStale) ? "" : "V"}</span>
73+
<span className={styles.cellText}>{formattedValue}{showDisconnected ? "" : "V"}</span>
16174
</div>
16275
);
16376
};
16477

16578
const TemperatureIndicator: React.FC<TemperatureProps> = ({ value, min, max, label }) => {
166-
const isStale = value === null;
167-
const colorClass = getColorFromValue(value, min, max, showDisconnected || isStale);
168-
const displayValue = value !== null ? value : 0;
169-
const formattedValue = isStale || showDisconnected ? "-.--" : displayValue.toFixed(1);
79+
const colorClass = getColorFromValue(value, min, max, showDisconnected);
80+
const formattedValue = value.toFixed(1);
17081
return (
17182
<div className={styles.temperatureIndicator}>
17283
<span className={styles.temperatureLabel}>{label}</span>
17384
<div className={`${styles.temperatureValue} ${colorClass}`}>
174-
<span className={styles.temperatureText}>{formattedValue}{(showDisconnected || isStale) ? "" : "°C"}</span>
85+
<span className={styles.temperatureText}>{formattedValue}{showDisconnected ? "" : "°C"}</span>
17586
</div>
17687
</div>
17788
);

0 commit comments

Comments
 (0)