Expand description

HID Gadget Emulation in Rust

github crate docs MIT CI

Rust crate for interfacing with Linux HID Gadget devices (/dev/hidgX). This crate supports async-std async runtime.

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 async_std_hidg::{Class, Device, Keyboard, Key, Led, StateChange};

#[async_std::main]
async fn main() -> std::io::Result<()> {
    let mut device = Device::<Keyboard>::open("hidg0").await?; // 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);

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

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

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

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

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

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

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

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

    Ok(())
}

Mouse input simulation:

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

#[async_std::main]
async fn main() -> std::io::Result<()> {
    let mut device = Device::<Mouse>::open("hidg0").await?; // open device

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

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

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

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

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

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

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

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

    Ok(())
}

Structs

Button mask
HID Gadget Device
The error type for I/O operations of the Read, Write, Seek, and associated traits.
Changes between keyboard input reports
Keyboard HID class
Keyboard input report
Keyboard output report
Changes between keyboard output reports
LED mask
Modifier mask
Mouse HID class
Mouse input report
Changes between mouse input reports
Keyboard output report
Key/button/LED state change event
Pointer/cursor position change event

Enums

Button code
Key code
LED code
Change between mouse input reports

Traits

Device class trait

Type Definitions

A specialized Result type for I/O operations.