WatchDogFSM.h 5.0 KB

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