diff --git a/wlx-overlay-s/src/subsystem/osc.rs b/wlx-overlay-s/src/subsystem/osc.rs index b578bf9..c73fe87 100644 --- a/wlx-overlay-s/src/subsystem/osc.rs +++ b/wlx-overlay-s/src/subsystem/osc.rs @@ -16,7 +16,7 @@ use crate::backend::input::TrackedDeviceRole; pub struct OscSender { last_sent_overlay: Instant, - last_sent_battery: Instant, + last_sent_device: Instant, upstream: UdpSocket, } @@ -35,7 +35,7 @@ impl OscSender { Ok(Self { upstream, last_sent_overlay: Instant::now(), - last_sent_battery: Instant::now(), + last_sent_device: Instant::now(), }) } @@ -55,24 +55,34 @@ impl OscSender { #[allow(clippy::too_many_lines)] pub fn send_params( &mut self, - overlays: &OverlayWindowManager, + overlay_manager: &OverlayWindowManager, devices: &Vec, ) -> anyhow::Result<()> where D: Default, { - // send overlay data every 0.1 seconds + // send overlay parameters every 0.1 seconds if self.last_sent_overlay.elapsed().as_millis() >= 100 { self.last_sent_overlay = Instant::now(); + let edit_mode = overlay_manager.get_edit_mode(); + let current_set = overlay_manager.get_current_set().unwrap_or(0) as i32; + let total_sets = overlay_manager.get_total_sets() as i32; + + // check state of each active overlay and count them let mut num_overlays = 0; let mut has_keyboard = false; let mut has_wrist = false; - - for o in overlays.values() { + for o in overlay_manager.values() { let Some(state) = o.config.active_state.as_ref() else { continue; }; + + // skip overlays that are fully transparent; e.g. the watch when not looking at it + if state.alpha <= 0f32 { + continue; + } + match o.config.name.as_ref() { WATCH_NAME => has_wrist = true, KEYBOARD_NAME => has_keyboard = true, @@ -84,6 +94,7 @@ impl OscSender { } } + // overlays self.send_message( "/avatar/parameters/isOverlayOpen".into(), vec![OscType::Bool(num_overlays > 0)], @@ -92,7 +103,34 @@ impl OscSender { "/avatar/parameters/ToggleWindows".into(), vec![OscType::Bool(num_overlays > 0)], )?; + self.send_message( + "/avatar/parameters/openOverlayCount".into(), + vec![OscType::Int(num_overlays)], + )?; + // working sets + self.send_message( + "/avatar/parameters/isEditModeActive".into(), + vec![OscType::Bool(edit_mode)], + )?; + self.send_message( + "/avatar/parameters/ToggleEditMode".into(), + vec![OscType::Bool(edit_mode)], + )?; + self.send_message( + "/avatar/parameters/currentWorkingSet".into(), + vec![OscType::Int(current_set)], + )?; + self.send_message( + "/avatar/parameters/CurrentProfile".into(), + vec![OscType::Int(current_set)], + )?; + self.send_message( + "/avatar/parameters/totalWorkingSets".into(), + vec![OscType::Int(total_sets)], + )?; + + // keyboard self.send_message( "/avatar/parameters/isKeyboardOpen".into(), vec![OscType::Bool(has_keyboard)], @@ -102,19 +140,16 @@ impl OscSender { vec![OscType::Bool(has_keyboard)], )?; + // watch self.send_message( "/avatar/parameters/isWristVisible".into(), vec![OscType::Bool(has_wrist)], )?; - self.send_message( - "/avatar/parameters/openOverlayCount".into(), - vec![OscType::Int(num_overlays)], - )?; } - // send battery levels every 10 seconds - if self.last_sent_battery.elapsed().as_millis() >= 10000 { - self.last_sent_battery = Instant::now(); + // send device parameters every 10 seconds + if self.last_sent_device.elapsed().as_millis() >= 10000 { + self.last_sent_device = Instant::now(); let mut tracker_count: i8 = 0; let mut controller_count: i8 = 0; @@ -162,7 +197,7 @@ impl OscSender { )?; } - // send average controller and tracker battery parameters + // send controller- and tracker-specific battery parameters self.send_message( String::from("/avatar/parameters/averageControllerBattery"), vec![OscType::Float( @@ -177,6 +212,10 @@ impl OscSender { String::from("/avatar/parameters/LowestBattery"), vec![OscType::Float(lowest_battery)], )?; + self.send_message( + String::from("/avatar/parameters/lowestBattery"), + vec![OscType::Float(lowest_battery)], + )?; } Ok(()) diff --git a/wlx-overlay-s/src/windowing/manager.rs b/wlx-overlay-s/src/windowing/manager.rs index cd52eb8..4674aeb 100644 --- a/wlx-overlay-s/src/windowing/manager.rs +++ b/wlx-overlay-s/src/windowing/manager.rs @@ -362,6 +362,14 @@ impl OverlayWindowManager { self.edit_mode } + pub const fn get_current_set(&self) -> Option { + self.current_set + } + + pub const fn get_total_sets(&self) -> usize { + self.sets.len() + } + pub fn set_edit_mode(&mut self, enabled: bool, app: &mut AppState) -> anyhow::Result<()> { let changed = enabled != self.edit_mode; self.edit_mode = enabled;