use crate::wire::DeviceOutput;
#[derive(Debug, Clone, Default)]
pub struct Dualshock4Output {
pub rumble_small: u8,
pub rumble_large: u8,
pub led_red: u8,
pub led_green: u8,
pub led_blue: u8,
pub flash_on: u8,
pub flash_off: u8,
}
impl DeviceOutput for Dualshock4Output {
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 flash_on = 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 flash_off = 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,
flash_on,
flash_off,
})
}
}