DiosSMachineV3.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. // DiosSMachine.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "DiosSMachineV3.h"
  5. #include "common_api.h"
  6. #include <sstream>
  7. using namespace std;
  8. //================================
  9. DiosStMRoutePos::DiosStMRoutePos()
  10. {
  11. m_ActiveState = false;
  12. m_pRoutePosName = new string();
  13. m_pOutRouteLineVec = new vector<DiosStMRouteLine *>();
  14. m_Timeout = TIMEOUT_TEMP;
  15. m_pRouteLineEvents = new vector<DiosStMEvt*>();
  16. m_pDevicePool = nullptr;
  17. }
  18. DiosStMRoutePos::DiosStMRoutePos(const char *pName, StateMachineDevicePool* pDevicePool)
  19. {
  20. m_ActiveState = false;
  21. m_pRoutePosName = new string();
  22. (*m_pRoutePosName) = pName;
  23. m_pOutRouteLineVec = new vector<DiosStMRouteLine *>();
  24. m_Timeout = TIMEOUT_TEMP;
  25. m_pRouteLineEvents = new vector<DiosStMEvt*>();
  26. m_pDevicePool = pDevicePool;
  27. }
  28. DiosStMRoutePos::~DiosStMRoutePos()
  29. {
  30. delete m_pRoutePosName;
  31. m_pRoutePosName = NULL;
  32. if (m_pOutRouteLineVec != NULL)
  33. {
  34. if (m_pOutRouteLineVec->size() > 0)
  35. {
  36. for (size_t i = 0; i < m_pOutRouteLineVec->size(); i++)
  37. {
  38. DiosStMRouteLine *p = (*m_pOutRouteLineVec)[i];
  39. delete p;
  40. }
  41. }
  42. delete m_pOutRouteLineVec;
  43. m_pOutRouteLineVec = NULL;
  44. }
  45. if (m_pRouteLineEvents != nullptr)
  46. {
  47. delete m_pRouteLineEvents;
  48. m_pRouteLineEvents = nullptr;
  49. }
  50. }
  51. void DiosStMRoutePos::Active(bool state,DWORD timeout)
  52. {
  53. m_ActiveState = state;
  54. if (m_ActiveState == false)
  55. {
  56. m_Timeout = timeout;
  57. }
  58. else
  59. {
  60. //get maximum timeperiod
  61. if (timeout > m_Timeout)
  62. {
  63. m_Timeout = timeout;
  64. }
  65. }
  66. }
  67. bool DiosStMRoutePos::GetActiveState()
  68. {
  69. return m_ActiveState;
  70. }
  71. bool DiosStMRoutePos::IsSMachine()
  72. {
  73. return false;
  74. }
  75. bool DiosStMRoutePos::PosAddOutRouteLine(DiosStMEvt *Evt, const char *pSrcPosName, const char *pGuardName, const char *pDesPosName)
  76. {
  77. DiosStMRouteLine *pLine = new DiosStMRouteLine();
  78. pLine->SetRoute(*Evt, pSrcPosName, pGuardName, pDesPosName);
  79. pLine->Active(true, 0);
  80. m_resEvent2DestPos.update(Evt->GetEventName(), pDesPosName);
  81. m_pOutRouteLineVec->push_back(pLine);
  82. m_pRouteLineEvents->push_back(Evt);
  83. return true;
  84. }
  85. void DiosStMRoutePos::SetName(const char *pName)
  86. {
  87. (*m_pRoutePosName) = pName;
  88. }
  89. const char* DiosStMRoutePos::GetName()
  90. {
  91. return m_pRoutePosName->c_str();
  92. }
  93. DWORD DiosStMRoutePos::GetRouteLineCount()
  94. {
  95. if (m_pOutRouteLineVec)
  96. {
  97. return (DWORD)m_pOutRouteLineVec->size();
  98. }
  99. return 0;
  100. }
  101. DiosStMRouteLine **DiosStMRoutePos::GetOutRouteLineVec()
  102. {
  103. if (m_pOutRouteLineVec)
  104. {
  105. if (m_pOutRouteLineVec->size() > 0)
  106. {
  107. return &((*m_pOutRouteLineVec)[0]);
  108. }
  109. }
  110. return NULL;
  111. }
  112. DiosStMRouteLine *DiosStMRoutePos::operator [](DiosStMEvt &Evt)
  113. {
  114. if (m_pOutRouteLineVec)
  115. {
  116. if (m_pOutRouteLineVec->size() > 0)
  117. {
  118. for (size_t i = 0; i < m_pOutRouteLineVec->size(); i++)
  119. {
  120. if ((*(DiosStMEvt *)(*(*m_pOutRouteLineVec)[i])) == Evt)
  121. {
  122. return (*m_pOutRouteLineVec)[i];
  123. }
  124. }
  125. }
  126. }
  127. return NULL;
  128. }
  129. DWORD DiosStMRoutePos::GetTimeout()
  130. {
  131. return m_Timeout;
  132. }
  133. void DiosStMRoutePos::SetDisable(ResDataObject disable)
  134. {
  135. m_resDisable = disable;
  136. }
  137. void DiosStMRoutePos::SetBreak(bool bBreakIn, bool bBreakAction, bool bBreakOut)
  138. {
  139. m_bBreakIn = bBreakIn;
  140. m_bBreakAction = bBreakAction;
  141. m_bBreakOut = bBreakOut;
  142. }
  143. DIOSSTMRET DiosStMRoutePos::DoIn(DiosSMachineIF* pSM)
  144. {
  145. if (pSM->InDebugMode() && m_bBreakIn)
  146. pSM->WaitContinue();
  147. for (int x = 0; x < m_resDisable.size(); x++)
  148. {
  149. pSM->EnableEvent((const char*)m_resDisable[x], false);
  150. }
  151. return DIOSSMRET_OK;
  152. }
  153. DIOSSTMRET DiosStMRoutePos::DoOut(DiosSMachineIF* pSM)
  154. {
  155. if (pSM->InDebugMode() && m_bBreakOut)
  156. pSM->WaitContinue();
  157. for (int x = 0; x < m_resDisable.size(); x++)
  158. {
  159. pSM->EnableEvent((const char*)m_resDisable[x], true);
  160. }
  161. return DIOSSMRET_OK;
  162. }
  163. DIOSSTMRET DiosStMRoutePos::DoAction(DiosSMachineIF* pSM) //执行进入当前状态的Action
  164. {
  165. ResDataObject resAction, resUserVaiable, resSystemVaiable;
  166. if (pSM->InDebugMode() && m_bBreakAction)
  167. pSM->WaitContinue();
  168. pSM->GetUserVariable(nullptr, resUserVaiable);
  169. pSM->GetSystemVariable(nullptr, resSystemVaiable);
  170. DIOSSTMRET ret = m_pDevicePool->StateMachineAction(&m_resStateActions, resAction, &resUserVaiable, m_Timeout);
  171. //存入系统变量
  172. //如果超时,触发超时
  173. if (ret == DIOSSMRET_TIMEOUT)
  174. {
  175. for (int x = 0; x < m_pRouteLineEvents->size(); x++)
  176. {
  177. DiosStMEvt* pEvent = (*m_pRouteLineEvents)[x];
  178. if (resAction.size() <= 0)
  179. {
  180. pEvent->Active("Timeout", &resAction, "");
  181. }
  182. for (int aidx = 0; aidx < resAction.size(); aidx++)
  183. {
  184. string device = resAction.GetKey(aidx);
  185. pEvent->Active("Timeout", &resAction[aidx], device.substr(0, device.find('.')).c_str());
  186. }
  187. }
  188. }
  189. else if(resAction.size() <= 0)
  190. {
  191. //没有Action定义
  192. }
  193. //触发Action执行结果处理
  194. for (int x = 0; x < m_pRouteLineEvents->size(); x++)
  195. {
  196. DiosStMEvt* pEvent = (*m_pRouteLineEvents)[x];
  197. for (int aidx = 0; aidx < resAction.size(); aidx++)
  198. {
  199. string device = resAction.GetKey(aidx);
  200. pEvent->Active("Action", &resAction[aidx], device.substr(0, device.find('.')).c_str());
  201. }
  202. }
  203. return ret;
  204. }
  205. //定时检查是否超时,最小间隔为1s,有可能不执行
  206. DIOSSTMRET DiosStMRoutePos::CheckTimeout()
  207. {
  208. return DIOSSMRET_NG;
  209. }
  210. //状态到了的检查,是否激活事件
  211. DIOSSTMRET DiosStMRoutePos::CheckNotify(const char* pszDevice, ResDataObject* res)
  212. {
  213. for (int x = 0; x < m_pRouteLineEvents->size(); x++)
  214. {
  215. DiosStMEvt* pEvent = (*m_pRouteLineEvents)[x];
  216. pEvent->Active("Notify", res, pszDevice);
  217. }
  218. return DIOSSMRET_OK;
  219. }
  220. bool DiosStMRoutePos::TriggerEvent(const char* pszEvent)
  221. {
  222. ResDataObject res;
  223. bool bRet = false;
  224. res = pszEvent;
  225. for (int x = 0; x < m_pRouteLineEvents->size(); x++)
  226. {
  227. DiosStMEvt* pEvent = (*m_pRouteLineEvents)[x];
  228. bRet |= pEvent->Active("External", &res, "");
  229. }
  230. return bRet;
  231. }
  232. DiosStMRouteLine* DiosStMRoutePos::WaitFroNextState(int timeout) //等待进入下一个状态
  233. {
  234. //在正常逻辑下,单个状态的 Action只会触发 当前状态的 事件
  235. // 除非有异常发生,产生了意外通知,这个由全局事件来管理
  236. HANDLE* pAllHandle = new HANDLE[m_pRouteLineEvents->size()];
  237. for (int x = 0; x < m_pRouteLineEvents->size(); x++)
  238. {
  239. DiosStMEvt* pEvent = (*m_pRouteLineEvents)[x];
  240. pAllHandle[x] = pEvent->GetHandle();
  241. }
  242. DWORD dwret = WaitForMultipleObjects(m_pRouteLineEvents->size(), pAllHandle, FALSE, timeout);
  243. if (dwret >= WAIT_OBJECT_0 && dwret < WAIT_OBJECT_0 + m_pRouteLineEvents->size())
  244. {
  245. (*m_pRouteLineEvents)[dwret - WAIT_OBJECT_0]->Reset();
  246. delete[] pAllHandle;
  247. return m_pOutRouteLineVec->at(dwret - WAIT_OBJECT_0);
  248. }
  249. delete[] pAllHandle;
  250. return nullptr;
  251. }
  252. void DiosStMRoutePos::EnableEvent(const char* pszEventName, bool state)
  253. {
  254. for (int x = 0; x < m_pRouteLineEvents->size(); x++)
  255. {
  256. DiosStMEvt* pEvent = (*m_pRouteLineEvents)[x];
  257. if (*pEvent == pszEventName)
  258. {
  259. pEvent->Enable(state);
  260. return;
  261. }
  262. }
  263. }
  264. //================================
  265. //-------------------------------------
  266. DiosSMachine::DiosSMachine()
  267. {
  268. m_pStatePosList = new MsgQueue<ResDataObject>();
  269. m_StateQuedEvent = CreateEvent(0, 1, 0, 0);
  270. m_pDevicePool = new StateMachineDevicePool();
  271. m_strName = "DiosSMachine";
  272. m_pGlobalRoute = new DiosStMRoutePos("Global", m_pDevicePool);
  273. }
  274. DiosSMachine::~DiosSMachine()
  275. {
  276. delete m_pStatePosList;
  277. CloseHandle(m_StateQuedEvent);
  278. //if (GetLogger() != 0)
  279. //{
  280. // ReleseLogger((Logger*)GetLogger());
  281. // SetLogger(0);
  282. //}
  283. delete m_pDevicePool;
  284. }
  285. void DiosSMachine::SetStateMachineLog(const char *pszLogTitle)
  286. {
  287. //if (GetLogger() == 0)
  288. //{
  289. // string logfile = GetProcessDirectory() + "\\logs\\";
  290. // logfile = FormatstdString("%s%s.log", logfile.c_str(), pszLogTitle);
  291. // //Logger *pLog = CreateLogger();
  292. // pLog->SetLogFilepath(logfile.c_str());
  293. // SetLogger(pLog);
  294. //}
  295. }
  296. bool DiosSMachine::OnStartThread()
  297. {
  298. return PrePareStateMachine();
  299. }
  300. bool DiosSMachine::Exec()
  301. {
  302. ExecStateMachine(GetExitEvt());
  303. return false;
  304. }
  305. void DiosSMachine::PushStateChange(ResDataObject &ChangedPos)
  306. {
  307. m_pStatePosList->InQueue(ChangedPos);
  308. SetEvent(m_StateQuedEvent);
  309. }
  310. bool DiosSMachine::PopStateChange(ResDataObject &LastPos)
  311. {
  312. bool ret = false;
  313. if (m_pStatePosList->size() > 0)
  314. {
  315. m_pStatePosList->DeQueue(LastPos);
  316. m_LastHitStatePos = LastPos;
  317. ret = true;
  318. }
  319. if (m_pStatePosList->size() == 0)
  320. {
  321. ResetEvent(m_StateQuedEvent);
  322. }
  323. else
  324. {
  325. SetEvent(m_StateQuedEvent);
  326. }
  327. if (ret == false)
  328. {
  329. if (m_LastHitStatePos.size() > 0)
  330. {
  331. LastPos = m_LastHitStatePos;
  332. ret = true;
  333. }
  334. }
  335. return ret;
  336. }
  337. HANDLE DiosSMachine::GetStateQuedEvent()
  338. {
  339. return m_StateQuedEvent;
  340. }
  341. bool DiosSMachine::StartStateMachine(/*DiosStMRouteLine *pExternalWaitEvts[], DWORD WaitCount*/)
  342. {
  343. m_LastHitStatePos.clear();
  344. if (WaitTheThreadEnd(0) == false)
  345. {
  346. //it's in running state
  347. printf("StartStateMachine Failed.it's in running state\n");
  348. return false;
  349. }
  350. //if (pExternalWaitEvts != NULL && WaitCount > 0)
  351. //{
  352. // m_RouteExternalEvtCount = WaitCount;
  353. // m_pRouteExternalMap = &pExternalWaitEvts[0];
  354. //}
  355. bool ret = StartThread();
  356. if (ret)
  357. {
  358. return GetRunningState(TIMEOUT_TEMP);
  359. }
  360. return ret;
  361. }
  362. void DiosSMachine::StopStateMachine(DWORD timeout)
  363. {
  364. //直接StopThread好像不是个办法,得让状态机退出前进行OnExit操作.
  365. StopThread(timeout);
  366. ClearState();
  367. }
  368. //DiosSubSMachine::DiosSubSMachine(void)
  369. //{
  370. //
  371. //}
  372. //
  373. //DiosSubSMachine::DiosSubSMachine(const char *pName) : DiosStMRoutePos(pName)
  374. //{
  375. // SetStateMachineName(pName);
  376. //}
  377. //
  378. //DiosSubSMachine::~DiosSubSMachine(void)
  379. //{
  380. //
  381. //}
  382. //
  383. //bool DiosSubSMachine::IsSMachine()
  384. //{
  385. // return true;
  386. //}
  387. bool DiosSMachine::Reset(DWORD Timeout)
  388. {
  389. StopStateMachine(Timeout);
  390. return m_pDevicePool->ClearDevices();
  391. }
  392. bool DiosSMachine::AddDevices(ResDataObject& DevList)
  393. {
  394. return m_pDevicePool->AddDevices(DevList);
  395. }
  396. bool DiosSMachine::ClearDevices()
  397. {
  398. return m_pDevicePool->ClearDevices();
  399. }
  400. bool DiosSMachine::TriggerEvent(const char* pEventName)
  401. {
  402. //DiosStMEvt Evt;
  403. bool bRet = false;
  404. printf("TriggerEvent:%s\n", pEventName);
  405. mLog::FDEBUG("TriggerEvent:%s\n", pEventName);
  406. if (!(bRet = m_pCurrentRoutePos->TriggerEvent(pEventName)))
  407. {
  408. //当前状态没有处理该事件
  409. bRet = m_pGlobalRoute->TriggerEvent(pEventName);
  410. }
  411. return bRet;
  412. //string ErrEvent = DiosErrorType;
  413. //if (ErrEvent == pEventName)
  414. //{
  415. // Evt.SetEvt(DiosErrorType, DiosFrameError);
  416. //}
  417. //else
  418. //{
  419. // Evt.SetEvt(pEventName, NULL);
  420. //}
  421. //return PushEvent(Evt);
  422. }
  423. //bool DiosSMachine::AddStateActions(ResDataObject& ActionMap)
  424. //{
  425. // return m_pDevicePool->AddStateActions(ActionMap);
  426. //}
  427. //
  428. //bool DiosSMachine::AddStateEvents(ResDataObject& EventMap)
  429. //{
  430. // return m_pDevicePool->AddStateEvents(EventMap);
  431. //}
  432. //从状态机定义中加载当前状态机定义
  433. //MachineName:单值
  434. //Variable:对象
  435. //States:
  436. // Begin:
  437. // xxxState:
  438. // In:
  439. // Out:
  440. // Action
  441. // Event:当前状态事件
  442. // End:
  443. // Event: 全局事件
  444. bool DiosSMachine::LoadMachine(ResDataObject& Machine)
  445. {
  446. //
  447. if (Machine.GetFirstOf("MachineName") >= 0)
  448. *m_pStateMachineName = (const char*)(Machine["MachineName"]);
  449. if (Machine.GetFirstOf("Variable") >= 0)
  450. m_resUserVariable = Machine["Variable"];
  451. ResDataObject stats;
  452. if (Machine.GetFirstOf("States") >= 0)
  453. stats = Machine["States"];
  454. if (stats.size() <= 0)
  455. return false;
  456. ResDataObject globalEvt;
  457. if (Machine.GetFirstOf("Events") >= 0)
  458. globalEvt = Machine["Events"];
  459. m_StmEntryPosName = (string)stats["Begin"];
  460. m_StmExitPosName = (string)stats["End"];
  461. ResDataObject stStep;
  462. int timeout = 0;
  463. for (int x = 0; x < stats.size(); x++)
  464. {
  465. string name = stats.GetKey(x);
  466. if (name != "Begin" && name != "End")
  467. {
  468. stStep = stats[x];
  469. //bool AddRoutePos(DiosStMRoutePos *pPos);
  470. //bool AddInRouteLine(DiosStMEvt & Evt, const char* pGuardName, const char* pDesPosName);
  471. //bool AddOutRouteLine(DiosStMEvt & Evt, const char* pSrcPosName, const char* pGuardName, const char* pDesPosName);
  472. //状态点
  473. DiosStMRoutePos* pStep = new DiosStMRoutePos(name.c_str(), m_pDevicePool);
  474. AddRoutePos(pStep);
  475. //全局路由
  476. ResDataObject in;
  477. if (stStep.GetFirstOf("In") >= 0)
  478. {
  479. //有In全局路由
  480. ResDataObject ins = stStep["In"];
  481. for (int ot = 0; ot < ins.size(); ot++)
  482. {
  483. string evtName = ins.GetKey(ot);
  484. if (globalEvt.GetFirstOf(evtName.c_str()) >= 0)
  485. {
  486. //找到事件定义
  487. DiosStMEvt* stEvt = new DiosStMEvt();
  488. stEvt->parse(&globalEvt[evtName.c_str()]);
  489. //全局事件设置
  490. AddInRouteLine(*stEvt, (const char*)ins[evtName.c_str()], (const char*)ins[evtName.c_str()]);
  491. }
  492. }
  493. }
  494. if (stStep.GetFirstOf("Out") < 0)
  495. {
  496. //该状态点没有出路由,有问题,状态机不完整
  497. return false;
  498. }
  499. if (stStep.GetFirstOf("Event") < 0)
  500. {
  501. //事件表有问题
  502. return false;
  503. }
  504. if (stStep.GetFirstOf("Action") < 0)
  505. {
  506. //Action表有问题
  507. return false;
  508. }
  509. ResDataObject out = stStep["Out"];
  510. ResDataObject evt = stStep["Event"];
  511. ResDataObject action = stStep["Action"];
  512. for (int otIdx = 0; otIdx < out.size(); otIdx++)
  513. {
  514. string evtName = out.GetKey(otIdx);
  515. if (evt.GetFirstOf(evtName.c_str()) >= 0)
  516. {
  517. //找到事件定义
  518. DiosStMEvt* stEvt = new DiosStMEvt();
  519. stEvt->SetEvt(evtName.c_str(), evtName.c_str(), evt[evtName.c_str()]);
  520. stEvt->parse(&evt[evtName.c_str()]);
  521. //AddOutRouteLine(*stEvt, name.c_str(), name.c_str(), (const char*)out[evtName.c_str()]);
  522. pStep->PosAddOutRouteLine(stEvt, name.c_str(), name.c_str(), (const char*)out[evtName.c_str()]);
  523. int evtTimeout = stEvt->GetTimeout();
  524. if (evtTimeout > timeout)
  525. timeout = evtTimeout;
  526. }
  527. }
  528. ////禁用全局事件
  529. if (evt.GetFirstOf("Disable") >= 0)
  530. {
  531. pStep->SetDisable(evt["Disable"]);
  532. }
  533. std::cout << "StateMachine Add " << name << " has out line [" << pStep->GetRouteLineCount() << "] " << endl;
  534. //Actions
  535. if (timeout < STATEMACHINE_ACTION_TIMEOUT)
  536. timeout = STATEMACHINE_ACTION_TIMEOUT;
  537. pStep->Active(true, timeout);
  538. pStep->SetAction(action);
  539. }
  540. }
  541. PrePareStateMachine();
  542. return true;
  543. }
  544. void DiosSMachine::ClearStateActionMaps()
  545. {
  546. m_pDevicePool->ClearStateActionMaps();
  547. }
  548. void DiosSMachine::ClearStateEventMaps()
  549. {
  550. m_pDevicePool->ClearStateEventMaps();
  551. }
  552. bool DiosSMachine::RunStateMachine(const char* pszLogTitle)
  553. {
  554. SetStateMachineLog(pszLogTitle);
  555. return StartStateMachine();
  556. }
  557. DIOSSTMRET DiosSMachine::StateMachineEntry(DWORD timeout)
  558. {
  559. printf("Enter Dr StateMachine\n");
  560. mLog::FDEBUG("Enter Dr StateMachine");
  561. m_pDevicePool->SetThreadExitHandle(GetExitEvt());
  562. return DIOSSMRET_OK;
  563. }
  564. DIOSSTMRET DiosSMachine::StateMachineExit(DWORD timeout)
  565. {
  566. printf("Exit Dr StateMachine\n");
  567. mLog::FDEBUG("Exit Dr StateMachine");
  568. return DIOSSMRET_OK;
  569. }
  570. //DIOSSTMRET DiosSMachine::StateMachineAction(const char* pAction, DWORD timeout)
  571. //{
  572. // return m_pDevicePool->StateMachineAction("Root", m_pCurrentRoutePos->GetName(), timeout);
  573. //}
  574. //
  575. //DIOSSTMRET DiosSMachine::StateMachineGuard(const char* pGuard, DWORD timeout)
  576. //{
  577. // return DIOSSMRET_OK;
  578. //}
  579. //int DiosSMachine::StateMachineWaitForEvents(
  580. // DiosStMRouteLine* pLocalEvts[], DWORD CountOfLocal,
  581. // //DiosStMRouteLine *pExternalEvts[], DWORD CountOfExternal,
  582. // DiosStMRouteLine* pOutpathEvts[], DWORD CountOfOutpath,
  583. // DWORD timeout
  584. //)
  585. //{
  586. // return m_pDevicePool->StateMachineWaitForEvents(this, pLocalEvts, CountOfLocal, pOutpathEvts, CountOfOutpath, timeout);
  587. //}
  588. DiosStMRouteLine* DiosSMachine::WaitNotfiyProcess()
  589. {
  590. DiosStMRouteLine* pRet = nullptr;
  591. ResDataObject resNotify;
  592. m_pDevicePool->ReadForDeviceEvents(resNotify, 200, m_pCurrentRoutePos->GetRouteLineCount()/2 + 1);
  593. for (int x = 0; x < resNotify.size(); x++)
  594. {
  595. ResDataObject notify = resNotify[x];
  596. string ntName = resNotify.GetKey(x);
  597. ntName = ntName.substr(0, ntName.find('.'));
  598. //当前状态的事件检查
  599. m_pCurrentRoutePos->CheckNotify(ntName.c_str(), &notify);
  600. //全局事件的检查
  601. m_pGlobalRoute->CheckNotify(ntName.c_str(), &notify);
  602. }
  603. //优先检查当前状态
  604. pRet = m_pCurrentRoutePos->WaitFroNextState(50);
  605. if (pRet != nullptr)
  606. {
  607. //必须消耗掉全局的已触发的事件
  608. m_pGlobalRoute->WaitFroNextState(1);
  609. return pRet;
  610. }
  611. //全局状态跳转
  612. pRet = m_pGlobalRoute->WaitFroNextState(50);
  613. return pRet;
  614. }