|
@@ -27,15 +27,14 @@ typedef struct {
|
|
|
bool RefreshActive;
|
|
|
} TUBE;
|
|
|
|
|
|
-TUBE Tube[NUM_TUBES] = {0}; // Active per-tube digit setting
|
|
|
+TUBE Tube[NUM_TUBES] = {0}; // Active per-tube configuration
|
|
|
|
|
|
ushort DotValue = PCA9685_Min_Brightness;
|
|
|
bool DotUpdated = false;
|
|
|
bool DotIncrement = true;
|
|
|
|
|
|
-Ticker StartupUpdateTicker, RuntimeUpdateTicker, RngUpdateTicker;
|
|
|
-int StartupTickerIter, RuntimeTickerIter, RngTickerIter;
|
|
|
-
|
|
|
+Ticker RuntimeUpdateTicker, RngUpdateTicker;
|
|
|
+int RuntimeTickerIter, RngTickerIter;
|
|
|
|
|
|
void RtcTickCallback(void) {
|
|
|
RtcTick = true;
|
|
@@ -52,21 +51,15 @@ void RngTickCallback(void) {
|
|
|
void RuntimeTickerUpdate(void) {
|
|
|
|
|
|
for (int i = 0; i < NUM_TUBES; i++) {
|
|
|
-
|
|
|
if(!Tube[i].RefreshActive) {
|
|
|
-
|
|
|
for (int j = 0; j < MAX_FADE_DIGITS; j++) {
|
|
|
-
|
|
|
DIGIT *digit = &Tube[i].Digits[j];
|
|
|
-
|
|
|
if (digit->Active) {
|
|
|
-
|
|
|
if (digit->Increment && digit->Reg < PCA9685_Max_Brightness) {
|
|
|
digit->Reg += FADE_TICK_STEP;
|
|
|
} else if (digit->Reg > PCA9685_Min_Brightness) {
|
|
|
digit->Reg -= FADE_TICK_STEP;
|
|
|
}
|
|
|
-
|
|
|
Tube[i].Updated = true;
|
|
|
}
|
|
|
}
|
|
@@ -148,11 +141,10 @@ int main() {
|
|
|
// Animate_Cycle_Fast();
|
|
|
// Animate_Cycle_Fast_Random();
|
|
|
|
|
|
+ // On every refresh tick, update the display with new values
|
|
|
if (RefreshTick) {
|
|
|
RefreshTick = false;
|
|
|
|
|
|
- // On refresh, update the display with new values
|
|
|
-
|
|
|
for (int i = 0; i < NUM_TUBES; i++) {
|
|
|
if (Tube[i].Updated) {
|
|
|
Tube[i].Updated = false;
|
|
@@ -175,82 +167,58 @@ int main() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // On every RTC tick, read and process the current time
|
|
|
if (RtcTick) {
|
|
|
RtcTick = false;
|
|
|
|
|
|
+ // Save the previous time to check if digit(s) has changed
|
|
|
prevMinute = nextMinute;
|
|
|
prevHour = nextHour;
|
|
|
|
|
|
DS3231_GetTime(&nextSecond, &nextMinute, &nextHour);
|
|
|
|
|
|
- if (startup) {
|
|
|
- startup = false;
|
|
|
-
|
|
|
- for (int i = 0; i < NUM_TUBES; i++) {
|
|
|
+ // Update the display configuration based on the new/previous time
|
|
|
+ for (int i = 0; i < NUM_TUBES; i++) {
|
|
|
|
|
|
- bool Update = false;
|
|
|
- if (i == 0 && nextHour / 10 != 0) {
|
|
|
+ bool Update = false;
|
|
|
+ if (i == 0 && (startup || prevHour / 10 != nextHour / 10)) {
|
|
|
+ if (nextHour / 10 != 0) {
|
|
|
Tube[i].NextDigit->Value = nextHour / 10;
|
|
|
- Update = true;
|
|
|
- } else if (i == 1) {
|
|
|
- Tube[i].NextDigit->Value = nextHour % 10;
|
|
|
- Update = true;
|
|
|
- } else if (i == 2) {
|
|
|
- Tube[i].NextDigit->Value = nextMinute / 10;
|
|
|
- Update = true;
|
|
|
- } else if (i == 3) {
|
|
|
- Tube[i].NextDigit->Value = nextMinute % 10;
|
|
|
- Update = true;
|
|
|
- }
|
|
|
-
|
|
|
- if (Update) {
|
|
|
-
|
|
|
Tube[i].NextDigit->Increment = true;
|
|
|
Tube[i].NextDigit->Active = true;
|
|
|
- Tube[i].PrevDigit = Tube[i].NextDigit;
|
|
|
- Tube[i].NextDigit = (Tube[i].NextDigit == &Tube[i].Digits[0]) ?
|
|
|
- &Tube[i].Digits[1] : &Tube[i].Digits[0];
|
|
|
}
|
|
|
+ Update = true; // ?
|
|
|
+ } else if (i == 1 && (startup || prevHour % 10 != nextHour % 10)) {
|
|
|
+ Tube[i].NextDigit->Value = nextHour % 10;
|
|
|
+ Tube[i].NextDigit->Increment = true;
|
|
|
+ Tube[i].NextDigit->Active = true;
|
|
|
+ Update = true;
|
|
|
+ } else if (i == 2 && (startup || prevMinute / 10 != nextMinute / 10)) {
|
|
|
+ Tube[i].NextDigit->Value = nextMinute / 10;
|
|
|
+ Tube[i].NextDigit->Increment = true;
|
|
|
+ Tube[i].NextDigit->Active = true;
|
|
|
+ Update = true;
|
|
|
+ } else if (i == 3 && (startup || prevMinute % 10 != nextMinute % 10)) {
|
|
|
+ Tube[i].NextDigit->Value = nextMinute % 10;
|
|
|
+ Tube[i].NextDigit->Increment = true;
|
|
|
+ Tube[i].NextDigit->Active = true;
|
|
|
+ Update = true;
|
|
|
}
|
|
|
|
|
|
- } else {
|
|
|
-
|
|
|
- for (int i = 0; i < NUM_TUBES; i++) {
|
|
|
-
|
|
|
- bool Update = false;
|
|
|
- if (i == 0 && ((prevHour / 10) != (nextHour / 10))) {
|
|
|
- if (nextHour / 10 != 0) {
|
|
|
- Tube[i].NextDigit->Value = nextHour / 10;
|
|
|
- Tube[i].NextDigit->Increment = true;
|
|
|
- Tube[i].NextDigit->Active = true;
|
|
|
- }
|
|
|
- Update = true;
|
|
|
- } else if (i == 1 && ((prevHour % 10) != (nextHour % 10))) {
|
|
|
- Tube[i].NextDigit->Value = nextHour % 10;
|
|
|
- Tube[i].NextDigit->Increment = true;
|
|
|
- Tube[i].NextDigit->Active = true;
|
|
|
- Update = true;
|
|
|
- } else if (i == 2 && ((prevMinute / 10) != (nextMinute / 10))) {
|
|
|
- Tube[i].NextDigit->Value = nextMinute / 10;
|
|
|
- Tube[i].NextDigit->Increment = true;
|
|
|
- Tube[i].NextDigit->Active = true;
|
|
|
- Update = true;
|
|
|
- } else if (i == 3 && ((prevMinute % 10) != (nextMinute % 10))) {
|
|
|
- Tube[i].NextDigit->Value = nextMinute % 10;
|
|
|
- Tube[i].NextDigit->Increment = true;
|
|
|
- Tube[i].NextDigit->Active = true;
|
|
|
- Update = true;
|
|
|
- }
|
|
|
-
|
|
|
- if (Update) {
|
|
|
+ // Handle display configuration changes for the given tube
|
|
|
+ if (Update) {
|
|
|
+ if (!startup) {
|
|
|
Tube[i].PrevDigit->Increment = false;
|
|
|
- Tube[i].PrevDigit = Tube[i].NextDigit;
|
|
|
- Tube[i].NextDigit = (Tube[i].NextDigit == &Tube[i].Digits[0]) ?
|
|
|
- &Tube[i].Digits[1] : &Tube[i].Digits[0];
|
|
|
}
|
|
|
+ Tube[i].PrevDigit = Tube[i].NextDigit;
|
|
|
+ Tube[i].NextDigit = Tube[i].NextDigit == &Tube[i].Digits[0] ?
|
|
|
+ &Tube[i].Digits[1] : &Tube[i].Digits[0];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Clear the startup run-once flag after the first iteration
|
|
|
+ startup = false;
|
|
|
+
|
|
|
// Fade in the new time
|
|
|
RuntimeTickerIter = FADE_TICKS;
|
|
|
RuntimeUpdateTicker.attach(RuntimeTickerUpdate, (float)(DIGIT_REFRESH_RATE_US / 1000) / RuntimeTickerIter);
|