|
@@ -0,0 +1,138 @@
|
|
|
|
|
+/**
|
|
|
|
|
+ *****************************************************************************
|
|
|
|
|
+ * @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 ********************************/
|