#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, public IFSMStateHooker { public: CSampleFSM(void); virtual ~CSampleFSM(void); virtual ErrorCodeEnum OnInit(); virtual ErrorCodeEnum OnExit(); void SelfTest(EntityTestEnum eTestType,CSmartPointer 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 { public: CSample2FSM(void) {} virtual ~CSample2FSM(void) {} virtual ErrorCodeEnum OnInit() { return Error_NotImpl; } virtual ErrorCodeEnum OnExit() { return Error_NotImpl; } void SelfTest(EntityTestEnum eTestType, CSmartPointer 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__