1- import { Measurement , NumericMeasurement , isNumericMeasurement } from "../models" ;
1+ import {
2+ Measurement ,
3+ NumericMeasurement ,
4+ isNumericMeasurement ,
5+ } from '../models' ;
26import {
37 getBooleanMeasurement ,
48 getEnumMeasurement ,
59 getNumericMeasurement ,
610 isNumericAdapter ,
711 PodDataAdapter ,
812 PacketUpdate ,
9- } from "../adapters" ;
10- import { create } from "zustand" ;
11- import { isNumericType } from "../BackendTypes" ;
13+ } from '../adapters' ;
14+ import { create } from 'zustand' ;
15+ import { isNumericType } from '../BackendTypes' ;
16+ import { NumericValue } from '../models/PodData/Measurement' ;
1217
13- export type Measurements = Record < string , Measurement >
18+ export type Measurements = Record < string , Measurement > ;
1419export type MeasurementId = string ;
1520export type MeasurementName = string ;
1621export type MeasurementColor = string ;
1722export type MeasurementUnits = string ;
1823export type UpdateFunction = ( ) => number ;
1924export type NumericMeasurementInfo = {
20- readonly id : MeasurementId ;
21- readonly name : MeasurementName ;
22- readonly range : [ number | null , number | null ] ;
23- readonly color : MeasurementColor ;
24- readonly units : MeasurementUnits ;
25- readonly getUpdate : UpdateFunction ;
25+ readonly id : MeasurementId ;
26+ readonly name : MeasurementName ;
27+ readonly range : [ number | null , number | null ] ;
28+ readonly color : MeasurementColor ;
29+ readonly units : MeasurementUnits ;
30+ readonly getUpdate : UpdateFunction ;
2631} ;
2732
2833export interface MeasurementsStore {
2934 measurements : Measurements ;
3035 packetIdToBoard : Record < number , string > ;
3136 initMeasurements : ( podDataAdapter : PodDataAdapter ) => void ;
32- updateMeasurements : ( measurements : Record < string , PacketUpdate > ) => void
37+ updateMeasurements : ( measurements : Record < string , PacketUpdate > ) => void ;
38+ showMeasurementLatest : ( id : string , showLatest : boolean ) => void ;
3339 getMeasurement : ( id : MeasurementId ) => Measurement ;
3440 getNumericMeasurementInfo : ( id : MeasurementId ) => NumericMeasurementInfo ;
3541 getMeasurementFallback : ( id : MeasurementId ) => Measurement ;
@@ -43,43 +49,53 @@ export const useMeasurementsStore = create<MeasurementsStore>((set, get) => ({
4349 /**
4450 * Reducer that receives a PodDataAdapter and initializes the measurements
4551 * and packetIdToBoard map in state.
46- * @param {PodDataAdapter } podDataAdapter
52+ * @param {PodDataAdapter } podDataAdapter
4753 * @returns {Measurements }
4854 */
4955 initMeasurements : ( podDataAdapter : PodDataAdapter ) => {
50- set ( state => ( {
56+ set ( ( state ) => ( {
5157 ...state ,
5258 measurements : createMeasurementsFromPodDataAdapter ( podDataAdapter ) ,
5359 packetIdToBoard : getPacketIdToBoard ( podDataAdapter ) ,
54- } ) )
60+ } ) ) ;
5561 } ,
5662
5763 /**
5864 * Reducer that updates the measurements in the state.
5965 * It receives a measurements map with PacketUpdates, extract the measurements
6066 * from each of them and updates the measurements.
61- * @param {Record<string, PacketUpdate> } measurements
67+ * @param {Record<string, PacketUpdate> } measurements
6268 */
6369 updateMeasurements : ( measurements : Record < string , PacketUpdate > ) => {
64-
6570 const measurementsDraft = get ( ) . measurements ;
6671
67- for ( const update of Object . values ( measurements ) ) {
68- for ( const [ id , mUpdate ] of Object . entries ( update . measurementUpdates ) ) {
72+ for ( const update of Object . values ( measurements ) ) {
73+ for ( const [ id , mUpdate ] of Object . entries (
74+ update . measurementUpdates
75+ ) ) {
6976 const boardName = get ( ) . packetIdToBoard [ update . id ] ;
7077 if ( ! boardName ) {
7178 continue ;
7279 }
7380
7481 const measurementId = `${ boardName } /${ id } ` ;
75- measurementsDraft [ measurementId ] . value = mUpdate ;
82+ if ( typeof mUpdate != 'string' && typeof mUpdate != 'boolean' ) {
83+ (
84+ measurementsDraft [ measurementId ] . value as NumericValue
85+ ) . last = mUpdate . last ;
86+ (
87+ measurementsDraft [ measurementId ] . value as NumericValue
88+ ) . average = mUpdate . average ;
89+ } else {
90+ measurementsDraft [ measurementId ] . value = mUpdate ;
91+ }
7692 }
7793 }
78-
79- set ( state => ( {
94+
95+ set ( ( state ) => ( {
8096 ...state ,
81- measurements : measurementsDraft
82- } ) )
97+ measurements : measurementsDraft ,
98+ } ) ) ;
8399 } ,
84100
85101 clearMeasurements : ( board : string ) => {
@@ -91,19 +107,39 @@ export const useMeasurementsStore = create<MeasurementsStore>((set, get) => ({
91107 measurementsDraft [ measurementId ] . value = {
92108 average : 0 ,
93109 last : 0 ,
94- }
95- } else if ( measurementsDraft [ measurementId ] . type == "bool" ) {
96- measurementsDraft [ measurementId ] . value = false
110+ showLatest : false ,
111+ } ;
112+ } else if ( measurementsDraft [ measurementId ] . type == 'bool' ) {
113+ measurementsDraft [ measurementId ] . value = false ;
97114 } else {
98- measurementsDraft [ measurementId ] . value = " Default"
115+ measurementsDraft [ measurementId ] . value = ' Default' ;
99116 }
100117 }
101118 }
102119
103- set ( state => ( {
120+ set ( ( state ) => ( {
104121 ...state ,
105- measurements : measurementsDraft
106- } ) )
122+ measurements : measurementsDraft ,
123+ } ) ) ;
124+ } ,
125+
126+ showMeasurementLatest : ( id : string , showLatest : boolean ) => {
127+ set ( ( state ) => {
128+ const draft = state . measurements ;
129+
130+ if (
131+ id in draft &&
132+ typeof draft [ id ] . value != 'string' &&
133+ typeof draft [ id ] . value != 'boolean'
134+ ) {
135+ ( draft [ id ] . value as NumericValue ) . showLatest = showLatest ;
136+ }
137+
138+ return {
139+ ...state ,
140+ measurements : draft ,
141+ } ;
142+ } ) ;
107143 } ,
108144
109145 getMeasurement : ( id : string ) => {
@@ -127,17 +163,19 @@ export const useMeasurementsStore = create<MeasurementsStore>((set, get) => ({
127163 } ,
128164
129165 getMeasurementFallback : ( id : string ) => {
130- return get ( ) . measurements [ id ] ?? {
131- id : "Default" ,
132- name : "Default" ,
133- safeRange : [ null , null ] ,
134- warningRange : [ null , null ] ,
135- type : "uint8" ,
136- units : "A" ,
137- value : { average : 0 , last : 0 } ,
138- } ;
139- }
140- } ) )
166+ return (
167+ get ( ) . measurements [ id ] ?? {
168+ id : 'Default' ,
169+ name : 'Default' ,
170+ safeRange : [ null , null ] ,
171+ warningRange : [ null , null ] ,
172+ type : 'uint8' ,
173+ units : 'A' ,
174+ value : { average : 0 , last : 0 } ,
175+ }
176+ ) ;
177+ } ,
178+ } ) ) ;
141179
142180function createMeasurementsFromPodDataAdapter (
143181 podDataAdapter : PodDataAdapter
@@ -150,7 +188,7 @@ function createMeasurementsFromPodDataAdapter(
150188 const id = `${ board . name } /${ adapter . id } ` ;
151189 if ( isNumericAdapter ( adapter ) ) {
152190 measurements [ id ] = getNumericMeasurement ( id , adapter ) ;
153- } else if ( adapter . type == " bool" ) {
191+ } else if ( adapter . type == ' bool' ) {
154192 measurements [ id ] = getBooleanMeasurement ( id , adapter ) ;
155193 } else {
156194 measurements [ id ] = getEnumMeasurement ( id , adapter ) ;
@@ -180,4 +218,4 @@ function getRandomColor() {
180218 const b = Math . floor ( Math . random ( ) * 256 ) ;
181219
182220 return `rgb(${ r } , ${ g } , ${ b } )` ;
183- }
221+ }
0 commit comments