123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- #ifndef __SAMPLE_FSM_H__
- #define __SAMPLE_FSM_H__
- #pragma once
- // This code is generated by spgenex tool!
- #include "SpFSM.h"
- #include "SampleEntity_def_g.h"
- #include "SpTest.h"
- using namespace SampleEntity;
- #define ENTITY_DEV_ID 0x103
- //
- // fsm event enum goes here
- //
- enum EvtType {
- EVT_USER_TEST_1 = (EVT_USER + 1),
- EVT_USER_TEST2 = (EVT_USER + 2),
- EVT_USER_TEST_3 = (EVT_USER + 3),
- EVT_USER_TEST_4 = (EVT_USER + 4),
- };
- class test2Event : public FSMEvent {
- public:
- test2Event() : FSMEvent(EVT_USER_TEST2){}
- ~test2Event(){}
- virtual void OnUnhandled() {
- THROW_ERROR("EVT_USER_TEST2 unhandled!");
- }
- };
- class test_3_event : public FSMEvent {
- public:
- test_3_event() : FSMEvent(EVT_USER_TEST_3){}
- ~test_3_event(){}
- virtual void OnUnhandled() {
- THROW_ERROR("EVT_USER_TEST_3 unhandled!");
- }
- };
- class test_4_event : public FSMEvent {
- public:
- test_4_event() : FSMEvent(EVT_USER_TEST_4){}
- ~test_4_event(){}
- virtual void OnUnhandled() {
- THROW_ERROR("EVT_USER_TEST_4 unhandled!");
- }
- };
- class CSampleFSM : public FSMImpl<CSampleFSM>, public IFSMStateHooker
- {
- public:
- CSampleFSM(void);
- virtual ~CSampleFSM(void);
- virtual ErrorCodeEnum OnInit();
- virtual ErrorCodeEnum OnExit();
- void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
- //define the state enum.
- enum {s0, s1=1, s2=2};
- BEGIN_FSM_STATE(CSampleFSM)
- FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
- FSM_STATE_ENTRY(s1, "Busy", s1_on_entry, s1_on_exit, s1_on_event)
- FSM_STATE_ENTRY(s2, "Fail", s2_on_entry, s2_on_exit, s2_on_event)
- END_FSM_STATE()
- BEGIN_FSM_RULE(CSampleFSM, s0)
- FSM_RULE_ENTRY(s0, s1, EVT_USER_TEST_4, 4)
- FSM_RULE_ENTRY(s1, s2, EVT_USER_TEST2, 0)
- FSM_RULE_ENTRY(s1, s0, EVT_USER_TEST_1, 1)
- FSM_RULE_ENTRY_RANGE(s1, s2, EVT_USER_TEST_3, 1, 3)
- FSM_RULE_ENTRY_ANY(s2, s0, EVT_USER_TEST_3)
- END_FSM_RULE()
- void s0_on_entry();
- void s0_on_exit();
- unsigned int s0_on_event(FSMEvent* event);
- void s1_on_entry();
- void s1_on_exit();
- unsigned int s1_on_event(FSMEvent* event);
- void s2_on_entry();
- void s2_on_exit();
- unsigned int s2_on_event(FSMEvent* event);
- /** return state before post event.*/
- int SimulateJump()
- {
- const int curState = GetCurrState()->id;
- Dbg("current state id: %d", curState);
- if (curState == s0) {
- FSMEvent* evt = new test_4_event();
- evt->param1 = 4;
- PostEventFIFO(evt);
- }
- else if(curState == s1) {
- FSMEvent* evt = new test2Event();
- evt->param1 = 0;
- PostEventFIFO(evt);
- }
- else if (curState == s2) {
- FSMEvent* evt = new test_3_event();
- evt->param1 = 4;
- PostEventFIFO(evt);
- }
- return curState;
- }
- void OnStateTrans(int iSrcState, int iDstState)
- {
- LogEvent(Severity_Low, 0, (LPCTSTR)CSimpleStringA::Format(
- "%s'FSM state changed from %s to %s", GetEntityBase()->GetEntityName(),
- GetStateName(iSrcState), GetStateName(iDstState)));
- /** still store old state when this hook is invoked*/
- CHECK(strcmp(GetCurrStateName(), GetStateName(iSrcState)) == 0);
- }
- private:
- //TODO:
- };
- class CSample2FSM : public FSMImpl<CSample2FSM>
- {
- public:
- CSample2FSM(void) {}
- virtual ~CSample2FSM(void) {}
- virtual ErrorCodeEnum OnInit() { return Error_NotImpl; }
- virtual ErrorCodeEnum OnExit() { return Error_NotImpl; }
- void SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext) {
- pTransactionContext->SendAnswer(Error_Succeed);
- }
- //define the state enum.
- enum {s0, s1, s2, s3};
- BEGIN_FSM_STATE(CSample2FSM)
- FSM_STATE_ENTRY(s0, "Init", s0_on_entry, s0_on_exit, s0_on_event)
- FSM_STATE_ENTRY(s1, "Processing", s1_on_entry, s1_on_exit, s1_on_event)
- FSM_STATE_ENTRY(s2, "Rich", s2_on_entry, s2_on_exit, s2_on_event)
- FSM_STATE_ENTRY(s3, "Old", s3_on_entry, s3_on_exit, s3_on_event)
- END_FSM_STATE()
- BEGIN_FSM_RULE(CSample2FSM, s0)
- FSM_RULE_ENTRY(s1, s2, EVT_USER_TEST_1, 0)
- FSM_RULE_ENTRY(s1, s0, EVT_USER_TEST2, 1)
- FSM_RULE_ENTRY_RANGE(s1, s2, EVT_USER_TEST_3, 0, 3)
- FSM_RULE_ENTRY_ANY(s1, s2, EVT_USER_TEST_4)
- END_FSM_RULE()
- void s0_on_entry() {}
- void s0_on_exit() {}
- unsigned int s0_on_event(FSMEvent* event) { return 0; }
- void s1_on_entry() {}
- void s1_on_exit() {}
- unsigned int s1_on_event(FSMEvent* event) { return 0; }
- void s2_on_entry() {}
- void s2_on_exit() {}
- unsigned int s2_on_event(FSMEvent* event) { return 0; }
- void s3_on_entry() {}
- void s3_on_exit() {}
- unsigned int s3_on_event(FSMEvent* event) { return 0; }
- private:
- //TODO:
- };
- #endif // __SAMPLE_FSM_H__
|