diff options
Diffstat (limited to 'ble/src/main.rs')
-rw-r--r-- | ble/src/main.rs | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/ble/src/main.rs b/ble/src/main.rs index 8b8c513..6f167a5 100644 --- a/ble/src/main.rs +++ b/ble/src/main.rs @@ -1,39 +1,75 @@ //! BLE interface. + #![no_std] #![no_main] -use core::fmt::Write; +mod logger; +mod macros; +mod rtc; + +use clint::HandlerArray; +use core::mem; +use cortex_m::asm::wfi; use cortex_m_rt::entry; -use nb::block; +use log::{info, trace, LevelFilter}; #[allow(unused_imports)] extern crate panic_semihosting; use nrf52840_mdk_bsp::{ hal::{ - prelude::*, - timer::{self, Timer}, + 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 mut nrf52 = Board::take().unwrap(); + 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<UARTE0> = 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)); - let mut timer = Timer::new(nrf52.TIMER0); + logln_now!("logln_now?"); + HANDLERS.with_overrides(|hs| { + hs.register(0, &mut rtc_handler); + nvic.enable(Interrupt::RTC0); - write!(nrf52.cdc, "Bootstrap complete.").ok(); - loop { - write!(nrf52.cdc, ".").ok(); - delay(&mut timer, 1_000_000); // 1s - } + 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!(); } -fn delay<T>(timer: &mut Timer<T>, cycles: u32) -where - T: timer::Instance, -{ - timer.start(cycles); - let _ = block!(timer.wait()); +// TODO: RTC0/1/2 exist. See which is best, if it matters. +#[interrupt] +fn RTC0() { + HANDLERS.call(0); } |