1+ #include " device_state_event.h"
2+
3+ ESP_EVENT_DEFINE_BASE (XIAOZHI_STATE_EVENTS);
4+
5+ DeviceStateEventManager& DeviceStateEventManager::GetInstance () {
6+ static DeviceStateEventManager instance;
7+ return instance;
8+ }
9+
10+ void DeviceStateEventManager::RegisterStateChangeCallback (std::function<void (DeviceState, DeviceState)> callback) {
11+ std::lock_guard<std::mutex> lock (mutex_);
12+ callbacks_.push_back (callback);
13+ }
14+
15+ void DeviceStateEventManager::PostStateChangeEvent (DeviceState previous_state, DeviceState current_state) {
16+ device_state_event_data_t event_data = {
17+ .previous_state = previous_state,
18+ .current_state = current_state
19+ };
20+ esp_event_post (XIAOZHI_STATE_EVENTS, XIAOZHI_STATE_CHANGED_EVENT, &event_data, sizeof (event_data), portMAX_DELAY);
21+ }
22+
23+ std::vector<std::function<void (DeviceState, DeviceState)>> DeviceStateEventManager::GetCallbacks () {
24+ std::lock_guard<std::mutex> lock (mutex_);
25+ return callbacks_;
26+ }
27+
28+ DeviceStateEventManager::DeviceStateEventManager () {
29+ esp_err_t err = esp_event_loop_create_default ();
30+ if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
31+ ESP_ERROR_CHECK (err);
32+ }
33+
34+ ESP_ERROR_CHECK (esp_event_handler_register (XIAOZHI_STATE_EVENTS, XIAOZHI_STATE_CHANGED_EVENT,
35+ [](void * handler_args, esp_event_base_t base, int32_t id, void * event_data) {
36+ auto * data = static_cast <device_state_event_data_t *>(event_data);
37+ auto & manager = DeviceStateEventManager::GetInstance ();
38+ for (const auto & callback : manager.GetCallbacks ()) {
39+ callback (data->previous_state , data->current_state );
40+ }
41+ }, nullptr ));
42+ }
43+
44+ DeviceStateEventManager::~DeviceStateEventManager () {
45+ esp_event_handler_unregister (XIAOZHI_STATE_EVENTS, XIAOZHI_STATE_CHANGED_EVENT, nullptr );
46+ }
0 commit comments