#[cfg(feature = "blocking")]
use embedded_hal::spi::{SpiBus, SpiDevice};
#[cfg(feature = "async")]
use embedded_hal_async::spi::{SpiBus, SpiDevice};
use embedded_hal::digital::OutputPin;
use crate::Interface;
pub struct SPIInterface<SPI: SpiDevice> {
spi: SPI,
}
impl<SPI: SpiDevice> SPIInterface<SPI> {
pub fn new(spi: SPI) -> Self {
Self { spi }
}
pub fn destroy(self) -> SPI {
self.spi
}
}
pub struct SPIBusInterface<SPI: SpiBus, CS: OutputPin> {
spi: SPI,
cs: CS,
}
impl<SPI: SpiBus, CS: OutputPin> SPIBusInterface<SPI, CS> {
#[allow(unused)]
pub fn new(spi: SPI, cs: CS) -> Self {
Self { spi, cs }
}
}
#[cfg(feature = "async")]
impl<SPI: SpiBus, CS: OutputPin> Interface for SPIBusInterface<SPI, CS> {
type Error = SPI::Error;
async fn write_read(&mut self, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> {
self.cs.set_low().ok();
let result = self.spi.transfer(read, write).await;
self.cs.set_high().ok();
result
}
async fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
self.cs.set_low().ok();
let result = self.spi.write(data).await;
self.cs.set_high().ok();
result
}
}
#[cfg(feature = "blocking")]
impl<SPI: SpiBus, CS: OutputPin> Interface for SPIBusInterface<SPI, CS> {
type Error = SPI::Error;
fn write_read(&mut self, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> {
self.cs.set_low().ok();
let result = self.spi.transfer(read, write);
self.cs.set_high().ok();
result
}
fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
self.cs.set_low().ok();
let result = self.spi.write(data);
self.cs.set_high().ok();
result
}
}
#[cfg(feature = "async")]
impl<SPI: SpiDevice> Interface for SPIInterface<SPI> {
type Error = SPI::Error;
async fn write_read(&mut self, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> {
self.spi.transfer(read, write).await
}
async fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
self.spi.write(data).await
}
}
#[cfg(feature = "blocking")]
impl<SPI: SpiDevice> Interface for SPIInterface<SPI> {
type Error = SPI::Error;
fn write_read(&mut self, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> {
self.spi.transfer(read, write)
}
fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
self.spi.write(data)
}
}