ENC424J600/src/rx.rs

136 lines
3.0 KiB
Rust

use crate::RAW_FRAME_LENGTH_MAX;
/// SRAM Addresses
pub const ERXST_DEFAULT: u16 = 0x5340;
pub const ERXTAIL_DEFAULT: u16 = 0x5ffe;
pub const RX_MAX_ADDRESS: u16 = 0x5fff;
/// Receive Status Vector Length
pub const RSV_LENGTH: usize = 6;
/// Struct for RX Buffer on the hardware
/// TODO: Should be a singleton
pub struct RxBuffer {
start_addr: u16,
next_addr: u16,
tail_addr: u16,
}
impl RxBuffer {
pub fn new() -> Self {
RxBuffer {
start_addr: ERXST_DEFAULT,
next_addr: ERXST_DEFAULT,
tail_addr: ERXTAIL_DEFAULT,
}
}
pub fn set_start_addr(&mut self, addr: u16) {
self.start_addr = addr;
}
pub fn get_start_addr(&self) -> u16 {
self.start_addr
}
pub fn set_next_addr(&mut self, addr: u16) {
self.next_addr = addr;
}
pub fn get_next_addr(&self) -> u16 {
self.next_addr
}
pub fn set_tail_addr(&mut self, addr: u16) {
self.tail_addr = addr;
}
pub fn get_tail_addr(&self) -> u16 {
self.tail_addr
}
}
/// Struct for RX Packet
/// TODO: Generalise MAC addresses
pub struct RxPacket {
rsv: Rsv,
frame: [u8; RAW_FRAME_LENGTH_MAX],
frame_length: usize,
}
impl RxPacket {
pub fn new() -> Self {
RxPacket {
rsv: Rsv::new(),
frame: [0; RAW_FRAME_LENGTH_MAX],
frame_length: 0,
}
}
pub fn write_to_rsv(&mut self, raw_rsv: &[u8]) {
self.rsv.write_to_rsv(raw_rsv);
}
pub fn read_raw_rsv(&self) -> &[u8] {
self.rsv.read_raw_rsv()
}
pub fn update_frame_length(&mut self) {
self.rsv.set_frame_length();
self.frame_length = self.rsv.get_frame_length() as usize;
}
pub fn get_frame_length(&self) -> usize {
self.frame_length
}
pub fn copy_frame_from(&mut self, raw_frame: &[u8]) {
for i in 0..self.frame_length {
self.frame[i] = raw_frame[i];
}
}
pub fn write_frame_to(&self, frame: &mut [u8]) {
for i in 0..self.frame_length {
frame[i] = self.frame[i];
}
}
pub fn get_mut_frame(&mut self) -> &mut [u8] {
&mut self.frame
}
/// TODO: Mostly for debugging only?
pub fn get_frame_byte(&self, i: usize) -> u8 {
self.frame[i]
}
}
/// Struct for Receive Status Vector
/// See: Table 9-1, ENC424J600 Data Sheet
struct Rsv {
raw_rsv: [u8; RSV_LENGTH],
// TODO: Add more definitions
frame_length: u16,
}
impl Rsv {
fn new() -> Self {
Rsv {
raw_rsv: [0; RSV_LENGTH],
frame_length: 0_u16,
}
}
fn write_to_rsv(&mut self, raw_rsv: &[u8]) {
for i in 0..RSV_LENGTH {
self.raw_rsv[i] = raw_rsv[i];
}
}
fn read_raw_rsv(&self) -> &[u8] {
&self.raw_rsv
}
fn set_frame_length(&mut self) {
self.frame_length = (self.raw_rsv[0] as u16) | ((self.raw_rsv[1] as u16) << 8);
}
fn get_frame_length(&self) -> u16 {
self.frame_length
}
}