hid_api_rs/
hid.rs

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}