use crate::backend::realsense::realsense_cam::RealsenseCam;
use crate::data_types::pointcloud::PointCloud;
use std::fmt;
pub enum CamType {
RealsenseCam(DepthCam<RealsenseCam>),
}
pub struct DepthCam<T> {
cam: T,
id: u32,
}
impl fmt::Display for DepthCam<RealsenseCam> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Cam ID: {}", self.id)
}
}
pub trait Required<T> {
fn connect(id: u32) -> Result<DepthCam<T>, anyhow::Error>;
fn get_pointcloud(&mut self) -> Result<PointCloud, anyhow::Error>;
}
impl Required<RealsenseCam> for DepthCam<RealsenseCam> {
fn connect(id: u32) -> Result<DepthCam<RealsenseCam>, anyhow::Error> {
let realsense_cam = RealsenseCam::initialise_raw(id as usize)?;
Ok(DepthCam {
cam: realsense_cam,
id,
})
}
fn get_pointcloud(&mut self) -> Result<PointCloud, anyhow::Error> {
const MAX_RANGE: f32 = 2.0;
let pcl_info = self.cam.get_depth_pnts(MAX_RANGE)?;
PointCloud::create_from_iter(pcl_info)
}
}
impl DepthCam<RealsenseCam> {
pub fn connect_realsense(id: u32) -> Result<Self, anyhow::Error> {
DepthCam::connect(id)
}
}