diff --git a/src/laser_diode/laser_diode.rs b/src/laser_diode/laser_diode.rs index 4948b1c..cc57b77 100644 --- a/src/laser_diode/laser_diode.rs +++ b/src/laser_diode/laser_diode.rs @@ -118,7 +118,7 @@ impl LdDrive{ } pub fn power_up(&mut self){ - let prev_i_set = LdCurrentOutCtrlTimer::get_target_i(); + let prev_i_set = self.settings.ld_drive_current; LdCurrentOutCtrlTimer::reset(); let _ = self.ctrl.set_i(ElectricCurrent::new::(0.0), Settings::LD_DRIVE_TRANSIMPEDANCE, Settings::DAC_OUT_V_MAX); LdPwrExcProtector::pwr_on_and_arm_protection(); @@ -142,14 +142,14 @@ impl LdDrive{ } pub fn ld_set_i(&mut self, i: ElectricCurrent){ - LdCurrentOutCtrlTimer::set_target_i_and_listen_irq(i, self.settings.ld_drive_current); + self.settings.ld_drive_current = i; + LdCurrentOutCtrlTimer::set_target_i_and_listen_irq(i, self.ctrl.get_i_set()); } pub fn poll_and_update_output_current(&mut self) -> ElectricCurrent { match LdCurrentOutCtrlTimer::get_irq_status() { Some(i_set) => { let i_set = self.ctrl.set_i(i_set, Settings::LD_DRIVE_TRANSIMPEDANCE, Settings::DAC_OUT_V_MAX); - self.settings.ld_drive_current = i_set; LdCurrentOutCtrlTimer::clear_alarm_and_resume_listening(); i_set } @@ -195,10 +195,15 @@ impl LdDrive{ } pub fn get_status_report(&mut self) -> StatusReport { + let ld_i_set = if LdPwrExcProtector::get_status().pwr_engaged { + self.ctrl.get_i_set() + } else { + ElectricCurrent::new::(0.0) + }; StatusReport { pwr_on: LdPwrExcProtector::get_status().pwr_engaged, pwr_excursion: LdPwrExcProtector::get_status().pwr_excursion, - ld_i_set: self.settings.ld_drive_current, + ld_i_set: ld_i_set, pd_i: self.get_pd_i(), pd_pwr: self.get_pd_pwr(), term_status: self.get_term_status(), diff --git a/src/laser_diode/ld_ctrl.rs b/src/laser_diode/ld_ctrl.rs index d1b07b2..732553f 100644 --- a/src/laser_diode/ld_ctrl.rs +++ b/src/laser_diode/ld_ctrl.rs @@ -8,7 +8,8 @@ use stm32f4xx_hal::{ use uom::si::{ ratio::ratio, - f32::{ElectricPotential, ElectricCurrent}, + f32::{ElectricPotential, ElectricCurrent}, + electric_current::ampere, }; use crate::laser_diode::max5719::{self, Dac}; @@ -49,12 +50,14 @@ type DacLoad = PB14>; pub struct LdCtrl{ pub phy: LdCtrlPhy, + i_set: ElectricCurrent, } impl LdCtrl { pub fn new(phy_ch0: LdCtrlPhy) -> Self { LdCtrl { phy: phy_ch0, + i_set: ElectricCurrent::new::(0.0) } } @@ -85,6 +88,11 @@ impl LdCtrl { } pub fn set_i(&mut self, current: ElectricCurrent, transimpedance: TransimpedanceUnit, dac_out_v_max: ElectricPotential) -> ElectricCurrent { - self.set_dac(current * transimpedance, dac_out_v_max) / transimpedance + self.i_set = self.set_dac(current * transimpedance, dac_out_v_max) / transimpedance; + self.i_set + } + + pub fn get_i_set(&mut self) -> ElectricCurrent{ + self.i_set } } \ No newline at end of file diff --git a/src/laser_diode/ld_current_out_ctrl_timer.rs b/src/laser_diode/ld_current_out_ctrl_timer.rs index 3a3fb84..780d787 100644 --- a/src/laser_diode/ld_current_out_ctrl_timer.rs +++ b/src/laser_diode/ld_current_out_ctrl_timer.rs @@ -63,13 +63,6 @@ impl LdCurrentOutCtrlTimer { } } - pub fn get_target_i() -> ElectricCurrent { - if let Some(ref mut ld_current_out_ctrl_timer ) = LdCurrentOutCtrlTimer::get() { - return ld_current_out_ctrl_timer.target_i - } - ElectricCurrent::new::(0.0) - } - pub fn set_alarm() { if let Some(ref mut ld_current_out_ctrl_timer ) = LdCurrentOutCtrlTimer::get() { ld_current_out_ctrl_timer.timeout = true;