//! This crate provides a safe wrapper around the native `libusb` library. pub use libusb1_sys as ffi; pub use libusb1_sys::constants; #[cfg(unix)] pub use crate::options::disable_device_discovery; pub use crate::{ config_descriptor::{ConfigDescriptor, Interfaces}, context::{Context, GlobalContext, LogCallbackMode, LogLevel, UsbContext}, device::Device, device_descriptor::DeviceDescriptor, device_handle::DeviceHandle, device_list::{DeviceList, Devices}, endpoint_descriptor::EndpointDescriptor, error::{Error, Result}, fields::{ request_type, Direction, Recipient, RequestType, Speed, SyncType, TransferType, UsageType, Version, }, hotplug::{Hotplug, HotplugBuilder, Registration}, interface_descriptor::{ EndpointDescriptors, Interface, InterfaceDescriptor, InterfaceDescriptors, }, language::{Language, PrimaryLanguage, SubLanguage}, options::UsbOption, version::{version, LibraryVersion}, }; #[cfg(test)] #[macro_use] mod test_helpers; #[macro_use] mod error; mod version; mod context; mod device; mod device_handle; mod device_list; mod config_descriptor; mod device_descriptor; mod endpoint_descriptor; mod fields; mod hotplug; mod interface_descriptor; mod language; mod options; /// Tests whether the running `libusb` library supports capability API. pub fn has_capability() -> bool { GlobalContext::default().as_raw(); unsafe { libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_HAS_CAPABILITY) != 0 } } /// Tests whether the running `libusb` library supports hotplug. pub fn has_hotplug() -> bool { GlobalContext::default().as_raw(); unsafe { libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_HAS_HOTPLUG) != 0 } } /// Tests whether the running `libusb` library has HID access. pub fn has_hid_access() -> bool { GlobalContext::default().as_raw(); unsafe { libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_HAS_HID_ACCESS) != 0 } } /// Tests whether the running `libusb` library supports detaching the kernel driver. pub fn supports_detach_kernel_driver() -> bool { GlobalContext::default().as_raw(); unsafe { libusb1_sys::libusb_has_capability(constants::LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER) != 0 } } /// Returns a list of the current USB devices. Using global context pub fn devices() -> crate::Result> { GlobalContext::default().devices() } /// Sets the log level of a `libusb` global context. pub fn set_log_level(level: LogLevel) { unsafe { libusb1_sys::libusb_set_debug(GlobalContext::default().as_raw(), level.as_c_int()); } } /// Convenience function to open a device by its vendor ID and product ID. /// Using global context /// /// This function is provided as a convenience for building prototypes without having to /// iterate a [`DeviceList`](struct.DeviceList.html). It is not meant for production /// applications. /// /// Returns a device handle for the first device found matching `vendor_id` and `product_id`. /// On error, or if the device could not be found, it returns `None`. pub fn open_device_with_vid_pid( vendor_id: u16, product_id: u16, ) -> Option> { let handle = unsafe { libusb1_sys::libusb_open_device_with_vid_pid( GlobalContext::default().as_raw(), vendor_id, product_id, ) }; if handle.is_null() { None } else { Some(unsafe { DeviceHandle::from_libusb( GlobalContext::default(), std::ptr::NonNull::new_unchecked(handle), ) }) } }