# HID Gadget Emulation in Rust
[](https://github.com/katyo/hidg-rs)
[](https://crates.io/crates/async-std-hidg)
[](https://docs.rs/async-std-hidg)
[](https://opensource.org/licenses/MIT)
[](https://github.com/katyo/hidg-rs/actions?query=workflow%3ARust)
Rust crate for interfacing with Linux HID Gadget devices (/dev/hidgX).
This crate supports [async-std](https://async.rs/) async runtime.
Since all functionality is dependent on Linux function calls, this crate only compiles for Linux systems.
## Crates
- [hidg-core](https://crates.io/crates/hidg-core) - core abstractions and low level interface (not for end users)
- [hidg](https://crates.io/crates/hidg) - std interface which supports synchronous operation only
- [tokio-hidg](https://crates.io/crates/tokio-hidg) - async interface for [tokio](https://tokio.rs/) adepts
- **[async-std-hidg](https://crates.io/crates/async-std-hidg)** - async interface for [async-std](https://async.rs/) adepts
## Features
- *fromstr* - implements [core::str::FromStr] implementation for some types
- *display* - implements [std::fmt::Display] implementation for some types
- *phf* - use [phf](https://crates.io/crates/phf) in [core::str::FromStr] trait implementations
- *serde* - enables [serde](https://crates.io/crates/serde) support for some types
- *keyboard* - enables keyboard class support
- *mouse* - enables mouse class support
## Usage examples
Keyboard input simulation:
```rust,no_run
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:
```rust,no_run
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(())
}
```