| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414 |
- /**
- *****************************************************************************
- * @file zf_fsm.c
- * @author Zorb
- * @version V1.0.0
- * @date 2018-06-28
- * @brief 有限状态机的实现
- *****************************************************************************
- * @history
- *
- * 1. Date:2018-06-28
- * Author:Zorb
- * Modification:建立文件
- *
- *****************************************************************************
- */
- #include "zf_fsm.h"
- #include "zf_assert.h"
- #include "zf_debug.h"
- #include "zf_malloc.h"
- /******************************************************************************
- * 描述 :创建状态机(内部分配空间)
- * 参数 :(out)-ppFsm 状态机指针的指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_create(Fsm ** ppFsm)
- {
- Fsm *pFsm;
-
- ZF_ASSERT(ppFsm != (Fsm **)0)
-
- /* 分配空间 */
- pFsm = ZF_MALLOC(sizeof(Fsm));
- if (pFsm == NULL)
- {
- ZF_DEBUG(LOG_E, "malloc fsm space error\r\n");
- return false;
- }
-
- /* 初始化成员 */
- pFsm->Level = 1;
- pFsm->ChildList = NULL;
- pFsm->Owner = NULL;
- pFsm->OwnerTriggerState = NULL;
- pFsm->CurrentState = NULL;
- pFsm->IsRunning = false;
-
- /* 初始化方法 */
- pFsm->SetInitialState = Fsm_setInitialState;
- pFsm->Run = Fsm_run;
- pFsm->RunAll = Fsm_runAll;
- pFsm->Stop = Fsm_stop;
- pFsm->StopAll = Fsm_stopAll;
- pFsm->Dispose = Fsm_dispose;
- pFsm->DisposeAll = Fsm_disposeAll;
- pFsm->AddChild = Fsm_addChild;
- pFsm->RemoveChild = Fsm_removeChild;
- pFsm->Dispatch = Fsm_dispatch;
- pFsm->Transfer = Fsm_transfer;
- pFsm->TransferWithEvent = Fsm_transferWithEvent;
-
- /* 输出 */
- *ppFsm = pFsm;
-
- return true;
- }
- /******************************************************************************
- * 描述 :设置状态机初始状态
- * 参数 :(in)-pFsm 状态机指针
- * (in)-initialState 状态机初始状态
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- void Fsm_setInitialState(Fsm * const pFsm, IFsmState initialState)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
- ZF_ASSERT(initialState != (IFsmState)0)
-
- pFsm->CurrentState = initialState;
- }
- /******************************************************************************
- * 描述 :运行当前状态机
- * 参数 :(in)-pFsm 状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_run(Fsm * const pFsm)
- {
- /* 返回结果 */
- bool res = false;
-
- ZF_ASSERT(pFsm != (Fsm *)0)
-
- if (!pFsm->IsRunning)
- {
- pFsm->IsRunning = true;
-
- res = true;
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :运行当前状态机和子状态机
- * 参数 :(in)-pFsm 状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_runAll(Fsm * const pFsm)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
-
- Fsm_run(pFsm);
-
- if (pFsm->ChildList != NULL && pFsm->ChildList->Count > 0)
- {
- uint32_t i;
- Fsm * pChildFsm;
-
- for (i = 0; i < pFsm->ChildList->Count; i++)
- {
- pChildFsm = (Fsm *)pFsm->ChildList
- ->GetElementDataAt(pFsm->ChildList, i);
-
- if (pChildFsm != NULL)
- {
- Fsm_runAll(pChildFsm);
- }
- }
- }
-
- return true;
- }
- /******************************************************************************
- * 描述 :停止当前状态机
- * 参数 :(in)-pFsm 状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_stop(Fsm * const pFsm)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
-
- pFsm->IsRunning = false;
-
- return true;
- }
- /******************************************************************************
- * 描述 :停止当前状态机和子状态机
- * 参数 :(in)-pFsm 状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_stopAll(Fsm * const pFsm)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
-
- Fsm_stop(pFsm);
-
- if (pFsm->ChildList != NULL && pFsm->ChildList->Count > 0)
- {
- uint32_t i;
- Fsm * pChildFsm;
-
- for (i = 0; i < pFsm->ChildList->Count; i++)
- {
- pChildFsm = (Fsm *)pFsm->ChildList
- ->GetElementDataAt(pFsm->ChildList, i);
-
- if (pChildFsm != NULL)
- {
- Fsm_stopAll(pChildFsm);
- }
- }
- }
-
- return true;
- }
- /******************************************************************************
- * 描述 :释放当前状态机
- * 参数 :(in)-pFsm 状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_dispose(Fsm * const pFsm)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
-
- if (pFsm->ChildList != NULL)
- {
- pFsm->ChildList->Dispose(pFsm->ChildList);
- }
-
- ZF_FREE(pFsm);
-
- return true;
- }
- /******************************************************************************
- * 描述 :释放当前状态机和子状态机
- * 参数 :(in)-pFsm 状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_disposeAll(Fsm * const pFsm)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
-
- if (pFsm->ChildList != NULL && pFsm->ChildList->Count > 0)
- {
- uint32_t i;
- Fsm * pChildFsm;
-
- for (i = 0; i < pFsm->ChildList->Count; i++)
- {
- pChildFsm = (Fsm *)pFsm->ChildList
- ->GetElementDataAt(pFsm->ChildList, i);
-
- if (pChildFsm != NULL)
- {
- Fsm_disposeAll(pChildFsm);
- }
- }
- }
-
- Fsm_dispose(pFsm);
-
- return true;
- }
- /******************************************************************************
- * 描述 :添加子状态机
- * 参数 :(in)-pFsm 状态机指针
- * (in)-pChildFsm 子状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_addChild(Fsm * const pFsm, Fsm * const pChildFsm)
- {
- /* 返回结果 */
- bool res = false;
-
- List *pList;
- ListNode *pNode;
-
- ZF_ASSERT(pFsm != (Fsm *)0)
- ZF_ASSERT(pChildFsm != (Fsm *)0)
-
- if (pFsm->ChildList == NULL)
- {
- List_create(&pList);
- pFsm->ChildList = pList;
- }
-
- pList = pFsm->ChildList;
-
- if (pList != NULL)
- {
- List_mallocNode(&pNode, NULL, 0);
- if (pNode != NULL)
- {
- pNode->pData = (void *)pChildFsm;
- pNode->Size = sizeof(Fsm);
-
- pList->Add(pList, pNode);
-
- pChildFsm->Owner = pFsm;
- pChildFsm->Level = pFsm->Level + 1;
-
- res = true;
- }
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :移除子状态机(不释放空间)
- * 参数 :(in)-pFsm 状态机指针
- * (in)-pChildFsm 子状态机指针
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_removeChild(Fsm * const pFsm, Fsm * const pChildFsm)
- {
- /* 返回结果 */
- bool res = false;
-
- ZF_ASSERT(pFsm != (Fsm *)0)
- ZF_ASSERT(pChildFsm != (Fsm *)0)
-
- if (pFsm->ChildList != NULL && pFsm->ChildList->Count > 0)
- {
- ListNode *pNode;
-
- /* 移除状态机 */
- while(pFsm->ChildList
- ->GetElementByData(pFsm->ChildList, pChildFsm, &pNode))
- {
- if (pNode == NULL)
- {
- break;
- }
-
- if (!pFsm->ChildList->Delete(pFsm->ChildList, pNode))
- {
- ZF_DEBUG(LOG_E, "delete fsm node from list error\r\n");
-
- break;
- }
-
- res = true;
- }
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :调度状态机
- * 参数 :(in)-pFsm 状态机指针
- * (in)-signal 调度信号
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- bool Fsm_dispatch(Fsm * const pFsm, FsmSignal const signal)
- {
- /* 返回结果 */
- bool res = false;
-
- ZF_ASSERT(pFsm != (Fsm *)0)
-
- if (pFsm->IsRunning)
- {
- if (pFsm->ChildList != NULL && pFsm->ChildList->Count > 0)
- {
- uint32_t i;
- Fsm * pChildFsm;
-
- for (i = 0; i < pFsm->ChildList->Count; i++)
- {
- pChildFsm = (Fsm *)pFsm->ChildList
- ->GetElementDataAt(pFsm->ChildList, i);
-
- if (pChildFsm != NULL)
- {
- Fsm_dispatch(pChildFsm, signal);
- }
- }
- }
-
- if (pFsm->CurrentState != NULL)
- {
- /* 1:根状态机时调度
- 2:没设置触发状态时调度
- 3:正在触发状态时调度
- */
- if (pFsm->Owner == NULL || pFsm->OwnerTriggerState == NULL
- || pFsm->OwnerTriggerState == pFsm->Owner->CurrentState)
- {
- pFsm->CurrentState(pFsm, signal);
-
- res = true;
- }
- }
- }
-
- return res;
- }
- /******************************************************************************
- * 描述 :状态转移
- * 参数 :(in)-pFsm 状态机指针
- * (in)-nextState 转移后状态
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- void Fsm_transfer(Fsm * const pFsm, IFsmState nextState)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
- ZF_ASSERT(nextState != (IFsmState)0)
-
- pFsm->CurrentState = (IFsmState)nextState;
- }
- /******************************************************************************
- * 描述 :状态转移(触发转出和转入事件)
- * 参数 :(in)-pFsm 状态机指针
- * (in)-nextState 转移后状态
- * 返回 :-true 成功
- * -false 失败
- ******************************************************************************/
- void Fsm_transferWithEvent(Fsm * const pFsm, IFsmState nextState)
- {
- ZF_ASSERT(pFsm != (Fsm *)0)
- ZF_ASSERT(nextState != (IFsmState)0)
-
- Fsm_dispatch(pFsm, FSM_EXIT_SIG);
-
- Fsm_transfer(pFsm, nextState);
-
- Fsm_dispatch(pFsm, FSM_ENTER_SIG);
- }
- /******************************** END OF FILE ********************************/
|