zf_fsm.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /**
  2. *****************************************************************************
  3. * @file zf_fsm.h
  4. * @author Zorb
  5. * @version V1.0.0
  6. * @date 2018-06-28
  7. * @brief 有限状态机的头文件
  8. *****************************************************************************
  9. * @history
  10. *
  11. * 1. Date:2018-06-28
  12. * Author:Zorb
  13. * Modification:建立文件
  14. *
  15. *****************************************************************************
  16. */
  17. #ifndef __ZF_FSM_H__
  18. #define __ZF_FSM_H__
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. #include "stdint.h"
  23. #include "stdbool.h"
  24. #include "zf_list.h"
  25. /* 状态机信号0-31保留,用户信号在32以后定义 */
  26. enum {
  27. FSM_NULL_SIG = 0,
  28. FSM_ENTER_SIG,
  29. FSM_EXIT_SIG,
  30. FSM_USER_SIG_START = 32
  31. /* 用户信号请在用户文件定义,不允许在此定义 */
  32. };
  33. typedef struct _Fsm Fsm;
  34. typedef uint32_t FsmSignal;
  35. typedef void (*IFsmState)(Fsm * const, FsmSignal const);
  36. /* 状态机结构 */
  37. struct _Fsm
  38. {
  39. uint8_t Level; /* 嵌套层数,根状态机层数为1,子状态机层数自增 */
  40. /* 注:严禁递归嵌套和环形嵌套 */
  41. List *ChildList; /* 子状态机列表 */
  42. Fsm *Owner; /* 父状态机 */
  43. IFsmState OwnerTriggerState; /* 当父状态机为设定状态时,才触发当前状态机 */
  44. /* 若不设定,则当执行完父状态机,立即运行子状态机 */
  45. IFsmState CurrentState; /* 当前状态 */
  46. bool IsRunning; /* 是否正在运行(默认关) */
  47. /* 设置初始状态 */
  48. void (*SetInitialState)(Fsm * const pFsm, IFsmState initialState);
  49. /* 运行当前状态机 */
  50. bool (*Run)(Fsm * const pFsm);
  51. /* 运行当前状态机和子状态机 */
  52. bool (*RunAll)(Fsm * const pFsm);
  53. /* 停止当前状态机 */
  54. bool (*Stop)(Fsm * const pFsm);
  55. /* 停止当前状态机和子状态机 */
  56. bool (*StopAll)(Fsm * const pFsm);
  57. /* 释放当前状态机 */
  58. bool (*Dispose)(Fsm * const pFsm);
  59. /* 释放当前状态机和子状态机 */
  60. bool (*DisposeAll)(Fsm * const pFsm);
  61. /* 添加子状态机 */
  62. bool (*AddChild)(Fsm * const pFsm, Fsm * const pChildFsm);
  63. /* 移除子状态机(不释放空间) */
  64. bool (*RemoveChild)(Fsm * const pFsm, Fsm * const pChildFsm);
  65. /* 调度状态机 */
  66. bool (*Dispatch)(Fsm * const pFsm, FsmSignal const signal);
  67. /* 状态转移 */
  68. void (*Transfer)(Fsm * const pFsm, IFsmState nextState);
  69. /* 状态转移(触发转出和转入事件) */
  70. void (*TransferWithEvent)(Fsm * const pFsm, IFsmState nextState);
  71. };
  72. /* 创建状态机(内部分配空间) */
  73. bool Fsm_create(Fsm ** ppFsm);
  74. /* 设置初始状态 */
  75. void Fsm_setInitialState(Fsm * const pFsm, IFsmState initialState);
  76. /* 运行当前状态机 */
  77. bool Fsm_run(Fsm * const pFsm);
  78. /* 运行当前状态机和子状态机 */
  79. bool Fsm_runAll(Fsm * const pFsm);
  80. /* 停止当前状态机 */
  81. bool Fsm_stop(Fsm * const pFsm);
  82. /* 停止当前状态机和子状态机 */
  83. bool Fsm_stopAll(Fsm * const pFsm);
  84. /* 释放当前状态机 */
  85. bool Fsm_dispose(Fsm * const pFsm);
  86. /* 释放当前状态机和子状态机 */
  87. bool Fsm_disposeAll(Fsm * const pFsm);
  88. /* 添加子状态机 */
  89. bool Fsm_addChild(Fsm * const pFsm, Fsm * const pChildFsm);
  90. /* 移除子状态机(不释放空间) */
  91. bool Fsm_removeChild(Fsm * const pFsm, Fsm * const pChildFsm);
  92. /* 调度状态机 */
  93. bool Fsm_dispatch(Fsm * const pFsm, FsmSignal const signal);
  94. /* 状态转移 */
  95. void Fsm_transfer(Fsm * const pFsm, IFsmState nextState);
  96. /* 状态转移(触发转出和转入事件) */
  97. void Fsm_transferWithEvent(Fsm * const pFsm, IFsmState nextState);
  98. #ifdef __cplusplus
  99. }
  100. #endif
  101. #endif /* __ZF_FSM_H__ */
  102. /******************************** END OF FILE ********************************/