diff --git a/src/channel_state.rs b/src/channel_state.rs index 4820131..fd4fb8e 100644 --- a/src/channel_state.rs +++ b/src/channel_state.rs @@ -16,6 +16,7 @@ use uom::si::{ use crate::{ ad7172, pid, + pwm_limits::PwmLimits, steinhart_hart as sh, command_parser::CenterPoint, }; @@ -32,6 +33,7 @@ pub struct ChannelState { pub center: CenterPoint, pub dac_value: ElectricPotential, pub i_set: ElectricCurrent, + pub pwm_limits: PwmLimits, pub pid_engaged: bool, pub pid: pid::Controller, pub sh: sh::Parameters, @@ -48,6 +50,11 @@ impl ChannelState { center: CenterPoint::Vref, dac_value: ElectricPotential::new::(0.0), i_set: ElectricCurrent::new::(0.0), + pwm_limits: PwmLimits { + max_v: ElectricPotential::new::(0.0), + max_i_pos: ElectricCurrent::new::(0.0), + max_i_neg: ElectricCurrent::new::(0.0), + }, pid_engaged: false, pid: pid::Controller::new(pid::Parameters::default()), sh: sh::Parameters::default(), diff --git a/src/channels.rs b/src/channels.rs index 63dbe85..13929a1 100644 --- a/src/channels.rs +++ b/src/channels.rs @@ -139,7 +139,7 @@ impl Channels { let r_sense = ElectricalResistance::new::(R_SENSE); let voltage = self.get_dac(channel); let i_set = (voltage - center_point) / (10.0 * r_sense); - (i_set, MAX_TEC_I) + (i_set, self.channel_state(channel).i_set) } /// i_set DAC @@ -393,19 +393,19 @@ impl Channels { pub fn get_max_v(&mut self, channel: usize) -> (ElectricPotential, ElectricPotential) { let max = 4.0 * ElectricPotential::new::(3.3); let duty = self.get_pwm(channel, PwmPin::MaxV); - (duty * max, MAX_TEC_V) + (duty * max, self.channel_state(channel).pwm_limits.max_v) } pub fn get_max_i_pos(&mut self, channel: usize) -> (ElectricCurrent, ElectricCurrent) { let max = ElectricCurrent::new::(3.0); let duty = self.get_pwm(channel, PwmPin::MaxIPos); - (duty * max, MAX_TEC_I) + (duty * max, self.channel_state(channel).pwm_limits.max_i_pos) } pub fn get_max_i_neg(&mut self, channel: usize) -> (ElectricCurrent, ElectricCurrent) { let max = ElectricCurrent::new::(3.0); let duty = self.get_pwm(channel, PwmPin::MaxINeg); - (duty * max, MAX_TEC_I) + (duty * max, self.channel_state(channel).pwm_limits.max_i_neg) } // Get current passing through TEC @@ -449,6 +449,7 @@ impl Channels { let max = 4.0 * ElectricPotential::new::(3.3); let duty = (max_v.min(MAX_TEC_V).max(ElectricPotential::zero()) / max).get::(); let duty = self.set_pwm(channel, PwmPin::MaxV, duty); + self.channel_state(channel).pwm_limits.max_v = max_v; (duty * max, max) } @@ -456,6 +457,7 @@ impl Channels { let max = ElectricCurrent::new::(3.0); let duty = (max_i_pos.min(MAX_TEC_I).max(ElectricCurrent::zero()) / max).get::(); let duty = self.set_pwm(channel, PwmPin::MaxIPos, duty); + self.channel_state(channel).pwm_limits.max_i_pos = max_i_pos; (duty * max, max) } @@ -463,6 +465,7 @@ impl Channels { let max = ElectricCurrent::new::(3.0); let duty = (max_i_neg.min(MAX_TEC_I).max(ElectricCurrent::zero()) / max).get::(); let duty = self.set_pwm(channel, PwmPin::MaxINeg, duty); + self.channel_state(channel).pwm_limits.max_i_neg = max_i_neg; (duty * max, max) } @@ -609,12 +612,12 @@ impl Serialize for CenterPointJson { #[derive(Serialize)] pub struct PwmSummaryField { value: T, - max: T, + user_value: T, } impl From<(T, T)> for PwmSummaryField { - fn from((value, max): (T, T)) -> Self { - PwmSummaryField { value, max } + fn from((value, user_value): (T, T)) -> Self { + PwmSummaryField { value, user_value } } }