From 56f730414c0b340bb0833bebe2b8700d98e494d5 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Thu, 8 Aug 2024 07:01:46 +0200 Subject: [PATCH] feat: refactor xr device listing around api changes to libmonado-rs --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/xr_devices.rs | 91 +++++++++++++++++++++++------------------------ 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f0a77d5..898d8f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1107,7 +1107,7 @@ dependencies = [ [[package]] name = "libmonado-rs" version = "0.1.0" -source = "git+https://github.com/technobaboo/libmonado-rs?rev=a495f6d162fce47ae5aafeb7ec38e774cb731c29#a495f6d162fce47ae5aafeb7ec38e774cb731c29" +source = "git+https://github.com/gabmus/libmonado-rs?rev=6ce5ef19f41413cda6a280087fd9411892f778f0#6ce5ef19f41413cda6a280087fd9411892f778f0" dependencies = [ "bindgen", "cmake", diff --git a/Cargo.toml b/Cargo.toml index de2067a..9328168 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ git2 = "0.19.0" gtk = { package = "gtk4", version = "0.9.0", features = ["v4_10"] } lazy_static = "1.5.0" adw = { package = "libadwaita", version = "0.7.0", features = ["v1_5"] } -libmonado-rs = { git = "https://github.com/technobaboo/libmonado-rs", rev = "a495f6d162fce47ae5aafeb7ec38e774cb731c29" } +libmonado-rs = { git = "https://github.com/gabmus/libmonado-rs", rev = "6ce5ef19f41413cda6a280087fd9411892f778f0" } rusb = "0.9.4" nix = { version = "0.29.0", features = ["fs", "signal"] } relm4 = { version = "0.9.0", features = ["libadwaita"] } diff --git a/src/xr_devices.rs b/src/xr_devices.rs index f7c540f..ac33aec 100644 --- a/src/xr_devices.rs +++ b/src/xr_devices.rs @@ -1,9 +1,9 @@ -use libmonado_rs::{self, BatteryStatus}; -use std::{fmt::Display, slice::Iter}; +use libmonado_rs::{self, BatteryStatus, DeviceRole}; +use std::{collections::HashMap, fmt::Display, slice::Iter}; const GENERIC_TRACKER_PREFIX: &str = "Found generic tracker device: "; -#[derive(Debug, Clone, PartialEq, Eq, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum XRDeviceRole { Head, Eyes, @@ -228,6 +228,20 @@ impl XRDeviceRole { } } +impl From for XRDeviceRole { + fn from(value: DeviceRole) -> Self { + match value { + DeviceRole::Head => XRDeviceRole::Head, + DeviceRole::Eyes => XRDeviceRole::Eyes, + DeviceRole::Left => XRDeviceRole::Left, + DeviceRole::Right => XRDeviceRole::Right, + DeviceRole::Gamepad => XRDeviceRole::Gamepad, + DeviceRole::HandTrackingLeft => XRDeviceRole::HandTrackingLeft, + DeviceRole::HandTrackingRight => XRDeviceRole::HandTrackingRight, + } + } +} + #[derive(Debug, Clone)] pub struct XRDevice { pub dev_type: XRDeviceRole, @@ -264,22 +278,28 @@ impl XRDevice { } pub fn from_libmonado(monado: &libmonado_rs::Monado) -> Vec { - let mut devs_with_role = vec![]; - // only roles in src/xrt/targets/libmonado/monado.c:role_enum - let mut res = [ - XRDeviceRole::Head, - XRDeviceRole::Eyes, - XRDeviceRole::Left, - XRDeviceRole::Right, - XRDeviceRole::Gamepad, - XRDeviceRole::HandTrackingLeft, - XRDeviceRole::HandTrackingRight, - ] - .into_iter() - .filter_map(|xrd| { - if let Ok(dev) = monado.device_from_role(xrd.to_monado_str()) { - devs_with_role.push(dev.id); - Some(Self { + let mut dev_indices_with_role: HashMap = HashMap::from_iter( + [ + DeviceRole::Head, + DeviceRole::Eyes, + DeviceRole::Left, + DeviceRole::Right, + DeviceRole::Gamepad, + DeviceRole::HandTrackingLeft, + DeviceRole::HandTrackingRight, + ] + .into_iter() + .filter_map(|role| { + if let Ok(index) = monado.device_index_from_role(role) { + Some((index, XRDeviceRole::from(role))) + } else { + None + } + }), + ); + if let Ok(devs) = monado.devices() { + devs.into_iter() + .map(|dev| Self { index: dev.id.to_string(), serial: dev.serial().ok(), battery: dev.battery_status().ok().and_then(|bs| { @@ -290,34 +310,13 @@ impl XRDevice { } }), name: dev.name, - dev_type: xrd, + dev_type: dev_indices_with_role + .remove(&dev.index) + .unwrap_or(XRDeviceRole::GenericTracker), }) - } else { - None - } - }) - .collect::>(); - if let Ok(all_devs) = monado.devices() { - res.extend(all_devs.into_iter().filter_map(|dev| { - if devs_with_role.contains(&dev.id) { - None - } else { - Some(Self { - index: dev.id.to_string(), - serial: dev.serial().ok(), - battery: dev.battery_status().ok().and_then(|bs| { - if bs.present { - Some(bs) - } else { - None - } - }), - name: dev.name, - dev_type: XRDeviceRole::GenericTracker, - }) - } - })); + .collect() + } else { + Vec::default() } - res } }