From b3a9f61648ac5320cf74a16f2e51b65e259f0137 Mon Sep 17 00:00:00 2001 From: linuswck Date: Wed, 22 Jan 2025 18:18:41 +0800 Subject: [PATCH] cmd_handler: add warning msgs for cmd with val clamped --- Cargo.lock | 27 ++++++++++ Cargo.toml | 1 + src/net/cmd_handler.rs | 114 ++++++++++++++++++++++++++++++++++------- 3 files changed, 124 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e08c544..e6882f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,6 +92,26 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "cortex-m" version = "0.7.7" @@ -451,6 +471,7 @@ dependencies = [ "bare-metal 1.0.0", "bit_field", "byteorder", + "const_format", "cortex-m", "cortex-m-log", "cortex-m-rt", @@ -1041,6 +1062,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "uom" version = "0.30.0" diff --git a/Cargo.toml b/Cargo.toml index f7bae9a..d00db79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ sfkv = "0.1" bit_field = "0.10" crc = "3.0.1" byteorder = { version = "1", default-features = false } +const_format = "0.2.34" [features] semihosting = ["cortex-m-log/semihosting"] RTT = [] diff --git a/src/net/cmd_handler.rs b/src/net/cmd_handler.rs index 78c5566..28a3070 100644 --- a/src/net/cmd_handler.rs +++ b/src/net/cmd_handler.rs @@ -9,6 +9,7 @@ use uom::si::{electric_current::{ampere, ElectricCurrent}, electrical_conductance::{siemens, ElectricalConductance}, electrical_resistance::{ohm, ElectricalResistance}, power::{watt, Power}}; +use const_format::concatcp; use crate::{device::{dfu, hw_rev::HWRev, sys_timer}, laser_diode::{laser_diode::{LdDrive, LdSettingsSummary, StatusReport as LdStatusReport}, @@ -33,6 +34,7 @@ pub enum ResponseEnum { InvalidDatatype, InvalidSettings, InvalidCmd, + Warning, HardReset, Dfu, ConnectionClose, @@ -165,6 +167,10 @@ const ERR_MSG_INVALID_PDMON_SETTINGS: &str = "Invalid PD Mon Parameter Setting(s const ERR_MSG_INVALID_LD_PWR_LIMIT_SETTING: &str = "Invalid LD Power Limit Setting"; const ERR_MSG_CMD_NOT_FOUND: &str = "Command Not Found"; +const WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE: &str = "Value set is out of range and clamped to the hardware limit"; +const WARN_MGS_TEMP_SETPOINT_IS_CLAMPED_BY_TEMP_MON_LIMIT: &str = "Value set is out of temperature monitor range and clamped to the temperature monitor limit"; +const WARN_MSG_TEMP_VALUE_IS_BELOW_ABOSOLUTE_ZERO: &str = "Value set is below absolute zero and clamped to absolute zero(-273.15 Degree)"; + #[derive(Deserialize, Serialize, Copy, Clone, Debug, Default, Tree)] pub struct CmdJsonObj { laser_diode_cmd: Option, @@ -351,8 +357,16 @@ pub fn execute_cmd( }; match cmd.set_json("/json", &buffer[0..buffer_size]) { Ok(_) => { - thermostat.set_i(ElectricCurrent::new::(cmd.json.tec_set_i)); - send_response(buffer, ResponseEnum::Acknowledge, None, socket); + if !thermostat.set_i(ElectricCurrent::new::(cmd.json.tec_set_i)) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("tec_set_i: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)), + socket + ); + } return; } Err(_) => { /* Do Nothing */ } @@ -498,8 +512,16 @@ pub fn execute_cmd( } Some(LdCmdEnum::SetI) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - laser.ld_set_i(ElectricCurrent::new::(val)); + if !laser.ld_set_i(ElectricCurrent::new::(val)) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Laser Cmd SetI: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)), + socket, + ); + } } None => { send_response( @@ -613,8 +635,16 @@ pub fn execute_cmd( } Some(ThermostatCmdEnum::SetTecMaxV) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - thermostat.set_max_v(ElectricPotential::new::(val)); + if !thermostat.set_max_v(ElectricPotential::new::(val)) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Thermostat Cmd SetTecMaxV: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)), + socket + ); + } } None => { send_response( @@ -627,8 +657,16 @@ pub fn execute_cmd( }, Some(ThermostatCmdEnum::SetTecMaxIPos) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - thermostat.set_max_i_pos(ElectricCurrent::new::(val)); + if !thermostat.set_max_i_pos(ElectricCurrent::new::(val)) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Thermostat Cmd SetTecMaxIPos: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)), + socket + ); + } } None => { send_response( @@ -641,8 +679,16 @@ pub fn execute_cmd( }, Some(ThermostatCmdEnum::SetTecMaxINeg) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - thermostat.set_max_i_neg(ElectricCurrent::new::(val)); + if !thermostat.set_max_i_neg(ElectricCurrent::new::(val)) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Thermostat Cmd SetTecMaxINeg: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)), + socket + ); + } } None => { send_response( @@ -655,8 +701,16 @@ pub fn execute_cmd( }, Some(ThermostatCmdEnum::SetTecIOut) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - thermostat.set_i(ElectricCurrent::new::(val)); + if !thermostat.set_i(ElectricCurrent::new::(val)) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Thermostat Cmd SetTecIOut: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)), + socket + ); + } } None => { send_response( @@ -669,8 +723,16 @@ pub fn execute_cmd( }, Some(ThermostatCmdEnum::SetTemperatureSetpoint) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - thermostat.set_temperature_setpoint(val); + if !thermostat.set_temperature_setpoint(val) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Thermostat Cmd SetTemperatureSetpoint: ", WARN_MGS_TEMP_SETPOINT_IS_CLAMPED_BY_TEMP_MON_LIMIT)), + socket + ); + } } None => { send_response( @@ -836,8 +898,16 @@ pub fn execute_cmd( } Some(ThermostatCmdEnum::SetTempMonUpperLimit) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - thermostat.set_temp_mon_upper_limit(val); + if !thermostat.set_temp_mon_upper_limit(val) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Thermostat Cmd SetTempMonUpperLimit: ", WARN_MSG_TEMP_VALUE_IS_BELOW_ABOSOLUTE_ZERO)), + socket + ); + } } None => { send_response( @@ -850,8 +920,16 @@ pub fn execute_cmd( }, Some(ThermostatCmdEnum::SetTempMonLowerLimit) => match cmd.json.data_f32 { Some(val) => { - send_response(buffer, ResponseEnum::Acknowledge, None, socket); - thermostat.set_temp_mon_lower_limit(val); + if !thermostat.set_temp_mon_lower_limit(val) { + send_response(buffer, ResponseEnum::Acknowledge, None, socket); + } else { + send_response( + buffer, + ResponseEnum::Warning, + Some(concatcp!("Thermostat Cmd SetTempMonLowerLimit: ", WARN_MSG_TEMP_VALUE_IS_BELOW_ABOSOLUTE_ZERO)), + socket + ); + } } None => { send_response(