device_state_event.cc 1.8 KB

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