#[derive(Debug, Copy, Clone, Default, PartialEq)]
pub struct Vec3 {
pub x: f32,
pub y: f32,
pub z: f32,
}
#[derive(Debug)]
pub struct Imu;
impl Imu {
pub fn begin(&mut self) -> bool {
unsafe { m5unified_sys::m5u_imu_begin() }
}
pub fn accel(&self) -> Option<Vec3> {
let (mut x, mut y, mut z) = (0.0, 0.0, 0.0);
let ok = unsafe { m5unified_sys::m5u_imu_get_accel(&mut x, &mut y, &mut z) };
ok.then_some(Vec3 { x, y, z })
}
pub fn gyro(&self) -> Option<Vec3> {
let (mut x, mut y, mut z) = (0.0, 0.0, 0.0);
let ok = unsafe { m5unified_sys::m5u_imu_get_gyro(&mut x, &mut y, &mut z) };
ok.then_some(Vec3 { x, y, z })
}
pub fn temperature_c(&self) -> Option<f32> {
let mut temp = 0.0;
let ok = unsafe { m5unified_sys::m5u_imu_get_temp_c(&mut temp) };
ok.then_some(temp)
}
pub fn is_enabled(&self) -> bool {
unsafe { m5unified_sys::m5u_imu_is_enabled() }
}
pub fn kind(&self) -> ImuKind {
ImuKind::Unknown(unsafe { m5unified_sys::m5u_imu_get_type() as i32 })
}
pub fn update(&mut self) -> bool {
unsafe { m5unified_sys::m5u_imu_update() }
}
pub fn data(&self) -> Option<ImuData> {
Some(ImuData {
accel: self.accel()?,
gyro: self.gyro()?,
temperature_c: self.temperature_c(),
})
}
pub fn load_offset_from_nvs(&mut self) -> bool {
unsafe { m5unified_sys::m5u_imu_load_offset_from_nvs() }
}
pub fn save_offset_to_nvs(&mut self) -> bool {
unsafe { m5unified_sys::m5u_imu_save_offset_to_nvs() }
}
pub fn offset_data(&self, index: i32) -> f32 {
unsafe { m5unified_sys::m5u_imu_get_offset_data(index) }
}
pub fn set_calibration(&mut self, x: f32, y: f32, z: f32) {
unsafe { m5unified_sys::m5u_imu_set_calibration(x, y, z) }
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ImuKind {
Unknown(i32),
}
#[derive(Debug, Copy, Clone, Default, PartialEq)]
pub struct ImuData {
pub accel: Vec3,
pub gyro: Vec3,
pub temperature_c: Option<f32>,
}