azure_kinect/
imu.rs

1use crate::*;
2use azure_kinect_sys::k4a::*;
3use std::fmt::{Display, Formatter};
4
5pub struct ImuSample {
6    pub(crate) value: k4a_imu_sample_t,
7}
8
9impl ImuSample {
10    pub(crate) fn from_native(value: k4a_imu_sample_t) -> ImuSample {
11        ImuSample { value }
12    }
13
14    #[doc = "< Temperature reading of this sample (Celsius)."]
15    pub fn temperature(&self) -> f32 {
16        self.value.temperature
17    }
18    #[doc = "< Accelerometer sample in meters per second squared."]
19    pub fn acc_sample(&self) -> Float3 {
20        Float3::from_native(self.value.acc_sample)
21    }
22    #[doc = "< Timestamp of the accelerometer in microseconds."]
23    pub fn acc_timestamp_usec(&self) -> u64 {
24        self.value.acc_timestamp_usec
25    }
26    #[doc = "< Gyro sample in radians per second."]
27    pub fn gyro_sample(&self) -> Float3 {
28        Float3::from_native(self.value.gyro_sample)
29    }
30    #[doc = "< Timestamp of the gyroscope in microseconds"]
31    pub fn gyro_timestamp_usec(&self) -> u64 {
32        self.value.gyro_timestamp_usec
33    }
34}
35
36impl Display for ImuSample {
37    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
38        write!(f,
39               "temperature: {}, acc_sample: {}, acc_timestamp_usec: {}, gyro_sample: {} gyro_timestamp_usec: {}",
40               self.temperature(),
41               self.acc_sample(),
42               self.acc_timestamp_usec(),
43               self.gyro_sample(),
44               self.gyro_timestamp_usec())
45    }
46}
47
48pub struct Imu<'a> {
49    device: &'a Device<'a>,
50}
51
52impl<'a> Imu<'a> {
53    pub(crate) fn new(device: &'a Device<'a>) -> Result<Imu<'a>, Error> {
54        Error::from_k4a_result_t(unsafe { (device.api.funcs.k4a_device_start_imu)(device.handle) })
55            .to_result(())?;
56        Ok(Imu { device })
57    }
58
59    /// Reads an IMU sample.  Returns true if a sample was read, false if the read timed out.
60    pub fn get_imu_sample(&self, timeout_in_ms: i32) -> Result<ImuSample, Error> {
61        let mut imu_sample = k4a_imu_sample_t::default();
62        Error::from_k4a_wait_result_t(unsafe {
63            (self.device.api.funcs.k4a_device_get_imu_sample)(
64                self.device.handle,
65                &mut imu_sample,
66                timeout_in_ms,
67            )
68        })
69        .to_result(ImuSample::from_native(imu_sample))
70    }
71
72    pub fn get_imu_sample_wait_infinite(&self) -> Result<ImuSample, Error> {
73        self.get_imu_sample(azure_kinect_sys::k4a::K4A_WAIT_INFINITE)
74    }
75}
76
77impl Drop for Imu<'_> {
78    fn drop(&mut self) {
79        unsafe { (self.device.api.funcs.k4a_device_stop_imu)(self.device.handle) }
80    }
81}