mirror of
https://github.com/esphome/esphome.git
synced 2025-10-26 20:53:50 +00:00
[light] Decouple AddressableLight and Light transition classes (#11166)
Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
@@ -62,7 +62,7 @@ void AddressableLightTransformer::start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
optional<LightColorValues> AddressableLightTransformer::apply() {
|
optional<LightColorValues> AddressableLightTransformer::apply() {
|
||||||
float smoothed_progress = LightTransitionTransformer::smoothed_progress(this->get_progress_());
|
float smoothed_progress = LightTransformer::smoothed_progress(this->get_progress_());
|
||||||
|
|
||||||
// When running an output-buffer modifying effect, don't try to transition individual LEDs, but instead just fade the
|
// When running an output-buffer modifying effect, don't try to transition individual LEDs, but instead just fade the
|
||||||
// LightColorValues. write_state() then picks up the change in brightness, and the color change is picked up by the
|
// LightColorValues. write_state() then picks up the change in brightness, and the color change is picked up by the
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include "esphome/core/defines.h"
|
#include "esphome/core/defines.h"
|
||||||
#include "light_output.h"
|
#include "light_output.h"
|
||||||
#include "light_state.h"
|
#include "light_state.h"
|
||||||
#include "transformers.h"
|
#include "light_transformer.h"
|
||||||
|
|
||||||
#ifdef USE_POWER_SUPPLY
|
#ifdef USE_POWER_SUPPLY
|
||||||
#include "esphome/components/power_supply/power_supply.h"
|
#include "esphome/components/power_supply/power_supply.h"
|
||||||
@@ -103,7 +103,7 @@ class AddressableLight : public LightOutput, public Component {
|
|||||||
bool effect_active_{false};
|
bool effect_active_{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
class AddressableLightTransformer : public LightTransitionTransformer {
|
class AddressableLightTransformer : public LightTransformer {
|
||||||
public:
|
public:
|
||||||
AddressableLightTransformer(AddressableLight &light) : light_(light) {}
|
AddressableLightTransformer(AddressableLight &light) : light_(light) {}
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ class LightTransformer {
|
|||||||
const LightColorValues &get_target_values() const { return this->target_values_; }
|
const LightColorValues &get_target_values() const { return this->target_values_; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// This looks crazy, but it reduces to 6x^5 - 15x^4 + 10x^3 which is just a smooth sigmoid-like
|
||||||
|
// transition from 0 to 1 on x = [0, 1]
|
||||||
|
static float smoothed_progress(float x) { return x * x * x * (x * (x * 6.0f - 15.0f) + 10.0f); }
|
||||||
|
|
||||||
/// The progress of this transition, on a scale of 0 to 1.
|
/// The progress of this transition, on a scale of 0 to 1.
|
||||||
float get_progress_() {
|
float get_progress_() {
|
||||||
uint32_t now = esphome::millis();
|
uint32_t now = esphome::millis();
|
||||||
|
|||||||
@@ -50,15 +50,11 @@ class LightTransitionTransformer : public LightTransformer {
|
|||||||
if (this->changing_color_mode_)
|
if (this->changing_color_mode_)
|
||||||
p = p < 0.5f ? p * 2 : (p - 0.5) * 2;
|
p = p < 0.5f ? p * 2 : (p - 0.5) * 2;
|
||||||
|
|
||||||
float v = LightTransitionTransformer::smoothed_progress(p);
|
float v = LightTransformer::smoothed_progress(p);
|
||||||
return LightColorValues::lerp(start, end, v);
|
return LightColorValues::lerp(start, end, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// This looks crazy, but it reduces to 6x^5 - 15x^4 + 10x^3 which is just a smooth sigmoid-like
|
|
||||||
// transition from 0 to 1 on x = [0, 1]
|
|
||||||
static float smoothed_progress(float x) { return x * x * x * (x * (x * 6.0f - 15.0f) + 10.0f); }
|
|
||||||
|
|
||||||
LightColorValues end_values_{};
|
LightColorValues end_values_{};
|
||||||
LightColorValues intermediate_values_{};
|
LightColorValues intermediate_values_{};
|
||||||
bool changing_color_mode_{false};
|
bool changing_color_mode_{false};
|
||||||
|
|||||||
Reference in New Issue
Block a user