HID Gadget Emulation in Rust

github crate docs MIT CI

Rust crate for interfacing with Linux HID Gadget devices (/dev/hidgX).

Since all functionality is dependent on Linux function calls, this crate only compiles for Linux systems.

Crates

Features

Usage examples

Keyboard input simulation:

```rust,no_run use hidg::{Class, Device, Keyboard, Key, Led, StateChange};

fn main() -> std::io::Result<()> { let mut device = Device::::open("hidg0")?; // open device

// Create input report
let mut input = Keyboard.input();

// Press left ctrl modifier
input.press_key(Key::LeftCtrl);

// Press key 'A'
input.press_key(Key::A);

// Send input report
device.input(&input)?;

// Get pressed keys
println!("Keys: {:?}", input.pressed().collect::<Vec<Key>>());

// Release left ctrl modifier
input.release_key(Key::LeftCtrl);

// Release key 'A'
input.release_key(Key::A);

// Send input report
device.input(&input)?;

// Create output report
let mut output = Keyboard.output();

// Receive output report
device.output(&mut output)?;

// Print lit LEDs
println!("LEDs: {:?}", output.lit().collect::<Vec<Led>>());

Ok(())

} ```

Mouse input simulation:

```rust,no_run use hidg::{Button, Class, Device, Mouse, StateChange, ValueChange};

fn main() -> std::io::Result<()> { let mut device = Device::::open("hidg0")?; // open device

// Create input report
let mut input = Mouse.input();

// Press primary button
input.press_button(Button::Primary);

// Update pointer coordinates
input.change_pointer((150, 50), false);

// Send input report
device.input(&input)?;

// Move pointer relatively
input.change_pointer((70, -30), true);

// Get pressed buttons
println!("Buttons: {:?}", input.pressed().collect::<Vec<Button>>());

// Release primary button
input.release_button(Button::Primary);

// Send input report
device.input(&input)?;

Ok(())

} ```