Skip to content

Commit 39e38d6

Browse files
authored
Merge branch 'develop' into backend/unit-tests
2 parents 62c5c4e + 07c83d0 commit 39e38d6

7 files changed

Lines changed: 225 additions & 150 deletions

File tree

common-front/lib/adapters/PodData.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ import {
66
EnumMeasurement,
77
Measurement,
88
NumericMeasurement,
9-
} from "../models";
9+
} from '../models';
1010

11-
import { NumericType, isNumericType } from "../BackendTypes";
11+
import { NumericType, isNumericType } from '../BackendTypes';
1212

1313
export type PodDataAdapter = { boards: { [name: string]: BoardAdapter } };
1414

15-
type BoardAdapter = Omit<Board, "measurementToPacket" | "packets"> & {
15+
type BoardAdapter = Omit<Board, 'measurementToPacket' | 'packets'> & {
1616
packets: { [id: number]: PacketAdapter };
1717
};
1818

19-
export type PacketAdapter = Omit<Packet, "measurements"> & {
19+
export type PacketAdapter = Omit<Packet, 'measurements'> & {
2020
measurements: { [name: string]: MeasurementAdapter };
2121
};
2222

@@ -25,9 +25,9 @@ export type MeasurementAdapter =
2525
| BooleanMeasurementAdapter
2626
| EnumMeasurementAdapter;
2727

28-
export type NumericMeasurementAdapter = Omit<NumericMeasurement, "value">;
29-
export type BooleanMeasurementAdapter = Omit<BooleanMeasurement, "value">;
30-
export type EnumMeasurementAdapter = Omit<EnumMeasurement, "value">;
28+
export type NumericMeasurementAdapter = Omit<NumericMeasurement, 'value'>;
29+
export type BooleanMeasurementAdapter = Omit<BooleanMeasurement, 'value'>;
30+
export type EnumMeasurementAdapter = Omit<EnumMeasurement, 'value'>;
3131

3232
export function createPodDataFromAdapter(adapter: PodDataAdapter): PodData {
3333
const boards: Board[] = Object.values(adapter.boards).map(
@@ -73,7 +73,7 @@ function getMeasurements(
7373
const id = `${boardName}/${adapter.id}`;
7474
if (isNumericAdapter(adapter)) {
7575
return getNumericMeasurement(id, adapter);
76-
} else if (adapter.type == "enum") {
76+
} else if (adapter.type == 'enum') {
7777
return getEnumMeasurement(id, adapter);
7878
} else {
7979
return getBooleanMeasurement(id, adapter);
@@ -101,6 +101,7 @@ export function getNumericMeasurement(
101101
value: {
102102
average: 0,
103103
last: 0,
104+
showLatest: false,
104105
},
105106
units: adapter.units,
106107
safeRange: adapter.safeRange,
@@ -115,8 +116,8 @@ export function getEnumMeasurement(
115116
return {
116117
id: id,
117118
name: adapter.name,
118-
type: "enum",
119-
value: "Default",
119+
type: 'enum',
120+
value: 'Default',
120121
};
121122
}
122123

@@ -127,7 +128,7 @@ export function getBooleanMeasurement(
127128
return {
128129
id: id,
129130
name: adapter.name,
130-
type: adapter.type as "bool",
131+
type: adapter.type as 'bool',
131132
value: false,
132133
};
133134
}
@@ -147,7 +148,7 @@ export function getBooleanMeasurement(
147148
export function getPacketToBoard(
148149
boards: Record<string, BoardAdapter>
149150
): Record<number, number> {
150-
let packetToBoard: PodData["packetToBoard"] = {};
151+
let packetToBoard: PodData['packetToBoard'] = {};
151152

152153
Object.values(boards).forEach((board, index) => {
153154
Object.values(board.packets).forEach((packet) => {
@@ -161,7 +162,7 @@ export function getPacketToBoard(
161162
export function getMeasurementToPacket(
162163
packets: Record<string, PacketAdapter>
163164
): Record<string, number> {
164-
let measurementToPacket: Board["measurementToPacket"] = {};
165+
let measurementToPacket: Board['measurementToPacket'] = {};
165166

166167
Object.values(packets).forEach((packet) => {
167168
Object.values(packet.measurements).forEach(

common-front/lib/models/PodData/Measurement.ts

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NumericType, isNumericType } from "../../BackendTypes";
1+
import { NumericType, isNumericType } from '../../BackendTypes';
22

33
export type Measurement =
44
| NumericMeasurement
@@ -19,15 +19,19 @@ export type NumericMeasurement = AbstractMeasurement & {
1919
warningRange: [number | null, number | null];
2020
};
2121

22-
export type NumericValue = { last: number; average: number };
22+
export type NumericValue = {
23+
last: number;
24+
average: number;
25+
showLatest: boolean;
26+
};
2327

2428
export type BooleanMeasurement = AbstractMeasurement & {
25-
type: "bool";
29+
type: 'bool';
2630
value: boolean;
2731
};
2832

2933
export type EnumMeasurement = AbstractMeasurement & {
30-
type: "enum";
34+
type: 'enum';
3135
value: string;
3236
};
3337

@@ -67,16 +71,16 @@ export function isNumericMeasurement(
6771

6872
export function isNumber(type: string) {
6973
switch (type) {
70-
case "uint8":
71-
case "uint16":
72-
case "uint32":
73-
case "uint64":
74-
case "int8":
75-
case "int16":
76-
case "int32":
77-
case "int64":
78-
case "float32":
79-
case "float64":
74+
case 'uint8':
75+
case 'uint16':
76+
case 'uint32':
77+
case 'uint64':
78+
case 'int8':
79+
case 'int16':
80+
case 'int32':
81+
case 'int64':
82+
case 'float32':
83+
case 'float64':
8084
return true;
8185
default:
8286
return false;
@@ -85,20 +89,20 @@ export function isNumber(type: string) {
8589

8690
export function getNumber(type: string, value: string): number {
8791
switch (type) {
88-
case "uint8":
89-
case "uint16":
90-
case "uint32":
91-
case "uint64":
92-
case "int8":
93-
case "int16":
94-
case "int32":
95-
case "int64":
92+
case 'uint8':
93+
case 'uint16':
94+
case 'uint32':
95+
case 'uint64':
96+
case 'int8':
97+
case 'int16':
98+
case 'int32':
99+
case 'int64':
96100
return Number.parseInt(value);
97-
case "float32":
98-
case "float64":
101+
case 'float32':
102+
case 'float64':
99103
return Number.parseFloat(value);
100104
default:
101-
console.error("Incorrect value type");
102-
throw "Incorrect value type";
105+
console.error('Incorrect value type');
106+
throw 'Incorrect value type';
103107
}
104108
}

common-front/lib/store/measurementsStore.ts

Lines changed: 82 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,41 @@
1-
import { Measurement, NumericMeasurement, isNumericMeasurement } from "../models";
1+
import {
2+
Measurement,
3+
NumericMeasurement,
4+
isNumericMeasurement,
5+
} from '../models';
26
import {
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>;
1419
export type MeasurementId = string;
1520
export type MeasurementName = string;
1621
export type MeasurementColor = string;
1722
export type MeasurementUnits = string;
1823
export type UpdateFunction = () => number;
1924
export 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

2833
export 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

142180
function 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

Comments
 (0)