mirror of
https://gitlab.com/gabmus/envision.git
synced 2025-08-07 08:38:46 +00:00
fix: only probe for device roles that exist in monado; refactor xr_devices
This commit is contained in:
parent
258c6d5fae
commit
0f3bea883f
3 changed files with 47 additions and 73 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -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",
|
||||
|
|
|
@ -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"] }
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue