mirror of
https://gitlab.com/gabmus/envision.git
synced 2025-08-01 21:58:43 +00:00
feat: refactor xr device listing around api changes to libmonado-rs
This commit is contained in:
parent
b2fd981c62
commit
56f730414c
3 changed files with 47 additions and 48 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=a495f6d162fce47ae5aafeb7ec38e774cb731c29#a495f6d162fce47ae5aafeb7ec38e774cb731c29"
|
source = "git+https://github.com/gabmus/libmonado-rs?rev=6ce5ef19f41413cda6a280087fd9411892f778f0#6ce5ef19f41413cda6a280087fd9411892f778f0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen",
|
"bindgen",
|
||||||
"cmake",
|
"cmake",
|
||||||
|
|
|
@ -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"] }
|
||||||
|
|
|
@ -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(|xrd| {
|
.filter_map(|role| {
|
||||||
if let Ok(dev) = monado.device_from_role(xrd.to_monado_str()) {
|
if let Ok(index) = monado.device_index_from_role(role) {
|
||||||
devs_with_role.push(dev.id);
|
Some((index, XRDeviceRole::from(role)))
|
||||||
Some(Self {
|
} else {
|
||||||
|
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),
|
||||||
})
|
})
|
||||||
|
.collect()
|
||||||
} else {
|
} else {
|
||||||
None
|
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue