//#define OFF_OVERRIDE //used to override game_paused commands from OC during testing

/****************************************************************************
 Module
 ChkEvents.c

 Description
 This is the Event Checking Module for our robot
 ****************************************************************************/
/*----------------------------- Include Files -----------------------------*/
#include "GlobalHeader.h"
#include "ChkEvents.h"
#include "SMMaster.h"
#include "TOMDebug.h"

/*------------------------------ Module Code ------------------------------*/
/****************************************************************************
 Function
	CheckEvents

 Parameters
 none

 Returns
 Event_t - the current, or most recent, event happening
 ****************************************************************************/
Event_t CheckEvents(void)
{
    Event_t CurrentEvent = EV_NO_EVENT;

    //allow manual event creation for debugging
    Event_t Event;
    Event = DebugEvent();
    if (Event != EV_NO_EVENT)
    	return Event;

	//OC EVENTS

    if (QueryOCNewResponseFlag())
    	return(EV_OC_NewResponse);

    if (QueryOCReadFlag())
    	return(EV_OC_NewRead);

    if (QueryOCTimerFlag())
    {
    	switch (QueryOCCommandCounter())
    	{
    		case 0:
				//	printf ("  ok\r\n");
    			return(EV_OC_TimerExpired);
    			break;
    		case 1:
				printf ("  oveflow\r\n");
    			return(EV_OC_CounterExpired);
    			break;
    	}
    }

    if ((QueryOffensiveCoordinatorSM() == OC_Ready) && (QueryOCQueueLength() > 0))
       	return(EV_OC_NewCommand);


	//DRIVE EVENTS

    if (QueryDriveTransitionFlag())
    	return(EV_Drive_Transition);

    if (QueryDriveTimerFlag())
    	return(EV_Drive_TimerExpired);

    if (QueryDriveBeaconFound())
    	return(EV_Drive_BeaconFound);

    if (QueryDriveBeaconLost())
    	return(EV_Drive_BeaconLost);

    if (QueryDriveAimed())
    	return(EV_Drive_Aimed);


	//SENSOR EVENTS

    if (CheckBumpSensors())
    	return(EV_Sensor_Bump);

    if (CheckFrontTapeCache())
    	return(EV_Sensor_TapeFront);

    if (CheckBackTapeCache())
    	return(EV_Sensor_TapeBack);


	//GAMESTATE EVENTS

    if (QueryGameStartFlag())
    	return(EV_Game_On);

#ifndef OFF_OVERRIDE
    if (QueryGamePauseFlag())
    	return(EV_Game_Pause);
#endif

    if (QueryGameSM() == Game_On)
    {

		if (QueryGameTime() > 12000) //12000 for 2min
			return(EV_Game_Pause);

		//GAMEPLAY EVENTS

		if (QueryGameTime() > 11500) //If game is almost over
		{
			if (QueryDispenserNearHoop() == 0)
				return EV_Play_Timeout; //choose new dispenser if not near hoop

		}
		else			//if game is not almost over,
		{
			if (QueryToDispenserFlag())	//allow changing of dispenser when empty
				return EV_Play_ToDispenser;

			if (QueryPlayTimeout())
				return EV_Play_Timeout; //allow timeouts

		}

		if (QueryAtDispenserFlag())
			return EV_Play_AtDispenser;

		if (CheckForBall() && (QueryPlaySM() == Play_AtDispenser) && (QueryShootSM() == Shoot_Waiting)) //check for ball first for continuous debounce
			return EV_Shoot_BallAtGate;

		if ((QueryPlaySM() == Play_AtDispenser) && QueryShootTimer())
			return EV_Shoot_TimerExpired;

		if ((QueryPlaySM()==Play_AtDispenser) && QueryRequestTimeout())
			return EV_Request_Timeout;
    }

    return(CurrentEvent);
}