forked from M-Labs/kirdy
temp_mon: Add support for constant current mode
This commit is contained in:
parent
048245f674
commit
99cf17f7e4
|
@ -11,6 +11,7 @@ pub enum TempStatusEnum {
|
||||||
OverTemp,
|
OverTemp,
|
||||||
Unstable,
|
Unstable,
|
||||||
Stable,
|
Stable,
|
||||||
|
ConstantCurrentMode,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
||||||
|
@ -56,7 +57,8 @@ impl Default for TempMon {
|
||||||
#[derive(Default, PartialEq, Debug)]
|
#[derive(Default, PartialEq, Debug)]
|
||||||
enum State {
|
enum State {
|
||||||
#[default]
|
#[default]
|
||||||
PidOff,
|
PwrOff,
|
||||||
|
ConstantCurrentMode,
|
||||||
PidStartUp,
|
PidStartUp,
|
||||||
PidStable,
|
PidStable,
|
||||||
OverTempAlarm,
|
OverTempAlarm,
|
||||||
|
@ -95,16 +97,38 @@ impl TempMon {
|
||||||
self.state = State::default();
|
self.state = State::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_status(&mut self, pid_engaged: bool, temp: ThermodynamicTemperature) {
|
pub fn update_status(&mut self, pid_engaged: bool, pwr_on: bool, temp: ThermodynamicTemperature) {
|
||||||
match self.state {
|
match self.state {
|
||||||
State::PidOff => {
|
State::PwrOff => {
|
||||||
self.is_set_point_changed = false;
|
self.is_set_point_changed = false;
|
||||||
self.status.status = TempStatusEnum::Off;
|
self.status.status = TempStatusEnum::Off;
|
||||||
self.count = 0;
|
self.count = 0;
|
||||||
|
|
||||||
// State Transition
|
// State Transition
|
||||||
|
if pwr_on {
|
||||||
if pid_engaged {
|
if pid_engaged {
|
||||||
self.state = State::PidStartUp;
|
self.state = State::PidStartUp;
|
||||||
|
} else {
|
||||||
|
self.state = State::ConstantCurrentMode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
State::ConstantCurrentMode => {
|
||||||
|
let is_over_temp = temp > self.upper_limit || temp < self.lower_limit;
|
||||||
|
self.status.status = TempStatusEnum::ConstantCurrentMode;
|
||||||
|
|
||||||
|
if is_over_temp {
|
||||||
|
self.state = State::OverTempAlarm;
|
||||||
|
self.status.status = TempStatusEnum::OverTemp;
|
||||||
|
}
|
||||||
|
else if !pwr_on {
|
||||||
|
self.state = State::PwrOff;
|
||||||
|
self.status.status = TempStatusEnum::Off;
|
||||||
|
} else if pid_engaged {
|
||||||
|
self.state = State::PidStartUp;
|
||||||
|
self.status.status = TempStatusEnum::Unstable;
|
||||||
|
self.is_set_point_changed = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
State::PidStartUp | State::PidStable => {
|
State::PidStartUp | State::PidStable => {
|
||||||
|
@ -134,6 +158,10 @@ impl TempMon {
|
||||||
}
|
}
|
||||||
|
|
||||||
// State Transition
|
// State Transition
|
||||||
|
if !pwr_on {
|
||||||
|
self.state = State::PwrOff;
|
||||||
|
}
|
||||||
|
else {
|
||||||
if self.status.status == TempStatusEnum::OverTemp {
|
if self.status.status == TempStatusEnum::OverTemp {
|
||||||
self.state = State::OverTempAlarm;
|
self.state = State::OverTempAlarm;
|
||||||
} else if self.is_set_point_changed {
|
} else if self.is_set_point_changed {
|
||||||
|
@ -141,6 +169,9 @@ impl TempMon {
|
||||||
self.state = State::PidStartUp;
|
self.state = State::PidStartUp;
|
||||||
} else if self.status.status == TempStatusEnum::Stable {
|
} else if self.status.status == TempStatusEnum::Stable {
|
||||||
self.state = State::PidStable;
|
self.state = State::PidStable;
|
||||||
|
} else if !pid_engaged {
|
||||||
|
self.state = State::ConstantCurrentMode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
State::OverTempAlarm => {
|
State::OverTempAlarm => {
|
||||||
|
|
|
@ -186,7 +186,7 @@ impl Thermostat{
|
||||||
state.update(data);
|
state.update(data);
|
||||||
let pid_engaged = state.get_pid_engaged();
|
let pid_engaged = state.get_pid_engaged();
|
||||||
let temp = self.get_temperature();
|
let temp = self.get_temperature();
|
||||||
self.temp_mon.update_status(pid_engaged, temp);
|
self.temp_mon.update_status(pid_engaged, self.max1968.is_powered_on(), temp);
|
||||||
debug!("state.get_pid_engaged(): {:?}", pid_engaged);
|
debug!("state.get_pid_engaged(): {:?}", pid_engaged);
|
||||||
debug!("Temperature: {:?} degree", temp.get::<degree_celsius>());
|
debug!("Temperature: {:?} degree", temp.get::<degree_celsius>());
|
||||||
data_rdy = true;
|
data_rdy = true;
|
||||||
|
|
Loading…
Reference in New Issue