use stm32f4xx_hal::hal::digital::v2::OutputPin; use crate::{ ad5680, ad7172, channel_state::ChannelState, pins::{ChannelPins, ChannelPinSet}, }; /// Marker type for the first channel pub struct Channel0; /// Marker type for the second channel pub struct Channel1; pub struct Channel { pub state: ChannelState, /// for `i_set` pub dac: ad5680::Dac, /// 1 / Volts pub dac_factor: f64, pub shdn: C::Shdn, pub vref_pin: C::VRefPin, pub itec_pin: C::ItecPin, /// feedback from `dac` output pub dac_feedback_pin: C::DacFeedbackPin, pub tec_u_meas_pin: C::TecUMeasPin, } impl Channel { pub fn new(pins: ChannelPinSet, adc_calibration: ad7172::ChannelCalibration) -> Self { let state = ChannelState::new(adc_calibration); let mut dac = ad5680::Dac::new(pins.dac_spi, pins.dac_sync); let _ = dac.set(0); // sensible dummy preset. calibrate_i_set() must be used. let dac_factor = ad5680::MAX_VALUE as f64 / 5.0; Channel { state, dac, dac_factor, shdn: pins.shdn, vref_pin: pins.vref_pin, itec_pin: pins.itec_pin, dac_feedback_pin: pins.dac_feedback_pin, tec_u_meas_pin: pins.tec_u_meas_pin, } } // power up TEC pub fn power_up(&mut self) { let _ = self.shdn.set_high(); } // power down TEC pub fn power_down(&mut self) { let _ = self.shdn.set_low(); } }