Re-wrote socket implementations to be more compatible with embedded-nal

This commit is contained in:
Jonah Dahlquist 2020-11-18 14:09:34 -08:00
commit f546ff2011
17 changed files with 673 additions and 1603 deletions

View file

@ -1,11 +1,10 @@
use crate::network::{Dhcp, Manual, Network};
use crate::{IpAddress, MacAddress, Mode};
use crate::{MacAddress, Mode};
use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire};
use embedded_hal::digital::v2::OutputPin;
use embedded_hal::spi::FullDuplex;
use embedded_nal::Ipv4Addr;
use register;
use socket::OwnedSockets;
use socket::{Socket0, Socket1, Socket2, Socket3, Socket4, Socket5, Socket6, Socket7};
use w5500::W5500;
pub struct UninitializedW5500<SpiBus: ActiveBus> {
@ -17,6 +16,7 @@ pub enum InitializeError<SpiError> {
SpiError(SpiError),
ChipNotConnected,
}
// TODO add From impl and remove map_errs
impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
pub fn new(bus: SpiBus) -> UninitializedW5500<SpiBus> {
@ -27,7 +27,7 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
self,
mac: MacAddress,
mode_options: Mode,
) -> Result<(W5500<SpiBus, Dhcp>, OwnedSockets), InitializeError<SpiBus::Error>> {
) -> Result<W5500<SpiBus, Dhcp>, InitializeError<SpiBus::Error>> {
let network = Dhcp::new(mac);
self.initialize_with_network(network, mode_options)
}
@ -35,23 +35,24 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
pub fn initialize_manual(
self,
mac: MacAddress,
ip: IpAddress,
ip: Ipv4Addr,
mode_options: Mode,
) -> Result<(W5500<SpiBus, Manual>, OwnedSockets), InitializeError<SpiBus::Error>> {
let mut gateway = ip;
gateway.address[3] = 1;
let subnet = IpAddress::new(255, 255, 255, 0);
) -> Result<W5500<SpiBus, Manual>, InitializeError<SpiBus::Error>> {
let mut ip_bytes = ip.octets();
ip_bytes[3] = 1;
let gateway = Ipv4Addr::from(ip_bytes);
let subnet = Ipv4Addr::new(255, 255, 255, 0);
self.initialize_advanced(mac, ip, gateway, subnet, mode_options)
}
pub fn initialize_advanced(
self,
mac: MacAddress,
ip: IpAddress,
gateway: IpAddress,
subnet: IpAddress,
ip: Ipv4Addr,
gateway: Ipv4Addr,
subnet: Ipv4Addr,
mode_options: Mode,
) -> Result<(W5500<SpiBus, Manual>, OwnedSockets), InitializeError<SpiBus::Error>> {
) -> Result<W5500<SpiBus, Manual>, InitializeError<SpiBus::Error>> {
let network = Manual::new(mac, ip, gateway, subnet);
self.initialize_with_network(network, mode_options)
}
@ -60,35 +61,21 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
mut self,
mut network: NetworkImpl,
mode_options: Mode,
) -> Result<(W5500<SpiBus, NetworkImpl>, OwnedSockets), InitializeError<SpiBus::Error>> {
) -> Result<W5500<SpiBus, NetworkImpl>, InitializeError<SpiBus::Error>> {
self.assert_chip_version(0x4)?;
// RESET
/*
let mut mode = [0b10000000];
self
.bus
.transfer_frame(register::COMMON, register::common::MODE, true, &mut mode)
self.bus
.write_frame(register::COMMON, register::common::MODE, &mut mode)
.map_err(|e| InitializeError::SpiError(e))?;
*/
self.set_mode(mode_options)
.map_err(|e| InitializeError::SpiError(e))?;
network
.refresh(&mut self.bus)
.map_err(|e| InitializeError::SpiError(e))?;
let sockets = (
Socket0 {},
Socket1 {},
Socket2 {},
Socket3 {},
Socket4 {},
Socket5 {},
Socket6 {},
Socket7 {},
);
Ok((W5500::new(self.bus, network), sockets))
Ok(W5500::new(self.bus, network))
}
fn assert_chip_version(
@ -96,13 +83,9 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
expected_version: u8,
) -> Result<(), InitializeError<SpiBus::Error>> {
let mut version = [0];
self.bus.transfer_frame(
register::COMMON,
register::common::VERSION,
false,
&mut version
)
.map_err(|e| InitializeError::SpiError(e))?;
self.bus
.read_frame(register::COMMON, register::common::VERSION, &mut version)
.map_err(|e| InitializeError::SpiError(e))?;
if version[0] != expected_version {
Err(InitializeError::ChipNotConnected)
} else {
@ -116,9 +99,8 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
mode[0] |= mode_options.on_ping_request as u8;
mode[0] |= mode_options.connection_type as u8;
mode[0] |= mode_options.arp_responses as u8;
self
.bus
.transfer_frame(register::COMMON, register::common::MODE, true, &mut mode)?;
self.bus
.write_frame(register::COMMON, register::common::MODE, &mut mode)?;
Ok(())
}
}