use heterob::{bit_numbering::Lsb, endianness::Le, Seq, P2, P3, P4};
use super::CapabilityDataError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AdvancedFeatures {
pub length: u8,
pub capabilities: Capabilities,
pub control: Control,
pub status: Status,
}
impl TryFrom<&[u8]> for AdvancedFeatures {
type Error = CapabilityDataError;
fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
let Seq {
head: Le((length, capabilities, control, status)),
..
} = P4(slice).try_into().map_err(|_| CapabilityDataError {
name: "Advanced Features",
size: 4,
})?;
let Lsb((cap_tp, function_level_reset, ())) = P3::<u8, 1, 1, 6>(capabilities).into();
let Lsb((initiate_flr, ())) = P2::<u8, 1, 7>(control).into();
let Lsb((st_tp, ())) = P2::<u8, 1, 7>(status).into();
Ok(Self {
length,
capabilities: Capabilities {
transactions_pending: cap_tp,
function_level_reset,
},
control: Control { initiate_flr },
status: Status {
transactions_pending: st_tp,
},
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Capabilities {
pub transactions_pending: bool,
pub function_level_reset: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Control {
pub initiate_flr: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Status {
pub transactions_pending: bool,
}