use core::ptr::{read_volatile, write_volatile};
#[derive(Clone, Copy)]
pub enum SleepMode {
IDLE,
ADC,
PD,
PS,
SBY,
ESBY,
}
#[repr(C, packed)]
pub struct Sleep {
pub smcr: u8,
}
impl Sleep {
pub unsafe fn new() -> &'static mut Sleep {
&mut *(0x53 as *mut Sleep)
}
pub fn enable(&mut self) {
let mut smcr = unsafe { read_volatile(&mut self.smcr) };
smcr = smcr | 0x01;
unsafe {
write_volatile(&mut self.smcr, smcr);
}
}
pub fn disable(&mut self) {
let mut smcr = unsafe { read_volatile(&mut self.smcr) };
smcr = smcr & 0xFE;
unsafe {
write_volatile(&mut self.smcr, smcr);
}
}
pub fn select_mode(&mut self, mode: SleepMode) {
self.enable(); let mut smcr = 0x0F;
match mode {
SleepMode::IDLE => {
smcr = smcr & 0xF1;
}
SleepMode::ADC => {
smcr = smcr & 0xF3;
}
SleepMode::PD => {
smcr = smcr & 0xF5;
}
SleepMode::PS => {
smcr = smcr & 0xF7;
}
SleepMode::SBY => {
smcr = smcr & 0xFD;
}
SleepMode::ESBY => {
smcr = smcr & 0xFF;
}
}
unsafe {
write_volatile(&mut self.smcr, smcr);
}
}
}