1use std::ops::Deref;
2use std::{
3 fs::{File, OpenOptions},
4 io::{BufWriter, Write},
5};
6use std::io::{Error, ErrorKind};
7
8use bitvec::prelude::Lsb0;
9use bitvec::view::BitView;
10
11use crate::gadgets::keyboard::KeyboardState;
12use crate::gadgets::mouse::MouseRaw;
13
14static mut GADGET_DEVICE_FILE: Option<File> = None;
15
16pub fn open_gadget_device(gadget_device_path: String) -> Result<&'static mut File, Error> {
17 unsafe {
18 GADGET_DEVICE_FILE = match OpenOptions::new()
19 .write(true)
20 .append(true)
21 .open(gadget_device_path)
22 {
23 Ok(result) => Some(result),
24 Err(error) => return Err(error),
25 };
26
27 match &mut GADGET_DEVICE_FILE {
28 Some(ref mut gadget) => Ok(gadget),
29 None => Err(Error::new(
30 ErrorKind::NotFound,
31 String::from("Hid gadget device file not found."),
32 ))
33 }
34 }
35}
36
37pub fn write_mouse(raw: &MouseRaw, gadget_writer: &mut BufWriter<&mut File>) -> Result<(), Error> {
38 const ID: [u8; 1] = [1u8];
39
40 let mut buttons = 0u8;
41 let bits = buttons.view_bits_mut::<Lsb0>();
42 bits.set(0, raw.left_button);
43 bits.set(1, raw.right_button);
44 bits.set(2, raw.middle_button);
45 bits.set(3, raw.four_button);
46 bits.set(4, raw.five_button);
47
48 let x_bytes = u16_to_u8s(raw.relative_x as u16);
49 let y_bytes = u16_to_u8s(raw.relative_y as u16);
50 let wheel_bytes = u16_to_u8s(raw.relative_wheel as u16);
51
52 let formatted_event = [
53 &ID[..],
54 &mut buttons.to_le_bytes(),
55 &[x_bytes[0]], &[x_bytes[1]],
56 &[y_bytes[0]], &[y_bytes[1]],
57 &[wheel_bytes[0]], &[wheel_bytes[1]]
58 ].concat();
59
60 gadget_writer.write(&formatted_event)?;
61 gadget_writer.flush()?;
62
63 Ok(())
64}
65
66pub fn write_keyboard(
67 keyboard_state: &KeyboardState,
68 gadget_writer: &mut BufWriter<&mut File>,
69) -> Result<(), Error> {
70 const ID: u8 = 2;
71
72 let mut modifiers_down: Vec<i32> = Vec::new();
73 if let Ok(modifiers_down_rwl) = keyboard_state.modifiers_down.read() {
74 modifiers_down = modifiers_down_rwl.deref().clone();
75 }
76
77 let mut modifier = 0u8;
78 let bits = modifier.view_bits_mut::<Lsb0>();
79 for modifier in &modifiers_down {
80 bits.set(*modifier as usize, true);
81 }
82
83 let mut keys_down: Vec<i32> = Vec::new();
84 if let Ok(keys_down_rwl) = keyboard_state.keys_down.read() {
85 keys_down = keys_down_rwl.deref().clone();
86 }
87
88 let mut formatted_event: Vec<u8> = vec![ID];
89
90 match modifiers_down.is_empty() {
91 true => formatted_event.push(0),
92 false => formatted_event.push(modifier),
93 }
94 formatted_event.push(0);
95
96 for key_down_index in 1..7 {
97 if key_down_index - 1 < keys_down.len() {
98 let key_down: i32 = keys_down[key_down_index - 1];
99 formatted_event.push(key_down as u8);
100 } else {
101 formatted_event.push(0);
102 }
103 }
104
105 gadget_writer.write(&formatted_event)?;
106 gadget_writer.flush()?;
107
108 Ok(())
109}
110
111fn u16_to_u8s(value: u16) -> [u8; 2] {
112 let low_byte = (value >> 8) as u8;
113 let high_byte = value as u8;
114
115 [high_byte, low_byte]
116}