From cd6e41862cea59ec306e7c9c578270575eb2a73b Mon Sep 17 00:00:00 2001 From: Daniel Mueller Date: Sun, 26 Mar 2017 17:07:56 -0700 Subject: Import subrepo hid/:hid at 3ac1005fe3e874bef850ab733fe1a09bc36b91c5 --- hid/src/manager.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 hid/src/manager.rs (limited to 'hid/src/manager.rs') diff --git a/hid/src/manager.rs b/hid/src/manager.rs new file mode 100644 index 0000000..4c2eb23 --- /dev/null +++ b/hid/src/manager.rs @@ -0,0 +1,56 @@ +use std::sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT, Ordering}; + +use sys::*; +use error::{self, Error}; +use devices::Devices; + +static INITIALIZED: AtomicBool = ATOMIC_BOOL_INIT; + +/// The device manager. +pub struct Manager; + +unsafe impl Send for Manager { } + +/// Create the manager. +pub fn init() -> error::Result { + if INITIALIZED.load(Ordering::Relaxed) { + return Err(Error::Initialized); + } + + let status = unsafe { hid_init() }; + + if status != 0 { + return Err(Error::from(status)); + } + + INITIALIZED.store(true, Ordering::Relaxed); + + Ok(Manager) +} + +impl Drop for Manager { + fn drop(&mut self) { + let status = unsafe { hid_exit() }; + + if status != 0 { + panic!("hid_exit() failed"); + } + + INITIALIZED.store(false, Ordering::Relaxed); + } +} + +impl Manager { + /// Find the wanted device, `vendor` or `product` are given it will + /// returns only the matches devices. + pub fn find(&self, vendor: Option, product: Option) -> Devices { + unsafe { + Devices::new(vendor, product) + } + } + + /// Return all devices. + pub fn devices(&self) -> Devices { + self.find(None, None) + } +} -- cgit v1.2.1