@@ -102,46 +102,60 @@ export function updateSignalRaw(signal: Signal) {
102102 }
103103 }
104104}
105- export function updateSignalPhys ( row : Signal ) {
105+ export function updateSignalPhys ( row : Signal , db : DBC ) {
106106 if ( row . physValue === undefined ) return
107107
108108 if ( row . values || row . valueTable ) {
109- // For enum values, directly set the phys value as raw value
110- row . value = typeof row . physValue === 'number' ? row . physValue : 0
111- } else {
112- const physValue = typeof row . physValue === 'number' ? row . physValue : 0
113- // Handle float value types
114- if ( row . valueType === 1 ) {
115- // IEEE Float (single precision)
116- const buffer = new ArrayBuffer ( 4 )
117- const view = new DataView ( buffer )
118- view . setFloat32 ( 0 , physValue , row . isLittleEndian ) // true for little-endian
119- row . value = view . getUint32 ( 0 , row . isLittleEndian )
120- } else if ( row . valueType === 2 ) {
121- // IEEE Double (double precision)
122- const buffer = new ArrayBuffer ( 8 )
123- const view = new DataView ( buffer )
124- view . setFloat64 ( 0 , physValue , row . isLittleEndian )
125- // For simplicity, we're only using the lower 32 bits
126- // This is a limitation as JavaScript numbers can't fully represent 64-bit integers
127- row . value = view . getUint32 ( 0 , row . isLittleEndian )
128- } else {
129- // Clamp physical value to min/max if defined
130- let clampedPhysValue = physValue
131- if ( row . minimum !== undefined && physValue < row . minimum ) {
132- clampedPhysValue = row . minimum
133- } else if ( row . maximum !== undefined && physValue > row . maximum ) {
134- clampedPhysValue = row . maximum
109+ // For enum values, comapre the phys value with the values or valueTable and set the raw value
110+ if ( row . values ) {
111+ const v = row . values . find ( ( v ) => v . value === row . physValue )
112+ if ( v ) {
113+ row . value = v . value
114+ return
135115 }
136-
137- // Update physical value if it was clamped
138- if ( clampedPhysValue !== physValue ) {
139- row . physValue = clampedPhysValue
116+ } else if ( row . valueTable ) {
117+ const vt = Object . values ( db . valueTables ) . find ( ( vt ) => vt . name === row . valueTable )
118+ if ( vt ) {
119+ const v = vt . values . find ( ( v ) => v . value === row . physValue )
120+ if ( v ) {
121+ row . value = v . value
122+ return
123+ }
140124 }
125+ }
126+ }
127+ const physValue = typeof row . physValue === 'number' ? row . physValue : 0
128+ // Handle float value types
129+ if ( row . valueType === 1 ) {
130+ // IEEE Float (single precision)
131+ const buffer = new ArrayBuffer ( 4 )
132+ const view = new DataView ( buffer )
133+ view . setFloat32 ( 0 , physValue , row . isLittleEndian ) // true for little-endian
134+ row . value = view . getUint32 ( 0 , row . isLittleEndian )
135+ } else if ( row . valueType === 2 ) {
136+ // IEEE Double (double precision)
137+ const buffer = new ArrayBuffer ( 8 )
138+ const view = new DataView ( buffer )
139+ view . setFloat64 ( 0 , physValue , row . isLittleEndian )
140+ // For simplicity, we're only using the lower 32 bits
141+ // This is a limitation as JavaScript numbers can't fully represent 64-bit integers
142+ row . value = view . getUint32 ( 0 , row . isLittleEndian )
143+ } else {
144+ // Clamp physical value to min/max if defined
145+ let clampedPhysValue = physValue
146+ if ( row . minimum !== undefined && physValue < row . minimum ) {
147+ clampedPhysValue = row . minimum
148+ } else if ( row . maximum !== undefined && physValue > row . maximum ) {
149+ clampedPhysValue = row . maximum
150+ }
141151
142- // Calculate and set raw value
143- row . value = physToRaw ( clampedPhysValue , row )
152+ // Update physical value if it was clamped
153+ if ( clampedPhysValue !== physValue ) {
154+ row . physValue = clampedPhysValue
144155 }
156+
157+ // Calculate and set raw value
158+ row . value = physToRaw ( clampedPhysValue , row )
145159 }
146160}
147161
0 commit comments