forked from M-Labs/kirdy
Add fns, struct items for getting ld, tec settings
This commit is contained in:
parent
adfa4f5fa3
commit
ef2410f441
|
@ -51,6 +51,7 @@ impl Settings{
|
||||||
#[derive(Deserialize, Serialize, Clone, Copy, Debug, Tree)]
|
#[derive(Deserialize, Serialize, Clone, Copy, Debug, Tree)]
|
||||||
struct Settings {
|
struct Settings {
|
||||||
pwr_on: bool,
|
pwr_on: bool,
|
||||||
|
default_pwr_on: bool,
|
||||||
ld_drive_current: ElectricCurrent,
|
ld_drive_current: ElectricCurrent,
|
||||||
ld_drive_current_limit: ElectricCurrent,
|
ld_drive_current_limit: ElectricCurrent,
|
||||||
pd_responsitivity: pd_responsitivity::Parameters,
|
pd_responsitivity: pd_responsitivity::Parameters,
|
||||||
|
@ -61,6 +62,7 @@ impl Default for Settings {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
pwr_on: false,
|
pwr_on: false,
|
||||||
|
default_pwr_on: false,
|
||||||
ld_drive_current: ElectricCurrent::new::<milliampere>(0.0),
|
ld_drive_current: ElectricCurrent::new::<milliampere>(0.0),
|
||||||
ld_drive_current_limit: ElectricCurrent::new::<milliampere>(0.0),
|
ld_drive_current_limit: ElectricCurrent::new::<milliampere>(0.0),
|
||||||
pd_responsitivity: pd_responsitivity::Parameters::default(),
|
pd_responsitivity: pd_responsitivity::Parameters::default(),
|
||||||
|
@ -71,7 +73,7 @@ impl Default for Settings {
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
||||||
pub struct StatusReport {
|
pub struct StatusReport {
|
||||||
pwr_engaged: bool,
|
pwr_on: bool,
|
||||||
pwr_excursion: bool,
|
pwr_excursion: bool,
|
||||||
ld_i_set: ElectricCurrent,
|
ld_i_set: ElectricCurrent,
|
||||||
pd_i: ElectricCurrent,
|
pd_i: ElectricCurrent,
|
||||||
|
@ -191,13 +193,17 @@ impl LdDrive{
|
||||||
LdPwrExcProtector::set_trigger_threshold_v(i / Settings::PD_MON_TRANSCONDUCTANCE);
|
LdPwrExcProtector::set_trigger_threshold_v(i / Settings::PD_MON_TRANSCONDUCTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_default_pwr_on(&mut self, pwr_on: bool){
|
||||||
|
self.settings.default_pwr_on = pwr_on;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_term_status(&mut self) -> Impedance {
|
pub fn get_term_status(&mut self) -> Impedance {
|
||||||
self.ctrl.get_lf_mod_in_impedance()
|
self.ctrl.get_lf_mod_in_impedance()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_status_report(&mut self) -> StatusReport {
|
pub fn get_status_report(&mut self) -> StatusReport {
|
||||||
StatusReport {
|
StatusReport {
|
||||||
pwr_engaged: LdPwrExcProtector::get_status().pwr_engaged,
|
pwr_on: LdPwrExcProtector::get_status().pwr_engaged,
|
||||||
pwr_excursion: LdPwrExcProtector::get_status().pwr_excursion,
|
pwr_excursion: LdPwrExcProtector::get_status().pwr_excursion,
|
||||||
ld_i_set: self.settings.ld_drive_current,
|
ld_i_set: self.settings.ld_drive_current,
|
||||||
pd_i: self.get_pd_i(),
|
pd_i: self.get_pd_i(),
|
||||||
|
@ -209,7 +215,7 @@ impl LdDrive{
|
||||||
pub fn get_settings_summary(&mut self) -> LdSettingsSummary {
|
pub fn get_settings_summary(&mut self) -> LdSettingsSummary {
|
||||||
let settings = self.settings;
|
let settings = self.settings;
|
||||||
LdSettingsSummary {
|
LdSettingsSummary {
|
||||||
pwr_on: self.settings.pwr_on,
|
default_pwr_on: self.settings.default_pwr_on,
|
||||||
ld_drive_current: LdSettingsSummaryField { value: settings.ld_drive_current, max: Settings::LD_CURRENT_MAX},
|
ld_drive_current: LdSettingsSummaryField { value: settings.ld_drive_current, max: Settings::LD_CURRENT_MAX},
|
||||||
ld_drive_current_limit: LdSettingsSummaryField { value: settings.ld_drive_current_limit, max: Settings::LD_CURRENT_MAX},
|
ld_drive_current_limit: LdSettingsSummaryField { value: settings.ld_drive_current_limit, max: Settings::LD_CURRENT_MAX},
|
||||||
pd_responsitivity: settings.pd_responsitivity,
|
pd_responsitivity: settings.pd_responsitivity,
|
||||||
|
@ -220,7 +226,7 @@ impl LdDrive{
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
||||||
pub struct LdSettingsSummary {
|
pub struct LdSettingsSummary {
|
||||||
pwr_on: bool,
|
default_pwr_on: bool,
|
||||||
ld_drive_current: LdSettingsSummaryField<ElectricCurrent>,
|
ld_drive_current: LdSettingsSummaryField<ElectricCurrent>,
|
||||||
ld_drive_current_limit: LdSettingsSummaryField<ElectricCurrent>,
|
ld_drive_current_limit: LdSettingsSummaryField<ElectricCurrent>,
|
||||||
pd_responsitivity: pd_responsitivity::Parameters,
|
pd_responsitivity: pd_responsitivity::Parameters,
|
||||||
|
|
|
@ -207,6 +207,10 @@ impl MAX1968 {
|
||||||
self.pins_adc.reference_voltage()
|
self.pins_adc.reference_voltage()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_powered_on(&mut self) -> bool {
|
||||||
|
self.phy.shdn.is_set_low()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn power_down(&mut self) {
|
pub fn power_down(&mut self) {
|
||||||
self.phy.shdn.set_low();
|
self.phy.shdn.set_low();
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,6 +142,10 @@ impl PidState {
|
||||||
Some(temperature)
|
Some(temperature)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn apply_pid_params(&mut self, pid_params: Parameters){
|
||||||
|
self.controller.parameters = pid_params;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_pid_params(&mut self, param: PidSettings, val: f32){
|
pub fn set_pid_params(&mut self, param: PidSettings, val: f32){
|
||||||
match param {
|
match param {
|
||||||
PidSettings::Kp => {
|
PidSettings::Kp => {
|
||||||
|
@ -208,4 +212,8 @@ impl PidState {
|
||||||
pub fn get_sh(&mut self) -> sh::Parameters {
|
pub fn get_sh(&mut self) -> sh::Parameters {
|
||||||
self.sh
|
self.sh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn apply_sh(&mut self, sh: sh::Parameters) {
|
||||||
|
self.sh = sh;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ use crate::thermostat::max1968::{MAX1968, AdcReadTarget, PwmPinsEnum};
|
||||||
use crate::thermostat::ad7172::{self, FilterType, PostFilter, SingleChODR};
|
use crate::thermostat::ad7172::{self, FilterType, PostFilter, SingleChODR};
|
||||||
use crate::thermostat::pid_state::{PidState, PidSettings, Parameters as PidParams};
|
use crate::thermostat::pid_state::{PidState, PidSettings, Parameters as PidParams};
|
||||||
use crate::thermostat::temp_mon::{TempMon, TempStatus, TempMonSettings};
|
use crate::thermostat::temp_mon::{TempMon, TempStatus, TempMonSettings};
|
||||||
|
use crate::thermostat::steinhart_hart::Parameters as Sh_Params;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use uom::si::{
|
use uom::si::{
|
||||||
|
@ -39,7 +40,7 @@ pub struct TempAdcFilter{
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Clone, Copy, Debug, Tree)]
|
#[derive(Deserialize, Serialize, Clone, Copy, Debug, Tree)]
|
||||||
pub struct TecSettings {
|
pub struct TecSettings {
|
||||||
pub pwr_on: bool,
|
pub default_pwr_on: bool,
|
||||||
pub center_pt: ElectricPotential,
|
pub center_pt: ElectricPotential,
|
||||||
pub max_v_set: ElectricPotential,
|
pub max_v_set: ElectricPotential,
|
||||||
pub max_i_pos_set: ElectricCurrent,
|
pub max_i_pos_set: ElectricCurrent,
|
||||||
|
@ -102,7 +103,7 @@ impl TecSettings{
|
||||||
impl Default for TecSettings {
|
impl Default for TecSettings {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
pwr_on: false,
|
default_pwr_on: false,
|
||||||
center_pt: ElectricPotential::new::<volt>(1.5),
|
center_pt: ElectricPotential::new::<volt>(1.5),
|
||||||
max_v_set: ElectricPotential::new::<volt>(5.0),
|
max_v_set: ElectricPotential::new::<volt>(5.0),
|
||||||
max_i_pos_set: ElectricCurrent::new::<ampere>(1.0),
|
max_i_pos_set: ElectricCurrent::new::<ampere>(1.0),
|
||||||
|
@ -123,9 +124,12 @@ pub struct Thermostat {
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
||||||
pub struct ThermostatSettingsSummary {
|
pub struct ThermostatSettingsSummary {
|
||||||
pwr_on: bool,
|
default_pwr_on: bool,
|
||||||
|
pid_engaged: bool,
|
||||||
|
temperature_setpoint: ThermodynamicTemperature,
|
||||||
tec_settings: TecSettingSummary,
|
tec_settings: TecSettingSummary,
|
||||||
pid_params: PidParams,
|
pid_params: PidParams,
|
||||||
|
temp_adc_settings: TempAdcFilter,
|
||||||
temp_mon_settings: TempMonSettings,
|
temp_mon_settings: TempMonSettings,
|
||||||
thermistor_params: ThermistorParams,
|
thermistor_params: ThermistorParams,
|
||||||
}
|
}
|
||||||
|
@ -210,20 +214,22 @@ impl Thermostat{
|
||||||
|
|
||||||
pub fn power_up(&mut self){
|
pub fn power_up(&mut self){
|
||||||
self.max1968.power_up();
|
self.max1968.power_up();
|
||||||
self.tec_settings.pwr_on = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn power_down(&mut self){
|
pub fn power_down(&mut self){
|
||||||
self.max1968.power_down();
|
self.max1968.power_down();
|
||||||
self.pid_ctrl_ch0.reset_pid_state();
|
self.pid_ctrl_ch0.reset_pid_state();
|
||||||
self.set_i(ElectricCurrent::new::<ampere>(0.0));
|
self.set_i(ElectricCurrent::new::<ampere>(0.0));
|
||||||
self.tec_settings.pwr_on = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_center_pt(&mut self, value: ElectricPotential){
|
fn set_center_pt(&mut self, value: ElectricPotential){
|
||||||
self.tec_settings.center_pt = value;
|
self.tec_settings.center_pt = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_default_pwr_on(&mut self, pwr_on: bool) {
|
||||||
|
self.tec_settings.default_pwr_on = pwr_on;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_i(&mut self, i_tec: ElectricCurrent) -> ElectricCurrent {
|
pub fn set_i(&mut self, i_tec: ElectricCurrent) -> ElectricCurrent {
|
||||||
let voltage = i_tec * 10.0 * R_SENSE + self.tec_settings.center_pt;
|
let voltage = i_tec * 10.0 * R_SENSE + self.tec_settings.center_pt;
|
||||||
let voltage = self.max1968.set_dac(voltage, TecSettings::DAC_OUT_V_MAX);
|
let voltage = self.max1968.set_dac(voltage, TecSettings::DAC_OUT_V_MAX);
|
||||||
|
@ -335,6 +341,7 @@ impl Thermostat{
|
||||||
pub fn get_status_report(&mut self) -> StatusReport {
|
pub fn get_status_report(&mut self) -> StatusReport {
|
||||||
let (tec_v, tec_i) = self.get_tec_readings();
|
let (tec_v, tec_i) = self.get_tec_readings();
|
||||||
StatusReport {
|
StatusReport {
|
||||||
|
pwr_on: self.max1968.is_powered_on(),
|
||||||
pid_engaged: self.get_pid_engaged(),
|
pid_engaged: self.get_pid_engaged(),
|
||||||
temp_mon_status: self.temp_mon.get_status(),
|
temp_mon_status: self.temp_mon.get_status(),
|
||||||
temperature: self.pid_ctrl_ch0.get_temperature(),
|
temperature: self.pid_ctrl_ch0.get_temperature(),
|
||||||
|
@ -367,6 +374,17 @@ impl Thermostat{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn apply_steinhart_hart(&mut self, sh: ThermistorParams) {
|
||||||
|
self.pid_ctrl_ch0.apply_sh(
|
||||||
|
Sh_Params {
|
||||||
|
t0: ThermodynamicTemperature::new::<degree_celsius>(sh.t0),
|
||||||
|
r0: sh.r0,
|
||||||
|
b: sh.b,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn get_tec_settings(&mut self) -> TecSettingSummary {
|
fn get_tec_settings(&mut self) -> TecSettingSummary {
|
||||||
TecSettingSummary {
|
TecSettingSummary {
|
||||||
i_set: TecSettingsSummaryField { value: self.tec_settings.i_set, max: TecSettings::MAX_I_SET },
|
i_set: TecSettingsSummaryField { value: self.tec_settings.i_set, max: TecSettings::MAX_I_SET },
|
||||||
|
@ -402,6 +420,11 @@ impl Thermostat{
|
||||||
self.temp_mon.set_setpoint(t);
|
self.temp_mon.set_setpoint(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn apply_temp_mon_settings(&mut self, settings: TempMonSettings){
|
||||||
|
self.temp_mon.set_upper_limit(ThermodynamicTemperature::new::<degree_celsius>(settings.upper_limit));
|
||||||
|
self.temp_mon.set_lower_limit(ThermodynamicTemperature::new::<degree_celsius>(settings.lower_limit));
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_temp_mon_upper_limit(&mut self, t: ThermodynamicTemperature) {
|
pub fn set_temp_mon_upper_limit(&mut self, t: ThermodynamicTemperature) {
|
||||||
self.temp_mon.set_upper_limit(t);
|
self.temp_mon.set_upper_limit(t);
|
||||||
}
|
}
|
||||||
|
@ -422,8 +445,8 @@ impl Thermostat{
|
||||||
self.ad7172.set_sinc5_sinc1_with_50hz_60hz_rejection(index, odr).unwrap();
|
self.ad7172.set_sinc5_sinc1_with_50hz_60hz_rejection(index, odr).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_temp_adc_sinc3_fine_filter(&mut self, index: u8, rate: f64) {
|
pub fn set_temp_adc_sinc3_fine_filter(&mut self, index: u8, rate: f32) {
|
||||||
self.ad7172.set_sinc3_fine_filter(index, rate as f32).unwrap();
|
self.ad7172.set_sinc3_fine_filter(index, rate).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clear_temp_mon_alarm(&mut self) {
|
pub fn clear_temp_mon_alarm(&mut self) {
|
||||||
|
@ -435,10 +458,32 @@ impl Thermostat{
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_settings_summary(&mut self) -> ThermostatSettingsSummary {
|
pub fn get_settings_summary(&mut self) -> ThermostatSettingsSummary {
|
||||||
|
let temp_adc_filter_type: FilterType;
|
||||||
|
let update_rate: f32;
|
||||||
|
match self.ad7172.get_filter_type_and_rate(0) {
|
||||||
|
Ok((filter_type, rate)) => {
|
||||||
|
temp_adc_filter_type = filter_type;
|
||||||
|
update_rate = rate;
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
panic!("Cannot read ADC filter type and rate");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ThermostatSettingsSummary {
|
ThermostatSettingsSummary {
|
||||||
pwr_on: self.tec_settings.pwr_on,
|
default_pwr_on: self.tec_settings.default_pwr_on,
|
||||||
|
pid_engaged: self.get_pid_engaged(),
|
||||||
|
temperature_setpoint: self.pid_ctrl_ch0.get_pid_setpoint(),
|
||||||
tec_settings: self.get_tec_settings(),
|
tec_settings: self.get_tec_settings(),
|
||||||
pid_params: self.get_pid_settings(),
|
pid_params: self.get_pid_settings(),
|
||||||
|
temp_adc_settings: TempAdcFilter{
|
||||||
|
filter_type : temp_adc_filter_type,
|
||||||
|
sinc5sinc1odr : None,
|
||||||
|
sinc3odr : None,
|
||||||
|
sinc5sinc1postfilter : None,
|
||||||
|
sinc3fineodr : None,
|
||||||
|
rate : Some(update_rate),
|
||||||
|
},
|
||||||
temp_mon_settings: self.get_temp_mon_settings(),
|
temp_mon_settings: self.get_temp_mon_settings(),
|
||||||
thermistor_params: self.get_steinhart_hart(),
|
thermistor_params: self.get_steinhart_hart(),
|
||||||
}
|
}
|
||||||
|
@ -447,6 +492,7 @@ impl Thermostat{
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
#[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)]
|
||||||
pub struct StatusReport {
|
pub struct StatusReport {
|
||||||
|
pwr_on: bool,
|
||||||
pid_engaged: bool,
|
pid_engaged: bool,
|
||||||
temp_mon_status: TempStatus,
|
temp_mon_status: TempStatus,
|
||||||
temperature: Option<ThermodynamicTemperature>,
|
temperature: Option<ThermodynamicTemperature>,
|
||||||
|
|
Loading…
Reference in New Issue