use std::sync::Arc;
use ddevmem::{register_map, DevMem};
use tokio::sync::Mutex;
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
}
}
#[tokio::main(flavor = "current_thread")]
async fn main() {
let tim1_mem = unsafe { DevMem::new(0x4000_0000, Some(256)).unwrap() };
let tim2_mem = unsafe { DevMem::new(0x4000_1000, Some(256)).unwrap() };
let mut tim1 = unsafe { TimerRegs::new(Arc::new(tim1_mem)).unwrap() };
let mut tim2 = unsafe { TimerRegs::new(Arc::new(tim2_mem)).unwrap() };
tim1.set_cr_enable(true);
tim1.set_cr_mode(TimerMode::FreeRun);
tim1.set_cnt(1000);
tim2.set_cr_enable(false);
tim2.set_cr_mode(TimerMode::External);
tim2.set_cnt(42);
let app = axum::Router::new().nest(
"/hw",
ddevmem::web::WebUi::new()
.add("timer1", Arc::new(Mutex::new(tim1)))
.add("timer2", Arc::new(Mutex::new(tim2)))
.build(),
);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
println!("Web UI at http://localhost:3000/hw/");
println!(" timer1 @ 0x4000_0000, timer2 @ 0x4000_1000");
axum::serve(listener, app).await.unwrap();
}