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;
149
152
153 uint32_t EffectStep = 0; /* Shared mutable effect step counter */
154 uint32_t PixelCount = 0; /* Number of RGB leds (not channels) */
155 uint32_t MirroredPixelCount = 0; /* Number of RGB leds (not channels) */
156 uint8_t ChannelsPerPixel = 3;
157 uint32_t PixelOffset = 0;
159
160 void setPixel(uint16_t idx, CRGB color);
161 void GetPixel (uint16_t pixelId, CRGB & out);
162 void setRange(uint16_t first, uint16_t len, CRGB color);
163 void clearRange(uint16_t first, uint16_t len);
164 void setAll(CRGB color);
165 void outputEffectColor (uint16_t pixelId, CRGB outputColor);
166
167 CRGB colorWheel(uint8_t pos);
168 dCHSV rgb2hsv(CRGB in);
169 CRGB hsv2rgb(dCHSV in);
170
171 void setColor (String& NewColor);
172 void setEffect (const String & effectName);
173 void setBrightness (float brightness);
174 void setSpeed (uint16_t speed);
175 void setDelay (uint16_t delay);
176 void PollFlash();
177
178 void clearAll ();
179
181
183 {
184 dCRGB CurrentColor = {0.0, 0.0, 0.0};
185 dCRGB StepValue = {2.0, 2.0, 2.0};
186 uint32_t StepsToTarget = 300; // number of NumStepsToTarget
187 uint32_t TimeAtTargetMs = 100; // number of milli seconds to stay at the target color.
188 uint32_t HoldStartTimeMs = 0; // time at which transition hold time was started. 0 == off
189 std::vector<c_InputEffectEngine::dCRGB>::iterator TargetColorIterator;
191
192 bool ColorHasReachedTarget ();
193 bool ColorHasReachedTarget (double tc, double cc, double step);
194 void ConditionalIncrementColor(double tc, double & cc, double step);
195 void CalculateTransitionStepValue(double tc, double cc, double & step);
196
198 {
199 bool Enable = false;
200 uint32_t MinIntensity = 100;
201 uint32_t MaxIntensity = 100;
202 uint32_t MinDelayMS = 100;
203 uint32_t MaxDelayMS = 5000;
204 uint32_t MinDurationMS = 25;
205 uint32_t MaxDurationMS = 50;
209
210};
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:605
bool StayDark
Definition InputEffectEngine.hpp:147
void setColor(String &NewColor)
Definition InputEffectEngine.cpp:711
uint32_t EffectDelay
Definition InputEffectEngine.hpp:140
void Poll()
Call from loop(), renders Input data.
Definition InputEffectEngine.cpp:379
bool HasBeenInitialized
Definition InputEffectEngine.hpp:131
uint16_t effectMarquee()
Definition InputEffectEngine.cpp:1077
FastTimer EffectDelayTimer
Definition InputEffectEngine.hpp:158
uint32_t PixelCount
Definition InputEffectEngine.hpp:154
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:217
uint16_t effectChase()
Definition InputEffectEngine.cpp:879
uint8_t ChannelsPerPixel
Definition InputEffectEngine.hpp:156
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:151
void setSpeed(uint16_t speed)
Definition InputEffectEngine.cpp:659
void PollFlash()
Definition InputEffectEngine.cpp:284
uint16_t effectFireFlicker()
Definition InputEffectEngine.cpp:1322
uint32_t EffectSpeed
Definition InputEffectEngine.hpp:139
uint16_t effectBreathe()
Definition InputEffectEngine.cpp:1399
uint32_t EffectCounter
Definition InputEffectEngine.hpp:138
uint16_t effectRainbow()
Definition InputEffectEngine.cpp:903
void setPixel(uint16_t idx, CRGB color)
Definition InputEffectEngine.cpp:731
c_InputEffectEngine()
Definition InputEffectEngine.cpp:97
void GetDriverName(String &sDriverName)
get the name for the instantiated driver
Definition InputEffectEngine.hpp:107
uint16_t effectFlash()
Definition InputEffectEngine.cpp:1292
uint32_t EffectStep
Definition InputEffectEngine.hpp:153
dCHSV rgb2hsv(CRGB in)
Definition InputEffectEngine.cpp:1433
void SetBufferInfo(uint32_t BufferSize)
Definition InputEffectEngine.cpp:468
void clearAll()
Definition InputEffectEngine.cpp:811
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:332
uint16_t(c_InputEffectEngine::*) EffectFunc(void)
Definition InputEffectEngine.hpp:64
void setBrightness(float brightness)
Definition InputEffectEngine.cpp:646
void setEffect(const String &effectName)
Definition InputEffectEngine.cpp:682
bool EffectWhiteChannel
Definition InputEffectEngine.hpp:144
bool EffectMirror
Definition InputEffectEngine.hpp:142
void setDelay(uint16_t delay)
Definition InputEffectEngine.cpp:667
uint32_t EffectWait
Definition InputEffectEngine.hpp:137
bool EffectReverse
Definition InputEffectEngine.hpp:141
void GetPixel(uint16_t pixelId, CRGB &out)
Definition InputEffectEngine.cpp:764
uint32_t PixelOffset
Definition InputEffectEngine.hpp:157
struct c_InputEffectEngine::FlashInfo_t FlashInfo
const EffectDescriptor_t * ActiveEffect
Definition InputEffectEngine.hpp:180
void validateConfiguration()
Definition InputEffectEngine.cpp:633
uint16_t effectBlink()
Definition InputEffectEngine.cpp:1271
uint16_t effectLightning()
Definition InputEffectEngine.cpp:1341
uint16_t effectRandom()
Definition InputEffectEngine.cpp:939
bool Disabled
Definition InputEffectEngine.hpp:148
void GetStatus(JsonObject &jsonStatus)
Definition InputEffectEngine.cpp:236
CRGB colorWheel(uint8_t pos)
Definition InputEffectEngine.cpp:817
void GetMqttEffectList(JsonObject &jsonConfig)
Get the current config used by the driver.
Definition InputEffectEngine.cpp:204
uint16_t effectSolidColor()
Definition InputEffectEngine.cpp:841
void outputEffectColor(uint16_t pixelId, CRGB outputColor)
Definition InputEffectEngine.cpp:854
bool SetConfig(JsonObject &jsonConfig)
Set a new config in the driver.
Definition InputEffectEngine.cpp:491
void ProcessButtonActions(c_ExternalInput::InputValue_t value)
Definition InputEffectEngine.cpp:443
void NextEffect()
Definition InputEffectEngine.cpp:249
bool EffectAllLeds
Definition InputEffectEngine.hpp:143
uint32_t effectMarqueePixelAdvanceCount
Definition InputEffectEngine.hpp:150
struct c_InputEffectEngine::Transition_t TransitionInfo
void CalculateTransitionStepValue(double tc, double cc, double &step)
Definition InputEffectEngine.cpp:1170
CRGB hsv2rgb(dCHSV in)
Definition InputEffectEngine.cpp:1481
bool ColorHasReachedTarget()
Definition InputEffectEngine.cpp:1252
void clearRange(uint16_t first, uint16_t len)
Definition InputEffectEngine.cpp:796
void ConditionalIncrementColor(double tc, double &cc, double step)
Definition InputEffectEngine.cpp:1197
void setAll(CRGB color)
Definition InputEffectEngine.cpp:805
uint16_t effectTransition()
Definition InputEffectEngine.cpp:996
uint32_t MirroredPixelCount
Definition InputEffectEngine.hpp:155
void setRange(uint16_t first, uint16_t len, CRGB color)
Definition InputEffectEngine.cpp:787
e_InputType
Definition InputMgr.hpp:71
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:198
uint32_t MinIntensity
Definition InputEffectEngine.hpp:200
uint32_t MaxIntensity
Definition InputEffectEngine.hpp:201
uint32_t MinDelayMS
Definition InputEffectEngine.hpp:202
uint32_t MaxDurationMS
Definition InputEffectEngine.hpp:205
FastTimer delaytimer
Definition InputEffectEngine.hpp:206
uint32_t MaxDelayMS
Definition InputEffectEngine.hpp:203
uint32_t MinDurationMS
Definition InputEffectEngine.hpp:204
FastTimer durationtimer
Definition InputEffectEngine.hpp:207
bool Enable
Definition InputEffectEngine.hpp:199
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:183
uint32_t TimeAtTargetMs
Definition InputEffectEngine.hpp:187
uint32_t StepsToTarget
Definition InputEffectEngine.hpp:186
dCRGB StepValue
Definition InputEffectEngine.hpp:185
uint32_t HoldStartTimeMs
Definition InputEffectEngine.hpp:188
dCRGB CurrentColor
Definition InputEffectEngine.hpp:184
std::vector< c_InputEffectEngine::dCRGB >::iterator TargetColorIterator
Definition InputEffectEngine.hpp:189
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