Closed
Description
I'm unfamiliar with SPI, so maybe I'm completely off here, but it seems like the two main traits in embedded_hal::spi
could be somewhat unified?
As an example, consider the API below.
trait Spi: ErrorType {
fn read(&mut self, words: &mut [Word]) -> Result<(), Self::Error>;
fn write(&mut self, words: &[Word]) -> Result<(), Self::Error>;
fn transfer(&mut self, read: &mut [Word], write: &[Word]) -> Result<(), Self::Error>;
fn transfer_in_place(&mut self, words: &mut [Word]) -> Result<(), Self::Error>;
fn flush(&mut self) -> Result<(), Self::Error>;
}
trait SpiBus: Spi {}
trait SpiDevice: Spi {
fn transaction(&mut self, operations: &mut [Operation<'_, Word>]) -> Result<(), Self::Error>;
}
impl<T: ?Sized + SpiDevice> Spi for T {
fn read(&mut self, words: &mut [Word]) -> Result<(), Self::Error> {
self.transaction(&mut [Operation::Read(words)])
}
fn write(&mut self, words: &[Word]) -> Result<(), Self::Error> {
self.transaction(&mut [Operation::Write(words)])
}
fn transfer(&mut self, read: &mut [Word], write: &[Word]) -> Result<(), Self::Error> {
self.transaction(&mut [Operation::Transfer(read, write)])
}
fn transfer_in_place(&mut self, words: &mut [Word]) -> Result<(), Self::Error> {
self.transaction(&mut [Operation::TransferInPlace(words)])
}
fn flush(&mut self) -> Result<(), Self::Error> {
// Noop for SPI devices, the flushing happens automatically inside the transaction
}
}
Again, unsure if this is actually beneficial to driver / HAL authors or not?
Metadata
Metadata
Assignees
Labels
No labels