ESPixelStick Firmware
Firmware for the ESPixelStick
Loading...
Searching...
No Matches
InputEffectEngine.hpp
Go to the documentation of this file.
1#pragma once
2/*
3* InputEffectEngine.cpp - Input Management class
4*
5* Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver
6* Copyright (c) 2021, 2025 Shelby Merrick
7* http://www.forkineye.com
8*
9* This program is provided free for you to use in any way that you wish,
10* subject to the laws and regulations where you are using it. Due diligence
11* is strongly suggested before using this code. Please give credit where due.
12*
13* The Author makes no warranty of any kind, express or implied, with regard
14* to this program or the documentation contained in this document. The
15* Author shall not be liable in any event for incidental or consequential
16* damages in connection with, or arising out of, the furnishing, performance
17* or use of these programs.
18*
19*/
20
21#include <vector>
22#include "InputCommon.hpp"
23
25{
26public:
28 c_InputMgr::e_InputType NewChannelType,
29 uint32_t BufferSize);
30 virtual ~c_InputEffectEngine ();
31
33
34 // dCRGB red, green, blue 0->1.0
35 struct dCRGB {
36 double r;
37 double g;
38 double b;
40 {
41 r = a.r;
42 g = a.g;
43 b = a.b;
44 return a;
45 }
46 };
47
48 // CRGB red, green, blue 0->255
49 struct CRGB
50 {
51 uint8_t r;
52 uint8_t g;
53 uint8_t b;
54 };
55
56 // dCHSV hue 0->360 sat 0->1.0 val 0->1.0
57 struct dCHSV
58 {
59 double h;
60 double s;
61 double v;
62 };
63
64 typedef uint16_t (c_InputEffectEngine::* EffectFunc)(void);
65
67 {
68 String name;
70 const char* htmlid;
76 String wsTCode;
77 };
78
80 {
81 String effect;
82 bool mirror;
83 bool allLeds;
84 uint8_t brightness;
87 };
88
96
97 // functions to be provided by the derived class
98 void Begin ();
99 bool SetConfig (JsonObject& jsonConfig);
100 void SetMqttConfig (MQTTConfiguration_t& mqttConfig);
101 void GetConfig (JsonObject& jsonConfig);
102 void GetMqttConfig (MQTTConfiguration_t& mqttConfig);
103 void GetMqttEffectList (JsonObject& jsonConfig);
104 void GetStatus (JsonObject& jsonStatus);
105 void Process ();
106 void Poll ();
107 void GetDriverName (String & sDriverName) { sDriverName = "Effects"; }
108 void SetBufferInfo (uint32_t BufferSize);
109 void NextEffect ();
111
112 // Effect functions
113 uint16_t effectSolidColor ();
114 uint16_t effectRainbow ();
115 uint16_t effectChase ();
116 uint16_t effectBlink ();
117 uint16_t effectFlash ();
118 uint16_t effectFireFlicker ();
119 uint16_t effectLightning ();
120 uint16_t effectBreathe ();
121 uint16_t effectNull ();
122 uint16_t effectRandom ();
123 uint16_t effectTransition ();
124 uint16_t effectMarquee ();
125
126private:
127#define EFFECTS_TASK_PRIORITY 5
128
129 void validateConfiguration ();
130
131 bool HasBeenInitialized = false;
132
133#define MIN_EFFECT_DELAY 10
134
135 using timeType = decltype(millis());
136
137 uint32_t EffectWait = 0; /* How long to wait for the effect to run again */
138 uint32_t EffectCounter = 0; /* Counter for the number of calls to the active effect */
139 uint32_t EffectSpeed = 6; /* Externally controlled effect speed 1..10 */
140 uint32_t EffectDelay = 0; /* Internal representation of speed */
141 bool EffectReverse = false; /* Externally controlled effect reverse option */
142 bool EffectMirror = false; /* Externally controlled effect mirroring (start at center) */
143 bool EffectAllLeds = false; /* Externally controlled effect all leds = 1st led */
144 bool EffectWhiteChannel = false;
145 float EffectBrightness = 1.0; /* Externally controlled effect brightness [0, 255] */
146 CRGB EffectColor = { 183, 0, 255 }; /* Externally controlled effect color */
147 bool StayDark = false;
148 bool Disabled = false;
157
158 uint32_t EffectStep = 0; /* Shared mutable effect step counter */
159 uint32_t PixelCount = 0; /* Number of RGB leds (not channels) */
160 uint32_t MirroredPixelCount = 0; /* Number of RGB leds (not channels) */
161 uint8_t ChannelsPerPixel = 3;
162 uint32_t PixelOffset = 0;
163 uint32_t ChannelCount = 0;
165
166 void setPixel(uint16_t idx, CRGB color);
167 void GetPixel (uint16_t pixelId, CRGB & out);
168 void setRange(uint16_t first, uint16_t len, CRGB color);
169 void clearRange(uint16_t first, uint16_t len);
170 void setAll(CRGB color);
171 void outputEffectColor (uint16_t pixelId, CRGB outputColor);
172
173 CRGB colorWheel(uint8_t pos);
174 dCHSV rgb2hsv(CRGB in);
175 CRGB hsv2rgb(dCHSV in);
176
177 void setColor (String& NewColor);
178 void setEffect (const String & effectName);
179 void setBrightness (float brightness);
180 void setSpeed (uint16_t speed);
181 void setDelay (uint16_t delay);
182 void PollFlash();
183
184 void clearAll ();
185
187
189 {
190 dCRGB CurrentColor = {0.0, 0.0, 0.0};
191 dCRGB StepValue = {2.0, 2.0, 2.0};
192 uint32_t StepsToTarget = 300; // number of NumStepsToTarget
193 uint32_t TimeAtTargetMs = 100; // number of milli seconds to stay at the target color.
194 uint32_t HoldStartTimeMs = 0; // time at which transition hold time was started. 0 == off
195 std::vector<c_InputEffectEngine::dCRGB>::iterator TargetColorIterator;
197
198 bool ColorHasReachedTarget ();
199 bool ColorHasReachedTarget (double tc, double cc, double step);
200 void ConditionalIncrementColor(double tc, double & cc, double step);
201 void CalculateTransitionStepValue(double tc, double cc, double & step);
202
204 {
205 bool Enable = false;
206 uint32_t MinIntensity = 100;
207 uint32_t MaxIntensity = 100;
208 uint32_t MinDelayMS = 100;
209 uint32_t MaxDelayMS = 5000;
210 uint32_t MinDurationMS = 25;
211 uint32_t MaxDurationMS = 50;
215
216};
Definition FastTimer.hpp:24
InputValue_t
Definition externalInput.h:32
Definition InputCommon.hpp:27
Definition InputEffectEngine.hpp:25
void SetMqttConfig(MQTTConfiguration_t &mqttConfig)
Set a new config in the driver.
Definition InputEffectEngine.cpp:631
bool StayDark
Definition InputEffectEngine.hpp:147
void setColor(String &NewColor)
Definition InputEffectEngine.cpp:737
uint32_t EffectDelay
Definition InputEffectEngine.hpp:140
void Poll()
Call from loop(), renders Input data.
Definition InputEffectEngine.cpp:380
bool HasBeenInitialized
Definition InputEffectEngine.hpp:131
uint16_t effectMarquee()
Definition InputEffectEngine.cpp:1125
FastTimer EffectDelayTimer
Definition InputEffectEngine.hpp:164
uint32_t PixelCount
Definition InputEffectEngine.hpp:159
uint16_t effectNull()
decltype(millis()) timeType
Definition InputEffectEngine.hpp:135
float EffectBrightness
Definition InputEffectEngine.hpp:145
void GetMqttConfig(MQTTConfiguration_t &mqttConfig)
Get the current config used by the driver.
Definition InputEffectEngine.cpp:218
uint32_t ChannelCount
Definition InputEffectEngine.hpp:163
uint16_t effectChase()
Definition InputEffectEngine.cpp:927
uint8_t ChannelsPerPixel
Definition InputEffectEngine.hpp:161
void Begin()
set up the operating environment based on the current config (or defaults)
Definition InputEffectEngine.cpp:120
virtual ~c_InputEffectEngine()
Definition InputEffectEngine.cpp:114
uint32_t effectMarqueePixelLocation
Definition InputEffectEngine.hpp:156
void setSpeed(uint16_t speed)
Definition InputEffectEngine.cpp:685
void PollFlash()
Definition InputEffectEngine.cpp:285
uint16_t effectFireFlicker()
Definition InputEffectEngine.cpp:1370
uint32_t EffectSpeed
Definition InputEffectEngine.hpp:139
uint16_t effectBreathe()
Definition InputEffectEngine.cpp:1447
uint32_t EffectCounter
Definition InputEffectEngine.hpp:138
uint16_t effectRainbow()
Definition InputEffectEngine.cpp:951
void setPixel(uint16_t idx, CRGB color)
Definition InputEffectEngine.cpp:757
c_InputEffectEngine()
Definition InputEffectEngine.cpp:97
EffectChannelMode_t
Definition InputEffectEngine.hpp:150
@ PixelMode
Definition InputEffectEngine.hpp:152
@ ChannelMode
Definition InputEffectEngine.hpp:151
void GetDriverName(String &sDriverName)
get the name for the instantiated driver
Definition InputEffectEngine.hpp:107
uint16_t effectFlash()
Definition InputEffectEngine.cpp:1340
uint32_t EffectStep
Definition InputEffectEngine.hpp:158
dCHSV rgb2hsv(CRGB in)
Definition InputEffectEngine.cpp:1481
void SetBufferInfo(uint32_t BufferSize)
Definition InputEffectEngine.cpp:469
void clearAll()
Definition InputEffectEngine.cpp:857
void GetConfig(JsonObject &jsonConfig)
Get the current config used by the driver.
Definition InputEffectEngine.cpp:137
CRGB EffectColor
Definition InputEffectEngine.hpp:146
void Process()
Call from loop(), renders Input data.
Definition InputEffectEngine.cpp:333
uint16_t(c_InputEffectEngine::*) EffectFunc(void)
Definition InputEffectEngine.hpp:64
void setBrightness(float brightness)
Definition InputEffectEngine.cpp:672
void setEffect(const String &effectName)
Definition InputEffectEngine.cpp:708
bool EffectWhiteChannel
Definition InputEffectEngine.hpp:144
bool EffectMirror
Definition InputEffectEngine.hpp:142
void setDelay(uint16_t delay)
Definition InputEffectEngine.cpp:693
uint32_t EffectWait
Definition InputEffectEngine.hpp:137
bool EffectReverse
Definition InputEffectEngine.hpp:141
void GetPixel(uint16_t pixelId, CRGB &out)
Definition InputEffectEngine.cpp:804
uint32_t PixelOffset
Definition InputEffectEngine.hpp:162
struct c_InputEffectEngine::FlashInfo_t FlashInfo
const EffectDescriptor_t * ActiveEffect
Definition InputEffectEngine.hpp:186
void validateConfiguration()
Definition InputEffectEngine.cpp:659
uint16_t effectBlink()
Definition InputEffectEngine.cpp:1319
uint16_t effectLightning()
Definition InputEffectEngine.cpp:1389
uint16_t effectRandom()
Definition InputEffectEngine.cpp:987
bool Disabled
Definition InputEffectEngine.hpp:148
void GetStatus(JsonObject &jsonStatus)
Definition InputEffectEngine.cpp:237
CRGB colorWheel(uint8_t pos)
Definition InputEffectEngine.cpp:865
void GetMqttEffectList(JsonObject &jsonConfig)
Get the current config used by the driver.
Definition InputEffectEngine.cpp:205
uint16_t effectSolidColor()
Definition InputEffectEngine.cpp:889
void outputEffectColor(uint16_t pixelId, CRGB outputColor)
Definition InputEffectEngine.cpp:902
bool SetConfig(JsonObject &jsonConfig)
Set a new config in the driver.
Definition InputEffectEngine.cpp:512
void ProcessButtonActions(c_ExternalInput::InputValue_t value)
Definition InputEffectEngine.cpp:444
void NextEffect()
Definition InputEffectEngine.cpp:250
bool EffectAllLeds
Definition InputEffectEngine.hpp:143
uint32_t effectMarqueePixelAdvanceCount
Definition InputEffectEngine.hpp:155
struct c_InputEffectEngine::Transition_t TransitionInfo
void CalculateTransitionStepValue(double tc, double cc, double &step)
Definition InputEffectEngine.cpp:1218
CRGB hsv2rgb(dCHSV in)
Definition InputEffectEngine.cpp:1529
bool ColorHasReachedTarget()
Definition InputEffectEngine.cpp:1300
void clearRange(uint16_t first, uint16_t len)
Definition InputEffectEngine.cpp:838
void ConditionalIncrementColor(double tc, double &cc, double step)
Definition InputEffectEngine.cpp:1245
void setAll(CRGB color)
Definition InputEffectEngine.cpp:849
EffectChannelMode_t EffectChannelMode
Definition InputEffectEngine.hpp:154
uint16_t effectTransition()
Definition InputEffectEngine.cpp:1044
uint32_t MirroredPixelCount
Definition InputEffectEngine.hpp:160
void setRange(uint16_t first, uint16_t len, CRGB color)
Definition InputEffectEngine.cpp:827
e_InputType
Definition InputMgr.hpp:73
e_InputChannelIds
Definition InputMgr.hpp:40
Definition InputEffectEngine.hpp:50
uint8_t g
Definition InputEffectEngine.hpp:52
uint8_t b
Definition InputEffectEngine.hpp:53
uint8_t r
Definition InputEffectEngine.hpp:51
Definition InputEffectEngine.hpp:67
bool hasMirror
Definition InputEffectEngine.hpp:72
bool hasColor
Definition InputEffectEngine.hpp:71
bool hasWhiteChannel
Definition InputEffectEngine.hpp:75
String wsTCode
Definition InputEffectEngine.hpp:76
String name
Definition InputEffectEngine.hpp:68
bool hasAllLeds
Definition InputEffectEngine.hpp:74
bool hasReverse
Definition InputEffectEngine.hpp:73
const char * htmlid
Definition InputEffectEngine.hpp:70
EffectFunc func
Definition InputEffectEngine.hpp:69
Definition InputEffectEngine.hpp:204
uint32_t MinIntensity
Definition InputEffectEngine.hpp:206
uint32_t MaxIntensity
Definition InputEffectEngine.hpp:207
uint32_t MinDelayMS
Definition InputEffectEngine.hpp:208
uint32_t MaxDurationMS
Definition InputEffectEngine.hpp:211
FastTimer delaytimer
Definition InputEffectEngine.hpp:212
uint32_t MaxDelayMS
Definition InputEffectEngine.hpp:209
uint32_t MinDurationMS
Definition InputEffectEngine.hpp:210
FastTimer durationtimer
Definition InputEffectEngine.hpp:213
bool Enable
Definition InputEffectEngine.hpp:205
Definition InputEffectEngine.hpp:80
bool allLeds
Definition InputEffectEngine.hpp:83
CRGB color
Definition InputEffectEngine.hpp:86
uint8_t brightness
Definition InputEffectEngine.hpp:84
bool whiteChannel
Definition InputEffectEngine.hpp:85
String effect
Definition InputEffectEngine.hpp:81
bool mirror
Definition InputEffectEngine.hpp:82
Definition InputEffectEngine.hpp:90
uint32_t NumPixelsInGroup
Definition InputEffectEngine.hpp:91
CRGB Color
Definition InputEffectEngine.hpp:92
uint8_t EndingIntensity
Definition InputEffectEngine.hpp:94
uint8_t StartingIntensity
Definition InputEffectEngine.hpp:93
Definition InputEffectEngine.hpp:189
uint32_t TimeAtTargetMs
Definition InputEffectEngine.hpp:193
uint32_t StepsToTarget
Definition InputEffectEngine.hpp:192
dCRGB StepValue
Definition InputEffectEngine.hpp:191
uint32_t HoldStartTimeMs
Definition InputEffectEngine.hpp:194
dCRGB CurrentColor
Definition InputEffectEngine.hpp:190
std::vector< c_InputEffectEngine::dCRGB >::iterator TargetColorIterator
Definition InputEffectEngine.hpp:195
Definition InputEffectEngine.hpp:58
double v
Definition InputEffectEngine.hpp:61
double s
Definition InputEffectEngine.hpp:60
double h
Definition InputEffectEngine.hpp:59
Definition InputEffectEngine.hpp:35
double g
Definition InputEffectEngine.hpp:37
dCRGB operator=(dCRGB a)
Definition InputEffectEngine.hpp:39
double r
Definition InputEffectEngine.hpp:36
double b
Definition InputEffectEngine.hpp:38