Files
P4-USB-transfer/main/EVENT/event.c
T
zhengxinandCursor 851e347cf5 初始提交卡包 USB 工程
纳入固件源码、屏幕组件、nand_xfer 工具和文档。忽略本机构建产物、sdkconfig,以及含本机路径的依赖锁。

Co-authored-by: Cursor <[email protected]>
2026-10-13 21:54:50 +08:00

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;
}