#include #include #include "event.h" #include "freertos/FreeRTOS.h" #include "freertos/event_groups.h" #include "freertos/task.h" #include "freertos/queue.h" #include "esp_log.h" EventGroupHandle_t system_event_group = NULL; QueueHandle_t system_event_queue = NULL; bool init_event_system(void) { // 检查是否已经初始化 if (system_event_group != NULL) { ESP_LOGW("EVENT", "Event system already initialized"); return true; } // 创建事件组 system_event_group = xEventGroupCreate(); if (system_event_group == NULL) { ESP_LOGE("EVENT", "Failed to create event group"); return false; } // 创建事件队列(BLE 回调等通过队列投递,避免在回调中直接操作事件组/任务通知) system_event_queue = xQueueCreate(8, sizeof(uint32_t)); if (system_event_queue == NULL) { ESP_LOGE("EVENT", "Failed to create event queue"); vEventGroupDelete(system_event_group); system_event_group = NULL; return false; } ESP_LOGI("EVENT", "Event system initialized (group + queue)"); return true; } // 清理函数 void deinit_event_system(void) { if (system_event_queue != NULL) { vQueueDelete(system_event_queue); system_event_queue = NULL; } if (system_event_group != NULL) { vEventGroupDelete(system_event_group); system_event_group = NULL; } ESP_LOGI("EVENT", "Event system deinitialized"); } void set_system_event(uint32_t bits) { ESP_LOGI("EVENT", "[DEBUG] set_system_event(0x%lX) group=%p queue=%p main_handle=%p", (unsigned long)bits, (void *)system_event_group, (void *)system_event_queue, (void *)main_task_handle); if (system_event_group) { xEventGroupSetBits(system_event_group, bits); } /* 通过队列投递,main_task 阻塞接收,避免 BLE 回调上下文限制导致事件丢失 */ if (system_event_queue) { UBaseType_t q_waiting = uxQueueMessagesWaiting(system_event_queue); UBaseType_t q_spaces = uxQueueSpacesAvailable(system_event_queue); ESP_LOGI("EVENT", "[DEBUG] queue before send: pending=%u, spaces=%u", (unsigned)q_waiting, (unsigned)q_spaces); BaseType_t ok = xQueueSend(system_event_queue, &bits, 0); ESP_LOGI("EVENT", "[DEBUG] xQueueSend result=%d (1=ok, 0=full)", (int)ok); if (!ok) { ESP_LOGE("EVENT", "Event queue FULL! bits=0x%lX DROPPED! pending=%u", (unsigned long)bits, (unsigned)q_waiting); } } else { ESP_LOGW("EVENT", "[DEBUG] system_event_queue is NULL!"); } if (main_task_handle) { xTaskNotify(main_task_handle, bits, eSetBits); } else { ESP_LOGW("EVENT", "[DEBUG] main_task_handle is NULL!"); } } void clear_system_event(uint32_t bits) { if (system_event_group) { xEventGroupClearBits(system_event_group, bits); } } uint32_t wait_system_event(uint32_t bits, TickType_t timeout) { if (system_event_group) { return xEventGroupWaitBits(system_event_group, bits, pdTRUE, pdFALSE, timeout); } return 0; }