Added bus model and InactiveW5500 state
This commit is contained in:
parent
03e30ef699
commit
a43f86d744
7 changed files with 130 additions and 40 deletions
|
|
@ -1,15 +1,13 @@
|
||||||
use embedded_hal::digital::v2::OutputPin;
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
use embedded_hal::spi::FullDuplex;
|
use embedded_hal::spi::FullDuplex;
|
||||||
|
|
||||||
use crate::bus::Bus;
|
use crate::bus::{ActiveBus, Bus};
|
||||||
|
|
||||||
pub struct FourWire<ChipSelect: OutputPin> {
|
pub struct FourWire<ChipSelect: OutputPin> {
|
||||||
cs: ChipSelect
|
cs: ChipSelect,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<ChipSelect: OutputPin>
|
impl<ChipSelect: OutputPin> FourWire<ChipSelect> {
|
||||||
FourWire<ChipSelect>
|
|
||||||
{
|
|
||||||
pub fn new(cs: ChipSelect) -> Self {
|
pub fn new(cs: ChipSelect) -> Self {
|
||||||
Self { cs }
|
Self { cs }
|
||||||
}
|
}
|
||||||
|
|
@ -18,12 +16,22 @@ impl<ChipSelect: OutputPin>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> Bus<Spi>
|
impl<ChipSelect: OutputPin> Bus for FourWire<ChipSelect> {}
|
||||||
for FourWire<ChipSelect>
|
|
||||||
{
|
impl<ChipSelect: OutputPin> FourWire<ChipSelect> {
|
||||||
|
pub fn activate<Spi: FullDuplex<u8>>(self, spi: Spi) -> ActiveFourWire<Spi, ChipSelect> {
|
||||||
|
ActiveFourWire { cs: self.cs, spi }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ActiveFourWire<Spi: FullDuplex<u8>, ChipSelect: OutputPin> {
|
||||||
|
cs: ChipSelect,
|
||||||
|
spi: Spi,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> ActiveBus for ActiveFourWire<Spi, ChipSelect> {
|
||||||
type Error = FourWireError<Spi::Error, ChipSelect::Error>;
|
type Error = FourWireError<Spi::Error, ChipSelect::Error>;
|
||||||
fn transfer_frame<'a, 'b>(
|
fn transfer_frame<'a>(
|
||||||
spi: &'b mut Spi,
|
|
||||||
address_phase: [u8; 2],
|
address_phase: [u8; 2],
|
||||||
control_phase: u8,
|
control_phase: u8,
|
||||||
data_phase: &'a mut [u8],
|
data_phase: &'a mut [u8],
|
||||||
|
|
@ -32,6 +40,11 @@ impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> Bus<Spi>
|
||||||
Ok(data_phase)
|
Ok(data_phase)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> ActiveFourWire<Spi, ChipSelect> {
|
||||||
|
pub fn deactivate(self) -> (FourWire<ChipSelect>, Spi) {
|
||||||
|
(FourWire::new(self.cs), self.spi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub enum FourWireError<SpiError, ChipSelectError> {
|
pub enum FourWireError<SpiError, ChipSelectError> {
|
||||||
SpiError(SpiError),
|
SpiError(SpiError),
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,18 @@
|
||||||
use nb::Result;
|
use nb::Result;
|
||||||
use embedded_hal::spi::FullDuplex;
|
|
||||||
|
|
||||||
mod four_wire;
|
mod four_wire;
|
||||||
mod three_wire;
|
mod three_wire;
|
||||||
|
|
||||||
|
pub use self::four_wire::ActiveFourWire;
|
||||||
pub use self::four_wire::FourWire;
|
pub use self::four_wire::FourWire;
|
||||||
|
pub use self::three_wire::ActiveThreeWire;
|
||||||
pub use self::three_wire::ThreeWire;
|
pub use self::three_wire::ThreeWire;
|
||||||
|
|
||||||
pub trait Bus<Spi: FullDuplex<u8>> {
|
pub trait Bus {}
|
||||||
|
|
||||||
|
pub trait ActiveBus {
|
||||||
type Error;
|
type Error;
|
||||||
fn transfer_frame<'a, 'b>(
|
fn transfer_frame<'a>(
|
||||||
spi: &'b mut Spi,
|
|
||||||
address_phase: [u8; 2],
|
address_phase: [u8; 2],
|
||||||
control_phase: u8,
|
control_phase: u8,
|
||||||
data_phase: &'a mut [u8],
|
data_phase: &'a mut [u8],
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,30 @@
|
||||||
use embedded_hal::spi::FullDuplex;
|
use embedded_hal::spi::FullDuplex;
|
||||||
|
|
||||||
use crate::bus::Bus;
|
use crate::bus::{ActiveBus, Bus};
|
||||||
|
|
||||||
pub struct ThreeWire {}
|
pub struct ThreeWire {}
|
||||||
|
|
||||||
impl ThreeWire {
|
impl ThreeWire {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self { }
|
Self {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Spi: FullDuplex<u8>> Bus<Spi> for ThreeWire {
|
impl Bus for ThreeWire {}
|
||||||
|
|
||||||
|
impl ThreeWire {
|
||||||
|
pub fn activate<Spi: FullDuplex<u8>>(self, spi: Spi) -> ActiveThreeWire<Spi> {
|
||||||
|
ActiveThreeWire { spi }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ActiveThreeWire<Spi: FullDuplex<u8>> {
|
||||||
|
spi: Spi,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Spi: FullDuplex<u8>> ActiveBus for ActiveThreeWire<Spi> {
|
||||||
type Error = Spi::Error;
|
type Error = Spi::Error;
|
||||||
fn transfer_frame<'a, 'b>(
|
fn transfer_frame<'a>(
|
||||||
spi: &'b mut Spi,
|
|
||||||
address_phase: [u8; 2],
|
address_phase: [u8; 2],
|
||||||
control_phase: u8,
|
control_phase: u8,
|
||||||
data_phase: &'a mut [u8],
|
data_phase: &'a mut [u8],
|
||||||
|
|
@ -22,3 +33,9 @@ impl<Spi: FullDuplex<u8>> Bus<Spi> for ThreeWire {
|
||||||
Ok(data_phase)
|
Ok(data_phase)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<Spi: FullDuplex<u8>> ActiveThreeWire<Spi> {
|
||||||
|
pub fn deactivate(self) -> (ThreeWire, Spi) {
|
||||||
|
(ThreeWire::new(), self.spi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
26
src/inactive_w5500.rs
Normal file
26
src/inactive_w5500.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
use bus::{ActiveFourWire, ActiveThreeWire, Bus, FourWire, ThreeWire};
|
||||||
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
|
use embedded_hal::spi::FullDuplex;
|
||||||
|
use w5500::W5500;
|
||||||
|
|
||||||
|
pub struct InactiveW5500<SpiBus: Bus> {
|
||||||
|
bus: SpiBus,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<SpiBus: Bus> InactiveW5500<SpiBus> {
|
||||||
|
pub fn new(bus: SpiBus) -> Self {
|
||||||
|
Self { bus }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<ChipSelect: OutputPin> InactiveW5500<FourWire<ChipSelect>> {
|
||||||
|
pub fn activate<Spi: FullDuplex<u8>>(self, spi: Spi) -> W5500<ActiveFourWire<Spi, ChipSelect>> {
|
||||||
|
W5500::new(self.bus.activate(spi))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl InactiveW5500<ThreeWire> {
|
||||||
|
pub fn activate<Spi: FullDuplex<u8>>(self, spi: Spi) -> W5500<ActiveThreeWire<Spi>> {
|
||||||
|
W5500::new(self.bus.activate(spi))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -901,7 +901,7 @@ extern crate nb;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
pub mod uninitialized_w5500;
|
|
||||||
pub mod bus;
|
pub mod bus;
|
||||||
|
pub mod inactive_w5500;
|
||||||
|
pub mod uninitialized_w5500;
|
||||||
pub mod w5500;
|
pub mod w5500;
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,33 @@
|
||||||
use embedded_hal::spi::FullDuplex;
|
use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire};
|
||||||
use embedded_hal::digital::v2::OutputPin;
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
use bus::{Bus, FourWire, ThreeWire};
|
use embedded_hal::spi::FullDuplex;
|
||||||
use w5500::W5500;
|
use w5500::W5500;
|
||||||
|
|
||||||
pub struct UninitializedW5500<Spi: FullDuplex<u8>, SpiBus: Bus<Spi>> {
|
pub struct UninitializedW5500<SpiBus: ActiveBus> {
|
||||||
bus: SpiBus,
|
bus: SpiBus,
|
||||||
spi: Spi,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Spi: FullDuplex<u8>, SpiBus: Bus<Spi>> UninitializedW5500<Spi, SpiBus> {
|
impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
|
||||||
pub fn initialize() -> W5500 {
|
pub fn initialize(self) -> W5500<SpiBus> {
|
||||||
// TODO actually initialize chip
|
// TODO actually initialize chip
|
||||||
W5500 {}
|
W5500::new(self.bus)
|
||||||
|
}
|
||||||
|
pub fn new(bus: SpiBus) -> UninitializedW5500<SpiBus> {
|
||||||
|
UninitializedW5500 { bus: bus }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> UninitializedW5500<Spi, FourWire<ChipSelect>> {
|
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin>
|
||||||
pub fn new(spi: Spi, cs: ChipSelect) -> Self {
|
UninitializedW5500<ActiveFourWire<Spi, ChipSelect>>
|
||||||
Self { spi, bus: FourWire::new(cs) }
|
{
|
||||||
}
|
|
||||||
pub fn deactivate(self) -> (Spi, ChipSelect) {
|
pub fn deactivate(self) -> (Spi, ChipSelect) {
|
||||||
(self.spi, self.bus.release())
|
let (bus, spi) = self.bus.deactivate();
|
||||||
|
(spi, bus.release())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Spi: FullDuplex<u8>> UninitializedW5500<Spi, ThreeWire> {
|
impl<Spi: FullDuplex<u8>> UninitializedW5500<ActiveThreeWire<Spi>> {
|
||||||
pub fn new(spi: Spi) -> Self {
|
|
||||||
Self { spi, bus: ThreeWire::new() }
|
|
||||||
}
|
|
||||||
pub fn deactivate(self) -> Spi {
|
pub fn deactivate(self) -> Spi {
|
||||||
self.spi
|
self.bus.deactivate().1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
35
src/w5500.rs
35
src/w5500.rs
|
|
@ -1 +1,34 @@
|
||||||
pub struct W5500 {}
|
use crate::inactive_w5500::InactiveW5500;
|
||||||
|
use crate::uninitialized_w5500::UninitializedW5500;
|
||||||
|
use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire, FourWire, ThreeWire};
|
||||||
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
|
use embedded_hal::spi::FullDuplex;
|
||||||
|
|
||||||
|
pub struct W5500<SpiBus: ActiveBus> {
|
||||||
|
bus: SpiBus,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<SpiBus: ActiveBus> W5500<SpiBus> {
|
||||||
|
pub fn new(bus: SpiBus) -> Self {
|
||||||
|
W5500 { bus }
|
||||||
|
}
|
||||||
|
pub fn reset(self) -> UninitializedW5500<SpiBus> {
|
||||||
|
// TODO reset chip
|
||||||
|
UninitializedW5500::new(self.bus)
|
||||||
|
}
|
||||||
|
//TODO open_udp_socket
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> W5500<ActiveFourWire<Spi, ChipSelect>> {
|
||||||
|
pub fn deactivate(self) -> (InactiveW5500<FourWire<ChipSelect>>, Spi) {
|
||||||
|
let (bus, spi) = self.bus.deactivate();
|
||||||
|
(InactiveW5500::new(bus), spi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Spi: FullDuplex<u8>> W5500<ActiveThreeWire<Spi>> {
|
||||||
|
pub fn deactivate(self) -> (InactiveW5500<ThreeWire>, Spi) {
|
||||||
|
let (bus, spi) = self.bus.deactivate();
|
||||||
|
(InactiveW5500::new(bus), spi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue