CcosSMachineV3.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #pragma once
  2. #define CCOSSMACHINE_API
  3. #define CCOSSMACHINE_C_API extern "C"
  4. #include "MsgCircle.h"
  5. #include "ModuleDevice.h"
  6. #include "ConditionEvent.h"
  7. #include "StateMachineDevicePool.h"
  8. //#include "SMachineDlg.h"
  9. using namespace std;
  10. #define Debug_HTTP 0
  11. #define SME_MaxWaitEventNum 20
  12. //状态机状态
  13. enum SMSTATETYPE {
  14. SMST_NULL,
  15. SMST_INIT,//初始化,包括加载工作流文件、初始化事件参数
  16. SMST_BEGIN,//开始执行状态机,启动状态流转线程
  17. SMST_RUN,//状态机执行中,包括当前状态条件判断动作执行、跳转至下一个状态
  18. SMST_STOP,//状态机暂停,一般用于状态发生跳转后、对应动作执行前,给子系统执行的时机
  19. SMST_ERROR,//状态机执行出错
  20. SMST_END,//状态机结束,包括直接退出和执行到最后一个状态
  21. SMST_EXIT,//状态机退出
  22. SMST_MAX
  23. };
  24. //状态变化回调
  25. using StateChangedCallback = std::function<void (const char*, const char*)>;
  26. //标准状态机
  27. class CCOSSMACHINE_API CcosSMachine : public Ccos_Thread, public CcosLock
  28. #if Debug_HTTP
  29. , public ModuleDevice
  30. #endif // Debug_HTTP
  31. {
  32. protected:
  33. //测试模式
  34. bool m_bDebugEnable{ false }; //是否启用Debug模式
  35. //SMachineDlg* m_pUIDebugObj{ nullptr }; //调试窗口
  36. //状态机自身使用
  37. atomic<SMSTATETYPE> m_nSMState; //状态机状态
  38. string m_strCurrentState; //当前流程状态
  39. std::shared_ptr<LinuxEvent> m_hRunningEvt; //状态机运行状态指示事件
  40. vector<std::shared_ptr<LinuxEvent>>m_hCurrentWaitEvtArray; //当前状态等待事件数组
  41. //配置中获取
  42. string m_strMachineName; //状态机名称
  43. map<string, ResDataObject> m_StateMap; //全局状态路由表,状态名:状态定义
  44. vector<ConditionEvent> m_EventsList; //事件列表
  45. ResDataObject m_resUserVariable; //用户临时系统变量
  46. string m_strBeginState; //流程起始状态
  47. string m_strEndState; //流程终止状态
  48. //上层所需
  49. StateChangedCallback m_StateNotify{ nullptr }; //上报回调
  50. std::shared_ptr<LinuxEvent> m_hTransStateEvt; //状态机跳转指示事件
  51. //设备池所需
  52. StateMachineDevicePool m_DevicePool; //设备订阅池
  53. map<string, string> m_DeviceMap; //启动的设备列表,设备类型:设备路径
  54. map<string, int> m_AttributeCountMap; //关注的设备属性列表,[设备类型:属性名]:引用计数
  55. protected:
  56. void ClearState(); //清理当前所有状态
  57. virtual bool Exec() override; //状态机运转线程,循环执行,由父类StartThread启动
  58. virtual bool OnStartThread() override;//Exec之前
  59. virtual bool OnEndThread() override;//Exec返回false之后
  60. bool ExecStateMachine(); //状态流转线程执行方法
  61. CCOSSTMRET StateMachineEntry(DWORD timeout);//Begin状态点
  62. CCOSSTMRET StateMachineExit(DWORD timeout);//End状态点
  63. DWORD GetCurrentStateTimeout(string& timeoutState); //获取当前状态中的超时定义
  64. CCOSSTMRET CheckExternal(string eventFrom = ""); //检查是否有直接跳转满足
  65. void WaitNotfiyProcess(string& Pathkey, string& Context); //检查是否有条件判断满足
  66. CCOSSTMRET TransToPos(const char* pPosName);//状态跳转
  67. CCOSSTMRET StateMachineAction(const char* pState, DWORD timeout); //状态点Action执行动作,检查是否有条件判断满足
  68. public:
  69. CcosSMachine(void);
  70. virtual ~CcosSMachine(void);
  71. #if Debug_HTTP
  72. //http接口,可用于后续自测调用
  73. RET_STATUS OnUpdate(const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons) override;
  74. RET_STATUS OnDel(const char* pszPropery, ResDataObject& resDelValue, ResDataObject& resResponse) override;
  75. RET_STATUS OnAdd(const char* pszPropery, ResDataObject& reAddValue, ResDataObject& resResponse) override;
  76. RET_STATUS SetItem(const char* pszPropery, ResDataObject& resSetValue, ResDataObject& resResponse) override;
  77. RET_STATUS GetItem(const char* pszPropery, ResDataObject& resResponse) override;
  78. RET_STATUS OnAction(const char* pszActionName, const char* pszParams, ResDataObject& resResponse) override;
  79. #endif
  80. //设置Debug模式,启用或者禁用
  81. void SetDebugMode(bool bEnable);
  82. //********************************外部启用状态机执行步骤********************************
  83. bool Reset(DWORD Timeout); //清除所有的状态和设备(步骤4.0之前、8.0之后执行)
  84. bool TriggerEvent(string EventName); //手动触发状态机事件(步骤4.0~8.0之间执行)
  85. void GetStateMachineState(SMSTATETYPE& state); //获取状态机运行、暂停等状态
  86. //================以下顺序执行================
  87. //1.0(必须).从状态机配置文件中加载当前状态机定义:配置文件格式见 TemplateWorkFlow.json
  88. bool LoadMachine(ResDataObject& Machine);
  89. //1.1(可选).设置、获取系统变量
  90. void SetUserVariable(const char* pKey, ResDataObject& resValue);
  91. void GetUserVariable(const char* pKey, ResDataObject& resValue);
  92. //1.2(可选).设置、获取状态机名称
  93. void SetStateMachineName(string Name);
  94. string GetStateMachineName();
  95. //1.3(可选).设置通知回调
  96. void SetNotifyCallback(StateChangedCallback callback);
  97. //1.4(可选).添加状态点映射,各个状态点的Actions
  98. bool AddStateActions(ResDataObject& ActionMap);
  99. //1.5(可选).添加事件映射,所有的抽象事件的物理映射
  100. bool AddStateEvents(ResDataObject& EventMap);
  101. //2.0(必须).设置状态机条件获取、动作执行的设备列表,
  102. //如果上层未Open对应WS的LogicClient,则参数WS为空;如果状态机配置文件中的DeviceList的不为空,则可以不调用该接口
  103. //DevList:类型:设备路径; WS:字符串
  104. bool AddDevices(ResDataObject& DevList, string WS);
  105. //3.0(可选).设备属性初始化
  106. bool PrePareStateMachine();
  107. //4.0(必须).状态机开始
  108. bool StartStateMachine();
  109. //5.0(必须).获取状态跳转事件句柄
  110. std::shared_ptr<LinuxEvent> GetStateTransEvent();
  111. //6.0(必须).获取当前激活状态(等待到步骤4后触发)
  112. void GetCurrentState(string& State);
  113. //7.0(必须).设置状态机运行状态(步骤5对应的上层执行后触发,告诉状态机继续执行)
  114. void SetRunningState(bool Running);
  115. //8.0(必须).停止状态机
  116. void StopStateMachine(DWORD timeout);
  117. };