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; }
90 const uint16_t add = 0xFFFF / this->
width_;
116 void set_colors(
const std::vector<AddressableColorWipeEffectColor> &colors) { this->
colors_ = colors; }
134 const Color next_esp_color =
Color(next_color.
r, next_color.
g, next_color.
b, next_color.
w);
136 esp_color = esp_color.
gradient(next_esp_color, gradient);
158 std::vector<AddressableColorWipeEffectColor>
colors_;
178 if (this->
at_led_ == it.
size() - this->scan_width_)
189 it[this->
at_led_ + i] = current_color;
214 for (
auto view : addressable) {
215 if (view.get_effect_data() != 0) {
216 const uint8_t sine = half_sin8(view.get_effect_data());
217 view = current_color * sine;
218 const uint8_t new_pos = view.get_effect_data() + pos_add;
219 if (new_pos < view.get_effect_data()) {
220 view.set_effect_data(0);
222 view.set_effect_data(new_pos);
230 if (addressable[pos].get_effect_data() != 0)
232 addressable[pos].set_effect_data(1);
256 for (
auto view : it) {
257 if (view.get_effect_data() != 0) {
258 const uint8_t
x = (view.get_effect_data() >> 3) & 0b11111;
259 const uint8_t color = view.get_effect_data() & 0b111;
260 const uint16_t sine = half_sin8((
x << 3) | subsine);
262 view = current_color * sine;
264 view =
Color(((color >> 2) & 1) * sine, ((color >> 1) & 1) * sine, ((color >> 0) & 1) * sine);
266 const uint8_t new_x =
x + pos_add;
267 if (new_x > 0b11111) {
268 view.set_effect_data(0);
270 view.set_effect_data((new_x << 3) | color);
273 view =
Color(0, 0, 0, 0);
278 if (it[pos].get_effect_data() != 0)
281 it[pos].set_effect_data(0b1000 | color);
308 for (
auto view : it) {
309 Color target = view.get() * fade_out_mult;
314 int last = it.
size() - 1;
315 it[0].set(it[0].get() + (it[1].get() * 128));
316 for (
int i = 1; i < last; i++) {
317 it[i] = (it[i - 1].
get() * 64) + it[i].
get() + (it[i + 1].
get() * 64);
319 it[last] = it[last].
get() + (it[last - 1].
get() * 128);
325 it[pos] = current_color;
349 const uint8_t inv_intensity = 255 - intensity;
355 for (
auto var : it) {
356 rng_state = (rng_state * 0x9E3779B9) + 0x9E37;
357 const uint8_t flicker = (rng_state & 0xFF) % intensity;
359 var = var.get() * (255 - flicker);
362 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_
uint32_t get_effect_index() const
Get effect index specifically for addressable effects.
virtual void apply(AddressableLight &it, const Color ¤t_color)=0
AddressableLight * get_addressable_() const
AddressableLightEffect(const std::string &name)
void start_internal() override
bool is_current_effect() const
Check if this is the currently running addressable effect.
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
bool is_effect_active() const
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.
uint32_t get_index() const
Get the index of this effect in the parent light's effect list.
bool is_active() const
Check if this effect is currently active.
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...
FLAG_HAS_TRANSITION float
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)