diff --git a/Cargo.lock b/Cargo.lock index c05b7d5..f0a77d5 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=ddad003d5701c7139dd0de69c8195ed2105784ca#ddad003d5701c7139dd0de69c8195ed2105784ca" +source = "git+https://github.com/technobaboo/libmonado-rs?rev=a495f6d162fce47ae5aafeb7ec38e774cb731c29#a495f6d162fce47ae5aafeb7ec38e774cb731c29" dependencies = [ "bindgen", "cmake", diff --git a/Cargo.toml b/Cargo.toml index 15f0d68..13dee92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ git2 = "0.19.0" gtk4 = { version = "0.9.0", features = ["v4_10"] } lazy_static = "1.5.0" libadwaita = { version = "0.7.0", features = ["v1_5"] } -libmonado-rs = { git = "https://github.com/technobaboo/libmonado-rs", rev = "ddad003d5701c7139dd0de69c8195ed2105784ca" } +libmonado-rs = { git = "https://github.com/technobaboo/libmonado-rs", rev = "a495f6d162fce47ae5aafeb7ec38e774cb731c29" } 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 91fbc50..3a03435 100644 --- a/src/xr_devices.rs +++ b/src/xr_devices.rs @@ -6,10 +6,10 @@ const GENERIC_TRACKER_PREFIX: &str = "Found generic tracker device: "; #[derive(Debug, Clone, PartialEq, Eq, Copy)] pub enum XRDeviceRole { Head, + Eyes, Left, Right, Gamepad, - Eyes, HandTrackingLeft, HandTrackingRight, @@ -44,13 +44,14 @@ impl Display for XRDeviceRole { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(match self { Self::Head => "Head", + Self::Eyes => "Eye Tracking", Self::Left => "Left", Self::Right => "Right", Self::Gamepad => "Gamepad", - Self::Eyes => "Eye Tracking", Self::HandTrackingLeft => "Hand tracking left", Self::HandTrackingRight => "Hand tracking right", + // the following are not in libmonado Self::HandheldObject => "Handheld object", Self::LeftFoot => "Left foot", Self::RightFoot => "Right foot", @@ -87,10 +88,11 @@ impl XRDeviceRole { pub fn iter() -> Iter<'static, Self> { [ Self::Head, + Self::Eyes, Self::Left, Self::Right, Self::Gamepad, - Self::Eyes, + // the following are not in libmonado Self::HandTrackingLeft, Self::HandTrackingRight, Self::HandheldObject, @@ -113,13 +115,14 @@ impl XRDeviceRole { pub fn to_monado_str(&self) -> &str { match self { Self::Head => "head", + Self::Eyes => "eyes", Self::Left => "left", Self::Right => "right", Self::Gamepad => "gamepad", - Self::Eyes => "eyes", Self::HandTrackingLeft => "hand-tracking-left", Self::HandTrackingRight => "hand-tracking-right", + // the following are not in libmonado Self::HandheldObject => "handheld-object", Self::LeftFoot => "left-foot", Self::RightFoot => "right-foot", @@ -142,13 +145,14 @@ impl XRDeviceRole { pub fn as_number(&self) -> u32 { match self { Self::Head => 0, - Self::Left => 1, - Self::Right => 2, - Self::Gamepad => 3, - Self::Eyes => 4, + Self::Eyes => 1, + Self::Left => 2, + Self::Right => 3, + Self::Gamepad => 4, Self::HandTrackingLeft => 5, Self::HandTrackingRight => 6, + // the following are not in libmonado Self::HandheldObject => 7, Self::LeftFoot => 8, Self::RightFoot => 9, @@ -259,64 +263,23 @@ impl XRDevice { None } - /* pub fn from_libmonado_devices(monado: &libmonado_rs::Monado) -> Vec { - if let Ok(devs) = monado.devices() { - return devs - .into_iter() - .map(|xrd| Self { - id: xrd.id.to_string(), - name: xrd.name, - ..Default::default() - }) - .collect(); - } - - vec![] - } */ - pub fn from_libmonado(monado: &libmonado_rs::Monado) -> Vec { - let mut res = 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, - XRDeviceRole::HandheldObject, - XRDeviceRole::LeftFoot, - XRDeviceRole::RightFoot, - XRDeviceRole::LeftShoulder, - XRDeviceRole::RightShoulder, - XRDeviceRole::LeftElbow, - XRDeviceRole::RightElbow, - XRDeviceRole::LeftKnee, - XRDeviceRole::RightKnee, - XRDeviceRole::Waist, - XRDeviceRole::Chest, - XRDeviceRole::Camera, - XRDeviceRole::Keyboard, - XRDeviceRole::Gamepad, - XRDeviceRole::Eyes, ] .into_iter() - .for_each(|xrd| { + .filter_map(|xrd| { if let Ok(dev) = monado.device_from_role(xrd.to_monado_str()) { devs_with_role.push(dev.id); - // let serial = match dev.serial() { - // Ok(s) => { - // serials.push(s.clone()); - // Some(s) - // } - // Err(e) => { - // eprintln!( - // "Warning: could not get serial for monado device {} ({}): {:#?}", - // dev.name, dev.id, e - // ); - // None - // } - // }; - res.push(Self { + Some(Self { index: dev.id.to_string(), serial: dev.serial().ok(), battery: dev.battery_status().ok().and_then(|bs| { @@ -329,21 +292,30 @@ impl XRDevice { name: dev.name, dev_type: xrd, }) + } else { + None } - }); + }) + .collect::>(); if let Ok(all_devs) = monado.devices() { - all_devs - .into_iter() - .filter(|dev| !devs_with_role.contains(&dev.id)) - .for_each(|dev_gt| { - res.push(Self { - name: dev_gt.name.clone(), - index: dev_gt.id.to_string(), - serial: dev_gt.serial().ok(), + res.extend( + all_devs + .into_iter() + .filter(|dev| !devs_with_role.contains(&dev.id)) + .map(|dev| 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, - ..Default::default() - }) - }) + }), + ) } res } @@ -388,9 +360,10 @@ impl XRDevice { .iter() .filter_map(|d| { if d.dev_type == XRDeviceRole::GenericTracker { - return None; + None + } else { + Some(d.dev_type) } - Some(d.dev_type) }) .collect::>(); let mut res = old @@ -402,9 +375,10 @@ impl XRDevice { .iter() .filter_map(|d| { if d.dev_type == XRDeviceRole::GenericTracker { - return d.serial.clone(); + d.serial.clone() + } else { + None } - None }) .collect::>(); for n_dev in new {