use std::sync::Arc;
use ddevmem::{register_map, DevMem};
register_map! {
pub unsafe map TimerRegs (u32) {
0x00 =>
rw cr: u32 {
enable: 0 as bool,
one_pulse: 1 as bool,
psc: 2..=5 as u8,
mode: 6..=7 as enum TimerMode {
Stopped = 0,
OneShot = 1,
FreeRun = 2,
External = 3,
},
},
0x04 =>
ro sr: u32 {
active: 0 as bool,
overflow: 1 as bool,
},
0x08 =>
rw cnt: u32
}
}
fn main() {
let devmem = unsafe { DevMem::new(0x0, Some(256)).unwrap() };
let mut timer = unsafe { TimerRegs::new(Arc::new(devmem)).unwrap() };
timer.set_cr_enable(true);
assert!(timer.cr_enable());
println!("enable = {}", timer.cr_enable());
timer.set_cr_one_pulse(false);
assert!(!timer.cr_one_pulse());
println!("one_pulse = {}", timer.cr_one_pulse());
timer.set_cr_psc(7);
assert_eq!(timer.cr_psc(), 7u8);
println!("psc = {}", timer.cr_psc());
timer.set_cr_mode(TimerMode::FreeRun);
assert_eq!(timer.cr_mode(), TimerMode::FreeRun);
println!("mode = {:?}", timer.cr_mode());
timer.set_cr_mode(TimerMode::External);
assert_eq!(timer.cr_mode(), TimerMode::External);
println!("mode = {:?}", timer.cr_mode());
println!("\nCR = 0x{:08X}", timer.cr());
assert_eq!(timer.cr(), 0xDD);
timer.set_cr(0);
assert_eq!(timer.cr_mode(), TimerMode::Stopped);
println!("mode after clear = {:?}", timer.cr_mode());
println!("\nAll assertions passed!");
}