feat: refactor xr device listing around api changes to libmonado-rs

This commit is contained in:
Gabriele Musco 2024-08-08 07:01:46 +02:00
commit 56f730414c
3 changed files with 47 additions and 48 deletions

2
Cargo.lock generated
View file

@ -1107,7 +1107,7 @@ dependencies = [
[[package]] [[package]]
name = "libmonado-rs" name = "libmonado-rs"
version = "0.1.0" 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 = [ dependencies = [
"bindgen", "bindgen",
"cmake", "cmake",

View file

@ -12,7 +12,7 @@ git2 = "0.19.0"
gtk = { package = "gtk4", version = "0.9.0", features = ["v4_10"] } gtk = { package = "gtk4", version = "0.9.0", features = ["v4_10"] }
lazy_static = "1.5.0" lazy_static = "1.5.0"
adw = { package = "libadwaita", version = "0.7.0", features = ["v1_5"] } 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" rusb = "0.9.4"
nix = { version = "0.29.0", features = ["fs", "signal"] } nix = { version = "0.29.0", features = ["fs", "signal"] }
relm4 = { version = "0.9.0", features = ["libadwaita"] } relm4 = { version = "0.9.0", features = ["libadwaita"] }

View file

@ -1,9 +1,9 @@
use libmonado_rs::{self, BatteryStatus}; use libmonado_rs::{self, BatteryStatus, DeviceRole};
use std::{fmt::Display, slice::Iter}; use std::{collections::HashMap, fmt::Display, slice::Iter};
const GENERIC_TRACKER_PREFIX: &str = "Found generic tracker device: "; const GENERIC_TRACKER_PREFIX: &str = "Found generic tracker device: ";
#[derive(Debug, Clone, PartialEq, Eq, Copy)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum XRDeviceRole { pub enum XRDeviceRole {
Head, Head,
Eyes, Eyes,
@ -228,6 +228,20 @@ impl XRDeviceRole {
} }
} }
impl From<DeviceRole> 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)] #[derive(Debug, Clone)]
pub struct XRDevice { pub struct XRDevice {
pub dev_type: XRDeviceRole, pub dev_type: XRDeviceRole,
@ -264,22 +278,28 @@ impl XRDevice {
} }
pub fn from_libmonado(monado: &libmonado_rs::Monado) -> Vec<Self> { pub fn from_libmonado(monado: &libmonado_rs::Monado) -> Vec<Self> {
let mut devs_with_role = vec![]; let mut dev_indices_with_role: HashMap<u32, XRDeviceRole> = HashMap::from_iter(
// only roles in src/xrt/targets/libmonado/monado.c:role_enum [
let mut res = [ 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, ]
] .into_iter()
.into_iter() .filter_map(|role| {
.filter_map(|xrd| { if let Ok(index) = monado.device_index_from_role(role) {
if let Ok(dev) = monado.device_from_role(xrd.to_monado_str()) { Some((index, XRDeviceRole::from(role)))
devs_with_role.push(dev.id); } else {
Some(Self { None
}
}),
);
if let Ok(devs) = monado.devices() {
devs.into_iter()
.map(|dev| Self {
index: dev.id.to_string(), index: dev.id.to_string(),
serial: dev.serial().ok(), serial: dev.serial().ok(),
battery: dev.battery_status().ok().and_then(|bs| { battery: dev.battery_status().ok().and_then(|bs| {
@ -290,34 +310,13 @@ impl XRDevice {
} }
}), }),
name: dev.name, name: dev.name,
dev_type: xrd, dev_type: dev_indices_with_role
.remove(&dev.index)
.unwrap_or(XRDeviceRole::GenericTracker),
}) })
} else { .collect()
None } else {
} Vec::default()
})
.collect::<Vec<Self>>();
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,
})
}
}));
} }
res
} }
} }