lsm6ds3tr/src/registers/wake_up_src.rs
2025-02-23 21:24:37 +01:00

71 lines
2.5 KiB
Rust

//! Wake up interrupt source register (r).
use heapless::Vec;
use crate::{IrqSource, RegisterAddress, RegisterBits};
/// Wake up interrupt source register (r).
#[derive(Default)]
pub struct WakeUpSrc {
/// Free-fall event detection status. Default: 0
/// (0: free-fall event not detected; 1: free-fall event detected)
pub free_fall_event: RegisterBits<1, 5>,
/// Sleep event status. Default value: 0
/// (0: sleep event not detected; 1: sleep event detected)
pub sleep_event: RegisterBits<1, 4>,
/// Wakeup event detection status. Default value: 0
/// (0: wakeup event not detected; 1: wakeup event detected.)
pub wake_up_event: RegisterBits<1, 3>,
/// Wakeup event detection status on X-axis. Default value: 0
/// (0: wakeup event on X-axis not detected; 1: wakeup event on X-axis detected)
pub wake_up_event_x: RegisterBits<1, 2>,
/// Wakeup event detection status on Y-axis. Default value: 0
/// (0: wakeup event on Y-axis not detected; 1: wakeup event on Y-axis detected)
pub wake_up_event_y: RegisterBits<1, 1>,
/// Wakeup event detection status on Z-axis. Default value: 0
/// (0: wakeup event on Z-axis not detected; 1: wakeup event on Z-axis detected)
pub wake_up_event_z: RegisterBits<1, 0>,
}
impl WakeUpSrc {
pub fn address(&self) -> u8 {
RegisterAddress::WAKE_UP_SRC.address()
}
pub fn get_irq_sources(&self) -> Vec<IrqSource, 6> {
let mut v = Vec::new();
if self.free_fall_event.value() != 0 {
v.push(IrqSource::FreeFall).unwrap();
}
if self.sleep_event.value() != 0 {
v.push(IrqSource::Sleep).unwrap();
}
if self.wake_up_event.value() != 0 {
v.push(IrqSource::WakeUp).unwrap();
}
if self.wake_up_event_x.value() != 0 {
v.push(IrqSource::WakeUpOnX).unwrap();
}
if self.wake_up_event_y.value() != 0 {
v.push(IrqSource::WakeUpOnY).unwrap();
}
if self.wake_up_event_z.value() != 0 {
v.push(IrqSource::WakeUpOnZ).unwrap();
}
v
}
}
impl From<u8> for WakeUpSrc {
fn from(value: u8) -> Self {
let mut s = Self::default();
s.free_fall_event.set_from_reg(value);
s.sleep_event.set_from_reg(value);
s.wake_up_event.set_from_reg(value);
s.wake_up_event_x.set_from_reg(value);
s.wake_up_event_y.set_from_reg(value);
s.wake_up_event_z.set_from_reg(value);
s
}
}