viiper_client/devices/dualshock4/
output.rs1use crate::wire::DeviceOutput;
4
5#[derive(Debug, Clone, Default)]
6pub struct Dualshock4Output {
7 pub rumble_small: u8,
8 pub rumble_large: u8,
9 pub led_red: u8,
10 pub led_green: u8,
11 pub led_blue: u8,
12 pub flash_on: u8,
13 pub flash_off: u8,
14}
15
16impl DeviceOutput for Dualshock4Output {
17 fn from_bytes(buf: &[u8]) -> Result<Self, crate::error::ViiperError> {
18 let mut offset = 0;
19 if offset + std::mem::size_of::<u8>() > buf.len() {
20 return Err(crate::error::ViiperError::UnexpectedResponse(
21 "buffer too short".into()
22 ));
23 }
24 let rumble_small = u8::from_le_bytes(
25 buf[offset..offset + std::mem::size_of::<u8>()]
26 .try_into()
27 .unwrap()
28 );
29 offset += std::mem::size_of::<u8>();
30 if offset + std::mem::size_of::<u8>() > buf.len() {
31 return Err(crate::error::ViiperError::UnexpectedResponse(
32 "buffer too short".into()
33 ));
34 }
35 let rumble_large = u8::from_le_bytes(
36 buf[offset..offset + std::mem::size_of::<u8>()]
37 .try_into()
38 .unwrap()
39 );
40 offset += std::mem::size_of::<u8>();
41 if offset + std::mem::size_of::<u8>() > buf.len() {
42 return Err(crate::error::ViiperError::UnexpectedResponse(
43 "buffer too short".into()
44 ));
45 }
46 let led_red = u8::from_le_bytes(
47 buf[offset..offset + std::mem::size_of::<u8>()]
48 .try_into()
49 .unwrap()
50 );
51 offset += std::mem::size_of::<u8>();
52 if offset + std::mem::size_of::<u8>() > buf.len() {
53 return Err(crate::error::ViiperError::UnexpectedResponse(
54 "buffer too short".into()
55 ));
56 }
57 let led_green = u8::from_le_bytes(
58 buf[offset..offset + std::mem::size_of::<u8>()]
59 .try_into()
60 .unwrap()
61 );
62 offset += std::mem::size_of::<u8>();
63 if offset + std::mem::size_of::<u8>() > buf.len() {
64 return Err(crate::error::ViiperError::UnexpectedResponse(
65 "buffer too short".into()
66 ));
67 }
68 let led_blue = u8::from_le_bytes(
69 buf[offset..offset + std::mem::size_of::<u8>()]
70 .try_into()
71 .unwrap()
72 );
73 offset += std::mem::size_of::<u8>();
74 if offset + std::mem::size_of::<u8>() > buf.len() {
75 return Err(crate::error::ViiperError::UnexpectedResponse(
76 "buffer too short".into()
77 ));
78 }
79 let flash_on = u8::from_le_bytes(
80 buf[offset..offset + std::mem::size_of::<u8>()]
81 .try_into()
82 .unwrap()
83 );
84 offset += std::mem::size_of::<u8>();
85 if offset + std::mem::size_of::<u8>() > buf.len() {
86 return Err(crate::error::ViiperError::UnexpectedResponse(
87 "buffer too short".into()
88 ));
89 }
90 let flash_off = u8::from_le_bytes(
91 buf[offset..offset + std::mem::size_of::<u8>()]
92 .try_into()
93 .unwrap()
94 );
95 offset += std::mem::size_of::<u8>();
96 let _ = offset; Ok(Self {
98 rumble_small,
99 rumble_large,
100 led_red,
101 led_green,
102 led_blue,
103 flash_on,
104 flash_off,
105 })
106 }
107}