diff --git a/common-front/lib/broker/BrokerStructure.ts b/common-front/lib/broker/BrokerStructure.ts index da75ee1f4..390ebe0e5 100644 --- a/common-front/lib/broker/BrokerStructure.ts +++ b/common-front/lib/broker/BrokerStructure.ts @@ -25,6 +25,7 @@ export type BrokerStructure = { }; "message/update": { request: never; response: MessageAdapter }; "logger/enable": { request: boolean; response: boolean }; + "logger/variables": { request: string[]; response: boolean }; "blcu/upload": { request: BootloaderUploadRequest; response: BootloaderUploadResponse; diff --git a/common-front/lib/models/PodData/Measurement.ts b/common-front/lib/models/PodData/Measurement.ts index 5e55ca9cc..74d46852c 100644 --- a/common-front/lib/models/PodData/Measurement.ts +++ b/common-front/lib/models/PodData/Measurement.ts @@ -9,6 +9,7 @@ export type Measurement = type AbstractMeasurement = { id: string; name: string; + log?: boolean; }; export type NumericMeasurement = AbstractMeasurement & { @@ -23,7 +24,7 @@ export type NumericValue = { last: number; average: number; showLatest: boolean; -}; +} export type BooleanMeasurement = AbstractMeasurement & { type: 'bool'; diff --git a/common-front/lib/store/measurementsStore.ts b/common-front/lib/store/measurementsStore.ts index 315179d40..fb5fb2e5d 100644 --- a/common-front/lib/store/measurementsStore.ts +++ b/common-front/lib/store/measurementsStore.ts @@ -1,7 +1,6 @@ import { Measurement, NumericMeasurement, - isNumericMeasurement, } from '../models'; import { getBooleanMeasurement, @@ -62,6 +61,8 @@ export interface MeasurementsStore { getEnumMeasurementInfo: (id: MeasurementId) => EnumMeasurementInfo; getMeasurementFallback: (id: MeasurementId) => Measurement; clearMeasurements: (board: string) => void; + setLogAll: (log: boolean) => void; + getLogVariables: () => string[]; } export const useMeasurementsStore = create((set, get) => ({ @@ -240,6 +241,25 @@ export const useMeasurementsStore = create((set, get) => ({ } ); }, + + setLogAll: (log: boolean) => { + const measurementsDraft = get().measurements; + for (const id in measurementsDraft) { + const m = measurementsDraft[id]; + m.log = log; + } + set((state) => ({ + ...state, + measurements: measurementsDraft, + })); + }, + + getLogVariables: () => { + const measurements = get().measurements; + return Object.values(measurements) + .filter(m => m.log !== false) + .map(m => m.id); + }, })); function createMeasurementsFromPodDataAdapter( diff --git a/common-front/lib/wsHandler/HandlerMessages.ts b/common-front/lib/wsHandler/HandlerMessages.ts index 2c1c4f44a..4c145005c 100644 --- a/common-front/lib/wsHandler/HandlerMessages.ts +++ b/common-front/lib/wsHandler/HandlerMessages.ts @@ -19,6 +19,7 @@ export type HandlerMessages = { "message/update": Subscription; "logger/enable": PostRequest; "logger/response": Subscription; + "logger/variables": PostRequest; "blcu/upload": Exchange; "blcu/download": Exchange< BootloaderDownloadRequest, diff --git a/ethernet-view/src/components/Logger/useLogger.ts b/ethernet-view/src/components/Logger/useLogger.ts index 4d9e2b169..c4fc57df9 100644 --- a/ethernet-view/src/components/Logger/useLogger.ts +++ b/ethernet-view/src/components/Logger/useLogger.ts @@ -1,21 +1,24 @@ import { useSubscribe, useWsHandler } from "common"; import { useState } from "react"; +import { useMeasurementsStore } from "common"; export function useLogger() { const [state, setState] = useState(false); const handler = useWsHandler(); - const log = (enable: boolean) => { - handler.post("logger/enable", enable); - }; + function getLoggedVariableIds() { + return useMeasurementsStore.getState().getLogVariables(); + } function startLogging() { - log(true); + const variables = getLoggedVariableIds(); + handler.post("logger/variables", variables); + handler.post("logger/enable", true); } function stopLogging() { - log(false); + handler.post("logger/enable", false); } useSubscribe("logger/response", (result) => { diff --git a/ethernet-view/src/components/ReceiveTable/BoardView/PacketView/MeasurementView/MeasurementView.tsx b/ethernet-view/src/components/ReceiveTable/BoardView/PacketView/MeasurementView/MeasurementView.tsx index 97bd6bbc8..a1991c47a 100644 --- a/ethernet-view/src/components/ReceiveTable/BoardView/PacketView/MeasurementView/MeasurementView.tsx +++ b/ethernet-view/src/components/ReceiveTable/BoardView/PacketView/MeasurementView/MeasurementView.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import styles from './MeasurementView.module.scss'; import { Measurement, @@ -31,18 +32,50 @@ export const MeasurementView = ({ measurement }: Props) => { setShowMeasurementLatest(event.currentTarget.checked); }; + const setLog = (log: boolean) => { + useMeasurementsStore.setState(state => { + const measurements = { ...state.measurements }; + measurements[measurement.id] = { ...measurements[measurement.id], log }; + return { ...state, measurements }; + }); + }; + + const logChecked = useMeasurementsStore(state => state.measurements[measurement.id]?.log !== false); + + React.useEffect(() => { + const handler = (e: any) => { + setLog(e.detail); + }; + window.addEventListener('log-all', handler); + return () => window.removeEventListener('log-all', handler); + }, [setLog]); + return ( <> - {measurement.name} + + setLog(e.currentTarget.checked)} + /> + + {measurement.name} + + {isNumeric && ( <> - + + + {measurement.units} {measurement.type} diff --git a/ethernet-view/src/components/ReceiveTable/ReceiveTable.tsx b/ethernet-view/src/components/ReceiveTable/ReceiveTable.tsx index 17dc07dde..88d57526f 100644 --- a/ethernet-view/src/components/ReceiveTable/ReceiveTable.tsx +++ b/ethernet-view/src/components/ReceiveTable/ReceiveTable.tsx @@ -2,16 +2,34 @@ import styles from "./ReceiveTable.module.scss"; import { BoardView } from "./BoardView/BoardView"; import { Header } from "./Header/Header"; import { TableUpdater } from "./TableUpdater"; -import { Board } from "common"; +import { Board, useMeasurementsStore} from "common"; type Props = { boards: Board[]; }; export const ReceiveTable = ({ boards }: Props) => { + const handleLogAll = (log: boolean) => { + useMeasurementsStore.getState().setLogAll(log); + }; return (
+
+
+ + +
{boards