cmd_handler: add warning msgs for cmd with val clamped

This commit is contained in:
linuswck 2025-01-22 18:18:41 +08:00
parent e1ee3ec959
commit b3a9f61648
3 changed files with 124 additions and 18 deletions

27
Cargo.lock generated
View File

@ -92,6 +92,26 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 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]] [[package]]
name = "cortex-m" name = "cortex-m"
version = "0.7.7" version = "0.7.7"
@ -451,6 +471,7 @@ dependencies = [
"bare-metal 1.0.0", "bare-metal 1.0.0",
"bit_field", "bit_field",
"byteorder", "byteorder",
"const_format",
"cortex-m", "cortex-m",
"cortex-m-log", "cortex-m-log",
"cortex-m-rt", "cortex-m-rt",
@ -1041,6 +1062,12 @@ version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "unicode-xid"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]] [[package]]
name = "uom" name = "uom"
version = "0.30.0" version = "0.30.0"

View File

@ -38,6 +38,7 @@ sfkv = "0.1"
bit_field = "0.10" bit_field = "0.10"
crc = "3.0.1" crc = "3.0.1"
byteorder = { version = "1", default-features = false } byteorder = { version = "1", default-features = false }
const_format = "0.2.34"
[features] [features]
semihosting = ["cortex-m-log/semihosting"] semihosting = ["cortex-m-log/semihosting"]
RTT = [] RTT = []

View File

