cmd: Add active report mode cmd

This commit is contained in:
linuswck 2024-02-19 15:08:00 +08:00
parent 0642640da7
commit 5f83b73011
5 changed files with 98 additions and 16 deletions

View File

@ -6,6 +6,7 @@ use crate::laser_diode::ld_pwr_exc_protector::{LdPwrExcProtector, self};
use crate::laser_diode::pd_responsitivity; use crate::laser_diode::pd_responsitivity;
use core::marker::PhantomData; use core::marker::PhantomData;
use crate::device::sys_timer::sleep; use crate::device::sys_timer::sleep;
use serde::{Deserialize, Serialize};
use uom::si::{ use uom::si::{
electric_current::milliampere, electric_current::milliampere,
@ -67,6 +68,16 @@ impl Default for Settings {
} }
} }
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
pub struct StatusReport {
pwr_engaged: bool,
pwr_excursion: bool,
ld_i_set: ElectricCurrent,
pd_i: ElectricCurrent,
pd_pwr: Power,
term_status: Impedance,
}
pub struct LdDrive{ pub struct LdDrive{
ctrl: LdCtrl, ctrl: LdCtrl,
settings: Settings, settings: Settings,
@ -120,6 +131,10 @@ impl LdDrive{
LdPwrExcProtector::get_status().v * Settings::PD_MON_TRANSCONDUCTANCE LdPwrExcProtector::get_status().v * Settings::PD_MON_TRANSCONDUCTANCE
} }
pub fn get_pd_pwr(&mut self) -> Power {
self.settings.pd_responsitivity.get_ld_pwr_from_ld_i(LdPwrExcProtector::get_status().v * Settings::PD_MON_TRANSCONDUCTANCE)
}
// Ramping up or down laser diode current according to preset current step size and time step. // Ramping up or down laser diode current according to preset current step size and time step.
pub fn ld_set_i(&mut self, i: ElectricCurrent) -> ElectricCurrent { pub fn ld_set_i(&mut self, i: ElectricCurrent) -> ElectricCurrent {
let mut prev_i_set = self.settings.ld_drive_current; let mut prev_i_set = self.settings.ld_drive_current;
@ -178,4 +193,15 @@ impl LdDrive{
pub fn get_term_status(&mut self) -> Impedance { pub fn get_term_status(&mut self) -> Impedance {
self.ctrl.get_lf_mod_in_impedance() self.ctrl.get_lf_mod_in_impedance()
} }
pub fn get_status_report(&mut self) -> StatusReport {
StatusReport {
pwr_engaged: LdPwrExcProtector::get_status().pwr_engaged,
pwr_excursion: LdPwrExcProtector::get_status().pwr_excursion,
ld_i_set: self.settings.ld_drive_current,
pd_i: self.get_pd_i(),
pd_pwr: self.get_pd_pwr(),
term_status: self.get_term_status(),
}
}
} }

View File

@ -1,3 +1,4 @@
use serde::{Deserialize, Serialize};
use stm32f4xx_hal::{ use stm32f4xx_hal::{
gpio::{gpioa::*, gpiob::*, gpiod::*, Alternate, Input, Output, PushPull}, gpio::{gpioa::*, gpiob::*, gpiod::*, Alternate, Input, Output, PushPull},
hal::{blocking::spi::Transfer, digital::{v2::OutputPin, v2::InputPin}}, hal::{blocking::spi::Transfer, digital::{v2::OutputPin, v2::InputPin}},
@ -13,7 +14,7 @@ use uom::si::{
use crate::laser_diode::max5719::{self, Dac}; use crate::laser_diode::max5719::{self, Dac};
use crate::laser_diode::laser_diode::TransimpedanceUnit; use crate::laser_diode::laser_diode::TransimpedanceUnit;
#[derive(Debug)] #[derive(Deserialize, Serialize, Debug, Clone, Copy)]
pub enum Impedance { pub enum Impedance {
Is50Ohm, Is50Ohm,
Not50Ohm, Not50Ohm,

View File

@ -34,6 +34,10 @@ use panic_halt as _;
static mut ETH_DATA_BUFFER: [u8; 1024] = [0; 1024]; static mut ETH_DATA_BUFFER: [u8; 1024] = [0; 1024];
pub struct DeviceSettings{
report_readings: bool,
}
#[cfg(not(test))] #[cfg(not(test))]
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
@ -80,6 +84,10 @@ fn main() -> ! {
let mut should_reset = false; let mut should_reset = false;
let mut device_settings = DeviceSettings {
report_readings: false,
};
loop { loop {
wd.feed(); wd.feed();
@ -98,6 +106,15 @@ fn main() -> ! {
info!("power_excursion: {:?}", laser.pd_mon_status().pwr_excursion); info!("power_excursion: {:?}", laser.pd_mon_status().pwr_excursion);
info!("Termination Status: {:?}", laser.get_term_status()); info!("Termination Status: {:?}", laser.get_term_status());
if net::net::eth_is_socket_active() {
if device_settings.report_readings {
unsafe {
net::cmd_handler::send_ld_readings(&mut ETH_DATA_BUFFER, &mut laser);
net::cmd_handler::send_tec_readings(&mut ETH_DATA_BUFFER, &mut thermostat);
}
}
}
} }
if net::net::eth_is_socket_active() { if net::net::eth_is_socket_active() {
@ -114,10 +131,13 @@ fn main() -> ! {
}); });
let bytes = net::net::eth_recv(&mut ETH_DATA_BUFFER); let bytes = net::net::eth_recv(&mut ETH_DATA_BUFFER);
debug!("Number of bytes recv: {:?}", bytes); debug!("Number of bytes recv: {:?}", bytes);
(laser, thermostat, should_reset) = net::cmd_handler::execute_cmd(&mut ETH_DATA_BUFFER, bytes, laser, thermostat); (laser, thermostat, should_reset, device_settings) = net::cmd_handler::execute_cmd(&mut ETH_DATA_BUFFER, bytes, laser, thermostat, device_settings);
} }
} }
} }
else {
device_settings.report_readings = false;
}
} else { } else {
// Should reset, close all TCP sockets. // Should reset, close all TCP sockets.
let mut any_socket_alive = false; let mut any_socket_alive = false;

View File

@ -7,17 +7,24 @@ use uom::si::{
electrical_resistance::{ElectricalResistance, ohm}, electrical_resistance::{ElectricalResistance, ohm},
f64::ThermodynamicTemperature, thermodynamic_temperature::degree_celsius f64::ThermodynamicTemperature, thermodynamic_temperature::degree_celsius
}; };
use crate::{laser_diode::laser_diode::LdDrive, net::net, thermostat::thermostat::StatusReport}; use crate::{laser_diode::laser_diode::{
LdDrive, StatusReport as LdStatusReport
},
net::net,
thermostat::thermostat::StatusReport as TecStatusReport
};
use crate::thermostat::thermostat::Thermostat; use crate::thermostat::thermostat::Thermostat;
use crate::thermostat::pid_state::PidSettings::*; use crate::thermostat::pid_state::PidSettings::*;
use crate::device::dfu; use crate::device::dfu;
use log::info; use log::info;
use crate::DeviceSettings;
#[derive(Deserialize, Serialize, Copy, Clone, Default, Debug)] #[derive(Deserialize, Serialize, Copy, Clone, Default, Debug)]
enum DeviceCmd { enum DeviceCmd {
#[default] #[default]
Reserved, Reserved,
Dfu ReportStatus,
Dfu,
} }
#[derive(Deserialize, Serialize, Copy, Clone, Default, Debug)] #[derive(Deserialize, Serialize, Copy, Clone, Default, Debug)]
@ -79,6 +86,7 @@ pub struct CmdJsonObj{
laser_diode_cmd: Option<LdCmdEnum>, laser_diode_cmd: Option<LdCmdEnum>,
thermostat_cmd: Option<ThermostatCmdEnum>, thermostat_cmd: Option<ThermostatCmdEnum>,
device_cmd: Option<DeviceCmd>, device_cmd: Option<DeviceCmd>,
data_bool: Option<bool>,
data_f32: Option<f32>, data_f32: Option<f32>,
data_f64: Option<f64>, data_f64: Option<f64>,
} }
@ -87,12 +95,33 @@ pub struct Cmd {
json: CmdJsonObj json: CmdJsonObj
} }
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Default, Tree)] #[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
pub struct StatusReportStruct { pub struct TecStatusReportStruct {
json: StatusReport json: TecStatusReport
} }
pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive, mut tec: Thermostat)->(LdDrive, Thermostat, bool){ #[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
pub struct LaserStatusReportStruct {
json: LdStatusReport
}
pub fn send_ld_readings(buffer: &mut [u8], laser: &mut LdDrive){
let status_report = LaserStatusReportStruct {
json: laser.get_status_report()
};
let num_bytes = status_report.get_json("/json", buffer).unwrap();
net::eth_send(buffer, num_bytes);
}
pub fn send_tec_readings(buffer: &mut [u8], tec: &mut Thermostat){
let status_report = TecStatusReportStruct {
json: tec.get_status_report()
};
let num_bytes = status_report.get_json("/json", buffer).unwrap();
net::eth_send(buffer, num_bytes);
}
pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive, mut tec: Thermostat, mut device_settings: DeviceSettings)->(LdDrive, Thermostat, bool, DeviceSettings){
let mut should_reset = false; let mut should_reset = false;
let mut cmd = Cmd { let mut cmd = Cmd {
@ -111,6 +140,16 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive, mu
} }
should_reset = true; should_reset = true;
} }
Some(DeviceCmd::ReportStatus) => {
match cmd.json.data_bool{
Some(val) => {
device_settings.report_readings = val;
}
None => {
info!("Wrong Data type is received")
}
}
}
None => { /* Do Nothing */} None => { /* Do Nothing */}
_ => { _ => {
info!("Unimplemented Command") info!("Unimplemented Command")
@ -176,7 +215,7 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive, mu
info!("Not supported Yet") info!("Not supported Yet")
} }
Some(LdCmdEnum::GetLdStatus) => { Some(LdCmdEnum::GetLdStatus) => {
info!("Not supported Yet") send_ld_readings(buffer, &mut laser);
} }
Some(LdCmdEnum::GetAlramStatus) => { Some(LdCmdEnum::GetAlramStatus) => {
info!("Not supported Yet") info!("Not supported Yet")
@ -334,11 +373,7 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive, mu
} }
} }
Some(ThermostatCmdEnum::GetTecStatus) => { Some(ThermostatCmdEnum::GetTecStatus) => {
let status_report = StatusReportStruct { send_tec_readings(buffer, &mut tec);
json: tec.get_status_report()
};
let num_bytes = status_report.get_json("/json", buffer).unwrap();
net::eth_send(buffer, num_bytes);
} }
Some(ThermostatCmdEnum::GetPidStatus) => { Some(ThermostatCmdEnum::GetPidStatus) => {
info!("Not supported Yet") info!("Not supported Yet")
@ -356,5 +391,5 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, mut laser: LdDrive, mu
info!("Invalid Command: {:?}", err); info!("Invalid Command: {:?}", err);
} }
} }
(laser, tec, should_reset) (laser, tec, should_reset, device_settings)
} }

View File

@ -338,7 +338,7 @@ impl Thermostat{
} }
} }
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Default, Tree)] #[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
pub struct StatusReport { pub struct StatusReport {
ts: u32, ts: u32,
pid_engaged: bool, pid_engaged: bool,