thermostat/src/channel_state.rs

47 lines
1.2 KiB
Rust
Raw Normal View History

use smoltcp::time::Instant;
2020-09-14 04:52:20 +08:00
use uom::si::{
f64::ElectricPotential,
electric_potential::volt,
};
2020-05-17 07:23:35 +08:00
use crate::{
ad7172,
pid,
steinhart_hart as sh,
};
pub struct ChannelState {
2020-03-20 06:39:06 +08:00
pub adc_data: Option<u32>,
pub adc_time: Instant,
2020-09-14 04:52:20 +08:00
pub dac_value: ElectricPotential,
2020-05-13 06:04:55 +08:00
pub pid_engaged: bool,
pub pid: pid::Controller,
pub sh: sh::Parameters,
}
impl Default for ChannelState {
fn default() -> Self {
ChannelState {
adc_data: None,
adc_time: Instant::from_secs(0),
2020-09-14 04:52:20 +08:00
dac_value: ElectricPotential::new::<volt>(0.0),
2020-05-13 06:04:55 +08:00
pid_engaged: false,
pid: pid::Controller::new(pid::Parameters::default()),
sh: sh::Parameters::default(),
}
}
}
impl ChannelState {
/// Update PID state on ADC input, calculate new DAC output
2020-05-17 07:23:35 +08:00
pub fn update_pid(&mut self, now: Instant, adc_data: u32) -> f64 {
self.adc_data = Some(adc_data);
self.adc_time = now;
// Update PID controller
let input = (adc_data as f64) / (ad7172::MAX_VALUE as f64);
let temperature = self.sh.get_temperature(input);
2020-05-17 07:23:35 +08:00
self.pid.update(temperature)
}
}