Repository navigation
Expand file tree
/
Copy pathclock.cpp
More file actions
74 lines (59 loc) · 1.81 KB
/
Copy pathclock.cpp
File metadata and controls
74 lines (59 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "clock.h"
#include "font.h"
#include "prog.h"
Clock::Clock(Ntp& ntp, Font& font)
: ntp(ntp),
font(font)
{
ledsPrevious = (CRGB*)malloc(sizeof(CRGB) * NUM_LEDS);
ledsNew = (CRGB*)malloc(sizeof(CRGB) * NUM_LEDS);
}
void Clock::Handle(CRGB* leds) {
time_t now = ntp.GetLocalTime();
int hourNow = hour(now);
int minuteNow = minute(now);
SERIAL_PRINT("Now: ");
SERIAL_PRINTLN(now);
if (previousHour != hourNow || previousMinute != minuteNow) {
// if recovering from a crash, we don't want to fade from "00:00"
if (previousHour == 0) {
DrawTime(ledsPrevious, hourNow, minuteNow);
}
else {
DrawTime(ledsPrevious, previousHour, previousMinute);
}
DrawTime(ledsNew, hourNow, minuteNow);
fade = millis() + 5000;
}
previousHour = hourNow;
previousMinute = minuteNow;
for (int i = 0; i < NUM_LEDS; i++) {
if (fade == 0 // how?
|| millis() > fade // we've passed the time we're supposed to be fully faded
|| ledsNew[i] == CRGB(CRGB::Black) // the new color is black, just skip the fade
)
{
leds[i] = ledsNew[i];
}
else {
uint8_t amount =
255 // max amount
- ((fade - millis()) / 5000.0) // fraction of time passed
* 255;
leds[i] = blend(ledsPrevious[i], ledsNew[i], amount);
}
}
}
void Clock::DrawTime(
CRGB* leds,
uint8_t hour,
uint8_t minute)
{
fill_solid(leds, NUM_LEDS, CRGB::Black);
uint16_t offset = 60 * hour + minute;
font.DrawDigit(leds, hour / 10, 2, offset);
font.DrawDigit(leds, hour - (hour / 10) * 10, 6, offset);
font.DrawSeparator(leds, 10, offset);
font.DrawDigit(leds, minute / 10, 12, offset);
font.DrawDigit(leds, minute - (minute / 10) * 10, 16, offset);
}