Began skeleton of new UninitializedW5500 struct and Bus trait/impls

This commit is contained in:
Jonah Dahlquist 2019-08-04 23:48:52 -05:00 committed by Jonah Dahlquist
commit 03e30ef699
6 changed files with 1019 additions and 976 deletions

39
src/bus/four_wire.rs Normal file
View file

@ -0,0 +1,39 @@
use embedded_hal::digital::v2::OutputPin;
use embedded_hal::spi::FullDuplex;
use crate::bus::Bus;
pub struct FourWire<ChipSelect: OutputPin> {
cs: ChipSelect
}
impl<ChipSelect: OutputPin>
FourWire<ChipSelect>
{
pub fn new(cs: ChipSelect) -> Self {
Self { cs }
}
pub fn release(self) -> ChipSelect {
self.cs
}
}
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> Bus<Spi>
for FourWire<ChipSelect>
{
type Error = FourWireError<Spi::Error, ChipSelect::Error>;
fn transfer_frame<'a, 'b>(
spi: &'b mut Spi,
address_phase: [u8; 2],
control_phase: u8,
data_phase: &'a mut [u8],
) -> Result<&'a mut [u8], nb::Error<Self::Error>> {
// TODO implement transfer
Ok(data_phase)
}
}
pub enum FourWireError<SpiError, ChipSelectError> {
SpiError(SpiError),
ChipSelectError(ChipSelectError),
}

18
src/bus/mod.rs Normal file
View file

@ -0,0 +1,18 @@
use nb::Result;
use embedded_hal::spi::FullDuplex;
mod four_wire;
mod three_wire;
pub use self::four_wire::FourWire;
pub use self::three_wire::ThreeWire;
pub trait Bus<Spi: FullDuplex<u8>> {
type Error;
fn transfer_frame<'a, 'b>(
spi: &'b mut Spi,
address_phase: [u8; 2],
control_phase: u8,
data_phase: &'a mut [u8],
) -> Result<&'a mut [u8], Self::Error>;
}

24
src/bus/three_wire.rs Normal file
View file

@ -0,0 +1,24 @@
use embedded_hal::spi::FullDuplex;
use crate::bus::Bus;
pub struct ThreeWire {}
impl ThreeWire {
pub fn new() -> Self {
Self { }
}
}
impl<Spi: FullDuplex<u8>> Bus<Spi> for ThreeWire {
type Error = Spi::Error;
fn transfer_frame<'a, 'b>(
spi: &'b mut Spi,
address_phase: [u8; 2],
control_phase: u8,
data_phase: &'a mut [u8],
) -> Result<&'a mut [u8], nb::Error<Self::Error>> {
// TODO implement transfer
Ok(data_phase)
}
}

1879
src/lib.rs

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,34 @@
use embedded_hal::spi::FullDuplex;
use embedded_hal::digital::v2::OutputPin;
use bus::{Bus, FourWire, ThreeWire};
use w5500::W5500;
pub struct UninitializedW5500<Spi: FullDuplex<u8>, SpiBus: Bus<Spi>> {
bus: SpiBus,
spi: Spi,
}
impl<Spi: FullDuplex<u8>, SpiBus: Bus<Spi>> UninitializedW5500<Spi, SpiBus> {
pub fn initialize() -> W5500 {
// TODO actually initialize chip
W5500 {}
}
}
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> UninitializedW5500<Spi, FourWire<ChipSelect>> {
pub fn new(spi: Spi, cs: ChipSelect) -> Self {
Self { spi, bus: FourWire::new(cs) }
}
pub fn deactivate(self) -> (Spi, ChipSelect) {
(self.spi, self.bus.release())
}
}
impl<Spi: FullDuplex<u8>> UninitializedW5500<Spi, ThreeWire> {
pub fn new(spi: Spi) -> Self {
Self { spi, bus: ThreeWire::new() }
}
pub fn deactivate(self) -> Spi {
self.spi
}
}

1
src/w5500.rs Normal file
View file

@ -0,0 +1 @@
pub struct W5500 {}