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