aboutsummaryrefslogtreecommitdiff
path: root/src/socket.rs
blob: 0d3d1aeb2b1790fc537759ceeb2c70e09d292e2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use crate::device::RegisterBlock;
use crate::spi::SpiInterface;
use embedded_hal_async::spi::SpiDevice;

pub const MODE: u16 = 0x00;
pub const COMMAND: u16 = 0x01;
pub const RXBUF_SIZE: u16 = 0x1E;
pub const TXBUF_SIZE: u16 = 0x1F;
pub const TX_FREE_SIZE: u16 = 0x20;
pub const TX_DATA_WRITE_PTR: u16 = 0x24;
pub const RECVD_SIZE: u16 = 0x26;
pub const RX_DATA_READ_PTR: u16 = 0x28;
pub const SOCKET_INTR_MASK: u16 = 0x2C;

#[repr(u8)]
pub enum Command {
    Open = 0x01,
    Send = 0x20,
    Receive = 0x40,
}

pub const INTR: u16 = 0x02;
#[repr(u8)]
pub enum Interrupt {
    SendOk = 0b010000_u8,
    Receive = 0b00100_u8,
}

pub async fn reset_interrupt<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
    code: Interrupt,
) -> Result<(), SPI::Error> {
    let data = [code as u8];
    bus.write_frame(RegisterBlock::Socket0, INTR, &data).await
}

pub async fn is_interrupt<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
    code: Interrupt,
) -> Result<bool, SPI::Error> {
    let mut data = [0u8];
    bus.read_frame(RegisterBlock::Socket0, INTR, &mut data)
        .await?;
    Ok(data[0] & code as u8 != 0)
}

pub async fn get_tx_write_ptr<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
) -> Result<u16, SPI::Error> {
    let mut data = [0u8; 2];
    bus.read_frame(RegisterBlock::Socket0, TX_DATA_WRITE_PTR, &mut data)
        .await?;
    Ok(u16::from_be_bytes(data))
}

pub async fn set_tx_write_ptr<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
    ptr: u16,
) -> Result<(), SPI::Error> {
    let data = ptr.to_be_bytes();
    bus.write_frame(RegisterBlock::Socket0, TX_DATA_WRITE_PTR, &data)
        .await
}

pub async fn get_rx_read_ptr<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
) -> Result<u16, SPI::Error> {
    let mut data = [0u8; 2];
    bus.read_frame(RegisterBlock::Socket0, RX_DATA_READ_PTR, &mut data)
        .await?;
    Ok(u16::from_be_bytes(data))
}

pub async fn set_rx_read_ptr<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
    ptr: u16,
) -> Result<(), SPI::Error> {
    let data = ptr.to_be_bytes();
    bus.write_frame(RegisterBlock::Socket0, RX_DATA_READ_PTR, &data)
        .await
}

pub async fn command<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
    command: Command,
) -> Result<(), SPI::Error> {
    let data = [command as u8];
    bus.write_frame(RegisterBlock::Socket0, COMMAND, &data)
        .await
}

pub async fn get_rx_size<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>) -> Result<u16, SPI::Error> {
    loop {
        // Wait until two sequential reads are equal
        let mut res0 = [0u8; 2];
        bus.read_frame(RegisterBlock::Socket0, RECVD_SIZE, &mut res0)
            .await?;
        let mut res1 = [0u8; 2];
        bus.read_frame(RegisterBlock::Socket0, RECVD_SIZE, &mut res1)
            .await?;
        if res0 == res1 {
            break Ok(u16::from_be_bytes(res0));
        }
    }
}

pub async fn get_tx_free_size<SPI: SpiDevice>(
    bus: &mut SpiInterface<SPI>,
) -> Result<u16, SPI::Error> {
    let mut data = [0; 2];
    bus.read_frame(RegisterBlock::Socket0, TX_FREE_SIZE, &mut data)
        .await?;
    Ok(u16::from_be_bytes(data))
}