|
@@ -66,178 +66,58 @@ static TUBE_MAPPING: PwmOutputMap = {
|
|
|
driver: [
|
|
|
PwmDriver {
|
|
|
digit: [
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 8,
|
|
|
- }, // Tube 0 Digit 0
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 9,
|
|
|
- }, // Tube 0 Digit 1
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 10,
|
|
|
- }, // Tube 0 Digit 2
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 12,
|
|
|
- }, // Tube 0 Digit 3
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 15,
|
|
|
- }, // Tube 0 Digit 4
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 14,
|
|
|
- }, // Tube 0 Digit 5
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 11,
|
|
|
- }, // Tube 0 Digit 6
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 0,
|
|
|
- }, // Tube 0 Digit 7
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 1,
|
|
|
- }, // Tube 0 Digit 8
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 13,
|
|
|
- }, // Tube 0 Digit 9
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 8, }, // Tube 0 Digit 0
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 9, }, // Tube 0 Digit 1
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 10, }, // Tube 0 Digit 2
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 12, }, // Tube 0 Digit 3
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 15, }, // Tube 0 Digit 4
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 14, }, // Tube 0 Digit 5
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 11, }, // Tube 0 Digit 6
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 0, }, // Tube 0 Digit 7
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 1, }, // Tube 0 Digit 8
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 13, }, // Tube 0 Digit 9
|
|
|
],
|
|
|
},
|
|
|
PwmDriver {
|
|
|
digit: [
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 5,
|
|
|
- }, // Tube 1 Digit 0
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 6,
|
|
|
- }, // Tube 1 Digit 1
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 7,
|
|
|
- }, // Tube 1 Digit 2
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 2,
|
|
|
- }, // Tube 1 Digit 3
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 4,
|
|
|
- }, // Tube 1 Digit 4
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 1,
|
|
|
- }, // Tube 1 Digit 5
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 4,
|
|
|
- }, // Tube 1 Digit 6
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 2,
|
|
|
- }, // Tube 1 Digit 7
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 3,
|
|
|
- }, // Tube 1 Digit 8
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_1,
|
|
|
- pin: 3,
|
|
|
- }, // Tube 1 Digit 9
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 5, }, // Tube 1 Digit 0
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 6, }, // Tube 1 Digit 1
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 7, }, // Tube 1 Digit 2
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 2, }, // Tube 1 Digit 3
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 4, }, // Tube 1 Digit 4
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 1, }, // Tube 1 Digit 5
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 4, }, // Tube 1 Digit 6
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 2, }, // Tube 1 Digit 7
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 3, }, // Tube 1 Digit 8
|
|
|
+ DigitToPin { address: PCA9685_ADDR_1, pin: 3, }, // Tube 1 Digit 9
|
|
|
],
|
|
|
},
|
|
|
PwmDriver {
|
|
|
digit: [
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 8,
|
|
|
- }, // Tube 2 Digit 0
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 9,
|
|
|
- }, // Tube 2 Digit 1
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 10,
|
|
|
- }, // Tube 2 Digit 2
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 12,
|
|
|
- }, // Tube 2 Digit 3
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 12,
|
|
|
- }, // Tube 2 Digit 4
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 13,
|
|
|
- }, // Tube 2 Digit 5
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 11,
|
|
|
- }, // Tube 2 Digit 6
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 14,
|
|
|
- }, // Tube 2 Digit 7
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_2,
|
|
|
- pin: 11,
|
|
|
- }, // Tube 2 Digit 8
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 13,
|
|
|
- }, // Tube 2 Digit 9
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 8, }, // Tube 2 Digit 0
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 9, }, // Tube 2 Digit 1
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 10, }, // Tube 2 Digit 2
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 12, }, // Tube 2 Digit 3
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 12, }, // Tube 2 Digit 4
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 13, }, // Tube 2 Digit 5
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 11, }, // Tube 2 Digit 6
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 14, }, // Tube 2 Digit 7
|
|
|
+ DigitToPin { address: PCA9685_ADDR_2, pin: 11, }, // Tube 2 Digit 8
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 13, }, // Tube 2 Digit 9
|
|
|
],
|
|
|
},
|
|
|
PwmDriver {
|
|
|
digit: [
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 5,
|
|
|
- }, // Tube 3 Digit 0
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 6,
|
|
|
- }, // Tube 3 Digit 1
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 7,
|
|
|
- }, // Tube 3 Digit 2
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 2,
|
|
|
- }, // Tube 3 Digit 3
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 14,
|
|
|
- }, // Tube 3 Digit 4
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 15,
|
|
|
- }, // Tube 3 Digit 5
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 4,
|
|
|
- }, // Tube 3 Digit 6
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 1,
|
|
|
- }, // Tube 3 Digit 7
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 0,
|
|
|
- }, // Tube 3 Digit 8
|
|
|
- DigitToPin {
|
|
|
- address: PCA9685_ADDR_3,
|
|
|
- pin: 3,
|
|
|
- }, // Tube 3 Digit 9
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 5, }, // Tube 3 Digit 0
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 6, }, // Tube 3 Digit 1
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 7, }, // Tube 3 Digit 2
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 2, }, // Tube 3 Digit 3
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 14, }, // Tube 3 Digit 4
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 15, }, // Tube 3 Digit 5
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 4, }, // Tube 3 Digit 6
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 1, }, // Tube 3 Digit 7
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 0, }, // Tube 3 Digit 8
|
|
|
+ DigitToPin { address: PCA9685_ADDR_3, pin: 3, }, // Tube 3 Digit 9
|
|
|
],
|
|
|
},
|
|
|
],
|
|
@@ -298,12 +178,7 @@ impl Tube {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- fn fade_in_out_digit(
|
|
|
- &mut self,
|
|
|
- digit: Option<u32>,
|
|
|
- fade_duration: u32,
|
|
|
- cycle_cmd: bool,
|
|
|
- ) {
|
|
|
+ fn fade_in_out_digit(&mut self, digit: Option<u32>, fade_duration: u32, cycle_cmd: bool) {
|
|
|
// If the tube is in the middle of a cycle sequence and a call comes
|
|
|
// in to update the tube digit (for time), override the last value of
|
|
|
// the cycle sequence with the new digit.
|
|
@@ -357,7 +232,10 @@ impl Clock {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Sets a new time to be displayed
|
|
|
pub fn rtc_tick(&mut self, second: u32, minute: u32, hour: u32) {
|
|
|
+
|
|
|
+ // Update digit for each tube if value has changed
|
|
|
match self.hour {
|
|
|
Some(prev_hour) if prev_hour / 10 == hour / 10 => {
|
|
|
if hour / 10 == 0 {
|
|
@@ -399,6 +277,7 @@ impl Clock {
|
|
|
minute % 10
|
|
|
);
|
|
|
|
|
|
+ // Set fade direction for dot
|
|
|
self.dot.state = match second % 2 {
|
|
|
0 => State::Incrementing,
|
|
|
1 => State::Decrementing,
|
|
@@ -409,9 +288,11 @@ impl Clock {
|
|
|
#[cfg(test)]
|
|
|
println!("RTC tick: dot state is {:?}", self.dot.state);
|
|
|
|
|
|
+ // Store the last set value for the next update
|
|
|
self.hour = Some(hour);
|
|
|
self.minute = Some(minute);
|
|
|
|
|
|
+ // Start the display refresh timer to update the display
|
|
|
#[cfg(not(test))]
|
|
|
free(|cs| {
|
|
|
let mut timer_ref = super::FPS_TIMER.borrow(cs).borrow_mut();
|
|
@@ -421,6 +302,8 @@ impl Clock {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ // Updates the display with values due to fade in/out
|
|
|
+ // Returns true if values have changed
|
|
|
pub fn fps_tick(&mut self) -> bool {
|
|
|
let mut pending_refresh: bool = false;
|
|
|
|
|
@@ -435,7 +318,7 @@ impl Clock {
|
|
|
digit.updated = true;
|
|
|
pending_refresh = true;
|
|
|
}
|
|
|
- },
|
|
|
+ }
|
|
|
State::Decrementing => {
|
|
|
if digit.value <= min {
|
|
|
digit.value = min;
|
|
@@ -445,19 +328,18 @@ impl Clock {
|
|
|
digit.updated = true;
|
|
|
pending_refresh = true;
|
|
|
}
|
|
|
- },
|
|
|
+ }
|
|
|
State::Idle => {
|
|
|
digit.fade_duration = None;
|
|
|
- },
|
|
|
+ }
|
|
|
};
|
|
|
};
|
|
|
|
|
|
#[cfg(not(test))]
|
|
|
self.tubes.iter_mut().for_each(|tube| {
|
|
|
tube.digits.iter_mut().for_each(|digit| {
|
|
|
-
|
|
|
if let Some(fade_duration) = digit.fade_duration {
|
|
|
- let ticks = fade_duration * 1000 / (1000 / DISPLAY_REFRESH_FPS * 1000);
|
|
|
+ let ticks = fade_duration * 1000 / (1000 / DISPLAY_REFRESH_FPS * 1000);
|
|
|
let steps = ((DIGIT_MAX_BRIGHTNESS - DIGIT_MIN_BRIGHTNESS) + ticks - 1) / ticks;
|
|
|
update_fn(digit, DIGIT_MIN_BRIGHTNESS, DIGIT_MAX_BRIGHTNESS, steps);
|
|
|
}
|
|
@@ -467,9 +349,8 @@ impl Clock {
|
|
|
#[cfg(test)]
|
|
|
for (t, tube) in self.tubes.iter_mut().enumerate() {
|
|
|
for (d, digit) in tube.digits.iter_mut().enumerate() {
|
|
|
-
|
|
|
if let Some(fade_duration) = digit.fade_duration {
|
|
|
- let ticks = fade_duration * 1000 / (1000 / DISPLAY_REFRESH_FPS * 1000);
|
|
|
+ let ticks = fade_duration * 1000 / (1000 / DISPLAY_REFRESH_FPS * 1000);
|
|
|
let steps = ((DIGIT_MAX_BRIGHTNESS - DIGIT_MIN_BRIGHTNESS) + ticks - 1) / ticks;
|
|
|
update_fn(digit, DIGIT_MIN_BRIGHTNESS, DIGIT_MAX_BRIGHTNESS, steps);
|
|
|
}
|
|
@@ -483,9 +364,9 @@ impl Clock {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Handle dot
|
|
|
+ // Update dot values
|
|
|
if let Some(fade_duration) = self.dot.fade_duration {
|
|
|
- let ticks = fade_duration * 1000 / (1000 / DISPLAY_REFRESH_FPS * 1000);
|
|
|
+ let ticks = fade_duration * 1000 / (1000 / DISPLAY_REFRESH_FPS * 1000);
|
|
|
let steps = ((DOT_MAX_BRIGHTNESS - DOT_MIN_BRIGHTNESS) + ticks - 1) / ticks;
|
|
|
update_fn(&mut self.dot, DOT_MIN_BRIGHTNESS, DOT_MAX_BRIGHTNESS, steps);
|
|
|
}
|
|
@@ -495,6 +376,7 @@ impl Clock {
|
|
|
println!("Refresh tick: updated dot to value {}", self.dot.value);
|
|
|
}
|
|
|
|
|
|
+ // Compute actual PWM values if display values have changed
|
|
|
if pending_refresh {
|
|
|
self.distribute_pwm();
|
|
|
}
|
|
@@ -502,12 +384,13 @@ impl Clock {
|
|
|
pending_refresh
|
|
|
}
|
|
|
|
|
|
+ // Updates the digit displayed during a cycle sequence
|
|
|
+ // Returns true if the cycle sequence has completed
|
|
|
pub fn cycle_tick(&mut self) -> bool {
|
|
|
let mut cycle_ended = true;
|
|
|
|
|
|
self.tubes.iter_mut().for_each(|tube| {
|
|
|
if let Some(cycle) = tube.cycle.as_mut() {
|
|
|
-
|
|
|
#[cfg(test)]
|
|
|
println!("Cycle tick: iteration {}", cycle.iteration);
|
|
|
|
|
@@ -537,6 +420,7 @@ impl Clock {
|
|
|
cycle_ended
|
|
|
}
|
|
|
|
|
|
+ // Writes updated PWM values to each PCA9685
|
|
|
pub fn write_i2c<T>(&mut self, i2c: &mut T)
|
|
|
where
|
|
|
T: _embedded_hal_blocking_i2c_WriteRead
|
|
@@ -652,20 +536,19 @@ impl Clock {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// Periodically called to update the display with a new time
|
|
|
pub fn rtc_interrupt<T>(i2c: &mut T)
|
|
|
where
|
|
|
T: _embedded_hal_blocking_i2c_WriteRead
|
|
|
+ _embedded_hal_blocking_i2c_Read
|
|
|
+ _embedded_hal_blocking_i2c_Write,
|
|
|
{
|
|
|
+ // 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);
|
|
|
|
|
|
- let hour = if ds3231::in_dst(weekday, day, month, hour) {
|
|
|
- (hour + 1) % 12
|
|
|
- } else {
|
|
|
- hour % 12
|
|
|
- };
|
|
|
+ // 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 };
|
|
|
|
|
|
free(|cs| {
|
|
@@ -675,8 +558,7 @@ where
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-// This function is called by an interrupt that is triggered every
|
|
|
-// DISPLAY_REFRESH_FPS to update the display with a new brightness value.
|
|
|
+// Periodically called to trigger a display refresh
|
|
|
pub fn fps_interrupt<T>(i2c: &mut T)
|
|
|
where
|
|
|
T: _embedded_hal_blocking_i2c_WriteRead
|
|
@@ -686,7 +568,11 @@ where
|
|
|
free(|cs| {
|
|
|
let mut clock_ref = CLOCK.borrow(cs).borrow_mut();
|
|
|
let clock = clock_ref.deref_mut();
|
|
|
+
|
|
|
+ // Compute updates for non-static digits
|
|
|
let updated = clock.fps_tick();
|
|
|
+
|
|
|
+ // Write new values if values have changed, otherwise disable the refresh timer
|
|
|
if updated {
|
|
|
clock.write_i2c(i2c);
|
|
|
free(|cs| {
|
|
@@ -706,29 +592,18 @@ where
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-// This function is called by an interrupt that is triggered every
|
|
|
-// DIGIT_CYCLE_FADE_DURATION_HZ to update the digit being refreshed.
|
|
|
-pub fn cycle_interrupt() {
|
|
|
+// Periodically called during a cycle sequence to increment through digits
|
|
|
+// Returns true if the cycle sequence has completed
|
|
|
+pub fn cycle_interrupt() -> bool {
|
|
|
free(|cs| {
|
|
|
let mut clock_ref = CLOCK.borrow(cs).borrow_mut();
|
|
|
let clock = clock_ref.deref_mut();
|
|
|
|
|
|
- let cycle_ended = clock.cycle_tick();
|
|
|
- free(|cs| {
|
|
|
- let mut cycle_timer_ref = super::CYCLE_TIMER.borrow(cs).borrow_mut();
|
|
|
- if let Some(ref mut cycle_timer) = cycle_timer_ref.deref_mut() {
|
|
|
- if cycle_ended {
|
|
|
- cycle_timer.unlisten(Event::TimeOut);
|
|
|
- } else {
|
|
|
- cycle_timer.clear_interrupt(Event::TimeOut);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- });
|
|
|
+ clock.cycle_tick()
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
-// This function is called to start cycling through all digits for a
|
|
|
-// tube to prevent damage to the nixie tube due to cathode poisoning.
|
|
|
+// Start cycling sequence for the given tube to prevent long term damage from cathode poisoning
|
|
|
pub fn cycle_start(tube: usize) {
|
|
|
free(|cs| {
|
|
|
let mut clock_ref = CLOCK.borrow(cs).borrow_mut();
|
|
@@ -742,7 +617,7 @@ pub fn cycle_start(tube: usize) {
|
|
|
});
|
|
|
});
|
|
|
|
|
|
- // Start the timer to cycle through all digits
|
|
|
+ // Start the timer to cycle through individual digits
|
|
|
free(|cs| {
|
|
|
let mut cycle_timer_ref = super::CYCLE_TIMER.borrow(cs).borrow_mut();
|
|
|
if let Some(ref mut cycle_timer) = cycle_timer_ref.deref_mut() {
|
|
@@ -760,14 +635,18 @@ mod test {
|
|
|
fn pwm_calc_test() {
|
|
|
let mut clock: Clock = Clock::default();
|
|
|
|
|
|
+ // Initialize clock to arbitrary time
|
|
|
clock.rtc_tick(10, 23, 12);
|
|
|
|
|
|
- for tick in 0..1005 {
|
|
|
+ // Iterate and print output values for each display refresh tick
|
|
|
+ for tick in 0..1000 {
|
|
|
println!("\nRefresh tick: {}", tick);
|
|
|
if !clock.fps_tick() {
|
|
|
println!("Refresh halted");
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ // Reset the updated field for each digit
|
|
|
clock.tubes.iter_mut().for_each(|tube| {
|
|
|
tube.digits.iter_mut().for_each(|digit| {
|
|
|
digit.updated = false;
|
|
@@ -781,6 +660,10 @@ mod test {
|
|
|
fn cycle_test() {
|
|
|
let mut clock: Clock = Clock::default();
|
|
|
|
|
|
+ // Initialize clock to arbitrary time
|
|
|
+ clock.rtc_tick(10, 23, 12);
|
|
|
+
|
|
|
+ // Simulate a cycle refresh sequence on tube 0
|
|
|
clock.tubes[0].cycle = Some(CycleSettings {
|
|
|
last_digit: clock.tubes[0].last_digit,
|
|
|
next_digit: 0,
|
|
@@ -788,8 +671,7 @@ mod test {
|
|
|
last_fade_duration: DIGIT_FADE_DURATION_MS,
|
|
|
});
|
|
|
|
|
|
- clock.rtc_tick(10, 23, 12);
|
|
|
-
|
|
|
+ // Iterate and print debug values for each cycle
|
|
|
for cycle in 0..1000 {
|
|
|
println!("\nCycle tick: {}", cycle);
|
|
|
if clock.cycle_tick() {
|
|
@@ -797,12 +679,15 @@ mod test {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- for tick in 0..1005 {
|
|
|
+ // Iterate and print output values for each display refresh tick
|
|
|
+ for tick in 0..1000 {
|
|
|
println!("\nRefresh tick: {}", tick);
|
|
|
if !clock.fps_tick() {
|
|
|
println!("Refresh halted");
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ // Reset the updated field for each digit
|
|
|
clock.tubes.iter_mut().for_each(|tube| {
|
|
|
tube.digits.iter_mut().for_each(|digit| {
|
|
|
digit.updated = false;
|