imix/
multi_timer_test.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Test the behavior of a single alarm.
6//! To add this test, include the line
7//! ```
8//!    multi_timer_test::run_multi_timer(alarm);
9//! ```
10//! to the imix boot sequence, where `alarm` is a
11//! `kernel::hil::Alarm`. The test sets up a series of
12//! timer of different durations and prints out when
13//! they fire.
14
15use kernel::debug;
16use kernel::hil::time::Timer;
17use kernel::static_init;
18
19use capsules_core::test::random_timer::TestRandomTimer;
20use capsules_core::virtualizers::virtual_timer::{MuxTimer, VirtualTimer};
21use sam4l::ast::Ast;
22
23pub unsafe fn run_multi_timer(mux: &'static MuxTimer<'static, Ast<'static>>) {
24    debug!("Starting multi timer test.");
25    let tests: [&'static TestRandomTimer<'static, VirtualTimer<'static, Ast<'static>>>; 3] =
26        static_init_multi_timer_test(mux);
27    tests[0].run();
28    tests[1].run();
29    tests[2].run();
30}
31
32unsafe fn static_init_multi_timer_test(
33    mux: &'static MuxTimer<'static, Ast<'static>>,
34) -> [&'static TestRandomTimer<'static, VirtualTimer<'static, Ast<'static>>>; 3] {
35    let virtual_timer1 = static_init!(VirtualTimer<'static, Ast<'static>>, VirtualTimer::new(mux));
36    virtual_timer1.setup();
37
38    let test1 = static_init!(
39        TestRandomTimer<'static, VirtualTimer<'static, Ast<'static>>>,
40        TestRandomTimer::new(virtual_timer1, 19, 'A')
41    );
42    virtual_timer1.set_timer_client(test1);
43
44    let virtual_timer2 = static_init!(VirtualTimer<'static, Ast<'static>>, VirtualTimer::new(mux));
45    virtual_timer2.setup();
46
47    let test2 = static_init!(
48        TestRandomTimer<'static, VirtualTimer<'static, Ast<'static>>>,
49        TestRandomTimer::new(virtual_timer2, 37, 'B')
50    );
51    virtual_timer2.set_timer_client(test2);
52
53    let virtual_timer3 = static_init!(VirtualTimer<'static, Ast<'static>>, VirtualTimer::new(mux));
54    virtual_timer3.setup();
55
56    let test3 = static_init!(
57        TestRandomTimer<'static, VirtualTimer<'static, Ast<'static>>>,
58        TestRandomTimer::new(virtual_timer3, 89, 'C')
59    );
60    virtual_timer3.set_timer_client(test3);
61    [&*test1, &*test2, &*test3]
62}