use embedded_hal::digital::{InputPin, OutputPin};
use embedded_io::{ErrorType, Read, Write};
use crate::error::Ad5700Error;
pub struct Ad5700<UART, RTS, CD> {
uart: UART,
rts: RTS,
cd: CD,
}
impl<UART, RTS, CD> Ad5700<UART, RTS, CD>
where
UART: Read + Write,
RTS: OutputPin,
CD: InputPin,
{
pub fn new(uart: UART, rts: RTS, cd: CD) -> Self {
Ad5700 { uart, rts, cd }
}
pub fn transmit(&mut self, data: &[u8]) -> Result<(), Ad5700Error<<UART as ErrorType>::Error>> {
self.rts.set_high().map_err(|_| Ad5700Error::NoCarrier)?;
self.uart.write_all(data).map_err(Ad5700Error::Uart)?;
self.uart.flush().map_err(Ad5700Error::Uart)?;
self.rts.set_low().map_err(|_| Ad5700Error::NoCarrier)?;
Ok(())
}
pub fn receive_into(
&mut self,
buf: &mut [u8],
) -> Result<usize, Ad5700Error<<UART as ErrorType>::Error>> {
let n = self.uart.read(buf).map_err(Ad5700Error::Uart)?;
Ok(n)
}
pub fn carrier_detected(&mut self) -> bool {
self.cd.is_high().unwrap_or(false)
}
pub fn release(self) -> (UART, RTS, CD) {
(self.uart, self.rts, self.cd)
}
}