use core::fmt;
use deku::prelude::*;
#[derive(
Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, DekuRead, DekuWrite,
)]
#[deku(endian = "endian", ctx = "endian: deku::ctx::Endian")]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeviceId(u64);
impl DeviceId {
pub fn size_words(&self) -> u16 {
(std::mem::size_of_val(&self.0) / std::mem::size_of::<u32>()) as u16
}
pub fn manufacturer_oui(&self) -> u32 {
((self.0 >> 32) & 0xFF_FFFF) as u32
}
pub fn set_manufacturer_oui(&mut self, oui: u32) {
let val = (oui as u64 & 0xFF_FFFF) << 32;
self.0 = self.0 & !(0xFF_FFFF << 32) | val;
}
pub fn device_code(&self) -> u16 {
(self.0 & 0xFFFF) as u16
}
pub fn set_device_code(&mut self, code: u16) {
self.0 = self.0 & !(0xFFFF) | code as u64;
}
}
impl fmt::Display for DeviceId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "Device ID:")?;
writeln!(f, " Manufacturer OUI: {:#x}", self.manufacturer_oui())?;
writeln!(f, " Device code: {}", self.device_code())?;
Ok(())
}
}