esp_ieee802154/
frame.rs

1use heapless::Vec;
2use ieee802154::mac::{FrameContent, Header};
3
4pub(crate) const FRAME_SIZE: usize = 129;
5pub(crate) const FRAME_VERSION_1: u8 = 0x10; // IEEE 802.15.4 - 2006 & 2011
6pub(crate) const FRAME_VERSION_2: u8 = 0x20; // IEEE 802.15.4 - 2015
7
8const FRAME_AR_OFFSET: usize = 1;
9const FRAME_AR_BIT: u8 = 0x20;
10const FRAME_VERSION_OFFSET: usize = 2;
11const FRAME_VERSION_MASK: u8 = 0x30;
12
13/// IEEE 802.15.4 MAC frame
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct Frame {
16    /// Header
17    pub header: Header,
18    /// Content
19    pub content: FrameContent,
20    /// Payload
21    pub payload: Vec<u8, FRAME_SIZE>,
22    /// This is a 2-byte CRC checksum
23    pub footer: [u8; 2],
24}
25
26/// IEEE 802.15.4 MAC frame which has been received
27#[derive(Debug, Clone, PartialEq, Eq)]
28pub struct ReceivedFrame {
29    /// Frame
30    pub frame: Frame,
31    /// Receiver channel
32    pub channel: u8,
33    /// Received Signal Strength Indicator (RSSI)
34    pub rssi: i8,
35    /// Link Quality Indication (LQI)
36    pub lqi: u8,
37}
38
39pub(crate) fn frame_is_ack_required(frame: &[u8]) -> bool {
40    if frame.len() <= FRAME_AR_OFFSET {
41        return false;
42    }
43    (frame[FRAME_AR_OFFSET] & FRAME_AR_BIT) != 0
44}
45
46pub(crate) fn frame_get_version(frame: &[u8]) -> u8 {
47    if frame.len() <= FRAME_VERSION_OFFSET {
48        return 0;
49    }
50    frame[FRAME_VERSION_OFFSET] & FRAME_VERSION_MASK
51}