/**************************************************************************** Module HSMTemplate.c Revision 2.0.1 Description This is a template file for implementing state machines. Notes History When Who What/Why -------------- --- -------- 02/07/13 21:00 jec corrections to return variable (should have been ReturnEvent, not CurrentEvent) and several EV_xxx event names that were left over from the old version 02/08/12 09:56 jec revisions for the Events and Services Framework Gen2 02/13/10 14:29 jec revised Start and run to add new kind of entry function to make implementing history entry cleaner 02/13/10 12:29 jec added NewEvent local variable to During function and comments about using either it or Event as the return 02/11/10 15:54 jec more revised comments, removing last comment in during function that belongs in the run function 02/09/10 17:21 jec updated comments about internal transitions on During funtion 02/18/09 10:14 jec removed redundant call to RunLowerlevelSM in EV_Entry processing in During function 02/20/07 21:37 jec converted to use enumerated type for events & states 02/13/05 19:38 jec added support for self-transitions, reworked to eliminate repeated transition code 02/11/05 16:54 jec converted to implment hierarchy explicitly 02/25/03 10:32 jec converted to take a passed event parameter 02/18/99 10:19 jec built template from MasterMachine.c 02/14/99 10:34 jec Began Coding ****************************************************************************/ /*----------------------------- Include Files -----------------------------*/ // Basic includes for a program using the Events and Services Framework #include "ES_Configure.h" #include "ES_Framework.h" /* include header files for this state machine as well as any machines at the next lower level in the hierarchy that are sub-machines to this machine */ #include "JoustingHSM.h" #include "TopHSM.h" #include "LanceMotorControl.h" #include "BallShootService.h" /*----------------------------- Module Defines ----------------------------*/ // define constants for the states for this machine // and any other local defines /*---------------------------- Module Functions ---------------------------*/ /* prototypes for private functions for this machine, things like during functions, entry & exit functions.They should be functions relevant to the behavior of this state machine */ /*---------------------------- Module Variables ---------------------------*/ // everybody needs a state variable, you may need others as well static JoustingState_t CurrentState; static bool SuddenDeathJoust; /*------------------------------ Module Code ------------------------------*/ /**************************************************************************** Function RunTemplateSM Parameters ES_Event: the event to process Returns ES_Event: an event to return Description add your description here Notes uses nested switch/case to implement the machine. Author J. Edward Carryer, 2/11/05, 10:45AM ****************************************************************************/ ES_Event RunJoustingHSM( ES_Event CurrentEvent ) { ES_Event ReturnEvent = CurrentEvent; // assume we are not consuming event ES_Event PostEvent; switch ( CurrentState ) { case FINDKNIGHT: if( ((CurrentEvent.EventType == ES_FORWARD_KNIGHT) && (!SuddenDeathJoust)) || ( (CurrentEvent.EventType == ES_REAR_KNIGHT) && SuddenDeathJoust )) { PostEvent.EventType = ES_SHOOT; PostBallShootService(PostEvent); PostEvent.EventType = ES_DEPLOY_LANCE; PostLanceService(PostEvent); CurrentState = HITKNIGHT; } break; case HITKNIGHT: if(CurrentEvent.EventType == ES_LANCE_RESPONSE) { PostEvent.EventType = ES_MOVE; PostMasterSM(PostEvent); CurrentState = FINISHEDJOUST; } break; } return(ReturnEvent); } /**************************************************************************** Function StartTemplateSM Parameters None Returns None Description Does any required initialization for this state machine Notes Author J. Edward Carryer, 2/18/99, 10:38AM ****************************************************************************/ void StartJoustingHSM ( ES_Event CurrentEvent ) { // local variable to get debugger to display the value of CurrentEvent ES_Event LocalEvent = CurrentEvent; // to implement entry to a history state or directly to a substate // you can modify the initialization of the CurrentState variable // otherwise just start in the entry state every time the state machine // is started if(CurrentEvent.EventParam == 0) { SuddenDeathJoust = true; } else { SuddenDeathJoust = false; } if ( ES_ENTRY_HISTORY != CurrentEvent.EventType ) { CurrentState = FINDKNIGHT; } // call the entry function (if any) for the ENTRY_STATE RunJoustingHSM(CurrentEvent); } /**************************************************************************** Function QueryTemplateSM Parameters None Returns TemplateState_t The current state of the Template state machine Description returns the current state of the Template state machine Notes Author J. Edward Carryer, 2/11/05, 10:38AM ****************************************************************************/ JoustingState_t QueryJoustingHSM ( void ) { return(CurrentState); } /*************************************************************************** private functions ***************************************************************************/