Added a way to consume the Interface object, and easy single-function way to create a network interface with mac and IP

This commit is contained in:
Jonah Dahlquist 2020-11-19 20:10:48 -08:00
commit 1d533b2104

View file

@ -1,7 +1,14 @@
use bus::{ActiveBus};
use embedded_hal::digital::v2::OutputPin;
use embedded_hal::spi::FullDuplex;
use embedded_nal::Ipv4Addr;
use crate::{MacAddress,Mode};
use bus::{ActiveBus,FourWire,ActiveFourWire};
use device::Device;
use network::Network;
use network::{Network,Manual};
use core::cell::RefCell;
use uninitialized_device::{UninitializedDevice,InitializeError};
pub struct Interface<SpiBus: ActiveBus, NetworkImpl: Network> {
pub device: RefCell<Device<SpiBus, NetworkImpl>>,
@ -11,7 +18,18 @@ impl<SpiBus: ActiveBus, NetworkImpl: Network> Interface<SpiBus, NetworkImpl> {
fn new(device: Device<SpiBus, NetworkImpl>) -> Self {
Self { device: RefCell::new(device) }
}
pub fn release(self) -> Device<SpiBus, NetworkImpl> {
self.device.into_inner()
}
}
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> Interface<ActiveFourWire<Spi, ChipSelect>, Manual> {
pub fn setup(spi: Spi, cs: ChipSelect, mac: MacAddress, ip: Ipv4Addr) -> Result<Self, InitializeError<<ActiveFourWire<Spi, ChipSelect> as ActiveBus>::Error>> {
Ok(UninitializedDevice::new(FourWire::new(cs).activate(spi)).initialize_manual(mac, ip, Mode::default())?.into_interface())
}
}
impl<SpiBus: ActiveBus, NetworkImpl: Network> From<Device<SpiBus, NetworkImpl>> for Interface<SpiBus, NetworkImpl> {
fn from(device: Device<SpiBus, NetworkImpl>) -> Interface<SpiBus, NetworkImpl> {