use crate::kind::Rs2DistortionModel;
use num_traits::FromPrimitive;
use realsense_sys as sys;
use std::{ffi::CString, time::Duration};
pub const DEFAULT_TIMEOUT: Duration = Duration::from_millis(sys::RS2_DEFAULT_TIMEOUT as u64);
pub(crate) fn from_path<P>(path: P) -> anyhow::Result<CString>
where
P: AsRef<std::path::Path>,
{
let mut buf = Vec::new();
#[cfg(unix)]
{
use std::os::unix::ffi::OsStrExt;
buf.extend(path.as_ref().as_os_str().as_bytes());
};
#[cfg(windows)]
{
use std::os::windows::ffi::OsStrExt;
buf.extend(
path.as_ref()
.as_os_str()
.encode_wide()
.chain(Some(0))
.map(|b| {
let b = b.to_ne_bytes();
b.get(0).copied().into_iter().chain(b.get(1).copied())
})
.flatten(),
);
};
Ok(CString::new(buf)?)
}
#[derive(Debug)]
pub struct Rs2MotionDeviceIntrinsics(pub sys::rs2_motion_device_intrinsic);
impl Rs2MotionDeviceIntrinsics {
pub fn data(&self) -> [[f32; 4usize]; 3usize] {
self.0.data
}
pub fn noise_variances(&self) -> [f32; 3usize] {
self.0.noise_variances
}
pub fn bias_variances(&self) -> [f32; 3usize] {
self.0.bias_variances
}
}
unsafe impl Send for Rs2MotionDeviceIntrinsics {}
#[derive(Debug)]
pub struct Rs2Distortion {
pub model: Rs2DistortionModel,
pub coeffs: [f32; 5usize],
}
unsafe impl Send for Rs2Distortion {}
#[derive(Debug)]
pub struct Rs2Intrinsics(pub sys::rs2_intrinsics);
impl Rs2Intrinsics {
pub fn width(&self) -> usize {
self.0.width as usize
}
pub fn height(&self) -> usize {
self.0.height as usize
}
pub fn ppx(&self) -> f32 {
self.0.ppx
}
pub fn ppy(&self) -> f32 {
self.0.ppy
}
pub fn fx(&self) -> f32 {
self.0.fx
}
pub fn fy(&self) -> f32 {
self.0.fy
}
pub fn distortion(&self) -> Rs2Distortion {
Rs2Distortion {
model: Rs2DistortionModel::from_i32(self.0.model as i32).unwrap(),
coeffs: self.0.coeffs,
}
}
}
unsafe impl Send for Rs2Intrinsics {}
#[derive(Debug)]
pub struct Rs2Extrinsics(pub sys::rs2_extrinsics);
impl Rs2Extrinsics {
pub fn rotation(&self) -> [f32; 9usize] {
self.0.rotation
}
pub fn translation(&self) -> [f32; 3usize] {
self.0.translation
}
}
unsafe impl Send for Rs2Extrinsics {}
#[derive(Debug, Clone)]
pub struct Rs2Roi {
pub min_x: i32,
pub min_y: i32,
pub max_x: i32,
pub max_y: i32,
}