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; use network::Network; use register; use socket::{OwnedSockets, Socket, Sockets}; use udp::UdpSocket; pub struct W5500 { bus: SpiBus, network: NetworkImpl, sockets: OwnedSockets, } impl W5500 { pub fn new(bus: SpiBus, network: NetworkImpl, sockets: OwnedSockets) -> Self { W5500 { bus, network, sockets, } } pub fn sockets(&mut self) -> Sockets { ( &mut self.sockets.0, &mut self.sockets.1, &mut self.sockets.2, &mut self.sockets.3, &mut self.sockets.4, &mut self.sockets.5, &mut self.sockets.6, &mut self.sockets.7, ) } pub fn reset(mut self) -> Result, SpiBus::Error> { self.clear_mode()?; Ok(UninitializedW5500::new(self.bus)) } fn clear_mode(&mut self) -> Result<(), SpiBus::Error> { // reset bit let mut mode = [0b10000000]; block!(self .bus .transfer_frame(register::COMMON, register::common::MODE, true, &mut mode))?; Ok(()) } pub fn open_udp_socket<'a, SocketImpl: Socket>( self, port: u16, socket: &'a mut SocketImpl, ) -> Result, OpenSocketError> { if socket.is_owned_by(&self.sockets) { UdpSocket::new(port, self.bus, self.network, self.sockets, socket) .map_err(|e| OpenSocketError::BusError(e)) } else { Err(OpenSocketError::ForeignSocketError) } } pub fn release(self) -> (SpiBus, NetworkImpl, OwnedSockets) { (self.bus, self.network, self.sockets) } } impl, ChipSelect: OutputPin, NetworkImpl: Network> W5500, NetworkImpl> { pub fn deactivate(self) -> (InactiveW5500, NetworkImpl>, Spi) { let (bus, spi) = self.bus.deactivate(); (InactiveW5500::new(bus, self.network, self.sockets), spi) } } impl, NetworkImpl: Network> W5500, NetworkImpl> { pub fn deactivate(self) -> (InactiveW5500, Spi) { let (bus, spi) = self.bus.deactivate(); (InactiveW5500::new(bus, self.network, self.sockets), spi) } } pub enum OpenSocketError { ForeignSocketError, BusError(BusError), } pub struct ForeignSocketError {}