use heterob::{bit_numbering::Lsb, endianness::Le, Seq, P2, P5, P6};
use super::ExtendedCapabilityDataError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PrecisionTimeMeasurement {
pub ptm_capability: PtmCapability,
pub ptm_control: PtmControl,
}
impl TryFrom<&[u8]> for PrecisionTimeMeasurement {
type Error = ExtendedCapabilityDataError;
fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
let Seq {
head: Le((ptm_capability, ptm_control)),
..
} = P2(slice)
.try_into()
.map_err(|_| ExtendedCapabilityDataError {
name: "Precision Time Measurement",
size: 8,
})?;
Ok(Self {
ptm_capability: From::<u32>::from(ptm_capability),
ptm_control: From::<u32>::from(ptm_control),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PtmCapability {
pub ptm_requester_capable: bool,
pub ptm_responder_capable: bool,
pub ptm_root_capable: bool,
pub local_clock_granularity: u8,
}
impl From<u32> for PtmCapability {
fn from(dword: u32) -> Self {
let Lsb((
ptm_requester_capable,
ptm_responder_capable,
ptm_root_capable,
(),
local_clock_granularity,
(),
)) = P6::<_, 1, 1, 1, 5, 8, 16>(dword).into();
Self {
ptm_requester_capable,
ptm_responder_capable,
ptm_root_capable,
local_clock_granularity,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PtmControl {
pub ptm_enable: bool,
pub root_select: bool,
pub effective_granularity: u8,
}
impl From<u32> for PtmControl {
fn from(dword: u32) -> Self {
let Lsb((ptm_enable, root_select, (), effective_granularity, ())) =
P5::<_, 1, 1, 6, 8, 16>(dword).into();
Self {
ptm_enable,
root_select,
effective_granularity,
}
}
}