mirror of
https://github.com/esphome/esphome.git
synced 2024-12-21 16:27:44 +01:00
Add transitions to light flash (#2201)
This commit is contained in:
parent
54337befc2
commit
ea1b5e19f0
@ -7,6 +7,7 @@ from esphome.const import (
|
|||||||
CONF_DEFAULT_TRANSITION_LENGTH,
|
CONF_DEFAULT_TRANSITION_LENGTH,
|
||||||
CONF_DISABLED_BY_DEFAULT,
|
CONF_DISABLED_BY_DEFAULT,
|
||||||
CONF_EFFECTS,
|
CONF_EFFECTS,
|
||||||
|
CONF_FLASH_TRANSITION_LENGTH,
|
||||||
CONF_GAMMA_CORRECT,
|
CONF_GAMMA_CORRECT,
|
||||||
CONF_ID,
|
CONF_ID,
|
||||||
CONF_INTERNAL,
|
CONF_INTERNAL,
|
||||||
@ -85,6 +86,9 @@ BRIGHTNESS_ONLY_LIGHT_SCHEMA = LIGHT_SCHEMA.extend(
|
|||||||
cv.Optional(
|
cv.Optional(
|
||||||
CONF_DEFAULT_TRANSITION_LENGTH, default="1s"
|
CONF_DEFAULT_TRANSITION_LENGTH, default="1s"
|
||||||
): cv.positive_time_period_milliseconds,
|
): cv.positive_time_period_milliseconds,
|
||||||
|
cv.Optional(
|
||||||
|
CONF_FLASH_TRANSITION_LENGTH, default="0s"
|
||||||
|
): cv.positive_time_period_milliseconds,
|
||||||
cv.Optional(CONF_EFFECTS): validate_effects(MONOCHROMATIC_EFFECTS),
|
cv.Optional(CONF_EFFECTS): validate_effects(MONOCHROMATIC_EFFECTS),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@ -132,6 +136,10 @@ async def setup_light_core_(light_var, output_var, config):
|
|||||||
config[CONF_DEFAULT_TRANSITION_LENGTH]
|
config[CONF_DEFAULT_TRANSITION_LENGTH]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
if CONF_FLASH_TRANSITION_LENGTH in config:
|
||||||
|
cg.add(
|
||||||
|
light_var.set_flash_transition_length(config[CONF_FLASH_TRANSITION_LENGTH])
|
||||||
|
)
|
||||||
if CONF_GAMMA_CORRECT in config:
|
if CONF_GAMMA_CORRECT in config:
|
||||||
cg.add(light_var.set_gamma_correct(config[CONF_GAMMA_CORRECT]))
|
cg.add(light_var.set_gamma_correct(config[CONF_GAMMA_CORRECT]))
|
||||||
effects = await cg.build_registry_list(
|
effects = await cg.build_registry_list(
|
||||||
|
@ -157,6 +157,11 @@ void LightState::add_new_target_state_reached_callback(std::function<void()> &&s
|
|||||||
void LightState::set_default_transition_length(uint32_t default_transition_length) {
|
void LightState::set_default_transition_length(uint32_t default_transition_length) {
|
||||||
this->default_transition_length_ = default_transition_length;
|
this->default_transition_length_ = default_transition_length;
|
||||||
}
|
}
|
||||||
|
uint32_t LightState::get_default_transition_length() const { return this->default_transition_length_; }
|
||||||
|
void LightState::set_flash_transition_length(uint32_t flash_transition_length) {
|
||||||
|
this->flash_transition_length_ = flash_transition_length;
|
||||||
|
}
|
||||||
|
uint32_t LightState::get_flash_transition_length() const { return this->flash_transition_length_; }
|
||||||
void LightState::set_gamma_correct(float gamma_correct) { this->gamma_correct_ = gamma_correct; }
|
void LightState::set_gamma_correct(float gamma_correct) { this->gamma_correct_ = gamma_correct; }
|
||||||
void LightState::set_restore_mode(LightRestoreMode restore_mode) { this->restore_mode_ = restore_mode; }
|
void LightState::set_restore_mode(LightRestoreMode restore_mode) { this->restore_mode_ = restore_mode; }
|
||||||
bool LightState::supports_effects() { return !this->effects_.empty(); }
|
bool LightState::supports_effects() { return !this->effects_.empty(); }
|
||||||
@ -234,7 +239,7 @@ void LightState::start_flash_(const LightColorValues &target, uint32_t length) {
|
|||||||
// If starting a flash if one is already happening, set end values to end values of current flash
|
// If starting a flash if one is already happening, set end values to end values of current flash
|
||||||
// Hacky but works
|
// Hacky but works
|
||||||
if (this->transformer_ != nullptr)
|
if (this->transformer_ != nullptr)
|
||||||
end_colors = this->transformer_->get_target_values();
|
end_colors = this->transformer_->get_start_values();
|
||||||
|
|
||||||
this->transformer_ = make_unique<LightFlashTransformer>(*this);
|
this->transformer_ = make_unique<LightFlashTransformer>(*this);
|
||||||
this->transformer_->setup(end_colors, target, length);
|
this->transformer_->setup(end_colors, target, length);
|
||||||
|
@ -99,6 +99,11 @@ class LightState : public Nameable, public Component {
|
|||||||
|
|
||||||
/// Set the default transition length, i.e. the transition length when no transition is provided.
|
/// Set the default transition length, i.e. the transition length when no transition is provided.
|
||||||
void set_default_transition_length(uint32_t default_transition_length);
|
void set_default_transition_length(uint32_t default_transition_length);
|
||||||
|
uint32_t get_default_transition_length() const;
|
||||||
|
|
||||||
|
/// Set the flash transition length
|
||||||
|
void set_flash_transition_length(uint32_t flash_transition_length);
|
||||||
|
uint32_t get_flash_transition_length() const;
|
||||||
|
|
||||||
/// Set the gamma correction factor
|
/// Set the gamma correction factor
|
||||||
void set_gamma_correct(float gamma_correct);
|
void set_gamma_correct(float gamma_correct);
|
||||||
@ -188,6 +193,8 @@ class LightState : public Nameable, public Component {
|
|||||||
|
|
||||||
/// Default transition length for all transitions in ms.
|
/// Default transition length for all transitions in ms.
|
||||||
uint32_t default_transition_length_{};
|
uint32_t default_transition_length_{};
|
||||||
|
/// Transition length to use for flash transitions.
|
||||||
|
uint32_t flash_transition_length_{};
|
||||||
/// Gamma correction factor for the light.
|
/// Gamma correction factor for the light.
|
||||||
float gamma_correct_{};
|
float gamma_correct_{};
|
||||||
/// Restore mode of the light.
|
/// Restore mode of the light.
|
||||||
|
@ -58,7 +58,45 @@ class LightFlashTransformer : public LightTransformer {
|
|||||||
public:
|
public:
|
||||||
LightFlashTransformer(LightState &state) : state_(state) {}
|
LightFlashTransformer(LightState &state) : state_(state) {}
|
||||||
|
|
||||||
optional<LightColorValues> apply() override { return this->get_target_values(); }
|
void start() override {
|
||||||
|
this->transition_length_ = this->state_.get_flash_transition_length();
|
||||||
|
if (this->transition_length_ * 2 > this->length_)
|
||||||
|
this->transition_length_ = this->length_ / 2;
|
||||||
|
|
||||||
|
// do not create transition if length is 0
|
||||||
|
if (this->transition_length_ == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// first transition to original target
|
||||||
|
this->transformer_ = this->state_.get_output()->create_default_transition();
|
||||||
|
this->transformer_->setup(this->state_.current_values, this->target_values_, this->transition_length_);
|
||||||
|
}
|
||||||
|
|
||||||
|
optional<LightColorValues> apply() override {
|
||||||
|
// transition transformer does not handle 0 length as progress returns nan
|
||||||
|
if (this->transition_length_ == 0)
|
||||||
|
return this->target_values_;
|
||||||
|
|
||||||
|
if (this->transformer_ != nullptr) {
|
||||||
|
if (!this->transformer_->is_finished()) {
|
||||||
|
return this->transformer_->apply();
|
||||||
|
} else {
|
||||||
|
this->transformer_->stop();
|
||||||
|
this->transformer_ = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (millis() > this->start_time_ + this->length_ - this->transition_length_ &&
|
||||||
|
!this->secondary_transition_occurred_) {
|
||||||
|
// second transition back to start value
|
||||||
|
this->transformer_ = this->state_.get_output()->create_default_transition();
|
||||||
|
this->transformer_->setup(this->state_.current_values, this->get_start_values(), this->transition_length_);
|
||||||
|
this->secondary_transition_occurred_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// once transition is complete, don't change states until next transition
|
||||||
|
return optional<LightColorValues>();
|
||||||
|
}
|
||||||
|
|
||||||
// Restore the original values after the flash.
|
// Restore the original values after the flash.
|
||||||
void stop() override {
|
void stop() override {
|
||||||
@ -69,6 +107,9 @@ class LightFlashTransformer : public LightTransformer {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
LightState &state_;
|
LightState &state_;
|
||||||
|
uint32_t transition_length_;
|
||||||
|
bool secondary_transition_occurred_{false};
|
||||||
|
std::unique_ptr<LightTransformer> transformer_{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace light
|
} // namespace light
|
||||||
|
@ -42,7 +42,7 @@ void PowerSupply::request_high_power() {
|
|||||||
void PowerSupply::unrequest_high_power() {
|
void PowerSupply::unrequest_high_power() {
|
||||||
this->active_requests_--;
|
this->active_requests_--;
|
||||||
if (this->active_requests_ < 0) {
|
if (this->active_requests_ < 0) {
|
||||||
// we're just going to use 0 as our now counter.
|
// we're just going to use 0 as our new counter.
|
||||||
this->active_requests_ = 0;
|
this->active_requests_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +241,7 @@ CONF_FILTERS = "filters"
|
|||||||
CONF_FINGER_ID = "finger_id"
|
CONF_FINGER_ID = "finger_id"
|
||||||
CONF_FINGERPRINT_COUNT = "fingerprint_count"
|
CONF_FINGERPRINT_COUNT = "fingerprint_count"
|
||||||
CONF_FLASH_LENGTH = "flash_length"
|
CONF_FLASH_LENGTH = "flash_length"
|
||||||
|
CONF_FLASH_TRANSITION_LENGTH = "flash_transition_length"
|
||||||
CONF_FLOW_CONTROL_PIN = "flow_control_pin"
|
CONF_FLOW_CONTROL_PIN = "flow_control_pin"
|
||||||
CONF_FOR = "for"
|
CONF_FOR = "for"
|
||||||
CONF_FORCE_UPDATE = "force_update"
|
CONF_FORCE_UPDATE = "force_update"
|
||||||
|
Loading…
Reference in New Issue
Block a user