diff --git a/src/components/Cars/CANSignals/index.jsx b/src/components/Cars/CANSignals/index.jsx index 37febbc..0dfe8bd 100644 --- a/src/components/Cars/CANSignals/index.jsx +++ b/src/components/Cars/CANSignals/index.jsx @@ -5,6 +5,11 @@ import { TableCell, TableHead, TableRow, + Box, + FormControl, + InputLabel, + Select, + MenuItem, } from "@material-ui/core"; import { @@ -13,7 +18,7 @@ import { } from "../../Contexts/CANSignalsContext"; const Main = ({ vin }) => { - const { signals, setVIN } = useCANSignalContext(); + const { signals, setVIN, queryDate, delays, delayIndex, setDelayIndex } = useCANSignalContext(); useEffect(() => { setVIN(vin); @@ -26,24 +31,31 @@ const Main = ({ vin }) => { if (!signals || signals.length === 0) return

Loading...

; return ( - - - - Timestamp - Signal - Value - - - - {signals.map((signal, i) => ( - - {signal.timestamp} - {signal.signal} - {signal.value} + <> + + Searching every + + seconds for signals sent after {queryDate}. + +
+ + + Timestamp + Signal + Value - ))} - -
+ + + {signals.map((signal, i) => ( + + {signal.timestamp} + {signal.signal} + {signal.value} + + ))} + + + ); }; @@ -53,4 +65,33 @@ const CANSignals = (props) => ( ); +const DelayController = ({ + delays, + delayIndex, + setDelayIndex +}) => { + const label = "Delay"; + const handleChange = (event) => { + setDelayIndex(event.target.value); + } + + return ( + + {label} + + + ) +} + export default CANSignals; diff --git a/src/components/Contexts/CANSignalsContext.jsx b/src/components/Contexts/CANSignalsContext.jsx index 30c49b8..d399159 100644 --- a/src/components/Contexts/CANSignalsContext.jsx +++ b/src/components/Contexts/CANSignalsContext.jsx @@ -1,8 +1,8 @@ -import React, {useContext, useState} from "react"; +import React, { useContext, useState } from "react"; import api from "../../services/vehiclesAPI"; import { LocalDateTimeString } from "../../utils/dates"; -import {useInterval} from "usehooks-ts"; +import { useInterval } from "usehooks-ts"; const CANSignalContext = React.createContext(); @@ -26,31 +26,43 @@ const transformSignals = (signals) => .flat(); export const CANSignalProvider = ({ token, children }) => { + // auto scale polling if not getting response + const delays = [500, 1500, 3000, 6000]; + const [delayIndex, setDelayIndex] = useState(2); const [vin, setVIN] = useState(null); const [signals, setSignals] = useState([]); - const [delay, setDelay] = useState(500); + const [utc, setUtc] = useState(undefined); useInterval( () => { getCANSignals() - }, vin?delay:null - ) + }, vin ? delays[delayIndex] : null + ); const getCANSignals = async () => { try { if (!vin) return; - const result = await api.getCANSignals(vin, token); - if (result.error) + const result = await api.getCANSignals(vin, { + after_utc: utc, + }, token); + + if (result.error) { throw new Error(`Get CAN signals error. ${result.message}`); + } + + const mostRecentTimestamp = result.data?.[0]?.timestamp; + if (mostRecentTimestamp) { + setUtc(new Date(mostRecentTimestamp).getTime() - 50); // apply slight offset to ensure last CAN Signals sent before sleep are returned. + } else { + setUtc(new Date().getTime()); + } const items = transformSignals(result.data); if (items.length > 0) { - setDelay(500); setSignals(items); } else { - setDelay(1000); setSignals([BlankSignal("No signals")]); } } catch (e) { @@ -61,8 +73,12 @@ export const CANSignalProvider = ({ token, children }) => { return ( {children} diff --git a/src/components/Contexts/CANSignalsContext.test.jsx b/src/components/Contexts/CANSignalsContext.test.jsx index 57b98e8..13be103 100644 --- a/src/components/Contexts/CANSignalsContext.test.jsx +++ b/src/components/Contexts/CANSignalsContext.test.jsx @@ -8,7 +8,7 @@ import { waitFor, act, } from "@testing-library/react"; -import {CANSignalProvider, useCANSignalContext} from "./CANSignalsContext"; +import { CANSignalProvider, useCANSignalContext } from "./CANSignalsContext"; const checkSignalsResults = (filters) => { expect(screen.getByTestId("signals").innerHTML).toEqual(filters); @@ -19,14 +19,15 @@ describe("CANSignalsContext", () => { beforeEach(() => { jest.useFakeTimers("setInterval"); const TestComp = () => { - const { signals, setVIN } = useCANSignalContext(); + const { signals, setVIN, setDelayIndex } = useCANSignalContext(); + setDelayIndex(0); return ( <>
{JSON.stringify(signals)}