DiosSMachineV3.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. #pragma once
  2. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  3. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DIOSSMACHINE_EXPORTS
  4. // 符号编译的。在使用此 DLL 的
  5. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  6. // DIOSSMACHINE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  7. // 符号视为是被导出的。
  8. #ifndef DIOSSMACHINE_EXPORTS
  9. #ifdef _WIN64
  10. #ifdef _DEBUG
  11. #pragma comment(lib, "DiosSMachineV3X64D.lib")
  12. #else
  13. #pragma comment(lib, "DiosSMachineV3X64.lib")
  14. #endif
  15. #else
  16. #ifdef _DEBUG
  17. #pragma comment(lib, "DiosSMachineV3D.lib")
  18. #else
  19. #pragma comment(lib, "DiosSMachineV3.lib")
  20. #endif
  21. #endif
  22. #endif
  23. #ifdef DIOSSMACHINE_EXPORTS
  24. #define DIOSSMACHINE_API __declspec(dllexport)
  25. #define DIOSSMACHINE_C_API extern "C" __declspec(dllexport)
  26. #else
  27. #define DIOSSMACHINE_API __declspec(dllimport)
  28. #define DIOSSMACHINE_C_API extern "C" __declspec(dllimport)
  29. #endif
  30. #include "ResDataObject.h"
  31. #include "DiosThread.h"
  32. #include "MsgCircle.h"
  33. #include "DiosLock.h"
  34. #include "MsgQueue.h"
  35. #include "LogicClient.h"
  36. #include <map>
  37. using namespace std;
  38. #define TIMEOUT_TEMP (3000)
  39. //#define DiosErrorType "Error"
  40. //行为,失败,超时等正常执行时错误
  41. //#define DiosFrameError "Frame"
  42. //人为的错误发送
  43. //#define DiosSeqError "Seq"
  44. //状态机不关心状态是不是Error,定义者自己来定义错误状态
  45. //#define DiosStmEntryPosName "StateMachineEntry"
  46. //#define DiosStmExitPosName "StateMachineExit"
  47. //状态机进出状态名称,用户自定义
  48. //#define DiosTopStateMachineName ("SMOuter")
  49. class StateMachineDevicePool;
  50. typedef enum _DiosStMachineRet
  51. {
  52. DIOSSMRET_NG,
  53. DIOSSMRET_OK,
  54. DIOSSMRET_TIMEOUT,
  55. DIOSSMRET_EXIT,
  56. DIOSSMRET_MAX
  57. }DIOSSTMRET;
  58. //assert,通用的事件和錯誤的事件處理上有所不同
  59. //最终有个==的判断,到时候错误和事件的处理方案不一样
  60. #define DiosStmEvtInfo "DiosStmEvtInfo"
  61. class ConditionEvent;
  62. //JSON格式,EVT事件相关的必须有,而INFO相关的是附加内容,可有可无
  63. /*
  64. {
  65. "evtkey" : "evt内容",
  66. "DiosStmEvtInfo" : "错误内容 or 事件INFO or 其他附加信息"
  67. }
  68. */
  69. typedef enum _SMEVTTYPE {
  70. SMEVT_NOTIFY,//有硬件事件,只读通知
  71. SMEVT_READATTR,//有硬件事件,step1:读通知,step2:没有通知情况下读属性,step3:没有属性置位情况下等通知.
  72. SMEVT_PASS,//无匹配,无条件穿过.
  73. SMEVT_BLOCK,//无匹配,保持阻挡状态
  74. SMEVT_MAX
  75. }SMEVTTYPE;
  76. class DIOSSMACHINE_API DiosStMEvt
  77. {
  78. ResDataObject *m_pEvt;
  79. ResDataObject *m_pInfo;
  80. SMEVTTYPE m_type;
  81. bool m_bTriggered;
  82. HANDLE m_hTriggered;
  83. ConditionEvent* m_pConditions;
  84. bool m_bActived;
  85. public:
  86. DiosStMEvt();
  87. DiosStMEvt(const DiosStMEvt &tValue);
  88. ~DiosStMEvt();
  89. bool SetEvt(const char* pKey, INT Val, const char *pInfo = NULL);
  90. bool SetEvt(const char* pKey, const char *pVal, const char *pInfo = NULL);
  91. DiosStMEvt& operator = (const DiosStMEvt &tValue);
  92. bool operator == (const DiosStMEvt &Obj);
  93. bool operator == (const char* pszEventName);
  94. const char *encode_s();
  95. bool decode(const char *pdata);
  96. //设置事件上下文
  97. bool parse(ResDataObject *evtContext);
  98. bool IsEmpty();
  99. ResDataObject& GetEvtContext();
  100. bool IsTriggered(); //事件是激发态
  101. //过滤激活事件,包括Action/Notfiy/External
  102. bool Active(const char* pszType, ResDataObject* resContext, const char* pszDevice);
  103. const char* GetEventName() { return m_pEvt->GetKey(0); }
  104. HANDLE GetHandle() { return m_hTriggered; }
  105. void Reset();
  106. void Enable(bool state) { m_bActived = state; }
  107. int GetTimeout();
  108. };
  109. //state route pos
  110. class DIOSSMACHINE_API DiosStMRouteLine
  111. {
  112. bool m_ActiveState;
  113. bool m_InRoute;
  114. DWORD m_Timeout;
  115. DiosStMEvt *m_pEvt; //一个out对应一个 事件
  116. string *m_pSrcRoutePos;
  117. string *m_pGuard;
  118. string *m_pDesRoutePos;
  119. public:
  120. DiosStMRouteLine();
  121. DiosStMRouteLine(const DiosStMRouteLine &tValue);
  122. virtual ~DiosStMRouteLine();
  123. void SetRoute(DiosStMEvt &evt, const char* pGuard, const char* pDes);
  124. void SetRoute(DiosStMEvt &evt, const char* pSrc,const char* pGuard, const char* pDes);
  125. const char* GetDesName();
  126. const char* GetSrcName();
  127. const char* GetGuardName();
  128. bool GetRouteType();//true:in,false:out
  129. void Active(bool state, DWORD timeout);
  130. bool GetActiveState();
  131. operator DiosStMEvt *();
  132. DiosStMRouteLine& operator = (const DiosStMRouteLine &tValue);
  133. DWORD GetTimeout();
  134. };
  135. class DiosSMachineIF;
  136. //一个状态有多个RouteLine, 每个RouteLine有一个单独的事件
  137. class DIOSSMACHINE_API DiosStMRoutePos
  138. {
  139. bool m_ActiveState;
  140. DWORD m_Timeout;
  141. string *m_pRoutePosName;
  142. vector<DiosStMRouteLine *> *m_pOutRouteLineVec;
  143. vector< DiosStMEvt*>* m_pRouteLineEvents; //出状态的事件列表,和RouteLine一一对应
  144. StateMachineDevicePool* m_pDevicePool;
  145. ResDataObject m_resStateActions;
  146. ResDataObject m_resDisable; //禁用全局事件列表
  147. ResDataObject m_resEvent2DestPos;
  148. bool m_bBreakIn;
  149. bool m_bBreakAction;
  150. bool m_bBreakOut;
  151. public:
  152. DiosStMRoutePos();
  153. DiosStMRoutePos(const char *pName, StateMachineDevicePool* pDevicePool);
  154. virtual ~DiosStMRoutePos();
  155. virtual bool IsSMachine();//no
  156. void SetName(const char *pName);
  157. const char* GetName();
  158. bool PosAddOutRouteLine(DiosStMEvt *Evt, const char *pSrcPosName, const char *pGuardName, const char *pDesPosName);
  159. void SetAction(ResDataObject actions) { m_resStateActions = actions; }
  160. DWORD GetRouteLineCount();
  161. DiosStMRouteLine **GetOutRouteLineVec();
  162. DiosStMRouteLine *operator [](DiosStMEvt &Evt);
  163. void Active(bool state, DWORD timeout);
  164. bool GetActiveState();
  165. DWORD GetTimeout();
  166. vector< DiosStMEvt*>* GetPosEvent() { return m_pRouteLineEvents; }
  167. //执行进入当前状态的Action
  168. DIOSSTMRET DoAction(DiosSMachineIF* pSM);
  169. DIOSSTMRET DoIn(DiosSMachineIF* pSM);
  170. DIOSSTMRET DoOut(DiosSMachineIF* pSM);
  171. //定时检查是否超时,最小间隔为1s,有可能不执行
  172. DIOSSTMRET CheckTimeout();
  173. //状态到了的检查,是否激活事件
  174. DIOSSTMRET CheckNotify(const char* pszDevice, ResDataObject* res);
  175. //
  176. bool TriggerEvent(const char* pszEvent);
  177. DiosStMRouteLine* WaitFroNextState(int timeout); //等待进入下一个状态
  178. //禁用全局事件
  179. void SetDisable(ResDataObject disable);
  180. void SetBreak(bool bBreakIn, bool bBrakAction, bool bBreakOut);
  181. //
  182. void EnableEvent(const char* pszEventName, bool state);
  183. };
  184. using StateChangedCallback = std::function<void (const char*, const char*)>;
  185. //通用状态机类
  186. class DIOSSMACHINE_API DiosSMachineIF : public DiosLock
  187. {
  188. protected:
  189. //DiosSMachineIF *m_pParent;
  190. string *m_pStateMachineName;
  191. StateMachineDevicePool* m_pDevicePool;
  192. string m_strLastPos; //上一个状态点
  193. string m_strCurrentPos; //当前状态点
  194. string m_StmEntryPosName; //状态机入口状态名称
  195. string m_StmExitPosName; //状态机出口状态名称
  196. ResDataObject m_resUserVariable; //用户变量
  197. ResDataObject m_resSystemVariable; //系统变量
  198. HANDLE m_StateCangeEvt;
  199. HANDLE m_RunningState;
  200. DiosStMRouteLine* StateMachineWaitForEvents(/*int &ExtEvtIndex*/);//[< 0]:Local or outline, [>= 0]: externalEvtIndex
  201. StateChangedCallback m_StateNotify;
  202. bool m_bDebugEnable; //是否启用Debug模式
  203. HANDLE m_hBreaked; //断点等待事件,用户发送Continue后触发,状态机继续执行,直至下一个断点
  204. protected:
  205. DiosStMRoutePos *m_pCurrentRoutePos;
  206. MsgCircle<DiosStMEvt> *m_pArrivedEvts;
  207. //状态与路由映射表
  208. map<string, DiosStMRoutePos*> *m_pRoutePosMap;
  209. //inline,全局路由表
  210. //vector<DiosStMRouteLine*> *m_pRouteInLineMap;
  211. DiosStMRoutePos* m_pGlobalRoute;
  212. ////external
  213. //size_t m_RouteExternalEvtCount;
  214. //DiosStMRouteLine** m_pRouteExternalMap;
  215. void ClearState();//reset
  216. DIOSSTMRET TransToPos(const char *pPosName);
  217. void PostError(const char *pErrorVal,const char *pErrorInfo = NULL);
  218. DiosStMRouteLine *GetEntryRouteLine();
  219. INT ExecStateMachine(HANDLE ThreadExitEvt/*,DiosStMRouteLine *pExternalWaitEvts[], size_t WaitCount*/);
  220. //INT EnterSubStateMachine(HANDLE ThreadExitEvt);
  221. bool PrePareStateMachine();
  222. bool GetRunningState(DWORD waittime = 0);
  223. void SetRunningState(bool Running);
  224. virtual void PushStateChange(ResDataObject &ChangedPos);//statemachinename:statemachinepos
  225. public:
  226. void SetMachineName(const char* pszEntryName, const char * pszExitName); //设置状态机名称及进出状态名称
  227. void SetUserVariable(const char* pKey, ResDataObject& resValue); //设置用户变量
  228. void GetUserVariable(const char* pKey, ResDataObject& resValue); //读取用户变量值
  229. void GetSystemVariable(const char* pKey, ResDataObject& resValue); //读取系统变量
  230. void EnableEvent(const char* pszGlobalEvent, bool state);
  231. DIOSSTMRET ProcessUserVaiable(const char* vName, ResDataObject& resVaiable);
  232. void SetNotifyCallback(StateChangedCallback callback) { m_StateNotify = callback; }
  233. public:
  234. DiosSMachineIF(void);
  235. virtual ~DiosSMachineIF(void);
  236. void SetStateMachineName(const char *pszName);
  237. const char *GetStateMachineName();
  238. //void SetParentSMachine(DiosSMachineIF *pParent);
  239. const char* GetCurrentState() { return m_strCurrentPos.c_str(); }
  240. //for this IF
  241. //virtual bool IsSMachine();//yes
  242. //void CopyEvtTo(DiosSMachineIF *pDes);
  243. //init state machine
  244. //第一个节点的接入比较特殊,所以做了个函数
  245. bool AddEntryRoutePos(DiosStMRoutePos *pPos);
  246. bool AddRoutePos(DiosStMRoutePos *pPos);
  247. bool AddInRouteLine(DiosStMEvt &Evt, const char *pGuardName, const char *pDesPosName);
  248. bool AddOutRouteLine(DiosStMEvt *Evt,const char *pSrcPosName,const char *pGuardName,const char *pDesPosName);
  249. //active state machine
  250. bool ActiveRoutePos(const char *pPosName, DWORD timeout = TIMEOUT_TEMP);
  251. bool ActiveRouteLine(DiosStMEvt &Evt, DWORD timeout = TIMEOUT_TEMP);
  252. bool DeActiveAll();
  253. DiosStMRoutePos *GetCurrentRoutePos();
  254. //evt
  255. bool PushEvent(DiosStMEvt &Evt);
  256. bool PopEvent(DiosStMEvt &Evt);
  257. bool PeekEvent(DiosStMEvt &Evt);
  258. HANDLE GetEvtNotifyHandle();
  259. //for Debug
  260. //设置Debug模式,启用或者禁用
  261. void SetDebugMode(bool bEnable);
  262. bool InDebugMode() { return m_bDebugEnable; }
  263. //设置状态断点,IN/ACTION/OUT 三个断点位置可以设置
  264. void EnableBreakPoint(const char* pState, bool bBreakInEable, bool bActionInEnable, bool bBreakOutEnable);
  265. //继续运行,当处于中断状态时
  266. void Continue();
  267. //获取状态的所有事件的激活值
  268. void GetEventStatus(const char* pState, const char* pszEvent);
  269. //获取当前断点位置
  270. void GetCurrentBreak();
  271. //等待继续事件触发
  272. void WaitContinue();
  273. HANDLE GetStateChangeEvtHandle();
  274. //for state machine thread
  275. virtual DIOSSTMRET StateMachineEntry(DWORD timeout);//Begin状态点
  276. virtual DIOSSTMRET StateMachineExit(DWORD timeout);//End状态点
  277. //状态点Action执行动作
  278. virtual DIOSSTMRET StateMachineAction(const char *pState, DWORD timeout);
  279. //状态点Guard
  280. virtual DIOSSTMRET StateMachineGuard(const char * pState, DWORD timeout);
  281. //返回值的定义
  282. //因为全局事件,本状态机事件,本状态点事件都需要监控
  283. //所以
  284. //返回值为负:退出状态机
  285. //返回值为正: 0 <= EvtIdx < CountOfLocal + CountOfExternal + CountOfOutpath
  286. // 至于那个数组的事件,可以自行推算
  287. // 例: Outpath第二个事件 => EvtIdx = CountOfLocal + CountOfExternal + 1
  288. //关于TIMEOUT:函数中wait的是OutpathEvts,LocalEvts和ExternalEvts是没有必要等待,有就有,没有就没有....
  289. virtual DiosStMRouteLine* WaitNotfiyProcess(); //子类需要从设备上获取通知,然后根据优先级找到目标状态路由
  290. //virtual int StateMachineWaitForEvents(
  291. // DiosStMRouteLine *pLocalEvts[], DWORD CountOfLocal,
  292. // //DiosStMRouteLine *pExternalEvts[], DWORD CountOfExternal,
  293. // DiosStMRouteLine *pOutpathEvts[], DWORD CountOfOutpath,
  294. // DWORD timeout
  295. // );
  296. };
  297. class StateMachineDevicePool;
  298. //标准状态机
  299. class DIOSSMACHINE_API DiosSMachine : public Dios_Thread,public DiosSMachineIF
  300. {
  301. protected:
  302. virtual bool OnStartThread();
  303. virtual bool Exec();
  304. HANDLE m_StateQuedEvent;
  305. ResDataObject m_LastHitStatePos;
  306. MsgQueue<ResDataObject> *m_pStatePosList;
  307. virtual void PushStateChange(ResDataObject &ChangedPos);//statemachinename:statemachinepos
  308. public:
  309. DiosSMachine(void);
  310. virtual ~DiosSMachine(void);
  311. void SetStateMachineLog(const char *pszLogTitle);
  312. bool PopStateChange(ResDataObject &LastPos);
  313. HANDLE GetStateQuedEvent();
  314. bool RunStateMachine(const char* pszLogTitle);
  315. //for other threads to call
  316. bool StartStateMachine(/*DiosStMRouteLine *pExternalWaitEvts[], DWORD WaitCount*/);
  317. void StopStateMachine(DWORD timeout);
  318. //清除所有的状态和设备.
  319. virtual bool Reset(DWORD Timeout);
  320. /*
  321. 在状态机停止情况下是可以的.
  322. 单元设备列表添加
  323. */
  324. virtual bool AddDevices(ResDataObject& DevList) ;//.
  325. //单元设备列表清理.
  326. virtual bool ClearDevices();
  327. /*
  328. 触发状态机事件
  329. */
  330. bool TriggerEvent(const char* pEventName);//
  331. //添加状态点映射,各个状态点的Actions with Params.
  332. /*
  333. List of below format...
  334. "ParentStateName":"StateName":"Devpath":ActionName:Params
  335. */
  336. bool AddStateActions(ResDataObject& ActionMap);//状态机激活中,应该是在SeqReady点位
  337. //添加事件映射,所有的抽象事件的物理映射.
  338. /*
  339. List of EventName:{
  340. Need : 1 or 0,
  341. Devpath : Key:Value
  342. }
  343. */
  344. bool AddStateEvents(ResDataObject& EventMap);//状态机激活中,应该是在SeqReady点位
  345. //从状态机定义中加载当前状态机定义
  346. bool LoadMachine(ResDataObject& Machine);
  347. //状态机自行跳入FrameError的时候,错误信息读取.(空的情况反馈false)
  348. bool GetStateMachinesErrorInfo(ResDataObject& ErrInfo);
  349. void ClearStateActionMaps();
  350. void ClearStateEventMaps();
  351. //Actions----------------------------------------------------------------------
  352. //Entry&Exit Action
  353. virtual DIOSSTMRET StateMachineEntry(DWORD timeout);//Begin状态点
  354. virtual DIOSSTMRET StateMachineExit(DWORD timeout);//End状态点
  355. //RoutePos Action
  356. //virtual DIOSSTMRET StateMachineAction(const char* pAction, DWORD timeout) = 0;
  357. //virtual DIOSSTMRET StateMachineGuard(const char* pGuard, DWORD timeout) = 0;
  358. DiosStMRouteLine* WaitNotfiyProcess() override;
  359. //int StateMachineWaitForEvents(
  360. // DiosStMRouteLine* pLocalEvts[], DWORD CountOfLocal,
  361. // //DiosStMRouteLine *pExternalEvts[], DWORD CountOfExternal,
  362. // DiosStMRouteLine* pOutpathEvts[], DWORD CountOfOutpath,
  363. // DWORD timeout
  364. //) override;
  365. };
  366. /*
  367. //子状态机
  368. class DIOSSMACHINE_API DiosSubSMachine : public DiosStMRoutePos, public DiosSMachineIF
  369. {
  370. protected:
  371. public:
  372. DiosSubSMachine(void);
  373. DiosSubSMachine(const char *pName);
  374. virtual ~DiosSubSMachine(void);
  375. virtual bool IsSMachine();//yes
  376. };
  377. */
  378. typedef enum _DrStateMachineErrorType {
  379. DSM_ERROR_NORMAL,
  380. DSM_ERROR_ACTION_FAILED,
  381. DSM_ERROR_ACTION_TIMEOUT,
  382. DSM_ERROR_WAITEVENT_TIMEOUT,
  383. DSM_ERROR_MAX
  384. }DSMERRORTYPE;
  385. #define INVALID_DEVIDX (-1)
  386. #define STATEMACHINE_ACTION_TIMEOUT (2500)
  387. class DIOSSMACHINE_API StateMachineDevicePool : public DiosLock
  388. {
  389. MsgQueue<ResDataObject>* m_pErrorInfoQue;
  390. HANDLE m_ThreadExitHandle;
  391. map<DWORD, string>* m_pDevpath;//devidx:devpath 设备序号->设备路径
  392. map<DWORD, LogicClient*>* m_pDevlist;//devidx:client 用于获取通知的连接
  393. map<DWORD, LogicClient*>* m_pActionDevList; // 用于执行Action的连接
  394. //map<string, map<string, map<DWORD, map<string, ResDataObject>>>>* m_pActionMap;//ParentStateName:statename:devidx:Action:Params Action映射
  395. //eventname:evttype:devidx:HardwareEventKey:HardwareEventVal
  396. //map<string, map<SMEVTTYPE, map<DWORD, map<string, string>>>>* m_pEventMap; //事件映射eventname:evttype:devidx:HardwareEventKey:HardwareEventVal
  397. //deviceidx:hardwarekey:hardwareval:eventname
  398. //map<DWORD, map<string, map<string, string>>>* m_pHardwareEventMap; //硬件事件映射deviceidx:hardwarekey:hardwareval:eventname
  399. DWORD GetDeviceIdx(const char* pszDevpath);
  400. const char* GetStateMachineEventName(DWORD DevIdx, const char* pKey, const char* pVal);
  401. //-1:failed,0:noactions,1:actionexist
  402. //INT GetDeviceActions(const char* pParentStatePos, const char* pStatePos, map<DWORD, map<string, ResDataObject>>* pDeviceActions);
  403. //int ReadForDeviceEventsEx(
  404. // DiosStMRouteLine* pEvts[], DWORD Count,
  405. // DWORD timeout
  406. //);
  407. //int ReadForDeviceEvents(
  408. // DiosSMachineIF* pTarget,
  409. // DiosStMRouteLine* pLocalEvts[], DWORD CountOfLocal,
  410. // //DiosStMRouteLine* pExternalEvts[], DWORD CountOfExternal,
  411. // DiosStMRouteLine* pOutpathEvts[], DWORD CountOfOutpath,
  412. // DWORD timeout
  413. //);//SMEVT_READATTR处理:1.尝试读取通知,2.尝试读取值
  414. //int WaitForDeviceEvents(
  415. // DiosSMachineIF* pTarget,
  416. // DiosStMRouteLine* pLocalEvts[], DWORD CountOfLocal,
  417. // //DiosStMRouteLine* pExternalEvts[], DWORD CountOfExternal,
  418. // DiosStMRouteLine* pOutpathEvts[], DWORD CountOfOutpath,
  419. // DWORD timeout
  420. //);
  421. void PushErrInfo(const char* pszContext, DSMERRORTYPE ErrType = DSM_ERROR_NORMAL);
  422. DWORD WINAPI ActionThread(LPVOID pPara);
  423. public:
  424. StateMachineDevicePool();
  425. ~StateMachineDevicePool();
  426. void SetThreadExitHandle(HANDLE tHand);
  427. //list of "devicepath":""
  428. bool AddDevices(ResDataObject& Devices);
  429. LogicClient* FindClient(const char* pszDevShortPath);
  430. /*
  431. List of below format...
  432. "ParentStateName":"StateName":"Devpath":ActionName:Params
  433. */
  434. bool AddStateActions(ResDataObject& ActionMaps);
  435. /*
  436. List of
  437. EventName:{ {Need : 1 or 0}, {ReadFromAttribute : 1 or 0},{Devpath : Key:Value}}
  438. */
  439. bool AddStateEvents(ResDataObject& EventMaps);
  440. void ClearStateActionMaps();
  441. void ClearStateEventMaps();
  442. //device init
  443. bool ClearDevices();
  444. bool OpenDevices();
  445. bool CloseDevices();
  446. //通用的Action和Event处理
  447. //DIOSSTMRET StateMachineAction(const char* pParentStatePos, const char* pStatePos, DWORD timeout);
  448. DIOSSTMRET StateMachineAction(ResDataObject* resActions, ResDataObject& resResult, ResDataObject* pVariable, DWORD Timeout);
  449. //DIOSSTMRET StateMachineAction(ResDataObject* resActions, ResDataObject& resResult);
  450. int ReadForDeviceEvents(ResDataObject& resNotfiy, DWORD timeout, int nMaxNotifyNum);
  451. //int StateMachineWaitForEvents(
  452. // DiosSMachineIF* pTarget,
  453. // DiosStMRouteLine* pLocalEvts[], DWORD CountOfLocal,
  454. // //DiosStMRouteLine* pExternalEvts[], DWORD CountOfExternal,
  455. // DiosStMRouteLine* pOutpathEvts[], DWORD CountOfOutpath,
  456. // DWORD timeout
  457. //);
  458. //error info
  459. bool PopErrInfo(ResDataObject& info);
  460. };