13inline static int16_t sin16_c(uint16_t theta) {
14 static const uint16_t BASE[] = {0, 6393, 12539, 18204, 23170, 27245, 30273, 32137};
15 static const uint8_t SLOPE[] = {49, 48, 44, 38, 31, 23, 14, 4};
16 uint16_t offset = (theta & 0x3FFF) >> 3;
18 offset = 2047 - offset;
19 uint8_t section = offset / 256;
20 uint16_t b = BASE[section];
21 uint8_t
m = SLOPE[section];
22 uint8_t secoffset8 = uint8_t(offset) / 2;
23 uint16_t mx =
m * secoffset8;
29inline static uint8_t half_sin8(uint8_t v) {
return sin16_c(uint16_t(v) * 128u) >> 8; }
55 uint32_t update_interval)
59 const uint32_t now =
millis();
83 const uint16_t add = 0xFFFF / this->
width_;
109 void set_colors(
const std::vector<AddressableColorWipeEffectColor> &colors) { this->
colors_ = colors; }
113 const uint32_t now =
millis();
127 const Color next_esp_color =
Color(next_color.
r, next_color.
g, next_color.
b, next_color.
w);
129 esp_color = esp_color.
gradient(next_esp_color, gradient);
151 std::vector<AddressableColorWipeEffectColor>
colors_;
165 const uint32_t now =
millis();
171 if (this->
at_led_ == it.
size() - this->scan_width_)
182 it[this->
at_led_ + i] = current_color;
200 const uint32_t now =
millis();
207 for (
auto view : addressable) {
208 if (view.get_effect_data() != 0) {
209 const uint8_t sine = half_sin8(view.get_effect_data());
210 view = current_color * sine;
211 const uint8_t new_pos = view.get_effect_data() + pos_add;
212 if (new_pos < view.get_effect_data()) {
213 view.set_effect_data(0);
215 view.set_effect_data(new_pos);
223 if (addressable[pos].get_effect_data() != 0)
225 addressable[pos].set_effect_data(1);
242 const uint32_t now =
millis();
249 for (
auto view : it) {
250 if (view.get_effect_data() != 0) {
251 const uint8_t
x = (view.get_effect_data() >> 3) & 0b11111;
252 const uint8_t color = view.get_effect_data() & 0b111;
253 const uint16_t sine = half_sin8((
x << 3) | subsine);
255 view = current_color * sine;
257 view =
Color(((color >> 2) & 1) * sine, ((color >> 1) & 1) * sine, ((color >> 0) & 1) * sine);
259 const uint8_t new_x =
x + pos_add;
260 if (new_x > 0b11111) {
261 view.set_effect_data(0);
263 view.set_effect_data((new_x << 3) | color);
266 view =
Color(0, 0, 0, 0);
271 if (it[pos].get_effect_data() != 0)
274 it[pos].set_effect_data(0b1000 | color);
295 const uint32_t now =
millis();
301 for (
auto view : it) {
302 Color target = view.get() * fade_out_mult;
307 int last = it.
size() - 1;
308 it[0].set(it[0].get() + (it[1].get() * 128));
309 for (
int i = 1; i < last; i++) {
310 it[i] = (it[i - 1].
get() * 64) + it[i].
get() + (it[i + 1].
get() * 64);
312 it[last] = it[last].
get() + (it[last - 1].
get() * 128);
318 it[pos] = current_color;
340 const uint32_t now =
millis();
342 const uint8_t inv_intensity = 255 - intensity;
348 for (
auto var : it) {
349 rng_state = (rng_state * 0x9E3779B9) + 0x9E37;
350 const uint8_t flicker = (rng_state & 0xFF) % intensity;
352 var = var.get() * (255 - flicker);
355 var = (var.get() * inv_intensity) + (current_color * intensity);
AddressableColorWipeEffect(const std::string &name)
void set_colors(const std::vector< AddressableColorWipeEffectColor > &colors)
void apply(AddressableLight &it, const Color ¤t_color) override
uint32_t add_led_interval_
void set_reverse(bool reverse)
void set_add_led_interval(uint32_t add_led_interval)
std::vector< AddressableColorWipeEffectColor > colors_
void set_fade_out_rate(uint8_t fade_out_rate)
void set_spark_probability(float spark_probability)
void set_use_random_color(bool random_color)
uint32_t update_interval_
AddressableFireworksEffect(const std::string &name)
void apply(AddressableLight &it, const Color ¤t_color) override
void set_update_interval(uint32_t update_interval)
void set_intensity(float intensity)
void apply(AddressableLight &it, const Color ¤t_color) override
uint32_t update_interval_
AddressableFlickerEffect(const std::string &name)
void set_update_interval(uint32_t update_interval)
uint32_t update_interval_
AddressableLambdaLightEffect(const std::string &name, std::function< void(AddressableLight &, Color, bool initial_run)> f, uint32_t update_interval)
void apply(AddressableLight &it, const Color ¤t_color) override
std::function< void(AddressableLight &, Color, bool initial_run)> f_
virtual void apply(AddressableLight &it, const Color ¤t_color)=0
AddressableLight * get_addressable_() const
AddressableLightEffect(const std::string &name)
void start_internal() override
virtual void clear_effect_data()=0
void shift_left(int32_t amnt)
ESPColorView get(int32_t index)
void shift_right(int32_t amnt)
void set_effect_active(bool effect_active)
virtual int32_t size() const =0
void apply(AddressableLight &it, const Color ¤t_color) override
void set_speed(uint32_t speed)
AddressableRainbowLightEffect(const std::string &name)
void set_width(uint16_t width)
AddressableRandomTwinkleEffect(const std::string &name)
void set_progress_interval(uint32_t progress_interval)
void apply(AddressableLight &it, const Color ¤t_color) override
uint32_t progress_interval_
float twinkle_probability_
void set_twinkle_probability(float twinkle_probability)
AddressableScanEffect(const std::string &name)
void set_scan_width(uint32_t scan_width)
void set_move_interval(uint32_t move_interval)
void apply(AddressableLight &it, const Color ¤t_color) override
uint32_t progress_interval_
void set_progress_interval(uint32_t progress_interval)
void set_twinkle_probability(float twinkle_probability)
void apply(AddressableLight &addressable, const Color ¤t_color) override
float twinkle_probability_
AddressableTwinkleEffect(const std::string &name)
virtual void start()
Initialize this LightEffect. Will be called once after creation.
LightColorValues remote_values
The remote color values reported to the frontend.
LightOutput * get_output() const
Get the light output associated with this object.
Color color_from_light_color_values(LightColorValues val)
Convert the color information from a LightColorValues object to a Color object (does not apply bright...
Providing packet encoding functions for exchanging data with a remote host.
float random_float()
Return a random float between 0 and 1.
uint32_t random_uint32()
Return a random 32-bit unsigned integer.
uint32_t IRAM_ATTR HOT millis()
static Color random_color()
Color gradient(const Color &to_color, uint8_t amnt)