@ -9,6 +9,7 @@ use uom::si::{electric_current::{ampere, ElectricCurrent},
electrical_conductance::{siemens, ElectricalConductance}, electrical_conductance::{siemens, ElectricalConductance},
electrical_resistance::{ohm, ElectricalResistance}, electrical_resistance::{ohm, ElectricalResistance},
power::{watt, Power}}; power::{watt, Power}};
use const_format::concatcp;
use crate::{device::{dfu, hw_rev::HWRev, sys_timer}, use crate::{device::{dfu, hw_rev::HWRev, sys_timer},
laser_diode::{laser_diode::{LdDrive, LdSettingsSummary, StatusReport as LdStatusReport}, laser_diode::{laser_diode::{LdDrive, LdSettingsSummary, StatusReport as LdStatusReport},
@ -33,6 +34,7 @@ pub enum ResponseEnum {
InvalidDatatype, InvalidDatatype,
InvalidSettings, InvalidSettings,
InvalidCmd, InvalidCmd,
Warning,
HardReset, HardReset,
Dfu, Dfu,
ConnectionClose, 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_INVALID_LD_PWR_LIMIT_SETTING: &str = "Invalid LD Power Limit Setting";
const ERR_MSG_CMD_NOT_FOUND: &str = "Command Not Found"; 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)] #[derive(Deserialize, Serialize, Copy, Clone, Debug, Default, Tree)]
pub struct CmdJsonObj { pub struct CmdJsonObj {
laser_diode_cmd: Option<LdCmdEnum>, laser_diode_cmd: Option<LdCmdEnum>,
@ -351,8 +357,16 @@ pub fn execute_cmd(
}; };
match cmd.set_json("/json", &buffer[0..buffer_size]) { match cmd.set_json("/json", &buffer[0..buffer_size]) {
Ok(_) => { Ok(_) => {
thermostat.set_i(ElectricCurrent::new::<ampere>(cmd.json.tec_set_i)); if !thermostat.set_i(ElectricCurrent::new::<ampere>(cmd.json.tec_set_i)) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); 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; return;
} }
Err(_) => { /* Do Nothing */ } Err(_) => { /* Do Nothing */ }
@ -498,8 +512,16 @@ pub fn execute_cmd(
} }
Some(LdCmdEnum::SetI) => match cmd.json.data_f32 { Some(LdCmdEnum::SetI) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !laser.ld_set_i(ElectricCurrent::new::<ampere>(val)) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
laser.ld_set_i(ElectricCurrent::new::<ampere>(val)); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Laser Cmd SetI: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)),
socket,
);
}
} }
None => { None => {
send_response( send_response(
@ -613,8 +635,16 @@ pub fn execute_cmd(
} }
Some(ThermostatCmdEnum::SetTecMaxV) => match cmd.json.data_f32 { Some(ThermostatCmdEnum::SetTecMaxV) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !thermostat.set_max_v(ElectricPotential::new::<volt>(val)) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
thermostat.set_max_v(ElectricPotential::new::<volt>(val)); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Thermostat Cmd SetTecMaxV: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)),
socket
);
}
} }
None => { None => {
send_response( send_response(
@ -627,8 +657,16 @@ pub fn execute_cmd(
}, },
Some(ThermostatCmdEnum::SetTecMaxIPos) => match cmd.json.data_f32 { Some(ThermostatCmdEnum::SetTecMaxIPos) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !thermostat.set_max_i_pos(ElectricCurrent::new::<ampere>(val)) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
thermostat.set_max_i_pos(ElectricCurrent::new::<ampere>(val)); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Thermostat Cmd SetTecMaxIPos: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)),
socket
);
}
} }
None => { None => {
send_response( send_response(
@ -641,8 +679,16 @@ pub fn execute_cmd(
}, },
Some(ThermostatCmdEnum::SetTecMaxINeg) => match cmd.json.data_f32 { Some(ThermostatCmdEnum::SetTecMaxINeg) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !thermostat.set_max_i_neg(ElectricCurrent::new::<ampere>(val)) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
thermostat.set_max_i_neg(ElectricCurrent::new::<ampere>(val)); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Thermostat Cmd SetTecMaxINeg: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)),
socket
);
}
} }
None => { None => {
send_response( send_response(
@ -655,8 +701,16 @@ pub fn execute_cmd(
}, },
Some(ThermostatCmdEnum::SetTecIOut) => match cmd.json.data_f32 { Some(ThermostatCmdEnum::SetTecIOut) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !thermostat.set_i(ElectricCurrent::new::<ampere>(val)) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
thermostat.set_i(ElectricCurrent::new::<ampere>(val)); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Thermostat Cmd SetTecIOut: ", WARN_MSG_VALUE_SET_IS_OUT_OF_RANGE)),
socket
);
}
} }
None => { None => {
send_response( send_response(
@ -669,8 +723,16 @@ pub fn execute_cmd(
}, },
Some(ThermostatCmdEnum::SetTemperatureSetpoint) => match cmd.json.data_f32 { Some(ThermostatCmdEnum::SetTemperatureSetpoint) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !thermostat.set_temperature_setpoint(val) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
thermostat.set_temperature_setpoint(val); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Thermostat Cmd SetTemperatureSetpoint: ", WARN_MGS_TEMP_SETPOINT_IS_CLAMPED_BY_TEMP_MON_LIMIT)),
socket
);
}
} }
None => { None => {
send_response( send_response(
@ -836,8 +898,16 @@ pub fn execute_cmd(
} }
Some(ThermostatCmdEnum::SetTempMonUpperLimit) => match cmd.json.data_f32 { Some(ThermostatCmdEnum::SetTempMonUpperLimit) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !thermostat.set_temp_mon_upper_limit(val) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
thermostat.set_temp_mon_upper_limit(val); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Thermostat Cmd SetTempMonUpperLimit: ", WARN_MSG_TEMP_VALUE_IS_BELOW_ABOSOLUTE_ZERO)),
socket
);
}
} }
None => { None => {
send_response( send_response(
@ -850,8 +920,16 @@ pub fn execute_cmd(
}, },
Some(ThermostatCmdEnum::SetTempMonLowerLimit) => match cmd.json.data_f32 { Some(ThermostatCmdEnum::SetTempMonLowerLimit) => match cmd.json.data_f32 {
Some(val) => { Some(val) => {
if !thermostat.set_temp_mon_lower_limit(val) {
send_response(buffer, ResponseEnum::Acknowledge, None, socket); send_response(buffer, ResponseEnum::Acknowledge, None, socket);
thermostat.set_temp_mon_lower_limit(val); } else {
send_response(
buffer,
ResponseEnum::Warning,
Some(concatcp!("Thermostat Cmd SetTempMonLowerLimit: ", WARN_MSG_TEMP_VALUE_IS_BELOW_ABOSOLUTE_ZERO)),
socket
);
}
} }
None => { None => {
send_response( send_response(