Added timeout interrupt bit, fixed several bugs with Socket code, added getters for the TX read/write pointers

This commit is contained in:
Jonah Dahlquist 2020-11-07 23:31:14 -08:00
commit 8aa5656873
2 changed files with 48 additions and 6 deletions

View file

@ -60,6 +60,7 @@ pub mod socketn {
pub enum Interrupt { pub enum Interrupt {
All = 0b11111111u8, All = 0b11111111u8,
SendOk = 0b010000u8, SendOk = 0b010000u8,
Timeout = 0b01000u8,
Receive = 0b00100u8, Receive = 0b00100u8,
} }

View file

@ -36,9 +36,8 @@ pub trait Socket {
code: socketn::Interrupt, code: socketn::Interrupt,
) -> Result<bool, SpiBus::Error> { ) -> Result<bool, SpiBus::Error> {
let mut data = [0u8]; let mut data = [0u8];
BigEndian::write_u16(&mut data, code as u16); bus.transfer_frame(self.register(), socketn::INTERRUPT, false, &mut data)?;
bus.transfer_frame(self.register(), socketn::INTERRUPT_MASK, true, &mut data)?; Ok(data[0] & code as u8 != 0)
Ok(data[0] & socketn::Interrupt::Receive as u8 != 0)
} }
fn set_source_port<SpiBus: ActiveBus>( fn set_source_port<SpiBus: ActiveBus>(
@ -73,6 +72,20 @@ pub trait Socket {
Ok(()) Ok(())
} }
fn get_tx_read_pointer<SpiBus: ActiveBus>(
&self,
bus: &mut SpiBus,
) -> Result<u16, SpiBus::Error> {
let mut data = [0u8; 2];
bus.transfer_frame(
self.register(),
socketn::TX_DATA_READ_POINTER,
false,
&mut data
)?;
Ok(BigEndian::read_u16(&data))
}
fn set_tx_read_pointer<SpiBus: ActiveBus>( fn set_tx_read_pointer<SpiBus: ActiveBus>(
&self, &self,
bus: &mut SpiBus, bus: &mut SpiBus,
@ -89,6 +102,20 @@ pub trait Socket {
Ok(()) Ok(())
} }
fn get_tx_write_pointer<SpiBus: ActiveBus>(
&self,
bus: &mut SpiBus,
) -> Result<u16, SpiBus::Error> {
let mut data = [0u8; 2];
bus.transfer_frame(
self.register(),
socketn::TX_DATA_WRITE_POINTER,
false,
&mut data
)?;
Ok(BigEndian::read_u16(&data))
}
fn set_tx_write_pointer<SpiBus: ActiveBus>( fn set_tx_write_pointer<SpiBus: ActiveBus>(
&self, &self,
bus: &mut SpiBus, bus: &mut SpiBus,
@ -113,7 +140,7 @@ pub trait Socket {
bus.transfer_frame( bus.transfer_frame(
self.register(), self.register(),
socketn::RX_DATA_READ_POINTER, socketn::RX_DATA_READ_POINTER,
true, false,
&mut data &mut data
)?; )?;
Ok(BigEndian::read_u16(&data)) Ok(BigEndian::read_u16(&data))
@ -135,13 +162,27 @@ pub trait Socket {
Ok(()) Ok(())
} }
fn set_interrupt_mask<SpiBus: ActiveBus>(
&self,
bus: &mut SpiBus,
mask: u8,
) -> Result<(), SpiBus::Error> {
let mut data = [mask];
bus.transfer_frame(
self.register(),
socketn::INTERRUPT_MASK,
true,
&mut data
)?;
Ok(())
}
fn command<SpiBus: ActiveBus>( fn command<SpiBus: ActiveBus>(
&self, &self,
bus: &mut SpiBus, bus: &mut SpiBus,
command: socketn::Command, command: socketn::Command,
) -> Result<(), SpiBus::Error> { ) -> Result<(), SpiBus::Error> {
let mut data = [0u8; 2]; let mut data = [command as u8];
BigEndian::write_u16(&mut data, command as u16);
bus.transfer_frame(self.register(), socketn::COMMAND, true, &mut data)?; bus.transfer_frame(self.register(), socketn::COMMAND, true, &mut data)?;
Ok(()) Ok(())
} }