mirror of
https://gitlab.com/gabmus/envision.git
synced 2025-08-10 01:58:52 +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]]
|
[[package]]
|
||||||
name = "libmonado-rs"
|
name = "libmonado-rs"
|
||||||
version = "0.1.0"
|
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 = [
|
dependencies = [
|
||||||
"bindgen",
|
"bindgen",
|
||||||
"cmake",
|
"cmake",
|
||||||
|
|
|
@ -12,7 +12,7 @@ git2 = "0.19.0"
|
||||||
gtk4 = { version = "0.9.0", features = ["v4_10"] }
|
gtk4 = { version = "0.9.0", features = ["v4_10"] }
|
||||||
lazy_static = "1.5.0"
|
lazy_static = "1.5.0"
|
||||||
libadwaita = { version = "0.7.0", features = ["v1_5"] }
|
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"
|
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"] }
|
||||||
|
|
|
@ -6,10 +6,10 @@ const GENERIC_TRACKER_PREFIX: &str = "Found generic tracker device: ";
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
|
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
|
||||||
pub enum XRDeviceRole {
|
pub enum XRDeviceRole {
|
||||||
Head,
|
Head,
|
||||||
|
Eyes,
|
||||||
Left,
|
Left,
|
||||||
Right,
|
Right,
|
||||||
Gamepad,
|
Gamepad,
|
||||||
Eyes,
|
|
||||||
HandTrackingLeft,
|
HandTrackingLeft,
|
||||||
HandTrackingRight,
|
HandTrackingRight,
|
||||||
|
|
||||||
|
@ -44,13 +44,14 @@ impl Display for XRDeviceRole {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
f.write_str(match self {
|
f.write_str(match self {
|
||||||
Self::Head => "Head",
|
Self::Head => "Head",
|
||||||
|
Self::Eyes => "Eye Tracking",
|
||||||
Self::Left => "Left",
|
Self::Left => "Left",
|
||||||
Self::Right => "Right",
|
Self::Right => "Right",
|
||||||
Self::Gamepad => "Gamepad",
|
Self::Gamepad => "Gamepad",
|
||||||
Self::Eyes => "Eye Tracking",
|
|
||||||
Self::HandTrackingLeft => "Hand tracking left",
|
Self::HandTrackingLeft => "Hand tracking left",
|
||||||
Self::HandTrackingRight => "Hand tracking right",
|
Self::HandTrackingRight => "Hand tracking right",
|
||||||
|
|
||||||
|
// the following are not in libmonado
|
||||||
Self::HandheldObject => "Handheld object",
|
Self::HandheldObject => "Handheld object",
|
||||||
Self::LeftFoot => "Left foot",
|
Self::LeftFoot => "Left foot",
|
||||||
Self::RightFoot => "Right foot",
|
Self::RightFoot => "Right foot",
|
||||||
|
@ -87,10 +88,11 @@ impl XRDeviceRole {
|
||||||
pub fn iter() -> Iter<'static, Self> {
|
pub fn iter() -> Iter<'static, Self> {
|
||||||
[
|
[
|
||||||
Self::Head,
|
Self::Head,
|
||||||
|
Self::Eyes,
|
||||||
Self::Left,
|
Self::Left,
|
||||||
Self::Right,
|
Self::Right,
|
||||||
Self::Gamepad,
|
Self::Gamepad,
|
||||||
Self::Eyes,
|
// the following are not in libmonado
|
||||||
Self::HandTrackingLeft,
|
Self::HandTrackingLeft,
|
||||||
Self::HandTrackingRight,
|
Self::HandTrackingRight,
|
||||||
Self::HandheldObject,
|
Self::HandheldObject,
|
||||||
|
@ -113,13 +115,14 @@ impl XRDeviceRole {
|
||||||
pub fn to_monado_str(&self) -> &str {
|
pub fn to_monado_str(&self) -> &str {
|
||||||
match self {
|
match self {
|
||||||
Self::Head => "head",
|
Self::Head => "head",
|
||||||
|
Self::Eyes => "eyes",
|
||||||
Self::Left => "left",
|
Self::Left => "left",
|
||||||
Self::Right => "right",
|
Self::Right => "right",
|
||||||
Self::Gamepad => "gamepad",
|
Self::Gamepad => "gamepad",
|
||||||
Self::Eyes => "eyes",
|
|
||||||
Self::HandTrackingLeft => "hand-tracking-left",
|
Self::HandTrackingLeft => "hand-tracking-left",
|
||||||
Self::HandTrackingRight => "hand-tracking-right",
|
Self::HandTrackingRight => "hand-tracking-right",
|
||||||
|
|
||||||
|
// the following are not in libmonado
|
||||||
Self::HandheldObject => "handheld-object",
|
Self::HandheldObject => "handheld-object",
|
||||||
Self::LeftFoot => "left-foot",
|
Self::LeftFoot => "left-foot",
|
||||||
Self::RightFoot => "right-foot",
|
Self::RightFoot => "right-foot",
|
||||||
|
@ -142,13 +145,14 @@ impl XRDeviceRole {
|
||||||
pub fn as_number(&self) -> u32 {
|
pub fn as_number(&self) -> u32 {
|
||||||
match self {
|
match self {
|
||||||
Self::Head => 0,
|
Self::Head => 0,
|
||||||
Self::Left => 1,
|
Self::Eyes => 1,
|
||||||
Self::Right => 2,
|
Self::Left => 2,
|
||||||
Self::Gamepad => 3,
|
Self::Right => 3,
|
||||||
Self::Eyes => 4,
|
Self::Gamepad => 4,
|
||||||
Self::HandTrackingLeft => 5,
|
Self::HandTrackingLeft => 5,
|
||||||
Self::HandTrackingRight => 6,
|
Self::HandTrackingRight => 6,
|
||||||
|
|
||||||
|
// the following are not in libmonado
|
||||||
Self::HandheldObject => 7,
|
Self::HandheldObject => 7,
|
||||||
Self::LeftFoot => 8,
|
Self::LeftFoot => 8,
|
||||||
Self::RightFoot => 9,
|
Self::RightFoot => 9,
|
||||||
|
@ -259,64 +263,23 @@ impl XRDevice {
|
||||||
None
|
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> {
|
pub fn from_libmonado(monado: &libmonado_rs::Monado) -> Vec<Self> {
|
||||||
let mut res = vec![];
|
|
||||||
let mut devs_with_role = vec![];
|
let mut devs_with_role = vec![];
|
||||||
[
|
// only roles in src/xrt/targets/libmonado/monado.c:role_enum
|
||||||
|
let mut res = [
|
||||||
XRDeviceRole::Head,
|
XRDeviceRole::Head,
|
||||||
|
XRDeviceRole::Eyes,
|
||||||
XRDeviceRole::Left,
|
XRDeviceRole::Left,
|
||||||
XRDeviceRole::Right,
|
XRDeviceRole::Right,
|
||||||
|
XRDeviceRole::Gamepad,
|
||||||
XRDeviceRole::HandTrackingLeft,
|
XRDeviceRole::HandTrackingLeft,
|
||||||
XRDeviceRole::HandTrackingRight,
|
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()
|
.into_iter()
|
||||||
.for_each(|xrd| {
|
.filter_map(|xrd| {
|
||||||
if let Ok(dev) = monado.device_from_role(xrd.to_monado_str()) {
|
if let Ok(dev) = monado.device_from_role(xrd.to_monado_str()) {
|
||||||
devs_with_role.push(dev.id);
|
devs_with_role.push(dev.id);
|
||||||
// let serial = match dev.serial() {
|
Some(Self {
|
||||||
// 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 {
|
|
||||||
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| {
|
||||||
|
@ -329,21 +292,30 @@ impl XRDevice {
|
||||||
name: dev.name,
|
name: dev.name,
|
||||||
dev_type: xrd,
|
dev_type: xrd,
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
.collect::<Vec<Self>>();
|
||||||
if let Ok(all_devs) = monado.devices() {
|
if let Ok(all_devs) = monado.devices() {
|
||||||
|
res.extend(
|
||||||
all_devs
|
all_devs
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|dev| !devs_with_role.contains(&dev.id))
|
.filter(|dev| !devs_with_role.contains(&dev.id))
|
||||||
.for_each(|dev_gt| {
|
.map(|dev| Self {
|
||||||
res.push(Self {
|
index: dev.id.to_string(),
|
||||||
name: dev_gt.name.clone(),
|
serial: dev.serial().ok(),
|
||||||
index: dev_gt.id.to_string(),
|
battery: dev.battery_status().ok().and_then(|bs| {
|
||||||
serial: dev_gt.serial().ok(),
|
if bs.present {
|
||||||
|
Some(bs)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
name: dev.name,
|
||||||
dev_type: XRDeviceRole::GenericTracker,
|
dev_type: XRDeviceRole::GenericTracker,
|
||||||
..Default::default()
|
}),
|
||||||
})
|
)
|
||||||
})
|
|
||||||
}
|
}
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
@ -388,9 +360,10 @@ impl XRDevice {
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|d| {
|
.filter_map(|d| {
|
||||||
if d.dev_type == XRDeviceRole::GenericTracker {
|
if d.dev_type == XRDeviceRole::GenericTracker {
|
||||||
return None;
|
None
|
||||||
}
|
} else {
|
||||||
Some(d.dev_type)
|
Some(d.dev_type)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.collect::<Vec<XRDeviceRole>>();
|
.collect::<Vec<XRDeviceRole>>();
|
||||||
let mut res = old
|
let mut res = old
|
||||||
|
@ -402,9 +375,10 @@ impl XRDevice {
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|d| {
|
.filter_map(|d| {
|
||||||
if d.dev_type == XRDeviceRole::GenericTracker {
|
if d.dev_type == XRDeviceRole::GenericTracker {
|
||||||
return d.serial.clone();
|
d.serial.clone()
|
||||||
}
|
} else {
|
||||||
None
|
None
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.collect::<Vec<String>>();
|
.collect::<Vec<String>>();
|
||||||
for n_dev in new {
|
for n_dev in new {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue