#![no_main]
#![no_std]
use core::cell::RefCell;
use core::ops::DerefMut;
use cortex_m::interrupt::{free, Mutex};
use embedded_hal::timer::CountDown;
use cortex_m_rt::entry;
use panic_rtt_target as _;
use rtt_target::{rprintln, rtt_init_print};
use bsp::hal;
use hal::pac;
use nrf52840_dk_bsp as bsp;
use pac::interrupt;
struct Blinky {
timer0: hal::Timer<pac::TIMER0, hal::timer::Periodic>,
timer1: hal::Timer<pac::TIMER1, hal::timer::Periodic>,
led1: bsp::Led,
led2: bsp::Led,
button2: bsp::Button,
led1_on: bool,
}
static BLINKY: Mutex<RefCell<Option<Blinky>>> = Mutex::new(RefCell::new(None));
#[entry]
fn main() -> ! {
rtt_init_print!();
rprintln!("Initialize");
rprintln!("Press button 2 to light up LED 2");
if let Some(nrf52) = bsp::Board::take() {
let mut timer0 = hal::Timer::new(nrf52.TIMER0);
timer0.enable_interrupt();
let mut timer0 = timer0.into_periodic();
timer0.start(1_000_000u32);
let mut timer1 = hal::Timer::new(nrf52.TIMER1);
timer1.enable_interrupt();
let mut timer1 = timer1.into_periodic();
timer1.start(50_000u32);
let mut led1 = nrf52.leds.led_1;
led1.disable();
let mut led2 = nrf52.leds.led_2;
led2.disable();
let _ = timer0.wait();
let _ = timer1.wait();
unsafe {
pac::NVIC::unmask(pac::Interrupt::TIMER0);
pac::NVIC::unmask(pac::Interrupt::TIMER1);
}
let blinky = Blinky {
timer0,
timer1,
led1,
led2,
button2: nrf52.buttons.button_2,
led1_on: false,
};
free(|cs| {
BLINKY.borrow(cs).replace(Some(blinky));
});
}
loop {}
}
#[interrupt]
fn TIMER0() {
free(|cs| {
if let Some(ref mut blinky) = BLINKY.borrow(cs).borrow_mut().deref_mut() {
let _ = blinky.timer0.wait();
if blinky.led1_on {
blinky.led1.enable();
} else {
blinky.led1.disable();
}
blinky.led1_on = !blinky.led1_on;
}
});
rprintln!("TIMER0");
}
#[interrupt]
fn TIMER1() {
free(|cs| {
if let Some(ref mut blinky) = BLINKY.borrow(cs).borrow_mut().deref_mut() {
let _ = blinky.timer1.wait();
if blinky.button2.is_pressed() {
blinky.led2.enable();
} else {
blinky.led2.disable();
}
}
});
}