use crate::wire::{CsiFrame, CsiPayload, Envelope, RxMeta, SessionInfo};
pub mod delivery;
pub(crate) mod esp;
pub mod session;
pub(crate) mod policy;
pub mod source;
pub(crate) mod text_row;
#[derive(Debug, Clone, PartialEq)]
pub struct CsiPacket {
pub envelope: Envelope,
pub frame: CsiFrame,
pub session: Option<SessionInfo>,
}
#[deprecated(since = "0.12.0", note = "renamed to `CsiPacket`; see the 0.12 CHANGELOG for the field map")]
pub type CSIDataPacket = CsiPacket;
impl CsiPacket {
pub fn from_wifi_csi_info(info: &esp_radio::wifi::csi::WifiCsiInfo<'_>) -> Option<Self> {
let frame = esp::frame_from_esp(info)?;
Some(Self::new(frame, crate::wire::SourceKind::EspVendor))
}
pub(crate) fn new(frame: CsiFrame, source: crate::wire::SourceKind) -> Self {
let session = session::take_announcement(frame.meta.timestamp_us);
Self {
envelope: session::next_envelope(source),
frame,
session,
}
}
pub fn meta(&self) -> &RxMeta {
&self.frame.meta
}
pub fn mac(&self) -> [u8; 6] {
self.frame.transmitter().unwrap_or([0; 6])
}
pub fn rssi(&self) -> i8 {
self.frame.meta.rssi
}
pub fn timestamp_us(&self) -> u64 {
self.frame.meta.timestamp_us
}
pub fn csi_data(&self) -> &[i8] {
match &self.frame.payload {
CsiPayload::EspRaw { bytes, .. } => bytes,
_ => &[],
}
}
pub fn subcarriers(&self) -> usize {
self.csi_data().len() / 2
}
pub fn print_csi_w_metadata(self) {
crate::logging::logging::log_csi(self);
}
}