From de262b849d513f276ccaa968c44a8a558c25a13b Mon Sep 17 00:00:00 2001 From: linuswck Date: Mon, 5 Feb 2024 15:14:23 +0800 Subject: [PATCH] eth: Add Thermostat related json cmd --- src/main.rs | 2 +- src/net/cmd_handler.rs | 171 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 153 insertions(+), 20 deletions(-) diff --git a/src/main.rs b/src/main.rs index 02bd9cb..227c834 100644 --- a/src/main.rs +++ b/src/main.rs @@ -112,7 +112,7 @@ fn main() -> ! { }); let bytes = net::net::eth_recv(&mut ETH_DATA_BUFFER); debug!("Number of bytes recv: {:?}", bytes); - laser = net::cmd_handler::execute_cmd(&mut ETH_DATA_BUFFER, bytes, laser); + (laser, thermostat) = net::cmd_handler::execute_cmd(&mut ETH_DATA_BUFFER, bytes, laser, thermostat); } } } diff --git a/src/net/cmd_handler.rs b/src/net/cmd_handler.rs index f5e679b..b97b171 100644 --- a/src/net/cmd_handler.rs +++ b/src/net/cmd_handler.rs @@ -1,8 +1,12 @@ use core::fmt::Debug; -use miniconf::{Error, JsonCoreSlash, Tree, TreeKey}; +use miniconf::{JsonCoreSlash, Tree}; use serde::{Deserialize, Serialize}; -use uom::si::electric_current::{milliampere, ElectricCurrent}; +use uom::si::{ + electric_current::{ampere, milliampere, ElectricCurrent}, + electric_potential::{volt, ElectricPotential} +}; use crate::laser_diode::laser_diode::LdDrive; +use crate::thermostat::thermostat::Thermostat; use log::info; #[derive(Deserialize, Serialize, Copy, Clone, Default, Debug)] @@ -28,10 +32,42 @@ enum LdCmdEnum { GetAlramStatus, } +#[derive(Deserialize, Serialize, Copy, Clone, Default, Debug)] +enum ThermostatCmdEnum { + #[default] + Reserved, + PowerUp, + PowerDown, + // TEC + SetTecMaxV, + SetTecMaxIPos, + SetTecMaxINeg, + SetTecIOut, // Constant Current Mode + // Control MOde + SetConstantCurrentMode, + SetPidControlMode, + // PID + SetPidKp, + SetPidKi, + SetPidKd, + SetPidOutMin, + SetPidOutMax, + SetPidUpdateInterval, // Update Interval is set based on the sampling rate of ADC + // Steinhart-Hart Equation + SetShT0, + SetShR0, + SetShBeta, + // Report Related + GetTecStatus, + GetPidStatus, + GetShParams, +} + #[derive(Deserialize, Serialize, Copy, Clone, Debug, Default, Tree)] pub struct CmdJsonObj{ rev: u8, - laser_diode_cmd: LdCmdEnum, + laser_diode_cmd: Option, + thermostat_cmd: Option, data_f32: Option, data_f64: Option, } @@ -40,7 +76,7 @@ pub struct Cmd { json: CmdJsonObj } -pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive)->(LdDrive){ +pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive, mut tec: Thermostat)->(LdDrive, Thermostat){ let mut cmd = Cmd { json: CmdJsonObj::default() }; @@ -49,19 +85,19 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive)->( info!("############ Command Received {:?}", cmd.json.laser_diode_cmd); match cmd.json.laser_diode_cmd { - LdCmdEnum::PowerUp => { + Some(LdCmdEnum::PowerUp) => { laser.power_up() } - LdCmdEnum::PowerDown => { + Some(LdCmdEnum::PowerDown) => { laser.power_down() } - LdCmdEnum::LdTermsShort => { + Some(LdCmdEnum::LdTermsShort) => { laser.ld_short(); } - LdCmdEnum::LdTermsOpen => { + Some(LdCmdEnum::LdTermsOpen) => { laser.ld_open(); } - LdCmdEnum::SetI => { + Some(LdCmdEnum::SetI) => { match cmd.json.data_f64 { Some(val) => { laser.ld_set_i(ElectricCurrent::new::(val)); @@ -71,7 +107,7 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive)->( } } } - LdCmdEnum::SetISoftLimit => { + Some(LdCmdEnum::SetISoftLimit) => { match cmd.json.data_f64 { Some(val) => { laser.set_ld_drive_current_limit(ElectricCurrent::new::(val)) @@ -81,13 +117,13 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive)->( } } } - LdCmdEnum::SetPdResponsitivity => { + Some(LdCmdEnum::SetPdResponsitivity) => { info!("Not supported Yet") } - LdCmdEnum::SetPdDarkCurrent => { + Some(LdCmdEnum::SetPdDarkCurrent) => { info!("Not supported Yet") } - LdCmdEnum::SetPdILimit => { + Some(LdCmdEnum::SetPdILimit) => { match cmd.json.data_f64 { Some(val) => { laser.set_pd_i_limit(ElectricCurrent::new::(val)) @@ -97,29 +133,126 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive)->( } } } - LdCmdEnum::SetLdPwrLimit => { + Some(LdCmdEnum::SetLdPwrLimit) => { info!("Not supported Yet") } - LdCmdEnum::ClearAlarmStatus => { + Some(LdCmdEnum::ClearAlarmStatus) => { laser.pd_mon_clear_alarm() } - LdCmdEnum::GetModInTermStatus => { + Some(LdCmdEnum::GetModInTermStatus) => { info!("Not supported Yet") } - LdCmdEnum::GetLdStatus => { + Some(LdCmdEnum::GetLdStatus) => { info!("Not supported Yet") } - LdCmdEnum::GetAlramStatus => { + Some(LdCmdEnum::GetAlramStatus) => { info!("Not supported Yet") } + None => { /* Do Nothing*/ } _ => { info!("Unimplemented Command") } } + + match cmd.json.thermostat_cmd { + Some(ThermostatCmdEnum::PowerUp) => { + tec.power_up() + } + Some(ThermostatCmdEnum::PowerDown) => { + tec.power_down() + } + Some(ThermostatCmdEnum::SetTecMaxV) => { + match cmd.json.data_f64 { + Some(val) => { + tec.set_max_v(ElectricPotential::new::(val)); + } + None => { + info!("Wrong Data type is received") + } + } + } + Some(ThermostatCmdEnum::SetTecMaxIPos) => { + match cmd.json.data_f64 { + Some(val) => { + tec.set_max_i_pos(ElectricCurrent::new::(val)); + } + None => { + info!("Wrong Data type is received") + } + } + } + Some(ThermostatCmdEnum::SetTecMaxINeg) => { + match cmd.json.data_f64 { + Some(val) => { + tec.set_max_i_pos(ElectricCurrent::new::(val)); + } + None => { + info!("Wrong Data type is received") + } + } + } + Some(ThermostatCmdEnum::SetTecIOut) => { + match cmd.json.data_f64 { + Some(val) => { + tec.set_i(ElectricCurrent::new::(val)); + } + None => { + info!("Wrong Data type is received") + } + } + } + Some(ThermostatCmdEnum::SetConstantCurrentMode) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetPidControlMode) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetPidKp) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetPidKi) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetPidKd) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetPidOutMin) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetPidOutMax) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetPidUpdateInterval) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetShT0) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetShR0) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::SetShBeta) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::GetTecStatus) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::GetPidStatus) => { + info!("Not supported Yet") + } + Some(ThermostatCmdEnum::GetShParams) => { + info!("Not supported Yet") + } + None => { /* Do Nothing*/ } + _ => { + info!("Unimplemented Command") + } + + } } Err(err) => { info!("Invalid Command: {:?}", err); } } - laser + (laser, tec) }