use nrf51_hal::hi_res_timer::{As16BitTimer, HiResTimer, Nrf51Timer, TimerCc, TimerFrequency};
use tiny_led_matrix::DisplayTimer;
pub(crate) struct MicrobitDisplayTimer<T: Nrf51Timer>(HiResTimer<T, u16>);
impl<T: As16BitTimer> MicrobitDisplayTimer<T> {
pub fn new(timer: T) -> MicrobitDisplayTimer<T> {
MicrobitDisplayTimer(timer.as_16bit_timer())
}
pub fn free(self) -> T {
self.0.free()
}
}
impl<T: Nrf51Timer> DisplayTimer for MicrobitDisplayTimer<T> {
fn initialise_cycle(&mut self, ticks: u16) {
self.0.set_frequency(TimerFrequency::Freq62500Hz);
self.0.set_compare_register(TimerCc::CC0, ticks);
self.0.enable_auto_clear(TimerCc::CC0);
self.0.enable_compare_interrupt(TimerCc::CC0);
self.0.start();
}
fn enable_secondary(&mut self) {
self.0.enable_compare_interrupt(TimerCc::CC1);
}
fn disable_secondary(&mut self) {
self.0.disable_compare_interrupt(TimerCc::CC1);
}
fn program_secondary(&mut self, ticks: u16) {
self.0.set_compare_register(TimerCc::CC1, ticks);
}
fn check_primary(&mut self) -> bool {
self.0.poll_compare_event(TimerCc::CC0)
}
fn check_secondary(&mut self) -> bool {
self.0.poll_compare_event(TimerCc::CC1)
}
}