use tiny_led_matrix::DisplayTimer;
use crate::hal::timer::Instance;
pub struct MicrobitDisplayTimer<T: Instance>(T);
impl<T: Instance> MicrobitDisplayTimer<T> {
pub fn new(timer: T) -> MicrobitDisplayTimer<T> {
MicrobitDisplayTimer(timer)
}
pub fn free(self) -> T {
self.0
}
}
impl<T: Instance> DisplayTimer for MicrobitDisplayTimer<T> {
fn initialise_cycle(&mut self, ticks: u16) {
let timer0 = self.0.as_timer0();
timer0.tasks_stop.write(|w| unsafe { w.bits(1) });
timer0.tasks_clear.write(|w| unsafe { w.bits(1) });
timer0.bitmode.write(|w| w.bitmode()._16bit());
#[cfg(feature = "v1")]
let prescaler = 8;
#[cfg(feature = "v2")]
let prescaler = 7;
timer0.prescaler.write(|w| unsafe { w.bits(prescaler) });
timer0.cc[0].write(|w| unsafe { w.bits(ticks.into()) });
timer0.shorts.write(|w| w.compare0_clear().enabled());
timer0.intenset.write(|w| w.compare0().set());
timer0.tasks_start.write(|w| unsafe { w.bits(1) });
}
fn enable_secondary(&mut self) {
self.0.as_timer0().intenset.write(|w| w.compare1().set());
}
fn disable_secondary(&mut self) {
self.0
.as_timer0()
.intenclr
.write(|w| w.compare1().set_bit());
}
fn program_secondary(&mut self, ticks: u16) {
#[cfg(feature = "v1")]
self.0.as_timer0().cc[1].write(|w| unsafe { w.bits(ticks.into()) });
#[cfg(feature = "v2")]
self.0.as_timer0().cc[1].write(|w| unsafe { w.cc().bits(ticks.into()) });
}
fn check_primary(&mut self) -> bool {
let reg = &self.0.as_timer0().events_compare[0];
let fired = reg.read().bits() != 0;
if fired {
reg.reset();
}
fired
}
fn check_secondary(&mut self) -> bool {
let reg = &self.0.as_timer0().events_compare[1];
let fired = reg.read().bits() != 0;
if fired {
reg.reset();
}
fired
}
}