增加事件驱动和业务回滚处理方式

This commit is contained in:
冯佳
2026-03-04 08:50:04 +08:00
parent cc4c361df6
commit 47a9dff6ef
25 changed files with 2626 additions and 1780 deletions

131
app/event_handler.c Normal file
View File

@ -0,0 +1,131 @@
/*
* event_handler.c
*
* Created on: 2026-03-04
* Author: RT-Thread
*
* 功能: 事件处理器模块实现
* 依赖: RT-Thread Nano, osal, event_queue
* 跨平台适配: 基于RT-Thread Nano使用标准API
*/
#include <rtthread.h>
#include "osal.h"
#include "event_queue.h"
#include "event_handler.h"
/* 事件处理器数组 */
static event_handler_t g_event_handlers[EVENT_TYPE_MAX];
/**
* @brief 初始化事件处理器
* @return 0 成功非0 失败
*/
int event_handler_init(void)
{
/* 初始化事件处理器数组 */
for (int i = 0; i < EVENT_TYPE_MAX; i++)
{
g_event_handlers[i].handler = NULL;
g_event_handlers[i].user_data = NULL;
}
osal_log_i("Event handler initialized");
return 0;
}
/**
* @brief 注册事件处理器
* @param type 事件类型
* @param handler 事件处理函数
* @param user_data 用户数据
* @return 0 成功非0 失败
*/
int event_handler_register(event_type_t type, event_handler_func_t handler, void *user_data)
{
if (type < 0 || type >= EVENT_TYPE_MAX)
{
return -1;
}
if (handler == NULL)
{
return -1;
}
g_event_handlers[type].handler = handler;
g_event_handlers[type].user_data = user_data;
osal_log_i("Event handler registered for type %d", type);
return 0;
}
/**
* @brief 注销事件处理器
* @param type 事件类型
* @return 0 成功非0 失败
*/
int event_handler_unregister(event_type_t type)
{
if (type < 0 || type >= EVENT_TYPE_MAX)
{
return -1;
}
g_event_handlers[type].handler = NULL;
g_event_handlers[type].user_data = NULL;
osal_log_i("Event handler unregistered for type %d", type);
return 0;
}
/**
* @brief 处理事件
* @param event 事件指针
* @return 0 成功非0 失败
*/
int event_handler_process(event_t *event)
{
if (event == NULL)
{
return -1;
}
event_type_t type = event->type;
if (type < 0 || type >= EVENT_TYPE_MAX)
{
osal_log_w("Invalid event type: %d", type);
return -1;
}
event_handler_t *handler = &g_event_handlers[type];
if (handler->handler != NULL)
{
osal_log_d("Processing event type %d", type);
return handler->handler(event, handler->user_data);
}
else
{
osal_log_d("No handler registered for event type %d", type);
return -1;
}
}
/**
* @brief 事件分发线程
* @param parameter 线程参数
*/
void event_dispatch_thread(void *parameter)
{
event_t event;
while (1)
{
/* 从事件队列中获取事件 */
if (event_queue_pop(&event, OSAL_WAIT_FOREVER) == 0)
{
/* 处理事件 */
event_handler_process(&event);
}
}
}