1use embedded_hal::digital::OutputPin;
2
3use crate::{mode::Async, Channel, Dac, DacError, Message};
4
5impl<SPI, SYNC> Dac<SPI, SYNC, Async>
6 where SPI: embedded_hal_async::spi::SpiBus, SYNC: OutputPin,
7
8{
9 pub async fn set_voltage(&mut self, channel: Channel, voltage: u16) -> Result<(), DacError> {
12 let message = Message::get_voltage_message(channel, voltage, self.is_inverted);
13 self.write(message).await
14 }
15
16 pub async fn use_internal_reference(&mut self) -> Result<(), DacError> {
19 let message = Message::get_internal_reference_message(true);
20 self.write(message).await
21 }
22
23 pub async fn use_external_reference(&mut self) -> Result<(), DacError> {
25 let message = Message::get_internal_reference_message(false);
26 self.write(message).await
27 }
28
29 pub async fn reset(&mut self) -> Result<(), DacError> {
35 let message = Message::get_software_reset_message();
36 self.write(message).await
37 }
38
39 async fn write(&mut self, message: Message) -> Result<(), DacError> {
41 let command: [u8; 4] = message.get_payload_bytes();
42
43 self.sync.set_low().unwrap_or_default();
44 let result = self.spi.write(&command).await;
45 self.sync.set_high().unwrap_or_default();
46
47 match result {
48 Ok(v) => Ok(v),
49 Err(_e) => Err(DacError::BusWriteError),
50 }
51 }
52}