Skip to main content

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)]
16#[instability::unstable]
17pub struct Frame {
18    /// Header
19    pub header: Header,
20    /// Content
21    pub content: FrameContent,
22    /// Payload
23    pub payload: Vec<u8>,
24    /// This is a 2-byte CRC checksum
25    pub footer: [u8; 2],
26}
27
28// FIXME: Remove and use derive when defmt 1.0.2 is released (we need https://github.com/knurling-rs/defmt/pull/955)
29#[cfg(feature = "defmt")]
30impl defmt::Format for Frame {
31    fn format(&self, f: defmt::Formatter<'_>) {
32        defmt::write!(
33            f,
34            "Frame {{ header: {}, content: {}, payload: {:?}, footer: {:?} }}",
35            self.header,
36            self.content,
37            self.payload.as_slice(),
38            self.footer
39        );
40    }
41}
42
43/// IEEE 802.15.4 MAC frame which has been received
44#[derive(Debug, Clone, PartialEq, Eq)]
45#[cfg_attr(feature = "defmt", derive(defmt::Format))]
46#[instability::unstable]
47pub struct ReceivedFrame {
48    /// Frame
49    pub frame: Frame,
50    /// Receiver channel
51    pub channel: u8,
52    /// Received Signal Strength Indicator (RSSI)
53    pub rssi: i8,
54    /// Link Quality Indication (LQI)
55    pub lqi: u8,
56}
57
58pub(crate) fn frame_is_ack_required(frame: &[u8]) -> bool {
59    if frame.len() <= FRAME_AR_OFFSET {
60        return false;
61    }
62    (frame[FRAME_AR_OFFSET] & FRAME_AR_BIT) != 0
63}
64
65pub(crate) fn frame_get_version(frame: &[u8]) -> u8 {
66    if frame.len() <= FRAME_VERSION_OFFSET {
67        return 0;
68    }
69    frame[FRAME_VERSION_OFFSET] & FRAME_VERSION_MASK
70}