CEC-5356: use new can signal api

This commit is contained in:
Tristan Timblin
2023-11-06 14:51:25 -08:00
parent 4adbc1dd7f
commit 8c5a38b843
3 changed files with 61 additions and 28 deletions

View File

@@ -13,7 +13,7 @@ import {
} from "../../Contexts/CANSignalsContext"; } from "../../Contexts/CANSignalsContext";
const Main = ({ vin }) => { const Main = ({ vin }) => {
const { signals, setVIN } = useCANSignalContext(); const { signals, setVIN, duration } = useCANSignalContext();
useEffect(() => { useEffect(() => {
setVIN(vin); setVIN(vin);
@@ -26,6 +26,8 @@ const Main = ({ vin }) => {
if (!signals || signals.length === 0) return <h3>Loading...</h3>; if (!signals || signals.length === 0) return <h3>Loading...</h3>;
return ( return (
<>
(Received within the last {duration} seconds)
<Table> <Table>
<TableHead> <TableHead>
<TableRow> <TableRow>
@@ -44,6 +46,7 @@ const Main = ({ vin }) => {
))} ))}
</TableBody> </TableBody>
</Table> </Table>
</>
); );
}; };

View File

@@ -1,8 +1,8 @@
import React, {useContext, useState} from "react"; import React, { useContext, useState } from "react";
import api from "../../services/vehiclesAPI"; import api from "../../services/vehiclesAPI";
import { LocalDateTimeString } from "../../utils/dates"; import { LocalDateTimeString } from "../../utils/dates";
import {useInterval} from "usehooks-ts"; import { useInterval } from "usehooks-ts";
const CANSignalContext = React.createContext(); const CANSignalContext = React.createContext();
@@ -26,31 +26,44 @@ const transformSignals = (signals) =>
.flat(); .flat();
export const CANSignalProvider = ({ token, children }) => { export const CANSignalProvider = ({ token, children }) => {
// auto scale polling if not getting response
const durations = [10000, 30000, 60000, 120000];
const delays = [500, 1500, 3000, 6000];
const [vin, setVIN] = useState(null); const [vin, setVIN] = useState(null);
const [signals, setSignals] = useState([]); const [signals, setSignals] = useState([]);
const [delay, setDelay] = useState(500); const [delayIndex, setDelayIndex] = useState(0);
useInterval( useInterval(
() => { () => {
getCANSignals() getCANSignals()
}, vin?delay:null }, vin ? delays[delayIndex] : null
) )
const getCANSignals = async () => { const getCANSignals = async () => {
try { try {
if (!vin) return; if (!vin) return;
const result = await api.getCANSignals(vin, token); const date = new Date();
date.setUTCSeconds(date.getUTCSeconds() - durations[delayIndex]);
const result = await api.getCANSignals(vin, {
after_utc: date,
}, token);
if (result.error) if (result.error)
throw new Error(`Get CAN signals error. ${result.message}`); throw new Error(`Get CAN signals error. ${result.message}`);
const items = transformSignals(result.data); const items = transformSignals(result.data);
if (items.length > 0) { if (items.length > 0) {
setDelay(500); setDelayIndex(0);
setSignals(items); setSignals(items);
} else { } else {
setDelay(1000); setDelayIndex((index) => {
if (index < delays.length - 1) {
return index += 1;
}
return index;
});
setSignals([BlankSignal("No signals")]); setSignals([BlankSignal("No signals")]);
} }
} catch (e) { } catch (e) {
@@ -61,6 +74,7 @@ export const CANSignalProvider = ({ token, children }) => {
return ( return (
<CANSignalContext.Provider <CANSignalContext.Provider
value={{ value={{
duration: durations[delayIndex] / 1000,
signals, signals,
setVIN, setVIN,
}} }}

View File

@@ -213,8 +213,23 @@ const vehiclesAPI = {
.then(fetchRespHandler) .then(fetchRespHandler)
.catch(errorHandler), .catch(errorHandler),
getCANSignals: async (vin, token) => /**
fetch(`${API_ENDPOINT}/cansignals/${vin}`, { *
* @param {String} vin The VIN of the car
* @param {Object} filter
* @param {Date} filter.after_utc Point in time to begin signal response
* @param {Integer} filter.limit Max number of CAN Signals to return
* @param {String} token
* @returns {Array}
*/
getCANSignals: async (vin, filter = {}, token) => {
if (filter.after_utc instanceof Date && !isNaN(filter.after_utc)) {
filter.after_utc = filter.after_utc.getTime();
}
const url = addQueryParams(`${API_ENDPOINT}/cansignals/${vin}`, filter);
console.log(url)
return fetch(url, {
method: "GET", method: "GET",
headers: Object.assign( headers: Object.assign(
{ "Content-Type": "application/json" }, { "Content-Type": "application/json" },
@@ -222,7 +237,8 @@ const vehiclesAPI = {
), ),
}) })
.then(fetchRespHandler) .then(fetchRespHandler)
.catch(errorHandler), .catch(errorHandler);
},
getTRexLogs: async (vin, date, offset, count, direction, token, controller) => getTRexLogs: async (vin, date, offset, count, direction, token, controller) =>
fetch(`${API_ENDPOINT}/vehicle/${vin}/trex-logs?date=${date}&offset=${offset}&count=${count}&direction=${direction}`, { fetch(`${API_ENDPOINT}/vehicle/${vin}/trex-logs?date=${date}&offset=${offset}&count=${count}&direction=${direction}`, {