Crate async_hid

source ·
Expand description

async-hid

A Rust library for asynchronously interacting with HID devices.

This crate aims the be a replacement for hidapi-rs without the baggage that comes from being a wrapper around a C library.

This crate generally offers a simpler and more streamlined api while also supporting async as best as possible.

Example

use async_hid::{AccessMode, DeviceInfo, HidResult};
use simple_logger::SimpleLogger;
use futures_lite::StreamExt;

#[tokio::main]
async fn main() -> HidResult<()> {
    SimpleLogger::new().init().unwrap();

    let device = DeviceInfo::enumerate()
        .await?
        //Steelseries Arctis Nova 7X headset
        .find(|info: &DeviceInfo | info.matches(0xFFC0, 0x1, 0x1038, 0x2206))
        .await
        .expect("Could not find device")
        .open(AccessMode::ReadWrite)
        .await?;

    device.write_output_report(&[0x0, 0xb0]).await?;
    let mut buffer = [0u8; 8];
    let size = device.read_input_report(&mut buffer).await?;
    println!("{:?}", &buffer[..size]);
    Ok(())
}

Platform Support

Operating SystemUnderlying API
WindowsWinRT (Windows.Devices.HumanInterfaceDevice)
Linuxhidraw
MacOsIOHIDManager

Async

The amount of asynchronicity that each OS provides varies. The following tables gives a rough overview which calls utilize async under the hood.

enumerateopenread_input_reportwrite_output_report
Windows✔️✔️✔️✔️
Linux✔️✔️
MacOS✔️✔️

Under Linux this crate requires a tokio runtime while the Window and MacOS backends are runtime agnostic.

Planned Features

  • Reading / Writing feature reports
  • Listening for changes to the device list
  • More unified error handling

License

MIT License

Structs

  • A struct representing an opened device
  • An opaque struct that wraps the OS specific identifier of a device
  • A struct containing basic information about a device

Enums

Type Definitions