#ifndef CUSTOMERBEINGFSM_H #define CUSTOMERBEINGFSM_H #pragma once #include "SpHelper.h" #include "SpFSM.h" #define USER_EVT_APPROACH EVT_USER+1 #define USER_EVT_LEAVE EVT_USER+2 #define USER_EVT_FRONT EVT_USER+3 #define USER_EVT_LEAVE_APPROACH EVT_USER+4 #define USER_EVT_LOCK EVT_USER+5 #define USER_EVT_UNLOCK EVT_USER+6 #define USER_EVT_EXIT EVT_USER+50 class CCustomerBeingFSM : public FSMImpl, public IFSMStateHooker { public: enum {s0, s1, s2, s3, s4}; BEGIN_FSM_STATE(CCustomerBeingFSM) FSM_STATE_ENTRY(s0,"None",s0_on_entry,s0_on_exit,s0_on_event) FSM_STATE_ENTRY(s1,"Approach",s1_on_entry,s1_on_exit,s1_on_event) FSM_STATE_ENTRY(s2,"Front",s2_on_entry,s2_on_exit,s2_on_event) FSM_STATE_ENTRY(s3,"Lock",s3_on_entry,s3_on_exit,s3_on_event) FSM_STATE_ENTRY(s4,"Sleep",s4_on_entry,s4_on_exit,s4_on_event) END_FSM_STATE() BEGIN_FSM_RULE(CCustomerBeingFSM, s0) FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_APPROACH) FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_FRONT) FSM_RULE_ENTRY_ANY(s0, s4, EVT_TIMER) FSM_RULE_ENTRY_ANY(s0, FSM_STATE_EXIT, USER_EVT_EXIT) FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_LEAVE) FSM_RULE_ENTRY_ANY(s1, s2, USER_EVT_FRONT) FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_LEAVE_APPROACH) FSM_RULE_ENTRY_ANY(s2, s0, USER_EVT_LEAVE) FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_LOCK) FSM_RULE_ENTRY_ANY(s3, s2, USER_EVT_UNLOCK) FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_LEAVE) FSM_RULE_ENTRY_ANY(s3, s1, USER_EVT_APPROACH) FSM_RULE_ENTRY_ANY(s4, s1, USER_EVT_APPROACH) FSM_RULE_ENTRY_ANY(s4, s2, USER_EVT_FRONT) END_FSM_RULE() CCustomerBeingFSM(); ~CCustomerBeingFSM(); virtual void OnStateTrans(int iSrcState, int iDstState); virtual ErrorCodeEnum OnInit(); virtual ErrorCodeEnum OnExit(); 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); void s3_on_entry(); void s3_on_exit(); unsigned int s3_on_event(FSMEvent* event); void s4_on_entry(); void s4_on_exit(); unsigned int s4_on_event(FSMEvent* event); private: ErrorCodeEnum SetSysState(int state); }; #endif // CUSTOMERBEINGFSM_H