|
@@ -264,23 +264,29 @@ fn EXTI9_5() {
|
|
|
free(|cs| {
|
|
|
let mut rtc_int_ref = RTC_INT.borrow(cs).borrow_mut();
|
|
|
let mut i2c_int_ref = I2C.borrow(cs).borrow_mut();
|
|
|
+ let mut fps_timer_ref = FPS_TIMER.borrow(cs).borrow_mut();
|
|
|
let mut clock_ref = CLOCK.borrow(cs).borrow_mut();
|
|
|
if let Some(ref mut rtc_int) = rtc_int_ref.deref_mut() {
|
|
|
if let Some(ref mut i2c) = i2c_int_ref.deref_mut() {
|
|
|
- if rtc_int.check_interrupt() {
|
|
|
- // Read new time from DS3231
|
|
|
- let (second, minute, hour) = ds3231::get_time(DS3231_ADDR, i2c);
|
|
|
- let (weekday, day, month, _, _) = ds3231::get_date(DS3231_ADDR, i2c);
|
|
|
-
|
|
|
- // Calculate new values and account for DST
|
|
|
- let hour = if ds3231::in_dst(weekday, day, month, hour) { (hour + 1) % 12 } else { hour % 12 };
|
|
|
- let hour = if hour == 0 { 12 } else { hour };
|
|
|
-
|
|
|
- // Trigger the processing of a new time value
|
|
|
- clock_ref.deref_mut().rtc_tick(second, minute, hour);
|
|
|
-
|
|
|
- // Clear the interrupt flag for the timer
|
|
|
- rtc_int.clear_interrupt_pending_bit();
|
|
|
+ if let Some(ref mut fps_timer) = fps_timer_ref.deref_mut() {
|
|
|
+ if rtc_int.check_interrupt() {
|
|
|
+ // Read new time from DS3231
|
|
|
+ let (second, minute, hour) = ds3231::get_time(DS3231_ADDR, i2c);
|
|
|
+ let (weekday, day, month, _, _) = ds3231::get_date(DS3231_ADDR, i2c);
|
|
|
+
|
|
|
+ // Calculate new values and account for DST
|
|
|
+ let hour = if ds3231::in_dst(weekday, day, month, hour) { (hour + 1) % 12 } else { hour % 12 };
|
|
|
+ let hour = if hour == 0 { 12 } else { hour };
|
|
|
+
|
|
|
+ // Trigger the processing of a new time value
|
|
|
+ clock_ref.deref_mut().rtc_tick(second, minute, hour);
|
|
|
+
|
|
|
+ // Start the refresh timer to update the display
|
|
|
+ fps_timer.listen(Event::TimeOut);
|
|
|
+
|
|
|
+ // Clear the interrupt flag for the timer
|
|
|
+ rtc_int.clear_interrupt_pending_bit();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -306,19 +312,19 @@ fn EXTI3() {
|
|
|
fn TIM2() {
|
|
|
free(|cs| {
|
|
|
let mut i2c_int_ref = I2C.borrow(cs).borrow_mut();
|
|
|
- let mut timer_ref = FPS_TIMER.borrow(cs).borrow_mut();
|
|
|
+ let mut fps_timer_ref = FPS_TIMER.borrow(cs).borrow_mut();
|
|
|
let mut clock_ref = CLOCK.borrow(cs).borrow_mut();
|
|
|
if let Some(ref mut i2c) = i2c_int_ref.deref_mut() {
|
|
|
- if let Some(ref mut timer) = timer_ref.deref_mut() {
|
|
|
+ if let Some(ref mut fps_timer) = fps_timer_ref.deref_mut() {
|
|
|
// Compute updates for non-static digits
|
|
|
let updated = clock_ref.deref_mut().fps_tick();
|
|
|
|
|
|
// Write new values if values have changed, otherwise disable the refresh timer
|
|
|
if updated {
|
|
|
clock_ref.deref_mut().write_i2c(i2c);
|
|
|
- timer.clear_interrupt(Event::TimeOut);
|
|
|
+ fps_timer.clear_interrupt(Event::TimeOut);
|
|
|
} else {
|
|
|
- timer.unlisten(Event::TimeOut);
|
|
|
+ fps_timer.unlisten(Event::TimeOut);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -330,13 +336,19 @@ fn TIM2() {
|
|
|
fn TIM7() {
|
|
|
free(|cs| {
|
|
|
let mut cycle_timer_ref = CYCLE_TIMER.borrow(cs).borrow_mut();
|
|
|
+ let mut fps_timer_ref = FPS_TIMER.borrow(cs).borrow_mut();
|
|
|
let mut clock_ref = CLOCK.borrow(cs).borrow_mut();
|
|
|
if let Some(ref mut cycle_timer) = cycle_timer_ref.deref_mut() {
|
|
|
- // Trigger the next step in the cycling sequence
|
|
|
- if clock_ref.deref_mut().cycle_tick() {
|
|
|
- cycle_timer.unlisten(Event::TimeOut);
|
|
|
- } else {
|
|
|
- cycle_timer.clear_interrupt(Event::TimeOut);
|
|
|
+ if let Some(ref mut fps_timer) = fps_timer_ref.deref_mut() {
|
|
|
+ // Trigger the next step in the cycling sequence
|
|
|
+ if clock_ref.deref_mut().cycle_tick() {
|
|
|
+ cycle_timer.unlisten(Event::TimeOut);
|
|
|
+ } else {
|
|
|
+ cycle_timer.clear_interrupt(Event::TimeOut);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Start the refresh timer to update the display
|
|
|
+ fps_timer.listen(Event::TimeOut);
|
|
|
}
|
|
|
}
|
|
|
});
|