//! BLE interface. #![no_std] #![no_main] mod logger; mod macros; mod rtc; use clint::HandlerArray; use core::mem; use cortex_m::asm::wfi; use cortex_m_rt::entry; use log::{info, trace, LevelFilter}; #[allow(unused_imports)] extern crate panic_semihosting; use nrf52840_mdk_bsp::{ hal::{ target::{interrupt, Interrupt, UARTE0}, Clocks, Rtc, }, Board, }; // TODO: // * set up serial reader for trinket // * set up i²c interface for keyboard reports // * and, finally, bluetooth // Interrupt handler table. static HANDLERS: HandlerArray = HandlerArray::new(); #[entry] fn main() -> ! { let nrf52 = Board::take().unwrap(); let uart_wrapped = logger::WriteWrapper::new(nrf52.cdc); let logger = logger::SerialLogger::new(uart_wrapped); let logger_ref: &'static logger::SerialLogger = unsafe { mem::transmute(&logger) }; log::set_logger(logger_ref).expect("setting logger"); log::set_max_level(LevelFilter::Trace); nrf52.RTC0.intenset.write(|w| w.tick().set()); let mut nvic = nrf52.NVIC; let mut rtc_handler = rtc::setup(Rtc::new(nrf52.RTC0), Clocks::new(nrf52.CLOCK)); logln_now!("logln_now?"); HANDLERS.with_overrides(|hs| { hs.register(0, &mut rtc_handler); nvic.enable(Interrupt::RTC0); info!("Bootstrap complete."); let mut last_tick = rtc::millis(); last_tick -= last_tick % 1024; loop { let tick = rtc::millis(); if tick >= last_tick + 1024 { last_tick = tick; last_tick -= last_tick % 1024; trace!("."); } wfi(); } }); unreachable!(); } // TODO: RTC0/1/2 exist. See which is best, if it matters. #[interrupt] fn RTC0() { HANDLERS.call(0); }