use async_timers::{OneshotTimer, PeriodicTimer};
use tokio::time::Duration;
#[tokio::main]
async fn main() {
let mut start_delay = OneshotTimer::expired();
let mut stop_delay = OneshotTimer::expired();
let mut periodic = PeriodicTimer::stopped();
let mut exit_loop_delay = OneshotTimer::scheduled(Duration::from_secs(10));
start_delay.schedule(Duration::from_secs(2));
println!("Periodic timer will start in 2 sec");
loop {
tokio::select! {
_ = start_delay.tick() => {
periodic.start(Duration::from_millis(500));
stop_delay.schedule(Duration::from_secs(3));
println!("Periodic timer will stop in 3 sec");
}
_ = stop_delay.tick() => {
periodic.stop();
exit_loop_delay.schedule(Duration::from_secs(3));
println!("Periodic timer stopped. Will exit in 3 sec");
}
_ = periodic.tick() => {
println!("Periodic tick!");
}
_ = exit_loop_delay.tick() => {
println!("Bye!");
break;
}
}
}
}