use crate::wire::DeviceOutput;
#[derive(Debug, Clone, Default)]
pub struct Ns2proOutput {
pub left_rumble: [u8; 16],
pub right_rumble: [u8; 16],
pub flags: u8,
pub player_led_mask: u8,
}
impl DeviceOutput for Ns2proOutput {
fn from_bytes(buf: &[u8]) -> Result<Self, crate::error::ViiperError> {
let mut offset = 0;
if offset + (std::mem::size_of::<u8>() * 16) > buf.len() {
return Err(crate::error::ViiperError::UnexpectedResponse(
"buffer too short".into()
));
}
let mut left_rumble = [u8::default(); 16];
for i in 0..16 {
let bytes = &buf[offset..offset + std::mem::size_of::<u8>()];
left_rumble[i] = u8::from_le_bytes(bytes.try_into().unwrap());
offset += std::mem::size_of::<u8>();
}
if offset + (std::mem::size_of::<u8>() * 16) > buf.len() {
return Err(crate::error::ViiperError::UnexpectedResponse(
"buffer too short".into()
));
}
let mut right_rumble = [u8::default(); 16];
for i in 0..16 {
let bytes = &buf[offset..offset + std::mem::size_of::<u8>()];
right_rumble[i] = u8::from_le_bytes(bytes.try_into().unwrap());
offset += std::mem::size_of::<u8>();
}
if offset + std::mem::size_of::<u8>() > buf.len() {
return Err(crate::error::ViiperError::UnexpectedResponse(
"buffer too short".into()
));
}
let flags = u8::from_le_bytes(
buf[offset..offset + std::mem::size_of::<u8>()]
.try_into()
.unwrap()
);
offset += std::mem::size_of::<u8>();
if offset + std::mem::size_of::<u8>() > buf.len() {
return Err(crate::error::ViiperError::UnexpectedResponse(
"buffer too short".into()
));
}
let player_led_mask = u8::from_le_bytes(
buf[offset..offset + std::mem::size_of::<u8>()]
.try_into()
.unwrap()
);
offset += std::mem::size_of::<u8>();
let _ = offset; Ok(Self {
left_rumble,
right_rumble,
flags,
player_led_mask,
})
}
}