| #![no_std] |
| /** |
| * This example shows a repeated timer combined with reading and displaying the current time in |
| * clock ticks. |
| **/ |
| use core::fmt::Write; |
| use libtock::console::Console; |
| use libtock::result::TockResult; |
| use libtock::timer::DriverContext; |
| use libtock::timer::Duration; |
| |
| const DELAY_MS: usize = 500; |
| |
| #[libtock::main] |
| async fn main() -> TockResult<()> { |
| let mut drivers = libtock::retrieve_drivers()?; |
| |
| let mut console = drivers.console.create_console(); |
| |
| let mut previous_ticks = None; |
| |
| for i in 0.. { |
| print_now(&mut console, &mut drivers.timer, &mut previous_ticks, i)?; |
| let mut timer_driver = drivers.timer.create_timer_driver(); |
| let timer_driver = timer_driver.activate()?; |
| |
| timer_driver.sleep(Duration::from_ms(DELAY_MS)).await?; |
| } |
| |
| Ok(()) |
| } |
| |
| fn print_now( |
| console: &mut Console, |
| timer_context: &mut DriverContext, |
| previous_ticks: &mut Option<isize>, |
| i: usize, |
| ) -> TockResult<()> { |
| let mut timer_with_callback = timer_context.with_callback(|_, _| {}); |
| let timer = timer_with_callback.init()?; |
| let current_clock = timer.get_current_clock()?; |
| let ticks = current_clock.num_ticks(); |
| let frequency = timer.clock_frequency().hz(); |
| writeln!( |
| console, |
| "[{}] Waited roughly {}. Now is {} = {:#010x} ticks ({:?} ticks since last time at {} Hz)", |
| i, |
| PrettyTime::from_ms(i * DELAY_MS), |
| PrettyTime::from_ms(current_clock.ms_f64() as usize), |
| ticks, |
| previous_ticks.map(|previous| ticks - previous), |
| frequency |
| )?; |
| *previous_ticks = Some(ticks); |
| Ok(()) |
| } |
| |
| struct PrettyTime { |
| mins: usize, |
| secs: usize, |
| ms: usize, |
| } |
| |
| impl PrettyTime { |
| fn from_ms(ms: usize) -> PrettyTime { |
| PrettyTime { |
| ms: ms % 1000, |
| secs: (ms / 1000) % 60, |
| mins: ms / (60 * 1000), |
| } |
| } |
| } |
| |
| impl core::fmt::Display for PrettyTime { |
| fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
| if self.mins != 0 { |
| write!(f, "{}m", self.mins)? |
| } |
| write!(f, "{}.{:03}s", self.secs, self.ms) |
| } |
| } |