/****************************************************************************
 Module
 TOMDebug.c

 Description
 Debug Module for project.  Contains code to force events to event checker
 through keyboard input, as well as terminal printouts of states and commands.
 ****************************************************************************/
/*----------------------------- Include Files -----------------------------*/
#include "GlobalHeader.h"
#include "TOMDebug.h"
#include "SMMaster.h"

/****************************************************************************
 Function
 DebugEvent

 Parameters
 none

 Returns
 Event_t event to force to event checker

 Description
 If a key has been hit, the corresponding event is returned.
 ****************************************************************************/
Event_t DebugEvent (void)
{
	Event_t Event = EV_NO_EVENT;
	if ( kbhit() != 0)
    {
		unsigned char KeyStroke = getchar();
		switch ((KeyStroke))
		{
				//General Events
	     	case '0': Event = EV_NO_EVENT; break;
				// 	case '1': Event = EV_ENTRY; break;
				// 	case '2': Event = EV_EXIT; break;

				//Master and Gameplay Events
	     	case 'q': Event = EV_Game_On; break;
	     	case 'w': Event = EV_Game_Pause; break;
	     	case 'e': Event = EV_Play_AtDispenser; break;
	     	case 'r': Event = EV_Play_ToDispenser; break;
	     	case 't': Event = EV_Request_Timeout; break;
	     	case 'y': Event = EV_Shoot_TimerExpired; break;
	     	case 'u': Event = EV_Shoot_BallAtGate; break;

				//OC Internal Events
				//  	case 'a': Event = EV_OC_TimerExpired; break;
				//  	case 's': Event = EV_OC_CounterExpired; break;
				//  	case 'd': Event = EV_OC_NewCommand; break;
				//  	case 'f': Event = EV_OC_NewRead; break;

				//OC External Events
				//  	case 'g': Event = EV_OC_NewResponse; break; //New response from field

				//Drivetrain Events
	     	case 'z': Event = EV_Drive_TimerExpired; break;
	     	case 'x': Event = EV_Drive_Transition; break;
	     	case 'c': Event = EV_Drive_BeaconFound; break;
	     	case 'v' : Event = EV_Drive_BeaconLost; break;
	     	case 'b' : Event = EV_Drive_Aimed; break;

				//Sensors
	     	case 'n' : Event = EV_Sensor_Bump; break;
	     	case 'm' : Event = EV_Sensor_TapeFront; break;
	     	case ',' : Event = EV_Sensor_TapeBack; break;

	     	case '.' : ClearBackTapeCache(); ClearFrontTapeCache(); break;
		}
    }
    return Event;
}

/****************************************************************************
 Function
 DebugPrint

 Parameters
 Event_t current event

 Returns
 none

 Description
 Prints desired outputs to terminal
 ****************************************************************************/
void DebugPrint (Event_t Event)
{
	if ((Event != 0) && (Event != EV_NO_EVENT) && (Event != EV_OC_TimerExpired) && (Event != EV_OC_NewCommand) && (Event != EV_OC_NewRead)) //(Event != EV_OC_CounterExpired) &&
	{

		printf("Event: %d      ",Event);

		if (Event == EV_OC_NewResponse)
	    {
	     	printf("    Com: 0x%x   Resp 0x%x\r\n",QueryOCLastCommand(),QueryOCResponse());
	    }

		/*
		 printf("\r\nStates: ");
		 printf("Master: %d   ",QueryMasterSM());
		 printf("Game: %d   ",QueryGameSM());
		 printf("Play: %d   ",QueryPlaySM());
		 printf("To: %d   ",QueryToDispenserSM());
		 printf("Req: %d   ",QueryRequestBallSM());
		 printf("Shoot: %d   ",QueryShootSM());
		 printf("Drive: %d   ",QueryDriveSM());

		 printf("\r\n");*/
	}

	//printf("L %d   C %d   R %d   BL %d   BR %d   Ball %d   Port 0x%x\r\n",ADS12_ReadADPin(5),ADS12_ReadADPin(6),ADS12_ReadADPin(7),ADS12_ReadADPin(2),ADS12_ReadADPin(3),ADS12_ReadADPin(4),PTAD);
}