diff --git a/control-station/src/components/SensorBoxes/Console.tsx b/control-station/src/components/SensorBoxes/Console.tsx index c64704ee..c66de3c0 100644 --- a/control-station/src/components/SensorBoxes/Console.tsx +++ b/control-station/src/components/SensorBoxes/Console.tsx @@ -1,35 +1,30 @@ -import { useContext, useEffect, useRef, useState } from "react"; +import { useContext, useEffect, useRef } from "react"; import "./SensorData.css"; import PodContext from "@/services/PodContext"; function Console() { const { podData } = useContext(PodContext); - const [stateList, setStateList] = useState([]); const listEndRef = useRef(null); - useEffect(() => { - if (podData.state) { - setStateList((prev) => [...prev, podData.state]); - } - }, [podData.state]); - useEffect(() => { if (listEndRef.current) { listEndRef.current.scrollIntoView({ behavior: "smooth" }); } - }, [stateList]); + console.log(podData.messages); + }, [podData.messages]); return (

Console

    - {stateList.map((prop, index) => ( + {podData.messages.map((prop, index) => (
  • - {prop} State + {prop.timestamp}   + {prop.message.toUpperCase()} State
  • ))}
diff --git a/control-station/src/services/PodSocketClient.ts b/control-station/src/services/PodSocketClient.ts index d47552b6..d10af10f 100644 --- a/control-station/src/services/PodSocketClient.ts +++ b/control-station/src/services/PodSocketClient.ts @@ -18,6 +18,11 @@ interface ServerToClientEvents { serverResponse: (data: string) => void; } +interface Message { + timestamp: string; + message: string; +} + interface ClientToServerEvents { load: (ack: (data: string) => void) => void; run: (ack: (data: string) => void) => void; @@ -28,6 +33,7 @@ interface ClientToServerEvents { export interface PodData { connected: boolean; state: State; + messages: Message[]; } type SetPodData = Dispatch>; @@ -74,28 +80,28 @@ class PodSocketClient { sendLoad(): void { this.socket.emit("load", (response: string) => { console.log("Server acknowledged:", response); - this.setPodData((d) => ({ ...d, state: State.Load })); + this.addMessage(response, State.Load); }); } sendRun(): void { this.socket.emit("run", (response: string) => { console.log("Server acknowledged:", response); - this.setPodData((d) => ({ ...d, state: State.Running })); + this.addMessage(response, State.Running); }); } sendStop(): void { this.socket.emit("stop", (response: string) => { console.log("Server acknowledged:", response); - this.setPodData((d) => ({ ...d, state: State.Stopped })); + this.addMessage(response, State.Stopped); }); } sendHalt(): void { this.socket.emit("halt", (response: string) => { console.log("Server acknowledged:", response); - this.setPodData((d) => ({ ...d, state: State.Halted })); + this.addMessage(response, State.Halted); }); } @@ -114,6 +120,25 @@ class PodSocketClient { private onData(data: string): void { console.log("server says", data); } + + private addMessage(response: string, newState: State): void { + const currentTime = new Date(); + const hours = currentTime.getHours().toString().padStart(2, "0"); + const minutes = currentTime.getMinutes().toString().padStart(2, "0"); + const seconds = currentTime.getSeconds().toString().padStart(2, "0"); + const timestamp = `${hours}:${minutes}:${seconds}`; + + const newMessage: Message = { + timestamp: timestamp, + message: response, + }; + + this.setPodData((d) => ({ + ...d, + state: newState, + messages: d.messages ? [...d.messages, newMessage] : [newMessage], + })); + } } export default PodSocketClient; diff --git a/control-station/src/services/usePodData.tsx b/control-station/src/services/usePodData.tsx index 5eda1aca..14fd55c8 100644 --- a/control-station/src/services/usePodData.tsx +++ b/control-station/src/services/usePodData.tsx @@ -5,6 +5,7 @@ function usePodData() { const [podData, setPodData] = useState({ state: State.Disconnected, connected: false, + messages: [], }); const podSocketClient = useMemo(() => new PodSocketClient(setPodData), []); diff --git a/pod-operation/src/main.rs b/pod-operation/src/main.rs index 70bf076b..817b3637 100644 --- a/pod-operation/src/main.rs +++ b/pod-operation/src/main.rs @@ -26,39 +26,39 @@ async fn main() -> Result<(), Box> { let (layer, io) = SocketIo::new_layer(); - let signal_light = SignalLight::new(); - tokio::spawn(demo::blink(signal_light)); + // let signal_light = SignalLight::new(); + // tokio::spawn(demo::blink(signal_light)); - let upstream_pressure_transducer = PressureTransducer::upstream(); - tokio::spawn(demo::read_pressure_transducer(upstream_pressure_transducer)); + // let upstream_pressure_transducer = PressureTransducer::upstream(); + // tokio::spawn(demo::read_pressure_transducer(upstream_pressure_transducer)); - let downstream_pressure_transducer = PressureTransducer::downstream(); - tokio::spawn(demo::read_pressure_transducer( - downstream_pressure_transducer, - )); + // let downstream_pressure_transducer = PressureTransducer::downstream(); + // tokio::spawn(demo::read_pressure_transducer( + // downstream_pressure_transducer, + // )); - let ads1015 = LimTemperature::new(ads1x1x::SlaveAddr::Default); - tokio::spawn(demo::read_ads1015(ads1015)); + // let ads1015 = LimTemperature::new(ads1x1x::SlaveAddr::Default); + // tokio::spawn(demo::read_ads1015(ads1015)); - let wheel_encoder = WheelEncoder::new(); - tokio::spawn(demo::read_wheel_encoder(wheel_encoder)); + // let wheel_encoder = WheelEncoder::new(); + // tokio::spawn(demo::read_wheel_encoder(wheel_encoder)); - let gyro: Gyroscope = Gyroscope::new(); - tokio::spawn(demo::read_gyroscope(gyro)); - let brakes = Brakes::new(); - tokio::spawn(demo::brake(brakes)); + // let gyro: Gyroscope = Gyroscope::new(); + // tokio::spawn(demo::read_gyroscope(gyro)); + // let brakes = Brakes::new(); + // tokio::spawn(demo::brake(brakes)); - let high_voltage_system = HighVoltageSystem::new(); - tokio::spawn(demo::high_voltage_system(high_voltage_system)); + // let high_voltage_system = HighVoltageSystem::new(); + // tokio::spawn(demo::high_voltage_system(high_voltage_system)); - let lidar = Lidar::new(); - tokio::spawn(demo::read_lidar(lidar)); + // let lidar = Lidar::new(); + // tokio::spawn(demo::read_lidar(lidar)); - let limcurrent = LimCurrent::new(ads1x1x::SlaveAddr::Default); - tokio::spawn(demo::read_lim_current(limcurrent)); + // let limcurrent = LimCurrent::new(ads1x1x::SlaveAddr::Default); + // tokio::spawn(demo::read_lim_current(limcurrent)); - let inverter_board = InverterBoard::new(); - tokio::spawn(demo::inverter_control(inverter_board)); + // let inverter_board = InverterBoard::new(); + // tokio::spawn(demo::inverter_control(inverter_board)); let mut state_machine = StateMachine::new(io); tokio::spawn(async move { diff --git a/pod-operation/src/state_machine.rs b/pod-operation/src/state_machine.rs index 7093f070..a0c03cf2 100644 --- a/pod-operation/src/state_machine.rs +++ b/pod-operation/src/state_machine.rs @@ -39,15 +39,15 @@ pub struct StateMachine { enter_actions: EnumMap, state_transitions: EnumMap>, io: SocketIo, - brakes: Brakes, - signal_light: SignalLight, - wheel_encoder: WheelEncoder, - //upstream_pressure_transducer: PressureTransducer, - downstream_pressure_transducer: PressureTransducer, - lim_temperature_port: LimTemperature, - lim_temperature_starboard: LimTemperature, - high_voltage_system: HighVoltageSystem, - lidar: Lidar, + // brakes: Brakes, + // signal_light: SignalLight, + // wheel_encoder: WheelEncoder, + // //upstream_pressure_transducer: PressureTransducer, + // downstream_pressure_transducer: PressureTransducer, + // lim_temperature_port: LimTemperature, + // lim_temperature_starboard: LimTemperature, + // high_voltage_system: HighVoltageSystem, + // lidar: Lidar, } impl StateMachine { @@ -94,17 +94,17 @@ impl StateMachine { enter_actions, state_transitions, io, - brakes: Brakes::new(), - signal_light: SignalLight::new(), - wheel_encoder: WheelEncoder::new(), - //upstream_pressure_transducer: PressureTransducer::upstream(), - downstream_pressure_transducer: PressureTransducer::downstream(), - lim_temperature_port: LimTemperature::new(ads1x1x::SlaveAddr::Default), - lim_temperature_starboard: LimTemperature::new(ads1x1x::SlaveAddr::Alternative( - false, true, - )), - high_voltage_system: HighVoltageSystem::new(), - lidar: Lidar::new(), + // brakes: Brakes::new(), + // signal_light: SignalLight::new(), + // wheel_encoder: WheelEncoder::new(), + // //upstream_pressure_transducer: PressureTransducer::upstream(), + // downstream_pressure_transducer: PressureTransducer::downstream(), + // lim_temperature_port: LimTemperature::new(ads1x1x::SlaveAddr::Default), + // lim_temperature_starboard: LimTemperature::new(ads1x1x::SlaveAddr::Alternative( + // false, true, + // )), + // high_voltage_system: HighVoltageSystem::new(), + // lidar: Lidar::new(), } } @@ -164,33 +164,33 @@ impl StateMachine { fn _enter_init(&mut self) { info!("Entering Init state"); - self.signal_light.disable(); + // self.signal_light.disable(); } fn _enter_load(&mut self) { info!("Entering Load state"); - self.brakes.disengage(); - self.signal_light.disable(); + // self.brakes.disengage(); + // self.signal_light.disable(); } fn _enter_running(&mut self) { info!("Entering Running state"); - self.high_voltage_system.enable(); // Enable high voltage system -- may move later - self.signal_light.enable(); - self.brakes.disengage(); + // self.high_voltage_system.enable(); // Enable high voltage system -- may move later + // self.signal_light.enable(); + // self.brakes.disengage(); } fn _enter_stopped(&mut self) { info!("Entering Stopped state"); - self.signal_light.disable(); - self.brakes.engage(); + // self.signal_light.disable(); + // self.brakes.engage(); } fn _enter_halted(&mut self) { info!("Entering Halted state"); - self.signal_light.disable(); - self.brakes.engage(); - self.high_voltage_system.disable(); + // self.signal_light.disable(); + // self.brakes.engage(); + // self.high_voltage_system.disable(); } fn _enter_faulted(&mut self) { @@ -200,9 +200,9 @@ impl StateMachine { .unwrap() .emit("fault", "123") .ok(); - self.signal_light.disable(); - self.brakes.engage(); - self.high_voltage_system.disable(); + // self.signal_light.disable(); + // self.brakes.engage(); + // self.high_voltage_system.disable(); } /// Perform operations when the pod is loading @@ -215,27 +215,27 @@ impl StateMachine { /// Perform operations when the pod is running fn _running_periodic(&mut self) -> State { info!("Rolling Running state"); - let encoder_value = self.wheel_encoder.measure().expect("wheel encoder faulted"); // Read the encoder value - if encoder_value > STOP_THRESHOLD { - return State::Stopped; - } - - if self.downstream_pressure_transducer.read_pressure() < MIN_PRESSURE { - return State::Faulted; - } - let default_readings = self.lim_temperature_port.read_lim_temps(); - let alternative_readings = self.lim_temperature_starboard.read_lim_temps(); - if default_readings - .iter() - .chain(alternative_readings.iter()) - .any(|&reading| reading > LIM_TEMP_THRESHOLD) - { - return State::Faulted; - } - // Last 20% of the track, as indicated by braking - if self.lidar.read_distance() < END_OF_TRACK { - return State::Faulted; - } + // let encoder_value = self.wheel_encoder.measure().expect("wheel encoder faulted"); // Read the encoder value + // if encoder_value > STOP_THRESHOLD { + // return State::Stopped; + // } + + // if self.downstream_pressure_transducer.read_pressure() < MIN_PRESSURE { + // return State::Faulted; + // } + // let default_readings = self.lim_temperature_port.read_lim_temps(); + // let alternative_readings = self.lim_temperature_starboard.read_lim_temps(); + // if default_readings + // .iter() + // .chain(alternative_readings.iter()) + // .any(|&reading| reading > LIM_TEMP_THRESHOLD) + // { + // return State::Faulted; + // } + // // Last 20% of the track, as indicated by braking + // if self.lidar.read_distance() < END_OF_TRACK { + // return State::Faulted; + // } State::Running }