use std::sync::Arc;
use crate::camera::Camera;
use crate::discovery::{register_camera_discovery, DiscoveryRegistration};
use crate::port::VmbRuntime;
use crate::types::{CameraInfo, DiscoveryEvent};
use crate::Result;
pub struct VmbSystem<R: VmbRuntime> {
runtime: Arc<R>,
}
impl<R: VmbRuntime> VmbSystem<R> {
pub fn startup(runtime: R) -> Result<Self> {
let runtime = Arc::new(runtime);
runtime.startup()?;
Ok(Self { runtime })
}
pub fn runtime(&self) -> &R {
&self.runtime
}
pub fn list_cameras(&self) -> Result<Vec<CameraInfo>> {
self.runtime.list_cameras()
}
pub fn open_camera(&self, id: &str) -> Result<Camera<R>> {
Camera::open(self.runtime.clone(), id)
}
pub fn register_discovery<F>(&self, callback: F) -> Result<DiscoveryRegistration<R>>
where
F: Fn(DiscoveryEvent) + Send + Sync + 'static,
{
register_camera_discovery(self.runtime.clone(), callback)
}
}
impl<R: VmbRuntime> Drop for VmbSystem<R> {
fn drop(&mut self) {
self.runtime.shutdown();
}
}
impl<R: VmbRuntime> std::fmt::Debug for VmbSystem<R> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("VmbSystem").finish_non_exhaustive()
}
}