blob: 2f7028c6a5e06cda957998852afac4f883e02838 [file] [log] [blame]
#![no_std]
/// Hardware regression tests.
/// Need P0.03 and P0.04 to be connected (on a nrf52-dk).
extern crate alloc;
use alloc::string::String;
use core::fmt::Write;
use futures::future;
use libtock::console::Console;
use libtock::gpio::GpioRead;
use libtock::gpio::GpioState;
use libtock::gpio::GpioWrite;
use libtock::gpio::ResistorMode;
use libtock::result::TockResult;
use libtock::timer::DriverContext;
use libtock::timer::Duration;
static mut STATIC: usize = 0;
trait MyTrait {
fn do_something_with_a_console(&self, console: &mut Console);
}
impl MyTrait for usize {
fn do_something_with_a_console(&self, console: &mut Console) {
writeln!(console, "trait_obj_value_usize = {}", &self).unwrap();
}
}
impl MyTrait for String {
fn do_something_with_a_console(&self, console: &mut Console) {
writeln!(console, "trait_obj_value_string = {}", &self).unwrap();
}
}
#[libtock::main]
async fn main() -> TockResult<()> {
let mut drivers = libtock::retrieve_drivers()?;
let mut gpio_driver = drivers.gpio.init_driver()?;
let mut console = drivers.console.create_console();
let mut gpios = gpio_driver.gpios();
let mut pin_in = gpios.next().unwrap();
let pin_in = pin_in.enable_input(ResistorMode::PullDown)?;
let mut pin_out = gpios.next().unwrap();
let mut pin_out = pin_out.enable_output()?;
writeln!(console, "[test-results]")?;
test_heap(&mut console);
test_formatting(&mut console);
test_static_mut(&mut console);
test_gpio(&mut console, &pin_in, &mut pin_out);
test_trait_objects(&mut console, &pin_in, &mut pin_out)?;
test_callbacks_and_wait_forever(&mut console, &mut drivers.timer).await
}
fn test_heap(console: &mut Console) {
let mut string = String::from("heap_test = \"Heap ");
string.push_str("works.\"");
writeln!(console, "{}", string).unwrap();
}
fn test_formatting(console: &mut Console) {
writeln!(console, "formatting = {}", String::from("works")).unwrap();
}
/// needs P0.03 and P0.04 to be connected
/// Output order should be:
/// trait_obj_value_usize = 1
/// trait_obj_value_string = string
fn test_trait_objects(
console: &mut Console,
pin_in: &GpioRead,
pin_out: &mut GpioWrite,
) -> TockResult<()> {
pin_out.set_high()?;
let string = String::from("string");
let x = match pin_in.read()? {
GpioState::Low => &string as &dyn MyTrait,
GpioState::High => &1usize as &dyn MyTrait,
};
let y = match pin_in.read()? {
GpioState::Low => &1usize as &dyn MyTrait,
GpioState::High => &string as &dyn MyTrait,
};
x.do_something_with_a_console(console);
y.do_something_with_a_console(console);
Ok(())
}
fn test_static_mut(console: &mut Console) {
increment_static_mut();
writeln!(console, "should_be_one = {}", unsafe { STATIC }).unwrap();
}
/// needs P0.03 and P0.04 to be connected
fn test_gpio(console: &mut Console, pin_in: &GpioRead, pin_out: &mut GpioWrite) {
pin_out.set_high().ok().unwrap();
writeln!(
console,
"gpio_works = {}",
pin_in.read().ok() == Some(GpioState::High)
)
.unwrap();
}
async fn test_callbacks_and_wait_forever(
console: &mut Console,
timer_context: &mut DriverContext,
) -> TockResult<()> {
let mut with_callback = timer_context.with_callback(|_, _| {
writeln!(console, "callbacks_work = true").unwrap();
writeln!(console, "all_tests_run = true").unwrap();
});
let mut timer = with_callback.init()?;
timer.set_alarm(Duration::from_ms(500))?;
future::pending().await
}
#[inline(never)]
fn increment_static_mut() {
unsafe { STATIC += 1 };
}