| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- /**
- *****************************************************************************
- * @file zf_event.c
- * @author Zorb
- * @version V1.0.0
- * @date 2018-06-28
- * @brief 事件和事件处理器的实现
- *****************************************************************************
- * @history
- *
- * 1. Date:2018-06-28
- * Author:Zorb
- * Modification:建立文件
- *
- *****************************************************************************
- */
- #include "zf_event.h"
- #include "zf_assert.h"
- #include "zf_debug.h"
- #include "zf_malloc.h"
- #include "zf_critical.h"
- /******************************************************************************
- * 描述 :创建事件
- * 参数 :(out)-ppEvent 事件指针的指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Event_create(Event **ppEvent)
- {
- Event *pEvent;
-
- ZF_ASSERT(ppEvent != (Event **)0)
-
- /* 分配空间 */
- pEvent = ZF_MALLOC(sizeof(Event));
- if (pEvent == NULL)
- {
- ZF_DEBUG(LOG_E, "malloc event space error\r\n");
- return false;
- }
-
- /* 初始化成员 */
- pEvent->Priority = EVENT_LOWEST_PRIORITY;
- pEvent->EventProcess = NULL;
- pEvent->pArgList = NULL;
-
- /* 初始化方法 */
- pEvent->AddArg = Event_addArg;
- pEvent->Dispose = Event_Dispose;
-
- /* 输出 */
- *ppEvent = pEvent;
-
- return true;
- }
- /******************************************************************************
- * 描述 :增加事件参数(深拷贝,按先后顺序入队列)
- * 参数 :(in)-pEvent 事件指针
- * (in)-pArg 要增加的参数
- * (in)-size 要增加的大小
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Event_addArg(Event * const pEvent, void *pArg, uint32_t size)
- {
- ListNode *pNode;
- void *pData;
-
- ZF_ASSERT(pEvent != (Event *)0)
- ZF_ASSERT(pArg != (void *)0)
- ZF_ASSERT(size > 0)
-
- /* 创建参数列表 */
- if (pEvent->pArgList == NULL)
- {
- List_create(&pEvent->pArgList);
-
- if (pEvent->pArgList == NULL)
- {
- ZF_DEBUG(LOG_E, "malloc event arg list space error\r\n");
-
- return false;
- }
- }
-
- /* 创建参数节点 */
- if (!List_mallocNode(&pNode, &pData, size))
- {
- ZF_DEBUG(LOG_E, "malloc event arg node space error\r\n");
-
- return false;
- }
-
- /* 深拷贝参数数据 */
- ZF_MEMCPY(pData, pArg, size);
-
- /* 添加到参数列表 */
- if (!pEvent->pArgList->Add(pEvent->pArgList, pNode))
- {
- ZF_DEBUG(LOG_E, "add event arg node into event arg list error\r\n");
-
- return false;
- }
-
- return true;
- }
- /******************************************************************************
- * 描述 :销毁事件(程序参数也同步销毁)
- * 参数 :(in)-pEvent 事件指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Event_Dispose(Event * const pEvent)
- {
- ZF_ASSERT(pEvent != (Event *)0)
-
- /* 销毁参数列表 */
- if (pEvent->pArgList != NULL)
- {
- pEvent->pArgList->Dispose(pEvent->pArgList);
- }
-
- ZF_FREE(pEvent);
-
- return true;
- }
- /******************************************************************************
- * 描述 :创建事件处理器
- * 参数 :(out)-ppEventHandler 事件处理器指针的指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool EventHandler_create(EventHandler **ppEventHandler)
- {
- EventHandler *pEventHandler;
-
- ZF_ASSERT(ppEventHandler != (EventHandler **)0)
-
- /* 分配空间 */
- pEventHandler = ZF_MALLOC(sizeof(EventHandler));
- if (pEventHandler == NULL)
- {
- ZF_DEBUG(LOG_E, "malloc event handler space error\r\n");
- return false;
- }
-
- /* 初始化成员 */
- pEventHandler->pEventList = NULL;
- pEventHandler->IsRunning = true;
-
- /* 初始化方法 */
- pEventHandler->GetEventCount = EventHandler_getEventCount;
- pEventHandler->Add = EventHandler_add;
- pEventHandler->Delete = EventHandler_delete;
- pEventHandler->Clear = EventHandler_clear;
- pEventHandler->Dispose = EventHandler_dispose;
- pEventHandler->Execute = EventHandler_execute;
-
- /* 输出 */
- *ppEventHandler = pEventHandler;
-
- return true;
- }
- /******************************************************************************
- * 描述 :获取事件数
- * 参数 :(in)-pEventHandler 事件处理器指针
- * 返回 :事件数
- ******************************************************************************/
- uint32_t EventHandler_getEventCount(EventHandler * const pEventHandler)
- {
- ZF_ASSERT(pEventHandler != (EventHandler *)0)
-
- if (pEventHandler->pEventList == NULL)
- {
- return 0;
- }
- else
- {
- return pEventHandler->pEventList->Count;
- }
- }
- /******************************************************************************
- * 描述 :增加事件(按优先级排序)
- * 参数 :(in)-pEventHandler 事件处理器指针
- * (in)-pEvent 事件指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool EventHandler_add(EventHandler * const pEventHandler, Event *pEvent)
- {
- /* SR变量 */
- ZF_SR_VAL();
-
- ListNode *pNode;
- uint32_t i;
- uint32_t index; /* 插入事件位置索引 */
-
- ZF_ASSERT(pEventHandler != (EventHandler *)0)
- ZF_ASSERT(pEvent != (Event *)0)
-
- /* 创建事件列表 */
- if (pEventHandler->pEventList == NULL)
- {
- List_create(&pEventHandler->pEventList);
-
- if (pEventHandler->pEventList == NULL)
- {
- ZF_DEBUG(LOG_E, "malloc event list space error\r\n");
-
- return false;
- }
- }
-
- /* 创建事件节点 */
- if (!List_mallocNode(&pNode, NULL, 0))
- {
- ZF_DEBUG(LOG_E, "malloc event node space error\r\n");
-
- return false;
- }
-
- pNode->pData = (void *)pEvent;
- pNode->Size = sizeof(Event);
-
- /* 按优先级排序 */
- index = pEventHandler->pEventList->Count;
-
- for (i = 0; i < pEventHandler->pEventList->Count; i++)
- {
- if (pEvent->Priority < ((Event *)pEventHandler->pEventList
- ->GetElementDataAt(pEventHandler->pEventList, i))->Priority)
- {
- index = i;
- break;
- }
- }
-
- /* 进入临界区 */
- ZF_CRITICAL_ENTER();
-
- /* 添加到事件列表 */
- if (!pEventHandler->pEventList
- ->AddElementAt(pEventHandler->pEventList, index, pNode))
- {
- ZF_DEBUG(LOG_E, "add event node into event list error\r\n");
-
- /* 退出临界区 */
- ZF_CRITICAL_EXIT();
-
- return false;
- }
-
- /* 退出临界区 */
- ZF_CRITICAL_EXIT();
-
- return true;
- }
- /******************************************************************************
- * 描述 :删除事件(释放空间)
- * 参数 :(in)-pEventHandler 事件处理器指针
- * (in)-pEvent 事件指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool EventHandler_delete(EventHandler * const pEventHandler, Event *pEvent)
- {
- /* SR变量 */
- ZF_SR_VAL();
-
- ListNode *pNode;
-
- ZF_ASSERT(pEventHandler != (EventHandler *)0)
- ZF_ASSERT(pEvent != (Event *)0)
-
- if (pEventHandler->pEventList == NULL ||
- pEventHandler->pEventList->Count == 0)
- {
- return false;
- }
-
- /* 进入临界区 */
- ZF_CRITICAL_ENTER();
-
- /* 移除事件 */
- while(pEventHandler->pEventList
- ->GetElementByData(pEventHandler->pEventList, pEvent, &pNode))
- {
- if (pNode == NULL)
- {
- break;
- }
-
- if (!pEventHandler->pEventList->Delete(pEventHandler->pEventList, pNode))
- {
- ZF_DEBUG(LOG_E, "delete event node from list error\r\n");
-
- break;
- }
- }
-
- /* 退出临界区 */
- ZF_CRITICAL_EXIT();
-
- pEvent->Dispose(pEvent);
-
- return true;
- }
- /******************************************************************************
- * 描述 :清空事件列表(释放空间)
- * 参数 :(in)-pEventHandler 事件处理器指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool EventHandler_clear(EventHandler * const pEventHandler)
- {
- /* SR变量 */
- ZF_SR_VAL();
-
- /* 返回结果 */
- bool res = true;
-
- uint32_t i;
- Event *pEvent;
-
- ZF_ASSERT(pEventHandler != (EventHandler *)0)
-
- if (pEventHandler->pEventList == NULL ||
- pEventHandler->pEventList->Count == 0)
- {
- return true;
- }
-
- /* 进入临界区 */
- ZF_CRITICAL_ENTER();
-
- for (i = 0; i < pEventHandler->pEventList->Count; i++)
- {
- /* 释放所有事件 */
- pEvent = (Event *)pEventHandler->pEventList
- ->GetElementDataAt(pEventHandler->pEventList, i);
-
- pEvent->Dispose(pEvent);
- }
-
- res = pEventHandler->pEventList->Clear(pEventHandler->pEventList);
-
- /* 退出临界区 */
- ZF_CRITICAL_EXIT();
-
- return res;
- }
- /******************************************************************************
- * 描述 :销毁事件处理器(释放空间)
- * 参数 :(in)-pEventHandler 事件处理器指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool EventHandler_dispose(EventHandler * const pEventHandler)
- {
- /* SR变量 */
- ZF_SR_VAL();
-
- ZF_ASSERT(pEventHandler != (EventHandler *)0)
-
- /* 进入临界区 */
- ZF_CRITICAL_ENTER();
-
- /* 清空事件列表(释放空间) */
- EventHandler_clear(pEventHandler);
-
- pEventHandler->pEventList->Dispose(pEventHandler->pEventList);
-
- pEventHandler->pEventList = NULL;
-
- /* 退出临界区 */
- ZF_CRITICAL_EXIT();
-
- ZF_FREE(pEventHandler);
-
- return true;
- }
- /******************************************************************************
- * 描述 :执行事件(按列表位置)
- * 参数 :(in)-pEventHandler 事件处理器指针
- * 返回 :无
- ******************************************************************************/
- void EventHandler_execute(EventHandler * const pEventHandler)
- {
- /* SR变量 */
- ZF_SR_VAL();
-
- Event *pEvent;
-
- ZF_ASSERT(pEventHandler != (EventHandler *)0)
-
- /* 没有运行则退出 */
- if (!pEventHandler->IsRunning)
- {
- return;
- }
-
- /* 没有事件则退出 */
- if (pEventHandler->pEventList == NULL
- || pEventHandler->pEventList->Count == 0)
- {
- return;
- }
-
- /* 进入临界区 */
- ZF_CRITICAL_ENTER();
-
- pEvent = (Event *)pEventHandler->pEventList
- ->GetElementDataAt(pEventHandler->pEventList, 0);
-
- /* 退出临界区 */
- ZF_CRITICAL_EXIT();
-
- if (pEvent == NULL || pEvent->EventProcess == NULL)
- {
- ZF_DEBUG(LOG_E, "event handler execute error:event is null\r\n");
- while(1);
- }
-
- pEvent->EventProcess(pEvent->pArgList);
-
- EventHandler_delete(pEventHandler, pEvent);
- }
- /******************************** END OF FILE ********************************/
|