WatchDogFSM.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #ifndef _WATCHDOG_FSM_H
  2. #define _WATCHDOG_FSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "DevFSMCommBase.hpp"
  6. #include "WatchDogClass.h"
  7. enum EvtType
  8. {
  9. USER_EVT_TEST = EVT_USER+1,
  10. USER_EVT_QUIT,
  11. USER_EVT_INIT,
  12. USER_EVT_STARTWATCH,
  13. USER_EVT_STARTWATCH_FINISHED,
  14. USER_EVT_REFRESH,
  15. USER_EVT_REFRESH_FINISHED,
  16. USER_EVT_STOPWATCH,
  17. USER_EVT_STOPWATCH_FINISHED,
  18. };
  19. #include "WatchDog_server_g.h"
  20. using namespace WatchDog;
  21. class InitEvent : public FSMEvent
  22. {
  23. public:
  24. InitEvent() : FSMEvent(USER_EVT_INIT){}
  25. virtual ~InitEvent(){}
  26. virtual void OnUnhandled()
  27. {
  28. }
  29. };
  30. class StartWatchEvent : public FSMEvent
  31. {
  32. public:
  33. StartWatchEvent() : FSMEvent(USER_EVT_STARTWATCH){}
  34. virtual ~StartWatchEvent(){}
  35. SpReqAnsContext<WatchDogService_StartWatch_Req,WatchDogService_StartWatch_Ans>::Pointer ctx;
  36. virtual void OnUnhandled()
  37. {
  38. if (ctx != NULL)
  39. ctx->Answer(Error_InvalidState);
  40. }
  41. };
  42. class RefreshEvent : public FSMEvent
  43. {
  44. public:
  45. RefreshEvent() : FSMEvent(USER_EVT_REFRESH){}
  46. virtual ~RefreshEvent(){}
  47. SpReqAnsContext<WatchDogService_Refresh_Req,WatchDogService_Refresh_Ans>::Pointer ctx;
  48. virtual void OnUnhandled()
  49. {
  50. if (ctx != NULL)
  51. ctx->Answer(Error_InvalidState);
  52. }
  53. };
  54. class StopWatchEvent : public FSMEvent
  55. {
  56. public:
  57. StopWatchEvent() : FSMEvent(USER_EVT_STOPWATCH){}
  58. virtual ~StopWatchEvent(){}
  59. SpReqAnsContext<WatchDogService_StopWatch_Req,WatchDogService_StopWatch_Ans>::Pointer ctx;
  60. virtual void OnUnhandled()
  61. {
  62. if (ctx != NULL)
  63. ctx->Answer(Error_InvalidState);
  64. }
  65. };
  66. struct WatchDogTimer : public ITimerListener
  67. {
  68. };
  69. class CWatchDogFSM : public CCommDevFSM<CWatchDogFSM, WatchDogClass>
  70. {
  71. public:
  72. enum {s0,s1,s2,s3,s4};
  73. BEGIN_FSM_STATE(CWatchDogFSM)
  74. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  75. FSM_STATE_ENTRY(s1,"StartWatching",s1_on_entry,s1_on_exit,s1_on_event)
  76. FSM_STATE_ENTRY(s2,"Watching",s2_on_entry,s2_on_exit,s2_on_event)
  77. FSM_STATE_ENTRY(s3,"StopWatching",s3_on_entry,s3_on_exit,s3_on_event)
  78. FSM_STATE_ENTRY(s4,"Fail",s4_on_entry,s4_on_exit,s4_on_event)
  79. END_FSM_STATE()
  80. BEGIN_FSM_RULE(CWatchDogFSM, s0)
  81. FSM_RULE_ENTRY(s0, s1, USER_EVT_STARTWATCH, 0)
  82. FSM_RULE_ENTRY(s1, s2, USER_EVT_STARTWATCH_FINISHED, 0)
  83. FSM_RULE_ENTRY(s1, s4, USER_EVT_STARTWATCH_FINISHED, 1)
  84. FSM_RULE_ENTRY(s1, s0, USER_EVT_STARTWATCH_FINISHED, 2)
  85. FSM_RULE_ENTRY(s2, s4, USER_EVT_REFRESH_FINISHED, 1)
  86. FSM_RULE_ENTRY(s2, s3, USER_EVT_STOPWATCH, 0)
  87. FSM_RULE_ENTRY(s3, s0, USER_EVT_STOPWATCH_FINISHED, 0)
  88. FSM_RULE_ENTRY(s3, s4, USER_EVT_STOPWATCH_FINISHED, 1)
  89. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  90. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  91. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  92. FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  93. FSM_RULE_ENTRY(s4, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  94. END_FSM_RULE()
  95. CWatchDogFSM() : m_devSN("")
  96. {
  97. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x20D);
  98. m_FirstStart = TRUE;
  99. ZeroMemory(&m_adapterInfo, sizeof(m_adapterInfo));
  100. }
  101. virtual ~CWatchDogFSM() {};
  102. virtual ErrorCodeEnum OnInit();
  103. virtual ErrorCodeEnum OnExit();
  104. virtual void s0_on_entry();
  105. virtual void s0_on_exit();
  106. virtual unsigned int s0_on_event(FSMEvent* e);
  107. virtual void s1_on_entry();
  108. virtual void s1_on_exit();
  109. virtual unsigned int s1_on_event(FSMEvent* e);
  110. virtual void s2_on_entry();
  111. virtual void s2_on_exit();
  112. virtual unsigned int s2_on_event(FSMEvent* e);
  113. virtual void s3_on_entry();
  114. virtual void s3_on_exit();
  115. virtual unsigned int s3_on_event(FSMEvent* e);
  116. virtual void s4_on_entry();
  117. virtual void s4_on_exit();
  118. virtual unsigned int s4_on_event(FSMEvent* e);
  119. int StartWatch(SpReqAnsContext<WatchDogService_StartWatch_Req,WatchDogService_StartWatch_Ans>::Pointer ctx);
  120. int Refresh(SpReqAnsContext<WatchDogService_Refresh_Req,WatchDogService_Refresh_Ans>::Pointer ctx);
  121. int StopWatch(SpReqAnsContext<WatchDogService_StopWatch_Req,WatchDogService_StopWatch_Ans>::Pointer ctx);
  122. private:
  123. ErrorCodeEnum Load();
  124. ErrorPackage m_errPkg;
  125. CSimpleStringA m_devSN;
  126. AdapterInfo m_adapterInfo;
  127. DevCategoryInfo m_devCatInfo;
  128. };
  129. struct StartWatchTask : public ITaskSp
  130. {
  131. CWatchDogFSM* fsm;
  132. StartWatchTask(CWatchDogFSM* f) : fsm(f) {}
  133. SpReqAnsContext<WatchDogService_StartWatch_Req,WatchDogService_StartWatch_Ans>::Pointer ctx;
  134. void Process()
  135. {
  136. FSMEvent *pEvt = new FSMEvent(USER_EVT_STARTWATCH_FINISHED);
  137. pEvt->param1 = fsm->StartWatch(ctx);
  138. fsm->PostEventFIFO(pEvt);
  139. }
  140. };
  141. struct RefreshTask : public ITaskSp
  142. {
  143. CWatchDogFSM* fsm;
  144. RefreshTask(CWatchDogFSM* f) : fsm(f) {}
  145. SpReqAnsContext<WatchDogService_Refresh_Req,WatchDogService_Refresh_Ans>::Pointer ctx;
  146. void Process()
  147. {
  148. FSMEvent *e = new FSMEvent(USER_EVT_REFRESH_FINISHED);
  149. e->param1 = fsm->Refresh(ctx);
  150. fsm->PostEventFIFO(e);
  151. }
  152. };
  153. struct StopWatchTask : public ITaskSp
  154. {
  155. CWatchDogFSM* fsm;
  156. StopWatchTask(CWatchDogFSM* f) : fsm(f) {}
  157. SpReqAnsContext<WatchDogService_StopWatch_Req,WatchDogService_StopWatch_Ans>::Pointer ctx;
  158. void Process()
  159. {
  160. FSMEvent *e = new FSMEvent(USER_EVT_STOPWATCH_FINISHED);
  161. e->param1 = fsm->StopWatch(ctx);
  162. fsm->PostEventFIFO(e);
  163. }
  164. };
  165. #endif //_WATCHDOG_FSM_H