/**************************************************************************** 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 "MoveForwardHSM.h" #include "TopHSM.h" #include "MotorService.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 MoveState_t CurrentState; static bool goalReached; static bool stageOver; static MasterState_t gameStage; static bool pastFirstGoal; /*------------------------------ 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 RunMoveHSM( ES_Event CurrentEvent ) { ES_Event ReturnEvent = CurrentEvent; // assume we are not consuming event ES_Event PostEvent; PostEvent.EventType = ES_MOTOR; if (CurrentEvent.EventType == ES_GAME_OVER) { PostEvent.EventParam = 0x00; //MOTORS STOP PostMotorService(PostEvent); CurrentState = Finished; } switch (CurrentState) { case WaitingMF: //Start Motors Going Forward if (gameStage == Stage1) { PostEvent.EventParam = 0x04; //MOTORS GO FORWARD } else if (gameStage == Stage3) { // PostEvent.EventParam = 0x04; //Jousting Forward }else if (gameStage == Stage2){ CurrentState = Paused; } else { PostEvent.EventParam = 0x06; //Jousting Back } PostMotorService(PostEvent); CurrentState = MoveForward; break; case Paused: if (CurrentEvent.EventType == ES_MOVE) { if (gameStage == Stage1 || gameStage == Stage3) { PostEvent.EventParam = 0x04; //MOTORS GO FORWARD } else { PostEvent.EventParam = 0x06; //MOTORS GO BACKWARD } PostMotorService(PostEvent); CurrentState = MoveForward; } break; case MoveForward: switch (CurrentEvent.EventType) { case ES_PAUSE: PostEvent.EventParam = 0x00; //MOTORS STOP PostMotorService(PostEvent); CurrentState = Paused; break; case ES_MOTOR_RESPONSE: if (stageOver) { ReturnEvent.EventType = ES_STAGE_OVER; //Indicate to Above Stage Machine The The Round is Over CurrentState = Finished; } else { goalReached = true; } break; case ES_CHANGE_STATUS: if (CurrentEvent.EventParam == 0x03) { //If end of stage if (goalReached) { ReturnEvent.EventType = ES_STAGE_OVER; CurrentState = Finished; } else { stageOver = true; } } break; } 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 StartMoveHSM ( ES_Event CurrentEvent ) { // local variable to get debugger to display the value of CurrentEvent ES_Event LocalEvent = CurrentEvent; goalReached = false; pastFirstGoal = false; stageOver = false; gameStage = QueryMasterHSM(); // 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 ( ES_ENTRY_HISTORY != CurrentEvent.EventType ) { CurrentState = WaitingMF; } // call the entry function (if any) for the ENTRY_STATE RunMoveHSM(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 ****************************************************************************/ MoveState_t QueryMoveHSM ( void ) { return(CurrentState); } /*************************************************************************** private functions ***************************************************************************/