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 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}