esp_radio/ieee802154/
frame.rs

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