use core::fmt;
use crate::protocol::opcode::{MI_HAS_BOS, MI_HAS_SERIAL};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MouseInfo {
pub vid: u16,
pub pid: u16,
pub bcd_device: u16,
pub bcd_usb: u16,
pub has_serial: bool,
pub has_bos: bool,
}
impl MouseInfo {
pub(crate) fn from_payload(p: &[u8]) -> Option<Self> {
if p.len() < 10 {
return None;
}
let flags = p[9];
Some(MouseInfo {
vid: u16::from_le_bytes([p[1], p[2]]),
pid: u16::from_le_bytes([p[3], p[4]]),
bcd_device: u16::from_le_bytes([p[5], p[6]]),
bcd_usb: u16::from_le_bytes([p[7], p[8]]),
has_serial: flags & MI_HAS_SERIAL != 0,
has_bos: flags & MI_HAS_BOS != 0,
})
}
}
impl fmt::Display for MouseInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:04X}:{:04X}", self.vid, self.pid)
}
}