fix: only probe for device roles that exist in monado; refactor xr_devices

This commit is contained in:
Gabriele Musco 2024-08-02 10:37:02 +02:00
commit 0f3bea883f
3 changed files with 47 additions and 73 deletions

2
Cargo.lock generated
View file

@ -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",

View file

@ -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"] }

View file

@ -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<Self> {
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<Self> {
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::<Vec<Self>>();
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::<Vec<XRDeviceRole>>();
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::<Vec<String>>();
for n_dev in new {