SensESP 3.2.2
Universal Signal K sensor toolkit ESP32
Loading...
Searching...
No Matches
led_blinker.cpp
Go to the documentation of this file.
1#include "led_blinker.h"
2
3#include <memory>
4#include <utility>
5
6namespace sensesp {
7
8LEDPatternFragment frag_solid_color(uint32_t duration_ms, const CRGB& color) {
9 return LEDPatternFragment(duration_ms,
10 [color](uint32_t, CRGB& crgb) { crgb = color; });
11}
12
14 uint32_t fade_duration_ms,
15 const CRGB& target_color) {
16 // Use shared_ptr to store per-instance state (avoids static variable issues)
17 auto state = std::make_shared<std::pair<CRGB, unsigned long>>(
18 CRGB::Black, 0); // {from_color, last_elapsed_ms}
19
20 LEDPatternFragment fragment(
21 duration_ms,
22 [target_color, fade_duration_ms, state](uint32_t elapsed_ms, CRGB& crgb) {
23 CRGB& from_color = state->first;
24 unsigned long& last_elapsed_ms = state->second;
25
26 if (elapsed_ms < last_elapsed_ms) {
27 from_color = crgb;
28 }
29 last_elapsed_ms = elapsed_ms;
30 if (fade_duration_ms == 0 || elapsed_ms >= fade_duration_ms) {
31 crgb = target_color;
32 return;
33 }
34 crgb =
35 blend(from_color, target_color, elapsed_ms * 255 / fade_duration_ms);
36 });
37
38 return fragment;
39}
40
41LEDPatternFragment frag_linear_invert(uint32_t duration_ms, bool reverse) {
42 return LEDPatternFragment(
43 duration_ms, [duration_ms, reverse](uint32_t elapsed_ms, CRGB& crgb) {
44 // Blend the color from current color to inverted
45 if (duration_ms == 0) {
46 crgb = CRGB(255, 255, 255) - crgb;
47 return;
48 }
49 if (reverse) {
50 crgb = blend(CRGB(255, 255, 255) - crgb, crgb,
51 elapsed_ms * 255 / duration_ms);
52 } else {
53 crgb = blend(crgb, CRGB(255, 255, 255) - crgb,
54 elapsed_ms * 255 / duration_ms);
55 }
56 });
57}
58
59LEDPatternFragment frag_blend(uint32_t duration_ms, const CRGB& target_color,
60 bool reverse) {
61 return LEDPatternFragment(duration_ms, [duration_ms, reverse, target_color](
62 uint32_t elapsed_ms, CRGB& crgb) {
63 if (duration_ms == 0) {
64 crgb = reverse ? crgb : target_color;
65 return;
66 }
67 if (reverse) {
68 crgb = blend(target_color, crgb, elapsed_ms * 255 / duration_ms);
69 } else {
70 crgb = blend(crgb, target_color, elapsed_ms * 255 / duration_ms);
71 }
72 });
73}
74
75LEDPatternFragment frag_nop(uint32_t duration_ms) {
76 // No operation
77 return LEDPatternFragment(duration_ms, [](uint32_t, CRGB&) {});
78}
79
80} // namespace sensesp
LEDPatternFragment frag_linear_fade(uint32_t duration_ms, uint32_t fade_duration_ms, const CRGB &target_color)
LEDPatternFragment frag_nop(uint32_t duration_ms)
LEDPatternFragment frag_blend(uint32_t duration_ms, const CRGB &target_color, bool reverse)
CRGB blend(const CRGB &p1, const CRGB &p2, uint8_t amountOfP2)
Linear interpolation (blend) between two colors.
Definition crgb.h:137
LEDPatternFragment frag_linear_invert(uint32_t duration_ms, bool reverse)
LEDPatternFragment frag_solid_color(uint32_t duration_ms, const CRGB &color)
Minimal RGB color struct.
Definition crgb.h:58
static const CRGB Black
Definition crgb.h:88