blob: 6786ecdef4f08cfcde1d41248088eb4beb3df3f3 [file] [log] [blame]
#![no_std]
use libtock::led::LedDriver;
use libtock::result::TockResult;
use libtock::rng;
use libtock::timer::Duration;
use libtock::Hardware;
#[libtock::main]
async fn main() -> TockResult<()> {
let Hardware { timer_context, .. } = libtock::retrieve_hardware()?;
let mut driver = timer_context.create_timer_driver();
let timer_driver = driver.activate()?;
let Hardware { mut led_driver, .. } = libtock::retrieve_hardware()?;
let num_leds = led_driver.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, &mut led_driver)?;
timer_driver.sleep(Duration::from_ms(100)).await?;
blink_nibble(x >> 4, &mut led_driver)?;
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, led_driver: &mut LedDriver) -> TockResult<()> {
for i in 0..4 {
let mut led = led_driver.get(i).unwrap();
if (x >> i) & 1 != 0 {
led.on()?;
} else {
led.off()?;
}
}
Ok(())
}