blob: cc6538aa7e7c692894a1539f094ec289f2e22f5a [file] [log] [blame] [edit]
/*
* Copyright 2021, Google LLC
*
* SPDX-License-Identifier: Apache-2.0
*/
#![no_std]
#![no_main]
use libcantrip::sdk_init;
use log::{error, info};
use sdk_interface::*;
#[no_mangle]
pub fn main() {
static mut HEAP: [u8; 4096] = [0; 4096];
sdk_init(unsafe { &mut HEAP });
info!(
"sdk_timer_cancel returned {:?} with nothing running",
sdk_timer_cancel(0)
);
info!("sdk_timer_poll returned {:?} with nothing running", sdk_timer_poll());
info!(
"sdk_timer_oneshot returned {:?} with an invalid timer id",
sdk_timer_oneshot(99, 100)
); // XXX need TIMERS_PER_CLIENT exported;
let _ = match sdk_timer_oneshot(0, 100) {
Ok(_) => {
info!("Timer 0 started");
match sdk_timer_wait() {
Ok(_) => info!("Timer 0 completed"),
Err(e) => error!("sdk_timer_wait failed: {:?}", e),
}
}
Err(e) => error!("sdk_timer_oneshot failed: {:?}", e),
};
const DURATION: TimerDuration = 75; // ms
if let Err(e) = sdk_timer_periodic(1, DURATION) {
error!("sdk_timer_periodic failed: {:?}", e);
} else {
info!("Timer 1 started");
let mut ms: TimerDuration = 0;
for _ in 0..10 {
let mask = sdk_timer_wait().unwrap();
if (mask & (1 << 1)) != 0 {
ms += DURATION;
}
let _ = info!("Timer completed: mask {:#06b} ms {}", mask, ms);
}
if let Err(e) = sdk_timer_cancel(1) {
error!("sdk_timer_cancel failed: {:?}", e);
}
let _ = info!("Timer 1 canceld");
}
if let Err(e) = sdk_timer_periodic(1, DURATION) {
error!("sdk_timer_periodic 1 failed: {:?}", e);
return;
}
let _ = sdk_log("Timer 1 started");
if let Err(e) = sdk_timer_periodic(2, 2 * DURATION) {
error!("sdk_timer_periodic 2 failed: {:?}", e);
return;
}
info!("Timer 2 started");
let mut expire_1 = 0;
let mut expire_2 = 0;
for _ in 0..21 {
let mask = sdk_timer_wait().unwrap();
if (mask & (1 << 1)) != 0 {
expire_1 += 1;
}
if (mask & (1 << 2)) != 0 {
expire_2 += 1;
}
info!(
"Timer completed: mask {:#06b} 1 {:#2} 2 {:#2}",
mask, expire_1, expire_2
);
}
if let Err(e) = sdk_timer_cancel(2) {
error!("sdk_timer_cancel 2 failed: {:?}", e);
}
info!("Timer 2 canceld");
if let Err(e) = sdk_timer_cancel(1) {
error!("sdk_timer_cancel 1 failed: {:?}", e);
}
info!("Timer 1 canceld");
info!("DONE!");
}