Guillaume Endignoux | f3879d2 | 2019-12-18 16:45:02 +0100 | [diff] [blame] | 1 | #![no_std] |
Alistair Francis | e5f74c3 | 2020-09-11 15:21:14 -0700 | [diff] [blame] | 2 | use libtock::println; |
Guillaume Endignoux | f3879d2 | 2019-12-18 16:45:02 +0100 | [diff] [blame] | 3 | /** |
| 4 | * This example shows a repeated timer combined with reading and displaying the current time in |
| 5 | * clock ticks. |
| 6 | **/ |
Guillaume Endignoux | f3879d2 | 2019-12-18 16:45:02 +0100 | [diff] [blame] | 7 | use libtock::result::TockResult; |
torfmaster | 86a9af5 | 2020-01-11 12:26:58 +0100 | [diff] [blame] | 8 | use libtock::timer::DriverContext; |
Guillaume Endignoux | f3879d2 | 2019-12-18 16:45:02 +0100 | [diff] [blame] | 9 | use libtock::timer::Duration; |
| 10 | |
Johnathan Van Why | 074fa7d | 2020-10-14 17:06:50 -0700 | [diff] [blame] | 11 | libtock_core::stack_size! {0x800} |
| 12 | |
Guillaume Endignoux | 6cbac75 | 2019-12-18 18:15:40 +0100 | [diff] [blame] | 13 | const DELAY_MS: usize = 500; |
| 14 | |
Guillaume Endignoux | f3879d2 | 2019-12-18 16:45:02 +0100 | [diff] [blame] | 15 | #[libtock::main] |
| 16 | async fn main() -> TockResult<()> { |
Woyten | b122620 | 2020-01-13 22:47:48 +0100 | [diff] [blame] | 17 | let mut drivers = libtock::retrieve_drivers()?; |
Woyten | 8d517b0 | 2020-01-13 20:58:20 +0100 | [diff] [blame] | 18 | |
Alistair Francis | e5f74c3 | 2020-09-11 15:21:14 -0700 | [diff] [blame] | 19 | drivers.console.create_console(); |
torfmaster | 86a9af5 | 2020-01-11 12:26:58 +0100 | [diff] [blame] | 20 | |
Guillaume Endignoux | dda9499 | 2019-12-18 16:53:12 +0100 | [diff] [blame] | 21 | let mut previous_ticks = None; |
| 22 | |
Guillaume Endignoux | f3879d2 | 2019-12-18 16:45:02 +0100 | [diff] [blame] | 23 | for i in 0.. { |
Alistair Francis | e5f74c3 | 2020-09-11 15:21:14 -0700 | [diff] [blame] | 24 | print_now(&mut drivers.timer, &mut previous_ticks, i)?; |
Woyten | b122620 | 2020-01-13 22:47:48 +0100 | [diff] [blame] | 25 | let mut timer_driver = drivers.timer.create_timer_driver(); |
| 26 | let timer_driver = timer_driver.activate()?; |
torfmaster | 86a9af5 | 2020-01-11 12:26:58 +0100 | [diff] [blame] | 27 | |
| 28 | timer_driver.sleep(Duration::from_ms(DELAY_MS)).await?; |
Guillaume Endignoux | 6cbac75 | 2019-12-18 18:15:40 +0100 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | Ok(()) |
| 32 | } |
| 33 | |
| 34 | fn print_now( |
torfmaster | 86a9af5 | 2020-01-11 12:26:58 +0100 | [diff] [blame] | 35 | timer_context: &mut DriverContext, |
Guillaume Endignoux | 6cbac75 | 2019-12-18 18:15:40 +0100 | [diff] [blame] | 36 | previous_ticks: &mut Option<isize>, |
| 37 | i: usize, |
| 38 | ) -> TockResult<()> { |
torfmaster | 86a9af5 | 2020-01-11 12:26:58 +0100 | [diff] [blame] | 39 | let mut timer_with_callback = timer_context.with_callback(|_, _| {}); |
Guillaume Endignoux | 6cbac75 | 2019-12-18 18:15:40 +0100 | [diff] [blame] | 40 | let timer = timer_with_callback.init()?; |
| 41 | let current_clock = timer.get_current_clock()?; |
| 42 | let ticks = current_clock.num_ticks(); |
| 43 | let frequency = timer.clock_frequency().hz(); |
Alistair Francis | e5f74c3 | 2020-09-11 15:21:14 -0700 | [diff] [blame] | 44 | println!( |
torfmaster | 86a9af5 | 2020-01-11 12:26:58 +0100 | [diff] [blame] | 45 | "[{}] Waited roughly {}. Now is {} = {:#010x} ticks ({:?} ticks since last time at {} Hz)", |
| 46 | i, |
| 47 | PrettyTime::from_ms(i * DELAY_MS), |
| 48 | PrettyTime::from_ms(current_clock.ms_f64() as usize), |
| 49 | ticks, |
| 50 | previous_ticks.map(|previous| ticks - previous), |
| 51 | frequency |
Alistair Francis | e5f74c3 | 2020-09-11 15:21:14 -0700 | [diff] [blame] | 52 | ); |
Guillaume Endignoux | 6cbac75 | 2019-12-18 18:15:40 +0100 | [diff] [blame] | 53 | *previous_ticks = Some(ticks); |
Guillaume Endignoux | f3879d2 | 2019-12-18 16:45:02 +0100 | [diff] [blame] | 54 | Ok(()) |
| 55 | } |
Guillaume Endignoux | 7798b1e | 2019-12-18 17:03:28 +0100 | [diff] [blame] | 56 | |
| 57 | struct PrettyTime { |
| 58 | mins: usize, |
| 59 | secs: usize, |
| 60 | ms: usize, |
| 61 | } |
| 62 | |
| 63 | impl PrettyTime { |
| 64 | fn from_ms(ms: usize) -> PrettyTime { |
| 65 | PrettyTime { |
| 66 | ms: ms % 1000, |
| 67 | secs: (ms / 1000) % 60, |
| 68 | mins: ms / (60 * 1000), |
| 69 | } |
| 70 | } |
| 71 | } |
| 72 | |
torfmaster | 86a9af5 | 2020-01-11 12:26:58 +0100 | [diff] [blame] | 73 | impl core::fmt::Display for PrettyTime { |
Guillaume Endignoux | 7798b1e | 2019-12-18 17:03:28 +0100 | [diff] [blame] | 74 | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
| 75 | if self.mins != 0 { |
| 76 | write!(f, "{}m", self.mins)? |
| 77 | } |
| 78 | write!(f, "{}.{:03}s", self.secs, self.ms) |
| 79 | } |
| 80 | } |