1313namespace Fade
1414{
1515
16- FadeMode currentFade = FadeMode::NONE;
16+ FadeMode mode = FadeMode::NONE;
1717uint16_t fadeBrightness = 0 ;
18- uint16_t sunsetMaximumBrightness = 0 ;
18+ uint16_t targetBrightness = 0 ;
1919Ticker fadeTicker;
20- Ticker hasBeenStartedResetTicker;
21- bool hasBeenStarted = false ;
20+ Ticker debounce;
2221
2322void initialize ()
2423{
@@ -28,59 +27,31 @@ void initialize()
2827
2928void handle ()
3029{
31- // Return if fade is running
32- if (currentFade != FadeMode::NONE || hasBeenStarted)
30+ if (mode != FadeMode::NONE || debounce.active ())
3331 return ;
3432
35- // Get current time
36- time_t n = time (nullptr );
37- if (!n)
33+ int8_t hour, minute;
34+ if (!getTime (&hour, &minute))
3835 return ;
39- struct tm *now = gmtime (&n);
40- int8_t hour = (now->tm_hour + Config.timeZone + Config.summerTime ) % 24 ;
4136
42- // Check for alarm
43- if (Config.alarmEnabled && hour == Config.alarmHour && now->tm_min == Config.alarmMinute )
37+ if (Config.alarmEnabled && hour == Config.alarmHour && minute == Config.alarmMinute )
4438 {
4539 Fade::begin (Fade::FadeMode::ALARM);
4640 }
47- // Check for sunset
48- else if (Config.sunsetEnabled && hour == Config.sunsetHour && now->tm_min == Config.sunsetMinute )
41+ else if (Config.sunsetEnabled && hour == Config.sunsetHour && minute == Config.sunsetMinute && FastLEDHub.isDim ())
4942 {
50- // Only start sunset if all leds are off
51- if (FastLEDHub.brightness10 == 0 )
52- {
53- Fade::begin (Fade::FadeMode::SUNSET);
54- }
55- else // brightness10 > 0
56- {
57- bool ledsIlluminated = false ;
58- for (uint16_t i = 0 ; i < FastLEDHub.numLeds ; i++)
59- {
60- if (FastLEDHub.hardwareLeds [i] != CRGB (0 , 0 , 0 ))
61- {
62- ledsIlluminated = true ;
63- break ;
64- }
65- }
66-
67- if (!ledsIlluminated)
68- Fade::begin (Fade::FadeMode::SUNSET);
69- }
43+ Fade::begin (Fade::FadeMode::SUNSET);
7044 }
7145}
7246
7347void begin (FadeMode fadeMode)
7448{
75- // Set fade starting point
76- fadeBrightness = 1 ;
49+ mode = fadeMode;
50+ targetBrightness = FastLEDHub.brightness10 ;
51+ fadeBrightness = 0 ;
7752 FastLEDHub.show (fadeBrightness);
7853
79- currentFade = fadeMode;
80-
81- // Prevent starting fade multiple times
82- hasBeenStarted = true ;
83- hasBeenStartedResetTicker.attach (90 , [&]() { hasBeenStarted = false ; }); // TODO: Should only be called once?
54+ debounce.once (61 , [&](){ debounce.detach (); });
8455
8556 if (fadeMode == Fade::FadeMode::ALARM)
8657 {
@@ -91,42 +62,38 @@ void begin(FadeMode fadeMode)
9162 else if (fadeMode == Fade::FadeMode::SUNSET)
9263 {
9364 FastLEDHub.begin (FastLEDHub.getAnimation (Config.sunsetAnimation ));
94- sunsetMaximumBrightness = FastLEDHub.brightness10 ;
95- fadeTicker.attach_ms (Config.sunsetDuration * 60 * 1000 / sunsetMaximumBrightness, tick);
65+ fadeTicker.attach_ms (Config.sunsetDuration * 60 * 1000 / targetBrightness, tick);
9666 PRINTLN (" [FastLEDHub] Start fade 'Sunset'" );
9767 }
9868}
9969
10070void stop ()
10171{
10272 fadeTicker.detach ();
103- currentFade = FadeMode::NONE;
73+ mode = FadeMode::NONE;
10474}
10575
10676void tick ()
10777{
10878 if (FastLEDHub.status == PAUSED)
10979 return ;
11080
111- if (currentFade == Fade::FadeMode::ALARM && fadeBrightness == 1023 )
81+ if (mode == Fade::FadeMode::ALARM && fadeBrightness == 1023 )
11282 {
11383 if (Config.postAlarmAnimation != Config.alarmAnimation )
11484 FastLEDHub.begin (FastLEDHub.getAnimation (Config.postAlarmAnimation ));
115- fadeTicker.detach ();
85+
86+ stop ();
11687 PRINTLN (" [FastLEDHub] End fade 'Alarm'" );
11788 }
118- else if (currentFade == Fade::FadeMode::SUNSET && fadeBrightness == sunsetMaximumBrightness )
89+ else if (mode == Fade::FadeMode::SUNSET && fadeBrightness == targetBrightness )
11990 {
120- fadeTicker. detach ();
91+ stop ();
12192 PRINTLN (" [FastLEDHub] End fade 'Sunset'" );
12293 }
12394 else
12495 {
125- if (fadeBrightness < 1023 )
126- fadeBrightness++;
127- else
128- fadeTicker.detach ();
129-
96+ fadeBrightness++;
13097 PRINTLN (" [FastLEDHub] Fade brightness: " + String (fadeBrightness));
13198 }
13299
@@ -166,4 +133,18 @@ void getSunsetTime()
166133 }
167134}
168135
136+ bool getTime (int8_t *hour, int8_t *minute)
137+ {
138+ time_t n = time (nullptr );
139+
140+ if (!n)
141+ return false ;
142+
143+ tm *now = gmtime (&n);
144+ *hour = (now->tm_hour + Config.timeZone + Config.summerTime ) % 24 ;
145+ *minute = now->tm_min ;
146+
147+ return true ;
148+ }
149+
169150} // namespace Fade
0 commit comments