1- import React , { useState , useContext , useRef , useMemo } from "react" ;
1+ import React , { useState , useContext } from "react" ;
22import styles from "./BatteriesModule.module.scss" ;
33import { useGlobalTicker , useMeasurementsStore , usePodDataStore } from "common" ;
44import { LostConnectionContext } from "services/connections" ;
5- import { DELTA_SAMPLE_PERIOD , DELTA_GRACE_PERIOD } from "constants/deltaTracking" ;
65
76interface CellProps {
8- value : number | null ;
7+ value : number ;
98 min : number ;
109 max : number ;
1110}
1211
1312interface 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