UpsFSM.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #ifndef __UPS_FSM_H
  2. #define __UPS_FSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "DevFSMCommBase.hpp"
  6. #define USER_EVT_TEST EVT_USER+1
  7. #define USER_EVT_QUIT EVT_USER+2
  8. #define USER_EVT_OPEN EVT_USER+3
  9. #define USER_EVT_GETSTATUS EVT_USER+4
  10. #define USER_EVT_SHUTDOWN EVT_USER+5
  11. #define USER_EVT_SHUTDOWN_FINISHED EVT_USER+6
  12. #define USER_EVT_CHECK_FINISHED EVT_USER+7
  13. #include "Ups_server_g.h"
  14. #include "UpsClass.h"
  15. using namespace Ups;
  16. class OpenUpsEvent : public FSMEvent
  17. {
  18. public:
  19. OpenUpsEvent() : FSMEvent(USER_EVT_OPEN){}
  20. virtual ~OpenUpsEvent(){}
  21. SpReqAnsContext<UpsService_Open_Req,UpsService_Open_Ans>::Pointer ctx;
  22. virtual void OnUnhandled()
  23. {
  24. if (ctx != NULL)
  25. ctx->Answer(Error_InvalidState);
  26. }
  27. };
  28. class GetStatusEvent : public FSMEvent
  29. {
  30. public:
  31. GetStatusEvent() : FSMEvent(USER_EVT_GETSTATUS){}
  32. virtual ~GetStatusEvent(){}
  33. SpReqAnsContext<UpsService_GetStatus_Req,UpsService_GetStatus_Ans>::Pointer ctx;
  34. virtual void OnUnhandled()
  35. {
  36. if (ctx != NULL)
  37. ctx->Answer(Error_InvalidState);
  38. }
  39. };
  40. class ShutDownEvent : public FSMEvent
  41. {
  42. public:
  43. ShutDownEvent() : FSMEvent(USER_EVT_SHUTDOWN){}
  44. virtual ~ShutDownEvent(){}
  45. SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx;
  46. //oiltest
  47. BYTE btShutTime,btRestartTime;
  48. virtual void OnUnhandled()
  49. {
  50. if (ctx != NULL)
  51. ctx->Answer(Error_InvalidState);
  52. }
  53. };
  54. class CUpsFSM : public CCommDevFSM<CUpsFSM, UpsClass>
  55. {
  56. public:
  57. enum {s0,s1,s2};
  58. BEGIN_FSM_STATE(CUpsFSM)
  59. FSM_STATE_ENTRY(s0,"Normal",s0_on_entry,s0_on_exit,s0_on_event)
  60. FSM_STATE_ENTRY(s1,"ShutDown",s1_on_entry,s1_on_exit,s1_on_event)
  61. FSM_STATE_ENTRY(s2,"Fail",s2_on_entry,s2_on_exit,s2_on_event)
  62. END_FSM_STATE()
  63. BEGIN_FSM_RULE(CUpsFSM, s0)
  64. FSM_RULE_ENTRY(s0, s1, USER_EVT_SHUTDOWN, 0)
  65. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  66. FSM_RULE_ENTRY(s1, s2, USER_EVT_SHUTDOWN_FINISHED, 1)
  67. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  68. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  69. FSM_RULE_ENTRY(s2, s0, USER_EVT_CHECK_FINISHED, 0)
  70. END_FSM_RULE()
  71. CUpsFSM():m_bDevOpen(false),m_testResult(Error_Succeed){}
  72. virtual ~CUpsFSM() {};
  73. virtual ErrorCodeEnum OnInit();
  74. virtual ErrorCodeEnum OnExit();
  75. virtual void s0_on_entry();
  76. virtual void s0_on_exit();
  77. virtual unsigned int s0_on_event(FSMEvent* e);
  78. virtual void s1_on_entry();
  79. virtual void s1_on_exit();
  80. virtual unsigned int s1_on_event(FSMEvent* e);
  81. virtual void s2_on_entry();
  82. virtual void s2_on_exit();
  83. virtual unsigned int s2_on_event(FSMEvent* e);
  84. int ShutDown(SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx);
  85. int CheckStatus();
  86. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  87. private:
  88. bool m_bDevOpen;
  89. ErrorCodeEnum m_testResult;
  90. };
  91. struct ShutDownTask : public ITaskSp
  92. {
  93. CUpsFSM *fsm;
  94. ShutDownTask(CUpsFSM* f) : fsm(f) {}
  95. SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx;
  96. void Process()
  97. {
  98. FSMEvent *e = new FSMEvent(USER_EVT_SHUTDOWN_FINISHED);
  99. e->param1 = fsm->ShutDown(ctx);
  100. fsm->PostEventFIFO(e);
  101. }
  102. };
  103. struct CheckTask : public ITaskSp
  104. {
  105. CUpsFSM *fsm;
  106. CheckTask(CUpsFSM *f) : fsm(f) {}
  107. void Process()
  108. {
  109. FSMEvent *e = new FSMEvent(USER_EVT_CHECK_FINISHED);
  110. e->param1 = fsm->CheckStatus();
  111. fsm->PostEventFIFO(e);
  112. }
  113. };
  114. #endif //__UPS_FSM_H