esp_radio/ieee802154/
frame.rs1use 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; pub(crate) const FRAME_VERSION_2: u8 = 0x20; const FRAME_AR_OFFSET: usize = 0;
15const FRAME_AR_BIT: u8 = 0x20;
16const FRAME_VERSION_OFFSET: usize = 1;
17const FRAME_VERSION_MASK: u8 = 0x30;
18
19#[derive(Debug, Clone, PartialEq, Eq)]
21#[instability::unstable]
22pub struct Frame {
23 pub header: Header,
25 pub content: FrameContent,
27 pub payload: Vec<u8>,
29 pub footer: [u8; 2],
31}
32
33#[cfg(feature = "defmt")]
35impl defmt::Format for Frame {
36 fn format(&self, f: defmt::Formatter<'_>) {
37 defmt::write!(
38 f,
39 "Frame {{ header: {}, content: {}, payload: {:?}, footer: {:?} }}",
40 self.header,
41 self.content,
42 self.payload.as_slice(),
43 self.footer
44 );
45 }
46}
47
48#[derive(Debug, Clone, PartialEq, Eq)]
50#[cfg_attr(feature = "defmt", derive(defmt::Format))]
51#[instability::unstable]
52pub struct ReceivedFrame {
53 pub frame: Frame,
55 pub channel: u8,
57 pub rssi: i8,
59 pub lqi: u8,
61}
62
63pub(crate) fn frame_is_ack_required(frame: &[u8]) -> bool {
64 if frame.len() <= FRAME_AR_OFFSET {
65 return false;
66 }
67 (frame[FRAME_AR_OFFSET] & FRAME_AR_BIT) != 0
68}
69
70pub(crate) fn frame_get_version(frame: &[u8]) -> u8 {
71 if frame.len() <= FRAME_VERSION_OFFSET {
72 return 0;
73 }
74 frame[FRAME_VERSION_OFFSET] & FRAME_VERSION_MASK
75}