| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /**
- *****************************************************************************
- * @file zf_fsm.h
- * @author Zorb
- * @version V1.0.0
- * @date 2018-06-28
- * @brief 有限状态机的头文件
- *****************************************************************************
- * @history
- *
- * 1. Date:2018-06-28
- * Author:Zorb
- * Modification:建立文件
- *
- *****************************************************************************
- */
- #ifndef __ZF_FSM_H__
- #define __ZF_FSM_H__
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include "stdint.h"
- #include "stdbool.h"
- #include "zf_list.h"
- /* 状态机信号0-31保留,用户信号在32以后定义 */
- enum {
- FSM_NULL_SIG = 0,
- FSM_ENTER_SIG,
- FSM_EXIT_SIG,
- FSM_USER_SIG_START = 32
- /* 用户信号请在用户文件定义,不允许在此定义 */
- };
- typedef struct _Fsm Fsm;
- typedef uint32_t FsmSignal;
- typedef void (*IFsmState)(Fsm * const, FsmSignal const);
- /* 状态机结构 */
- struct _Fsm
- {
- uint8_t Level; /* 嵌套层数,根状态机层数为1,子状态机层数自增 */
- /* 注:严禁递归嵌套和环形嵌套 */
- List *ChildList; /* 子状态机列表 */
- Fsm *Owner; /* 父状态机 */
- IFsmState OwnerTriggerState; /* 当父状态机为设定状态时,才触发当前状态机 */
- /* 若不设定,则当执行完父状态机,立即运行子状态机 */
- IFsmState CurrentState; /* 当前状态 */
- bool IsRunning; /* 是否正在运行(默认关) */
-
- /* 设置初始状态 */
- void (*SetInitialState)(Fsm * const pFsm, IFsmState initialState);
-
- /* 运行当前状态机 */
- bool (*Run)(Fsm * const pFsm);
-
- /* 运行当前状态机和子状态机 */
- bool (*RunAll)(Fsm * const pFsm);
-
- /* 停止当前状态机 */
- bool (*Stop)(Fsm * const pFsm);
-
- /* 停止当前状态机和子状态机 */
- bool (*StopAll)(Fsm * const pFsm);
-
- /* 释放当前状态机 */
- bool (*Dispose)(Fsm * const pFsm);
-
- /* 释放当前状态机和子状态机 */
- bool (*DisposeAll)(Fsm * const pFsm);
-
- /* 添加子状态机 */
- bool (*AddChild)(Fsm * const pFsm, Fsm * const pChildFsm);
-
- /* 移除子状态机(不释放空间) */
- bool (*RemoveChild)(Fsm * const pFsm, Fsm * const pChildFsm);
-
- /* 调度状态机 */
- bool (*Dispatch)(Fsm * const pFsm, FsmSignal const signal);
-
- /* 状态转移 */
- void (*Transfer)(Fsm * const pFsm, IFsmState nextState);
-
- /* 状态转移(触发转出和转入事件) */
- void (*TransferWithEvent)(Fsm * const pFsm, IFsmState nextState);
- };
- /* 创建状态机(内部分配空间) */
- bool Fsm_create(Fsm ** ppFsm);
- /* 设置初始状态 */
- void Fsm_setInitialState(Fsm * const pFsm, IFsmState initialState);
- /* 运行当前状态机 */
- bool Fsm_run(Fsm * const pFsm);
- /* 运行当前状态机和子状态机 */
- bool Fsm_runAll(Fsm * const pFsm);
- /* 停止当前状态机 */
- bool Fsm_stop(Fsm * const pFsm);
- /* 停止当前状态机和子状态机 */
- bool Fsm_stopAll(Fsm * const pFsm);
- /* 释放当前状态机 */
- bool Fsm_dispose(Fsm * const pFsm);
- /* 释放当前状态机和子状态机 */
- bool Fsm_disposeAll(Fsm * const pFsm);
- /* 添加子状态机 */
- bool Fsm_addChild(Fsm * const pFsm, Fsm * const pChildFsm);
- /* 移除子状态机(不释放空间) */
- bool Fsm_removeChild(Fsm * const pFsm, Fsm * const pChildFsm);
- /* 调度状态机 */
- bool Fsm_dispatch(Fsm * const pFsm, FsmSignal const signal);
- /* 状态转移 */
- void Fsm_transfer(Fsm * const pFsm, IFsmState nextState);
- /* 状态转移(触发转出和转入事件) */
- void Fsm_transferWithEvent(Fsm * const pFsm, IFsmState nextState);
- #ifdef __cplusplus
- }
- #endif
- #endif /* __ZF_FSM_H__ */
- /******************************** END OF FILE ********************************/
|