Skip to content
 
 

Latest commit

 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

  • fromstr - implements [core::str::FromStr] implementation for some types
  • display - implements [std::fmt::Display] implementation for some types
  • phf - use phf in [core::str::FromStr] trait implementations
  • serde - enables serde support for some types
  • keyboard - enables keyboard class support
  • mouse - enables mouse class support

Usage examples

Keyboard input simulation:

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

fn main() -> std::io::Result<()> {
    let mut device = Device::<Keyboard>::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:

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

fn main() -> std::io::Result<()> {
    let mut device = Device::<Mouse>::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(())
}

About

Linux HID Gadget Emulation in Rust

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages