SampleFSM.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #ifndef __SAMPLE_FSM_H__
  2. #define __SAMPLE_FSM_H__
  3. #pragma once
  4. // This code is generated by spgenex tool!
  5. #include "SpFSM.h"
  6. #include "SampleEntity_def_g.h"
  7. #include "SpTest.h"
  8. using namespace SampleEntity;
  9. #define ENTITY_DEV_ID 0x103
  10. //
  11. // fsm event enum goes here
  12. //
  13. enum EvtType {
  14. EVT_USER_TEST_1 = (EVT_USER + 1),
  15. EVT_USER_TEST2 = (EVT_USER + 2),
  16. EVT_USER_TEST_3 = (EVT_USER + 3),
  17. EVT_USER_TEST_4 = (EVT_USER + 4),
  18. };
  19. class test2Event : public FSMEvent {
  20. public:
  21. test2Event() : FSMEvent(EVT_USER_TEST2){}
  22. ~test2Event(){}
  23. virtual void OnUnhandled() {
  24. THROW_ERROR("EVT_USER_TEST2 unhandled!");
  25. }
  26. };
  27. class test_3_event : public FSMEvent {
  28. public:
  29. test_3_event() : FSMEvent(EVT_USER_TEST_3){}
  30. ~test_3_event(){}
  31. virtual void OnUnhandled() {
  32. THROW_ERROR("EVT_USER_TEST_3 unhandled!");
  33. }
  34. };
  35. class test_4_event : public FSMEvent {
  36. public:
  37. test_4_event() : FSMEvent(EVT_USER_TEST_4){}
  38. ~test_4_event(){}
  39. virtual void OnUnhandled() {
  40. THROW_ERROR("EVT_USER_TEST_4 unhandled!");
  41. }
  42. };
  43. class CSampleFSM : public FSMImpl<CSampleFSM>, public IFSMStateHooker
  44. {
  45. public:
  46. CSampleFSM(void);
  47. virtual ~CSampleFSM(void);
  48. virtual ErrorCodeEnum OnInit();
  49. virtual ErrorCodeEnum OnExit();
  50. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  51. //define the state enum.
  52. enum {s0, s1=1, s2=2};
  53. BEGIN_FSM_STATE(CSampleFSM)
  54. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  55. FSM_STATE_ENTRY(s1, "Busy", s1_on_entry, s1_on_exit, s1_on_event)
  56. FSM_STATE_ENTRY(s2, "Fail", s2_on_entry, s2_on_exit, s2_on_event)
  57. END_FSM_STATE()
  58. BEGIN_FSM_RULE(CSampleFSM, s0)
  59. FSM_RULE_ENTRY(s0, s1, EVT_USER_TEST_4, 4)
  60. FSM_RULE_ENTRY(s1, s2, EVT_USER_TEST2, 0)
  61. FSM_RULE_ENTRY(s1, s0, EVT_USER_TEST_1, 1)
  62. FSM_RULE_ENTRY_RANGE(s1, s2, EVT_USER_TEST_3, 1, 3)
  63. FSM_RULE_ENTRY_ANY(s2, s0, EVT_USER_TEST_3)
  64. END_FSM_RULE()
  65. void s0_on_entry();
  66. void s0_on_exit();
  67. unsigned int s0_on_event(FSMEvent* event);
  68. void s1_on_entry();
  69. void s1_on_exit();
  70. unsigned int s1_on_event(FSMEvent* event);
  71. void s2_on_entry();
  72. void s2_on_exit();
  73. unsigned int s2_on_event(FSMEvent* event);
  74. /** return state before post event.*/
  75. int SimulateJump()
  76. {
  77. const int curState = GetCurrState()->id;
  78. Dbg("current state id: %d", curState);
  79. if (curState == s0) {
  80. FSMEvent* evt = new test_4_event();
  81. evt->param1 = 4;
  82. PostEventFIFO(evt);
  83. }
  84. else if(curState == s1) {
  85. FSMEvent* evt = new test2Event();
  86. evt->param1 = 0;
  87. PostEventFIFO(evt);
  88. }
  89. else if (curState == s2) {
  90. FSMEvent* evt = new test_3_event();
  91. evt->param1 = 4;
  92. PostEventFIFO(evt);
  93. }
  94. return curState;
  95. }
  96. void OnStateTrans(int iSrcState, int iDstState)
  97. {
  98. LogEvent(Severity_Low, 0, (LPCTSTR)CSimpleStringA::Format(
  99. "%s'FSM state changed from %s to %s", GetEntityBase()->GetEntityName(),
  100. GetStateName(iSrcState), GetStateName(iDstState)));
  101. /** still store old state when this hook is invoked*/
  102. CHECK(strcmp(GetCurrStateName(), GetStateName(iSrcState)) == 0);
  103. }
  104. private:
  105. //TODO:
  106. };
  107. class CSample2FSM : public FSMImpl<CSample2FSM>
  108. {
  109. public:
  110. CSample2FSM(void) {}
  111. virtual ~CSample2FSM(void) {}
  112. virtual ErrorCodeEnum OnInit() { return Error_NotImpl; }
  113. virtual ErrorCodeEnum OnExit() { return Error_NotImpl; }
  114. void SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext) {
  115. pTransactionContext->SendAnswer(Error_Succeed);
  116. }
  117. //define the state enum.
  118. enum {s0, s1, s2, s3};
  119. BEGIN_FSM_STATE(CSample2FSM)
  120. FSM_STATE_ENTRY(s0, "Init", s0_on_entry, s0_on_exit, s0_on_event)
  121. FSM_STATE_ENTRY(s1, "Processing", s1_on_entry, s1_on_exit, s1_on_event)
  122. FSM_STATE_ENTRY(s2, "Rich", s2_on_entry, s2_on_exit, s2_on_event)
  123. FSM_STATE_ENTRY(s3, "Old", s3_on_entry, s3_on_exit, s3_on_event)
  124. END_FSM_STATE()
  125. BEGIN_FSM_RULE(CSample2FSM, s0)
  126. FSM_RULE_ENTRY(s1, s2, EVT_USER_TEST_1, 0)
  127. FSM_RULE_ENTRY(s1, s0, EVT_USER_TEST2, 1)
  128. FSM_RULE_ENTRY_RANGE(s1, s2, EVT_USER_TEST_3, 0, 3)
  129. FSM_RULE_ENTRY_ANY(s1, s2, EVT_USER_TEST_4)
  130. END_FSM_RULE()
  131. void s0_on_entry() {}
  132. void s0_on_exit() {}
  133. unsigned int s0_on_event(FSMEvent* event) { return 0; }
  134. void s1_on_entry() {}
  135. void s1_on_exit() {}
  136. unsigned int s1_on_event(FSMEvent* event) { return 0; }
  137. void s2_on_entry() {}
  138. void s2_on_exit() {}
  139. unsigned int s2_on_event(FSMEvent* event) { return 0; }
  140. void s3_on_entry() {}
  141. void s3_on_exit() {}
  142. unsigned int s3_on_event(FSMEvent* event) { return 0; }
  143. private:
  144. //TODO:
  145. };
  146. #endif // __SAMPLE_FSM_H__