#![no_main]
#![no_std]

use embedded_hal::digital::{self, InputPin, OutputPin};
use nrf52840_hal as hal;
use nrf52840_hal::gpio::Level;
use rtt_target::{rprintln, rtt_init_print};

#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
    cortex_m::interrupt::disable();
    rprintln!("{}", info);
    loop { cortex_m::asm::bkpt(); }
}

/// Blinks an LED on button press.
fn blink_led_on_button_press<E: digital::Error>(
    button: &mut impl InputPin<Error = E>,
    led: &mut impl OutputPin<Error = E>,
) -> Result<(), E> {
    if button.is_high()? {
        led.set_high()?;
    } else {
        led.set_low()?;
    }
    Ok(())
}

#[cortex_m_rt::entry]
fn main() -> ! {
    rtt_init_print!();
    let p = hal::pac::Peripherals::take().unwrap();
    let port0 = hal::gpio::p0::Parts::new(p.P0);
    let mut button = port0.p0_11.into_pullup_input();
    let mut led = port0.p0_13.into_push_pull_output(
                      Level::Low);

    rprintln!("GPIO example starting");
    loop {
        blink_led_on_button_press(&mut button,
            &mut led).expect(
            "Error in blink_led_on_button_press");
  }
}
