blob: 6b964a29aa0ec7996d24cf9eb0fbf688b5147176 [file] [log] [blame]
#![no_std]
use libtock::led;
use libtock::result::TockResult;
use libtock::rng;
use libtock::timer;
use libtock::timer::Duration;
#[libtock::main]
async fn main() -> TockResult<()> {
let context = timer::DriverContext::create()?;
let mut driver = context.create_timer_driver()?;
let timer_driver = driver.activate()?;
let num_leds = led::count()?;
// blink_nibble assumes 4 leds.
assert_eq!(num_leds, 4);
let mut buf = [0; 64];
loop {
rng::fill_buffer(&mut buf).await?;
for &x in buf.iter() {
blink_nibble(x)?;
timer_driver.sleep(Duration::from_ms(100)).await?;
blink_nibble(x >> 4)?;
timer_driver.sleep(Duration::from_ms(100)).await?;
}
}
}
// Takes the 4 least-significant bits of x, and turn the 4 leds on/off accordingly.
fn blink_nibble(x: u8) -> TockResult<()> {
for i in 0..4 {
let led = led::get(i).unwrap();
if (x >> i) & 1 != 0 {
led.on()?;
} else {
led.off()?;
}
}
Ok(())
}