Skip to main content

Crate hidra

Crate hidra 

Source
Expand description

§hidra

A pure-Rust HID library.

hidra talks to HID devices through native OS interfaces:

TargetNativeNusb (feature nusb)
Linuxhidraw device nodes + sysfs enumerationUSB interrupt/control transfers via nusb
Windowshid.dll / SetupAPI via windows-sys declarationsas above
macOSIOHIDManager via direct framework FFIas above

On WebAssembly the backend is always WebHID via web-sys.

The backend is a type parameter: Hidra<Native> for the OS HID stack, Hidra<Nusb> for raw USB. Both coexist in one build, so a program can drive two devices through different backends at once. A backend this build does not have cannot be named, so the wrong choice is a compile error rather than a run-time one.

use hidra::{Hidra, Nusb};
let native = Hidra::new()?;                    // the OS HID stack
let usb = Hidra::<Nusb>::builder().build()?;  // raw USB transfers

They are different types, so a handle that holds either is the caller’s to declare; examples/backends.rs shows the whole of it.

Following nusb’s model, every Hidra / HidDevice I/O method returns an impl Future. On native targets bring MaybeFuture into scope to drive it blocking with .wait(), or .await it under any async runtime (no executor dependency, wake-ups are plain Wakers like nusb).

On wasm32 the same Hidra / HidDevice types are backed by WebHID; there is no blocking mode, so always .await their futures (no .wait()). Discovery is WebHID-shaped: Hidra::request_device shows the browser’s device chooser (filtered with DeviceFilter) and Hidra::get_devices lists previously granted devices. descriptor offers report-descriptor primitives that work everywhere.

use hidra::MaybeFuture;
let api = hidra::Hidra::new()?;
for dev in api.device_list() {
    println!("{:04x}:{:04x} {}", dev.vendor_id(), dev.product_id(),
             dev.product_string().unwrap_or("<unnamed>"));
}
let device = api.open(0x046d, 0xc216).wait()?;
device.write(&[0x00, 0x01, 0x02]).wait()?; // report ID 0 + payload
let mut buf = [0u8; 64];
let len = device.read(&mut buf).wait()?;

Modules§

descriptor
HID report descriptor primitives.
report_info
WebHID-style collection primitives, also usable standalone.

Structs§

ApiVersion
hidra’s version, mirroring hid_version().
DeviceInfo
Information about a connected HID device, as returned by enumeration.
HidDevice
An open HID device. Closed on drop.
Hidra
Entry point to the library; owns backend state and the cached device list.
HidraBuilder
Configures a Hidra: whether to enumerate up front, and on which backend.
Native
The Linux hidraw backend: device nodes plus sysfs enumeration.
NativeDevice
An open hidraw device node.
Nusb
Entry point for the USB backend; behind a crate::Hidra built with Nusb. See the module docs for when to prefer it. The raw-USB backend: HID reports over nusb transfers.
NusbDevice
An open USB HID interface; behind a crate::HidDevice opened through Nusb.

Enums§

BusType
The underlying transport a HID device is attached through.
HidError
Errors returned by hidra.

Constants§

MAX_REPORT_DESCRIPTOR_SIZE
Largest report descriptor a HID device can have (HID_API_MAX_REPORT_DESCRIPTOR_SIZE).

Traits§

HidBackend
The backend traits, and the backend types implementing them. The backend traits, and the backend types implementing them. The backend traits, and the backend types implementing them. Enumerating and opening HID devices through one implementation.
HidDeviceBackend
The backend traits, and the backend types implementing them. The backend traits, and the backend types implementing them. The backend traits, and the backend types implementing them. One open HID device.
MaybeFuture
Extension trait adding a blocking .wait() to every action.

Functions§

version
Library version (hid_version equivalent).
version_str
Library version string (hid_version_str equivalent).

Type Aliases§

HidResult
Convenience alias used by every fallible API in this crate.