#![no_main]
#![no_std]

use embedded_hal::{delay::DelayNs};
use embedded_hal::pwm::{self, SetDutyCycle};
use nrf52840_hal::pwm::{PwmChannel, Channel};
use nrf52840_hal::time::U32Ext;
use nrf52840_hal as hal;
use nrf52840_hal::gpio::Level;
use rtt_target::{rprintln, rtt_init_print};

/// PWMを使って少しずつ明るくする
fn fade_in<E: pwm::Error>(
    delay: &mut impl DelayNs,
    pwm: &mut impl SetDutyCycle<Error = E>,
)
        -> Result<(), E> {
    let wait_time = 10u32;
    loop {
        for duty in 0..pwm.max_duty_cycle() {
            pwm.set_duty_cycle(duty)?;
            delay.delay_ms(wait_time);
        }
    }
}

#[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 pwm = hal::pwm::Pwm::new(p.PWM0);
    pwm.set_output_pin(
        Channel::C0,
        port0.p0_13.into_push_pull_output(
            Level::High).degrade(),
    );
    pwm.set_period(500u32.hz());
    let mut pwm_channel = PwmChannel::new(&pwm,
        Channel::C0);

    let mut timer = hal::Timer::new(p.TIMER0);

    rprintln!("PWM example starting");
    fade_in(&mut timer, &mut pwm_channel).expect(
        "Error in fade_in");
    loop {
        // Keep the main loop running
    }
}
