Skip to main content

rdif_serial/
types.rs

1use bitflags::bitflags;
2
3bitflags! {
4    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
5    pub struct InterruptMask: u32 {
6        const RX_DATA      = 1 << 0;
7        const RX_STATUS    = 1 << 1;
8        const TX_SPACE     = 1 << 2;
9        const MODEM_STATUS = 1 << 3;
10
11        const RX = Self::RX_DATA.bits() | Self::RX_STATUS.bits();
12        const RX_AVAILABLE = Self::RX.bits();
13        const TX_EMPTY = Self::TX_SPACE.bits();
14    }
15}
16
17impl InterruptMask {
18    pub fn rx_available(&self) -> bool {
19        self.intersects(Self::RX)
20    }
21
22    pub fn tx_empty(&self) -> bool {
23        self.contains(Self::TX_SPACE)
24    }
25}
26
27bitflags! {
28    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
29    pub struct IrqSource: u32 {
30        const RX_DATA      = 1 << 0;
31        const RX_TIMEOUT   = 1 << 1;
32        const RX_STATUS    = 1 << 2;
33        const TX_SPACE     = 1 << 3;
34        const MODEM_STATUS = 1 << 4;
35        const BUSY_DETECT  = 1 << 5;
36        const OTHER_ACK    = 1 << 6;
37    }
38}
39
40#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
41pub struct IrqSnapshot {
42    pub claimed: bool,
43    pub sources: IrqSource,
44}
45
46#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
47pub enum RxFlag {
48    #[default]
49    Normal,
50    Break,
51    Parity,
52    Framing,
53}
54
55#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
56pub struct RxSample {
57    pub byte: Option<u8>,
58    pub flag: RxFlag,
59    pub overrun: bool,
60}
61
62#[derive(Clone, Copy, Debug, PartialEq, Eq)]
63pub enum RxItem {
64    Byte { byte: u8, flag: RxFlag },
65    Overrun,
66}
67
68impl Default for RxItem {
69    fn default() -> Self {
70        Self::Byte {
71            byte: 0,
72            flag: RxFlag::Normal,
73        }
74    }
75}
76
77#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
78pub struct SerialCounters {
79    pub irq_total: u64,
80    pub irq_spurious: u64,
81    pub irq_budget_exhausted: u64,
82    pub rx_bytes: u64,
83    pub rx_fifo_overruns: u64,
84    pub rx_queue_dropped: u64,
85    pub rx_breaks: u64,
86    pub rx_parity_errors: u64,
87    pub rx_framing_errors: u64,
88    pub tx_bytes: u64,
89}
90
91#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
92pub struct SerialIrqOutcome {
93    pub claimed: bool,
94    pub rx_pushed: usize,
95    pub tx_sent: usize,
96    pub tx_wakeup: bool,
97    pub budget_exhausted: bool,
98}