viiper_client/devices/ns2pro/
output.rs1use crate::wire::DeviceOutput;
4
5#[derive(Debug, Clone, Default)]
6pub struct Ns2proOutput {
7 pub left_rumble: [u8; 16],
8 pub right_rumble: [u8; 16],
9 pub flags: u8,
10 pub player_led_mask: u8,
11}
12
13impl DeviceOutput for Ns2proOutput {
14 fn from_bytes(buf: &[u8]) -> Result<Self, crate::error::ViiperError> {
15 let mut offset = 0;
16 if offset + (std::mem::size_of::<u8>() * 16) > buf.len() {
17 return Err(crate::error::ViiperError::UnexpectedResponse(
18 "buffer too short".into()
19 ));
20 }
21 let mut left_rumble = [u8::default(); 16];
22 for i in 0..16 {
23 let bytes = &buf[offset..offset + std::mem::size_of::<u8>()];
24 left_rumble[i] = u8::from_le_bytes(bytes.try_into().unwrap());
25 offset += std::mem::size_of::<u8>();
26 }
27 if offset + (std::mem::size_of::<u8>() * 16) > buf.len() {
28 return Err(crate::error::ViiperError::UnexpectedResponse(
29 "buffer too short".into()
30 ));
31 }
32 let mut right_rumble = [u8::default(); 16];
33 for i in 0..16 {
34 let bytes = &buf[offset..offset + std::mem::size_of::<u8>()];
35 right_rumble[i] = u8::from_le_bytes(bytes.try_into().unwrap());
36 offset += std::mem::size_of::<u8>();
37 }
38 if offset + std::mem::size_of::<u8>() > buf.len() {
39 return Err(crate::error::ViiperError::UnexpectedResponse(
40 "buffer too short".into()
41 ));
42 }
43 let flags = u8::from_le_bytes(
44 buf[offset..offset + std::mem::size_of::<u8>()]
45 .try_into()
46 .unwrap()
47 );
48 offset += std::mem::size_of::<u8>();
49 if offset + std::mem::size_of::<u8>() > buf.len() {
50 return Err(crate::error::ViiperError::UnexpectedResponse(
51 "buffer too short".into()
52 ));
53 }
54 let player_led_mask = u8::from_le_bytes(
55 buf[offset..offset + std::mem::size_of::<u8>()]
56 .try_into()
57 .unwrap()
58 );
59 offset += std::mem::size_of::<u8>();
60 let _ = offset; Ok(Self {
62 left_rumble,
63 right_rumble,
64 flags,
65 player_led_mask,
66 })
67 }
68}