mirror of
https://github.com/esphome/esphome.git
synced 2026-10-15 18:52:51 +00:00
37 lines
1.1 KiB
C++
37 lines
1.1 KiB
C++
#include "event.h"
|
|
#include "esphome/core/defines.h"
|
|
#include "esphome/core/controller_registry.h"
|
|
#include "esphome/core/log.h"
|
|
|
|
namespace esphome::event {
|
|
|
|
ESPHOME_LOG_TAG(TAG, "event");
|
|
|
|
void Event::trigger(const char *event_type) {
|
|
// Linear search with strcmp - faster than std::set for small datasets (1-5 items typical)
|
|
const char *found = nullptr;
|
|
for (const char *type : this->types_) {
|
|
if (strcmp(type, event_type) == 0) {
|
|
found = type;
|
|
break;
|
|
}
|
|
}
|
|
if (found == nullptr) {
|
|
ESP_LOGE(TAG, "'%s': invalid event type for trigger(): %s", LOG_STR_ARG(this->get_log_name()), event_type);
|
|
return;
|
|
}
|
|
this->last_event_type_ = found;
|
|
ESP_LOGV(TAG, "'%s' >> '%s'", LOG_STR_ARG(this->get_log_name()), this->last_event_type_);
|
|
this->event_callback_.call(StringRef(found));
|
|
#if defined(USE_EVENT) && defined(USE_CONTROLLER_REGISTRY)
|
|
ControllerRegistry::notify_event(this);
|
|
#endif
|
|
}
|
|
|
|
void Event::set_event_types_copy_(const char *const *event_types, size_t count) {
|
|
this->types_.assign_copy(event_types, count);
|
|
this->last_event_type_ = nullptr; // Reset when types change
|
|
}
|
|
|
|
} // namespace esphome::event
|