use crate::wire::DeviceOutput;
#[derive(Debug, Clone, Default)]
pub struct DualsenseOutput {
pub rumble_small: u8,
pub rumble_large: u8,
pub led_red: u8,
pub led_green: u8,
pub led_blue: u8,
pub player_leds: u8,
}
impl DeviceOutput for DualsenseOutput {
fn from_bytes(buf: &[u8]) -> Result<Self, crate::error::ViiperError> {
let mut offset = 0;
if offset + std::mem::size_of::<u8>() > buf.len() {
return Err(crate::error::ViiperError::UnexpectedResponse(
"buffer too short".into()
));
}
let rumble_small = 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 rumble_large = 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 led_red = 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 led_green = 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 led_blue = 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_leds = 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 {
rumble_small,
rumble_large,
led_red,
led_green,
led_blue,
player_leds,
})
}
}