109 lines
3.2 KiB
C
109 lines
3.2 KiB
C
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
||
|
|
#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;
|
||
|
|
}
|