/****************************************************************************
 Module
 SMMaster.c

 Description
 Master State Machine.  Starts Gamestate and OC SMs as concurrent children.
 ****************************************************************************/
/*----------------------------- Include Files -----------------------------*/
#include "GlobalHeader.h"
#include "SMMaster.h"

/*----------------------------- Module Defines ----------------------------*/


/*---------------------------- Module Functions ---------------------------*/
static Event_t DuringRunning( Event_t Event);

/*---------------------------- Module Variables ---------------------------*/
static MasterState_t CurrentState;

/*------------------------------ Module Code ------------------------------*/
/****************************************************************************
 Function
    RunMasterSM

 Parameters
   Event_t

 Returns
   Event_t

 Description
  Runs master state machine
****************************************************************************/
Event_t RunMasterSM( Event_t CurrentEvent )
{
   unsigned char MakeTransition = FALSE;/* are we making a state transition? */
   MasterState_t NextState = CurrentState;

   switch ( CurrentState )
   {
       case Master_Running :
         CurrentEvent = DuringRunning(CurrentEvent);
         //process any events
         if ( CurrentEvent != EV_NO_EVENT )        //If an event is active
         {
            switch (CurrentEvent)
            {
            }
         }
         break;
    }
    //   If we are making a state transition
    if (MakeTransition == TRUE)
    {
       //   Execute exit function for current state
       (void)RunMasterSM(EV_EXIT);
       CurrentState = NextState; //Modify state variable
       //   Execute entry function for new state
       (void)RunMasterSM(EV_ENTRY);
     }
     return(CurrentEvent);
}
/****************************************************************************
 Function
     StartMasterSM

 Parameters
     Event_t

 Returns
     None

 Description
     Starts Master state machine
****************************************************************************/
void StartMasterSM ( Event_t CurrentEvent )
{
   CurrentState = Master_Running;

   // call the entry function (if any) for the ENTRY_STATE
   (void)RunMasterSM(EV_ENTRY);
}

/****************************************************************************
 Function
     QueryMasterSM

 Parameters
     None

 Returns
     MasterState_t The current state of the state machine

 Description
     returns the current state of the state machine
****************************************************************************/
MasterState_t QueryMasterSM ( void )
{
   return(CurrentState);
}

/***************************************************************************
 private functions
 ***************************************************************************/

/****************************************************************************
 Function
DuringRunning

 Parameters
 Event_t

 Returns
 Event_t

 Description
 Starts and Runs lower level SMs Gamestate and OC
 ****************************************************************************/
static Event_t DuringRunning( Event_t Event)
{
    // process EV_ENTRY & EV_EXIT events
    if ( Event == EV_ENTRY)
    {
        StartGameSM(Event);
        StartOffensiveCoordinatorSM(Event);
    }else if ( Event == EV_EXIT)
    {
        (void)RunGameSM(Event);
        (void)RunOffensiveCoordinatorSM(Event);
    }else
    // do the 'during' function for this state
    {
        (void)RunGameSM(Event);
        (void)RunOffensiveCoordinatorSM(Event);
    }
    return(Event);
}