use embedded_hal::{digital::OutputPin, spi::SpiBus};
use crate::{mode::Blocking, Channel, Dac, DacError, Message};
impl<SPI, SYNC> Dac<SPI, SYNC, Blocking>
where SPI: SpiBus, SYNC: OutputPin,
{
pub fn set_voltage(&mut self, channel: Channel, voltage: u16) -> Result<(), DacError> {
let message = Message::get_voltage_message(channel, voltage, self.is_inverted);
self.write(message)
}
pub fn use_internal_reference(&mut self) -> Result<(), DacError> {
let message = Message::get_internal_reference_message(true);
self.write(message)
}
pub fn use_external_reference(&mut self) -> Result<(), DacError> {
let message = Message::get_internal_reference_message(false);
self.write(message)
}
pub fn reset(&mut self) -> Result<(), DacError> {
let message = Message::get_software_reset_message();
self.write(message)
}
fn write(&mut self, message: Message) -> Result<(), DacError> {
let command: [u8; 4] = message.get_payload_bytes();
self.sync.set_low().unwrap_or_default();
let result = self.spi.write(&command);
self.sync.set_high().unwrap_or_default();
match result {
Ok(v) => Ok(v),
Err(_e) => Err(DacError::BusWriteError),
}
}
}