CcosSMachineV2.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #include "stdafx.h"
  2. #include "CcosSMachineV2.h"
  3. #include "common_api.h"
  4. #include <sstream>
  5. using namespace std;
  6. CcosSMachineV2::CcosSMachineV2()
  7. {
  8. m_pStatePosList = new MsgQueue<ResDataObject>();
  9. m_StateQuedEvent = CreateEvent(0, 1, 0, 0);
  10. }
  11. CcosSMachineV2::~CcosSMachineV2()
  12. {
  13. delete m_pStatePosList;
  14. CloseHandle(m_StateQuedEvent);
  15. if (GetLogger() != 0)
  16. {
  17. ReleseLogger((Logger*)GetLogger());
  18. SetLogger(0);
  19. }
  20. }
  21. void CcosSMachineV2::SetStateMachineLog(const char* pszLogTitle)
  22. {
  23. if (GetLogger() == 0)
  24. {
  25. string logfile = GetProcessDirectory() + "\\logs\\";
  26. logfile = FormatstdString("%s%s.log", logfile.c_str(), pszLogTitle);
  27. Logger* pLog = CreateLogger();
  28. pLog->SetLogFilepath(logfile.c_str());
  29. SetLogger(pLog);
  30. }
  31. }
  32. bool CcosSMachineV2::OnStartThread()
  33. {
  34. return PrePareStateMachine();
  35. }
  36. bool CcosSMachineV2::Exec()
  37. {
  38. ExecStateMachine(GetExitEvt(), NULL, 0);
  39. return false;
  40. }
  41. void CcosSMachineV2::PushStateChange(ResDataObject& ChangedPos)
  42. {
  43. m_pStatePosList->InQueue(ChangedPos);
  44. SetEvent(m_StateQuedEvent);
  45. }
  46. bool CcosSMachineV2::PopStateChange(ResDataObject& LastPos)
  47. {
  48. bool ret = false;
  49. if (m_pStatePosList->size() > 0)
  50. {
  51. m_pStatePosList->DeQueue(LastPos);
  52. m_LastHitStatePos = LastPos;
  53. ret = true;
  54. }
  55. if (m_pStatePosList->size() == 0)
  56. {
  57. ResetEvent(m_StateQuedEvent);
  58. }
  59. else
  60. {
  61. SetEvent(m_StateQuedEvent);
  62. }
  63. if (ret == false)
  64. {
  65. if (m_LastHitStatePos.size() > 0)
  66. {
  67. LastPos = m_LastHitStatePos;
  68. ret = true;
  69. }
  70. }
  71. return ret;
  72. }
  73. HANDLE CcosSMachineV2::GetStateQuedEvent()
  74. {
  75. return m_StateQuedEvent;
  76. }
  77. bool CcosSMachineV2::StartStateMachine(CcosStMRouteLine* pExternalWaitEvts[], DWORD WaitCount)
  78. {
  79. m_LastHitStatePos.clear();
  80. if (WaitTheThreadEnd(0) == false)
  81. {
  82. //it's in running state
  83. printf("StartStateMachine Failed.it's in running state\n");
  84. return false;
  85. }
  86. if (pExternalWaitEvts != NULL && WaitCount > 0)
  87. {
  88. m_RouteExternalEvtCount = WaitCount;
  89. m_pRouteExternalMap = &pExternalWaitEvts[0];
  90. }
  91. bool ret = StartThread();
  92. if (ret)
  93. {
  94. return GetRunningState(TIMEOUT_TEMP);
  95. }
  96. return ret;
  97. }
  98. void CcosSMachineV2::StopStateMachine(DWORD timeout)
  99. {
  100. //直接StopThread好像不是个办法,得让状态机退出前进行OnExit操作.
  101. StopThread(timeout);
  102. ClearState();
  103. }
  104. CcosSubSMachine::CcosSubSMachine(void)
  105. {
  106. }
  107. CcosSubSMachine::CcosSubSMachine(const char* pName) : CcosStMRoutePos(pName)
  108. {
  109. SetStateMachineName(pName);
  110. }
  111. CcosSubSMachine::~CcosSubSMachine(void)
  112. {
  113. }
  114. bool CcosSubSMachine::IsSMachine()
  115. {
  116. return true;
  117. }
  118. bool CcosSMachineV2::Reset(DWORD Timeout)
  119. {
  120. StopStateMachine(Timeout);
  121. return m_pDevicePool->ClearDevices();
  122. }
  123. bool CcosSMachineV2::AddDevices(ResDataObject& DevList)
  124. {
  125. return m_pDevicePool->AddDevices(DevList);
  126. }
  127. bool CcosSMachineV2::ClearDevices()
  128. {
  129. return m_pDevicePool->ClearDevices();
  130. }
  131. bool CcosSMachineV2::TriggerEvent(const char* pEventName)
  132. {
  133. CcosStMEvt Evt;
  134. printf("TriggerEvent:%s\n", pEventName);
  135. TPRINTA_DEBUG("TriggerEvent:%s\n", pEventName);
  136. string ErrEvent = CcosErrorType;
  137. if (ErrEvent == pEventName)
  138. {
  139. Evt.SetEvt(CcosErrorType, CcosFrameError);
  140. }
  141. else
  142. {
  143. Evt.SetEvt(pEventName, NULL);
  144. }
  145. return PushEvent(Evt);
  146. }
  147. bool CcosSMachineV2::AddStateActions(ResDataObject& ActionMap)
  148. {
  149. return m_pDevicePool->AddStateActions(ActionMap);
  150. }
  151. bool CcosSMachineV2::AddStateEvents(ResDataObject& EventMap)
  152. {
  153. return m_pDevicePool->AddStateEvents(EventMap);
  154. }
  155. void CcosSMachineV2::ClearStateActionMaps()
  156. {
  157. m_pDevicePool->ClearStateActionMaps();
  158. }
  159. void CcosSMachineV2::ClearStateEventMaps()
  160. {
  161. m_pDevicePool->ClearStateEventMaps();
  162. }
  163. bool CcosSMachineV2::RunStateMachine(const char* pszLogTitle)
  164. {
  165. SetStateMachineLog(pszLogTitle);
  166. return StartStateMachine(0, 0);
  167. }
  168. CCOSSTMRET CcosSMachineV2::StateMachineEntry(DWORD timeout)
  169. {
  170. printf("Enter Dr StateMachine\n");
  171. TPRINTA_DEBUG("Enter Dr StateMachine");
  172. m_pDevicePool->SetThreadExitHandle(GetExitEvt());
  173. return CCOSSMRET_OK;
  174. }
  175. CCOSSTMRET CcosSMachineV2::StateMachineExit(DWORD timeout)
  176. {
  177. printf("Exit Dr StateMachine\n");
  178. TPRINTA_DEBUG("Exit Dr StateMachine");
  179. return CCOSSMRET_OK;
  180. }