diff --git a/crates/muninn-daemon/src/main.rs b/crates/muninn-daemon/src/main.rs index 0ce5e00..3239886 100644 --- a/crates/muninn-daemon/src/main.rs +++ b/crates/muninn-daemon/src/main.rs @@ -297,8 +297,7 @@ struct ActiveMoveMarkerCameraSource { frame_source: MoveMarkerFrameSource, sequence: u64, #[cfg(feature = "psmoveapi-tracker")] - psmoveapi_tracker: Option, - last_psmoveapi_calibration_at: Option, + psmoveapi_observations: Option>>, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -4236,19 +4235,14 @@ fn active_move_marker_camera_sources(options: &Options) -> Vec Some(tracker), - Err(error) => { - eprintln!("Muninn PSMoveAPI tracker failed camera={} path={}: {error}", source.camera_id, source.device_path.display()); - None - } - } + move_colors.clone(), + )) }) } else { None @@ -4276,8 +4270,7 @@ fn active_move_marker_camera_sources(options: &Options) -> Vec= Duration::from_secs(5)); - if calibration_due { - tracker.calibrate_connected(); - camera.last_psmoveapi_calibration_at = Some(Instant::now()); - } + if let Some(receiver) = camera.psmoveapi_observations.as_ref() { let observed_at = timestamp()?; - marker_candidates.extend(tracker.update().into_iter().map(|observation| { + let mut latest = None; + while let Ok(observations) = receiver.try_recv() { + latest = Some(observations); + } + marker_candidates.extend(latest.unwrap_or_default().into_iter().map(|observation| { let radius = observation.radius_px.max(0.0); MuninnMoveMarkerCandidateRecord { stream_id: frame_source.stream_id.clone(), @@ -4351,6 +4342,42 @@ fn publish_move_marker_camera_frames( Ok(()) } +#[cfg(feature = "psmoveapi-tracker")] +fn start_psmoveapi_tracker_worker( + camera_id: String, + camera_index: i32, + exposure: f32, + colors: Vec<(String, [u8; 3])>, +) -> mpsc::Receiver> { + let (sender, receiver) = mpsc::sync_channel(1); + thread::spawn(move || { + let mut tracker = match muninn_psmoveapi_tracker::PsmoveApiTracker::open( + camera_index, + exposure, + &colors, + ) { + Ok(tracker) => tracker, + Err(error) => { + eprintln!("Muninn PSMoveAPI tracker failed camera={camera_id} index={camera_index}: {error}"); + return; + } + }; + let mut last_calibration_at = Instant::now(); + loop { + if last_calibration_at.elapsed() >= Duration::from_secs(5) { + tracker.calibrate_connected(); + last_calibration_at = Instant::now(); + } + let observations = tracker.update(); + match sender.try_send(observations) { + Ok(()) | Err(mpsc::TrySendError::Full(_)) => {} + Err(mpsc::TrySendError::Disconnected(_)) => return, + } + } + }); + receiver +} + fn video_device_index(path: &Path) -> Option { path.file_name()?.to_str()?.strip_prefix("video")?.parse().ok() }