[template.lock] Avoid heap allocation for triggers

This commit is contained in:
J. Nick Koston
2026-02-02 04:37:14 +01:00
parent 1ff2f3b6a3
commit 54aee071ec
2 changed files with 13 additions and 17 deletions

View File

@@ -7,8 +7,7 @@ using namespace esphome::lock;
static const char *const TAG = "template.lock";
TemplateLock::TemplateLock()
: lock_trigger_(new Trigger<>()), unlock_trigger_(new Trigger<>()), open_trigger_(new Trigger<>()) {}
TemplateLock::TemplateLock() = default;
void TemplateLock::setup() {
if (!this->f_.has_value())
@@ -28,11 +27,11 @@ void TemplateLock::control(const lock::LockCall &call) {
auto state = *call.get_state();
if (state == LOCK_STATE_LOCKED) {
this->prev_trigger_ = this->lock_trigger_;
this->lock_trigger_->trigger();
this->prev_trigger_ = &this->lock_trigger_;
this->lock_trigger_.trigger();
} else if (state == LOCK_STATE_UNLOCKED) {
this->prev_trigger_ = this->unlock_trigger_;
this->unlock_trigger_->trigger();
this->prev_trigger_ = &this->unlock_trigger_;
this->unlock_trigger_.trigger();
}
if (this->optimistic_)
@@ -42,14 +41,11 @@ void TemplateLock::open_latch() {
if (this->prev_trigger_ != nullptr) {
this->prev_trigger_->stop_action();
}
this->prev_trigger_ = this->open_trigger_;
this->open_trigger_->trigger();
this->prev_trigger_ = &this->open_trigger_;
this->open_trigger_.trigger();
}
void TemplateLock::set_optimistic(bool optimistic) { this->optimistic_ = optimistic; }
float TemplateLock::get_setup_priority() const { return setup_priority::HARDWARE; }
Trigger<> *TemplateLock::get_lock_trigger() const { return this->lock_trigger_; }
Trigger<> *TemplateLock::get_unlock_trigger() const { return this->unlock_trigger_; }
Trigger<> *TemplateLock::get_open_trigger() const { return this->open_trigger_; }
void TemplateLock::dump_config() {
LOG_LOCK("", "Template Lock", this);
ESP_LOGCONFIG(TAG, " Optimistic: %s", YESNO(this->optimistic_));

View File

@@ -15,9 +15,9 @@ class TemplateLock final : public lock::Lock, public Component {
void dump_config() override;
template<typename F> void set_state_lambda(F &&f) { this->f_.set(std::forward<F>(f)); }
Trigger<> *get_lock_trigger() const;
Trigger<> *get_unlock_trigger() const;
Trigger<> *get_open_trigger() const;
Trigger<> *get_lock_trigger() { return &this->lock_trigger_; }
Trigger<> *get_unlock_trigger() { return &this->unlock_trigger_; }
Trigger<> *get_open_trigger() { return &this->open_trigger_; }
void set_optimistic(bool optimistic);
void loop() override;
@@ -29,9 +29,9 @@ class TemplateLock final : public lock::Lock, public Component {
TemplateLambda<lock::LockState> f_;
bool optimistic_{false};
Trigger<> *lock_trigger_;
Trigger<> *unlock_trigger_;
Trigger<> *open_trigger_;
Trigger<> lock_trigger_;
Trigger<> unlock_trigger_;
Trigger<> open_trigger_;
Trigger<> *prev_trigger_{nullptr};
};