#![no_std]
#![no_main]
use panic_halt as _;
use bsp::{pins::ButtonReader, pins::Keys, Pins};
use edgebadge as bsp;
#[rtic::app(device = bsp::pac, peripherals = true)]
mod app {
use super::*;
use bsp::clock::GenericClockController;
use bsp::gpio::{OpenDrain, Output, Pa23};
use bsp::prelude::*;
#[local]
struct Local {
red_led: Pa23<Output<OpenDrain>>,
timer: bsp::timer::TimerCounter3,
buttons: ButtonReader,
}
#[shared]
struct Shared {}
#[task(binds = TC3, local = [timer, red_led, buttons])]
fn tc3(c: tc3::Context) {
if c.local.timer.wait().is_ok() {
for event in c.local.buttons.events() {
match event {
Keys::SelectDown => {
c.local.red_led.set_high().ok();
}
Keys::SelectUp => {
c.local.red_led.set_low().ok();
}
_ => {}
}
}
}
}
#[init]
fn init(c: init::Context) -> (Shared, Local, init::Monotonics) {
let mut device = c.device;
let mut clocks = GenericClockController::with_internal_32kosc(
device.GCLK,
&mut device.MCLK,
&mut device.OSC32KCTRL,
&mut device.OSCCTRL,
&mut device.NVMCTRL,
);
let mut pins = Pins::new(device.PORT).split();
let gclk0 = clocks.gclk0();
let timer_clock = clocks.tc2_tc3(&gclk0).unwrap();
let mut tc3 = bsp::timer::TimerCounter::tc3_(&timer_clock, device.TC3, &mut device.MCLK);
tc3.start(200.hz());
tc3.enable_interrupt();
(
Shared {},
Local {
buttons: pins.buttons.init(&mut pins.port),
red_led: pins.led_pin.into_open_drain_output(&mut pins.port),
timer: tc3,
},
init::Monotonics(),
)
}
}