summaryrefslogtreecommitdiff
path: root/hid/src/manager.rs
diff options
context:
space:
mode:
Diffstat (limited to 'hid/src/manager.rs')
-rw-r--r--hid/src/manager.rs56
1 files changed, 56 insertions, 0 deletions
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<Manager> {
+ 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<u16>, product: Option<u16>) -> Devices {
+ unsafe {
+ Devices::new(vendor, product)
+ }
+ }
+
+ /// Return all devices.
+ pub fn devices(&self) -> Devices {
+ self.find(None, None)
+ }
+}