Moved more functionality into socket
This commit is contained in:
parent
423d2f6401
commit
332ab924db
3 changed files with 20 additions and 13 deletions
|
|
@ -68,5 +68,4 @@ pub mod socketn {
|
||||||
pub const RECEIVED_SIZE: u16 = 0x26;
|
pub const RECEIVED_SIZE: u16 = 0x26;
|
||||||
|
|
||||||
pub const RX_DATA_READ_POINTER: u16 = 0x28;
|
pub const RX_DATA_READ_POINTER: u16 = 0x28;
|
||||||
pub const RX_DATA_WRITE_POINTER: u16 = 0x2A;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ pub trait Socket {
|
||||||
fn register(&self) -> u8;
|
fn register(&self) -> u8;
|
||||||
fn tx_buffer(&self) -> u8;
|
fn tx_buffer(&self) -> u8;
|
||||||
fn rx_buffer(&self) -> u8;
|
fn rx_buffer(&self) -> u8;
|
||||||
|
|
||||||
fn set_mode<SpiBus: ActiveBus>(
|
fn set_mode<SpiBus: ActiveBus>(
|
||||||
&self,
|
&self,
|
||||||
bus: &mut SpiBus,
|
bus: &mut SpiBus,
|
||||||
|
|
@ -18,6 +19,7 @@ pub trait Socket {
|
||||||
block!(bus.transfer_frame(self.register(), socketn::MODE, true, &mut mode))?;
|
block!(bus.transfer_frame(self.register(), socketn::MODE, true, &mut mode))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reset_interrupt<SpiBus: ActiveBus>(
|
fn reset_interrupt<SpiBus: ActiveBus>(
|
||||||
&self,
|
&self,
|
||||||
bus: &mut SpiBus,
|
bus: &mut SpiBus,
|
||||||
|
|
@ -27,6 +29,7 @@ pub trait Socket {
|
||||||
block!(bus.transfer_frame(self.register(), socketn::INTERRUPT, true, &mut data))?;
|
block!(bus.transfer_frame(self.register(), socketn::INTERRUPT, true, &mut data))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_source_port<SpiBus: ActiveBus>(
|
fn set_source_port<SpiBus: ActiveBus>(
|
||||||
&self,
|
&self,
|
||||||
bus: &mut SpiBus,
|
bus: &mut SpiBus,
|
||||||
|
|
@ -37,6 +40,7 @@ pub trait Socket {
|
||||||
block!(bus.transfer_frame(self.register(), socketn::SOURCE_PORT, true, &mut data))?;
|
block!(bus.transfer_frame(self.register(), socketn::SOURCE_PORT, true, &mut data))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_received<SpiBus: ActiveBus>(
|
fn has_received<SpiBus: ActiveBus>(
|
||||||
&self,
|
&self,
|
||||||
bus: &mut SpiBus,
|
bus: &mut SpiBus,
|
||||||
|
|
@ -68,6 +72,19 @@ pub trait Socket {
|
||||||
block!(bus.transfer_frame(self.register(), socketn::COMMAND, true, &mut data))?;
|
block!(bus.transfer_frame(self.register(), socketn::COMMAND, true, &mut data))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_receive_size<SpiBus: ActiveBus>(&self, bus: &mut SpiBus) -> Result<u16, SpiBus::Error> {
|
||||||
|
loop {
|
||||||
|
// Section 4.2 of datasheet, Sn_TX_FSR address docs indicate that read must be repeated until two sequential reads are stable
|
||||||
|
let mut sample_0 = [0u8; 2];
|
||||||
|
block!(bus.transfer_frame(self.register(), socketn::RECEIVED_SIZE, false, &mut sample_0))?;
|
||||||
|
let mut sample_1 = [0u8; 2];
|
||||||
|
block!(bus.transfer_frame(self.register(), socketn::RECEIVED_SIZE, false, &mut sample_1))?;
|
||||||
|
if sample_0 == sample_1 && sample_0[0] >= 8 {
|
||||||
|
break Ok(BigEndian::read_u16(&sample_0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type OwnedSockets = (
|
pub type OwnedSockets = (
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,9 @@ pub struct UdpPacket<UdpSocket> {
|
||||||
impl<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> UdpPacket<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>>
|
impl<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> UdpPacket<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>>
|
||||||
{
|
{
|
||||||
pub fn new(mut udp_socket: UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>) -> Result<Self, SpiBus::Error> {
|
pub fn new(mut udp_socket: UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>) -> Result<Self, SpiBus::Error> {
|
||||||
let receive_size = Self::block_until_receive_size_known(&mut udp_socket)?;
|
let receive_size = udp_socket.socket.get_receive_size(&mut udp_socket.bus)?;
|
||||||
|
|
||||||
|
// Packet frame, as described in W5200 docs sectino 5.2.2.1
|
||||||
// |<-- read_pointer read_pointer + received_size -->|
|
// |<-- read_pointer read_pointer + received_size -->|
|
||||||
// |Destination IP Address | Destination Port | Byte Size of DATA | Actual DATA ... |
|
// |Destination IP Address | Destination Port | Byte Size of DATA | Actual DATA ... |
|
||||||
// | --- 4 Bytes --- | --- 2 Bytes --- | --- 2 Bytes --- | .... |
|
// | --- 4 Bytes --- | --- 2 Bytes --- | --- 2 Bytes --- | .... |
|
||||||
|
|
@ -53,17 +55,6 @@ impl<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> UdpPacket<
|
||||||
Ok(self.udp_socket)
|
Ok(self.udp_socket)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn block_until_receive_size_known(udp_socket: &mut UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>) -> Result<u16, SpiBus::Error> {
|
|
||||||
loop {
|
|
||||||
let mut sample_0 = [0u8; 2];
|
|
||||||
block!(udp_socket.bus.transfer_frame(udp_socket.socket.register(), socketn::RECEIVED_SIZE, false, &mut sample_0))?;
|
|
||||||
let mut sample_1 = [0u8; 2];
|
|
||||||
block!(udp_socket.bus.transfer_frame(udp_socket.socket.register(), socketn::RECEIVED_SIZE, false, &mut sample_1))?;
|
|
||||||
if sample_0 == sample_1 && sample_0[0] >= 8 {
|
|
||||||
break Ok(BigEndian::read_u16(&sample_0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> Iterator for UdpPacket<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>> {
|
impl<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> Iterator for UdpPacket<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue