diff --git a/src/config.rs b/src/config.rs index 7773583..6a74f80 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,10 @@ use serde::{Serialize, Deserialize}; use postcard::{from_bytes, to_slice}; +use uom::si::{ + electric_potential::volt, + electric_current::ampere, +}; use crate::{ - channel_state::ChannelState, channels::{CHANNELS, Channels}, command_parser::CenterPoint, pid, @@ -18,8 +21,8 @@ impl Config { pub fn new(channels: &mut Channels) -> Self { Config { channels: [ - ChannelConfig::new(channels.channel_state(0usize)), - ChannelConfig::new(channels.channel_state(1usize)), + ChannelConfig::new(channels, 0), + ChannelConfig::new(channels, 1), ], } } @@ -39,21 +42,44 @@ pub struct ChannelConfig { pid: pid::Parameters, pid_target: f32, sh: steinhart_hart::Parameters, - // TODO: pwm limits + pwm: PwmLimits, } impl ChannelConfig { - pub fn new(state: &ChannelState) -> Self { + pub fn new(channels: &mut Channels, channel: usize) -> Self { + let pwm = PwmLimits::new(channels, channel); + let state = channels.channel_state(channel); ChannelConfig { center: state.center.clone(), pid: state.pid.parameters.clone(), pid_target: state.pid.target as f32, sh: state.sh.clone(), + pwm, } } } +#[derive(Clone, Serialize, Deserialize)] +struct PwmLimits { + max_v: f32, + max_i_pos: f32, + max_i_neg: f32, +} + +impl PwmLimits { + pub fn new(channels: &mut Channels, channel: usize) -> Self { + let (max_v, _) = channels.get_max_v(channel); + let (max_i_pos, _) = channels.get_max_i_pos(channel); + let (max_i_neg, _) = channels.get_max_i_neg(channel); + PwmLimits { + max_v: max_v.get::() as f32, + max_i_pos: max_i_pos.get::() as f32, + max_i_neg: max_i_neg.get::() as f32, + } + } +} + #[cfg(test)] mod test { use super::*; @@ -65,6 +91,11 @@ mod test { pid: pid::Parameters::default(), pid_target: 93.7, sh: steinhart_hart::Parameters::default(), + pwm: PwmLimits { + max_v: 1.65, + max_i_pos: 2.1, + max_i_neg: 2.25, + }, }; let config = Config { channels: [