use core::fmt::Debug; use miniconf::{JsonCoreSlash, Tree}; use serde::{Deserialize, Serialize}; 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)] enum LdCmdEnum { #[default] Reserved, // LD Drive Related PowerUp, PowerDown, LdTermsShort, LdTermsOpen, SetI, SetISoftLimit, // PD Mon Related SetPdResponsitivity, SetPdDarkCurrent, SetPdILimit, SetLdPwrLimit, ClearAlarmStatus, // Report Related GetModInTermStatus, GetLdStatus, 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: Option, thermostat_cmd: Option, data_f32: Option, data_f64: Option, } #[derive(Deserialize, Serialize, Copy, Clone, Debug, Default, Tree)] pub struct Cmd { json: CmdJsonObj } 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() }; match cmd.set_json("/json", &buffer[0..buffer_size]){ Ok(_) => { info!("############ Command Received {:?}", cmd.json.laser_diode_cmd); match cmd.json.laser_diode_cmd { Some(LdCmdEnum::PowerUp) => { laser.power_up() } Some(LdCmdEnum::PowerDown) => { laser.power_down() } Some(LdCmdEnum::LdTermsShort) => { laser.ld_short(); } Some(LdCmdEnum::LdTermsOpen) => { laser.ld_open(); } Some(LdCmdEnum::SetI) => { match cmd.json.data_f64 { Some(val) => { laser.ld_set_i(ElectricCurrent::new::(val)); } None => { info!("Wrong Data type is received") } } } Some(LdCmdEnum::SetISoftLimit) => { match cmd.json.data_f64 { Some(val) => { laser.set_ld_drive_current_limit(ElectricCurrent::new::(val)) } None => { info!("Wrong Data type is received") } } } Some(LdCmdEnum::SetPdResponsitivity) => { info!("Not supported Yet") } Some(LdCmdEnum::SetPdDarkCurrent) => { info!("Not supported Yet") } Some(LdCmdEnum::SetPdILimit) => { match cmd.json.data_f64 { Some(val) => { laser.set_pd_i_limit(ElectricCurrent::new::(val)) } None => { info!("Wrong Data type is received") } } } Some(LdCmdEnum::SetLdPwrLimit) => { info!("Not supported Yet") } Some(LdCmdEnum::ClearAlarmStatus) => { laser.pd_mon_clear_alarm() } Some(LdCmdEnum::GetModInTermStatus) => { info!("Not supported Yet") } Some(LdCmdEnum::GetLdStatus) => { info!("Not supported Yet") } 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, tec) }