
//#include "DSP280x_Device.h"     // DSP280x Headerfile Include File
//#include "DSP280x_Examples.h"   // DSP280x Examples Include File
#include "PeripheralHeaderIncludes.h"
#include "pin_test.h"

#define CPU_RATE   16.667L   // for a 60MHz CPU clock speed (SYSCLKOUT)
// DO NOT MODIFY THIS LINE.




#define		_1ms		1000
#define		_100ms		1000000
#define		EXT			0
#define		MOTOR		1
#define		UEXT		2

//#define		PULL_PIN	1  
 

const unsigned long mask_portA_EXT = 0x000F10FE&(~BIT12);    	// pull pin GPIOA12
const unsigned long mask_portB_EXT = 0x7;  
const unsigned long mask_portAIO_EXT = 0x1414; 			
const unsigned long mask_portA_Motor_EXT = 0x000F10FE&(~BIT12);   // pull pin GPIOA12 		
const unsigned long mask_portB_Motor_EXT = 0x7;
const unsigned long mask_portAIO_Motor_EXT = 0x1454;	
const unsigned long mask_portA_UEXT = 0x000F1080&(~BIT12);    	  // pull pin GPIOA12
const unsigned long mask_portB_UEXT = 0x3;
const unsigned long mask_portAIO_UEXT = 0;			
unsigned long 	mask_portA;
unsigned long  mask_portB;
unsigned long  mask_portAIO;
unsigned char state_pA_vcc = 0;
unsigned char state_pB_vcc = 0;
unsigned char Number_Ext = 0;
unsigned long PULL_PIN;
extern unsigned char test_flag;
//extern int AdcResults[16];

void Stop (void)
{
unsigned char t=0;
EALLOW;
GpioCtrlRegs.GPADIR.all = 0;
GpioCtrlRegs.GPBDIR.all = 0;
EDIS;
t++;
while (1);
}

void Test_ADC_Pins(void)
{
unsigned int mask_analog = 0xA8A;		//adc 1,3,7,9,11
unsigned char i, k, dec, number;
unsigned int	ADC_STEP = 4096/6;
unsigned int	RANGE = 100;
//unsigned long	temp;
int AdcResults[16];

			EALLOW;
//			temp =GpioCtrlRegs.AIODIR.all;					//save AIODIR
//			GpioCtrlRegs.AIODIR.all = 0;
			

//			AdcResults[0] = AdcResult.ADCRESULT0;
			AdcResults[1] = AdcResult.ADCRESULT1;			
			AdcResults[3] = AdcResult.ADCRESULT3;					
			AdcResults[7] = AdcResult.ADCRESULT7;
			AdcResults[9] = AdcResult.ADCRESULT9;
			AdcResults[11] = AdcResult.ADCRESULT11;
			AdcResults[13] = AdcResult.ADCRESULT13;
			AdcResults[15] = AdcResult.ADCRESULT15;		

			k=0;
			for(i=0;i!=16;i++)
			{
				if((mask_analog)&(1<<i)) 
				{
					k=k+ADC_STEP;
					if ((((4096-k)-RANGE) > AdcResults[i]) || (((4096-k)+RANGE) < AdcResults[i]))
					{
						scia_msg("\r\nADC\0");	
						dec = i/10;
						number = i%10;
						scia_xmit('0'+dec);	
						scia_xmit('0'+number);
						scia_msg(" ERROR\r\n\0");
						test_flag=1;
//				  	    Stop();
					}
				}
			}
//			GpioCtrlRegs.AIODIR.all = temp;		//restore AIODIR
			EDIS;
}

void Print_SHORT_GPIOA(unsigned char dec, unsigned char number, unsigned char j)
{		
		dec = j/10;
		number = j%10;
		scia_msg("\r\nSHORT GPIOA\0");
		scia_xmit('0'+dec);	
		scia_xmit('0'+number);
}

void Print_SHORT_GPAIO(unsigned char dec, unsigned char number, unsigned char j)
{
		dec = j/10;
		number = j%10;
		scia_msg("\r\nSHORT GPAIO\0");
		scia_xmit('0'+dec);	
		scia_xmit('0'+number);
}

void usDelay(double long a)
{
a = a/4;
while (--a != 0);
}
unsigned char  Wait_For_Any_Key (void)
{
	while(SciaRegs.SCIFFRX.bit.RXFFST !=1) {;} // wait for ANY KEY
	return SciaRegs.SCIRXBUF.all;
}



void TestExt(void)
{

//GPIO0 is pull pin
//// Test for VCC short circuit or unconected pins/////---------------------------------------

	unsigned long j = 0;
	unsigned long my_1 = 1; 
	unsigned char dec = 0;
	unsigned char number = 0;	

	scia_msg("\r\nBegin test EXTENSIONS\n\0");		   
    scia_msg("\r\nPUT EXTENSION AND PRESS ANY KEY\n\0");	
	Wait_For_Any_Key ();    

	mask_portA = mask_portA_EXT;
	mask_portB = mask_portB_EXT;
	mask_portAIO = mask_portAIO_EXT;

TEST_AGAIN:
	EALLOW;	
	PULL_PIN = BIT12;	//Pull pin is GPIOA12
	GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;		//GPIOA12 like GPIO
	GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;		//clear pull_pin for other EXT
	GpioCtrlRegs.GPADIR.all = PULL_PIN;			//pull_pin is output
	GpioCtrlRegs.AIODIR.all = 0;				//restore AIO direction
	GpioCtrlRegs.GPBDIR.all = 0;				//restore GPIOB direction

	GpioCtrlRegs.GPAPUD.all = 0xFFFFFFFF;		//Disable GPIO pull-ups
	GpioCtrlRegs.GPBPUD.all = 0xFFFFFFFF;		//Disable GPIOB Pull-ups
	GpioCtrlRegs.GPBDIR.all = 0;	
	
	usDelay(1000);
	if((GpioDataRegs.GPADAT.all & mask_portA) != 0x0)  				// for GPIOA
	{ 
	  scia_msg("\r\nGPIOA_ERR\0");
	  test_flag=1;
	  Stop(); 
	}
	if ((GpioDataRegs.GPBDAT.all & mask_portB) != 0x0)

	{ 
	  scia_msg("\r\nGPIOB_ERR\0"); 
	  test_flag=1;
	  Stop(); 
	}
	
	if ((GpioDataRegs.AIODAT.all & mask_portAIO) != 0x0)
	{
	  scia_msg("\r\nGPAIO_ERR\0"); 
	  test_flag=1;
	  Stop();
	}

	if (Number_Ext != UEXT) Test_ADC_Pins();
	
//// Test for GND short circuit or unconected pins/////---------------------------------------	    
	EALLOW;
	GpioDataRegs.GPASET.bit.GPIO12 = 1;		//set pull_pin
	GpioCtrlRegs.GPADIR.all = PULL_PIN;		//pull_pin is output	
	usDelay(1000);
	if((GpioDataRegs.GPADAT.all | ~mask_portA) != 0xFFFFFFFF)  				// for GPIOA
	{ 
		scia_msg("\r\nGPIOA_ERR\0");  
		test_flag=1;
		Stop(); 
	}
	if ((GpioDataRegs.GPBDAT.all | ~mask_portB) != 0xFFFFFFFF)	
	{ 
		scia_msg("\r\nGPIOB_ERR\0"); 
		test_flag=1;
		Stop(); 
	}
	if ((GpioDataRegs.AIODAT.all | ~mask_portAIO) != 0xFFFFFFFF)
	{
	  scia_msg("\r\nGPAIO_ERR\0"); 
	  test_flag=1;
	  Stop();
	}
	EDIS;
	if (Number_Ext != UEXT) Test_ADC_Pins();

// loop for GPIOA running Zero
 	for(j=0; j<32; j++) 
 	{
    	if(!((mask_portA)&(my_1<<j))) continue;
		EALLOW;
    	GpioDataRegs.GPACLEAR.all = (my_1<<j);
    	GpioCtrlRegs.GPADIR.all = (my_1<<j)|PULL_PIN;
    	// just simple delay
		usDelay(1000);
    	// check for other zero at GPIOA
    	if((GpioDataRegs.GPADAT.all | (~mask_portA)) != ((0xFFFFFFFF)&(~((unsigned long)1<<j))))  
    		{ 				
				Print_SHORT_GPIOA(dec,number,j);
				test_flag=1;
      			Stop();  
    		}

	// check for other zero at GPIOB
		if ((GpioDataRegs.GPBDAT.all | ~mask_portB) != 0xFFFFFFFF)
			{
				Print_SHORT_GPIOA(dec,number,j);
	  			scia_msg(" with GPIOB\0"); 
	  			test_flag=1;
	  			Stop();
			}
	// check for other zero at GPAIO
		if ((GpioDataRegs.AIODAT.all | ~mask_portAIO) != 0xFFFFFFFF)
			{
				Print_SHORT_GPIOA(dec, number,j);
	  			scia_msg(" with GPAIO\0"); 
	  			test_flag=1;
	  			Stop();
			}
		EDIS;
		if (Number_Ext != UEXT) Test_ADC_Pins();
    }

	// loop for GPIOB
	EALLOW;
	GpioDataRegs.GPASET.bit.GPIO12 = 1;		//set pull_pin
	GpioCtrlRegs.GPADIR.all = PULL_PIN;		//pull_pin is output
 	for(j=0; j<3; j++) 
 	{		
    	if(!((mask_portB)&(my_1<<j))) continue;
		EALLOW;
    	GpioDataRegs.GPBCLEAR.all = (my_1<<j);
    	GpioCtrlRegs.GPBDIR.all = (my_1<<j);

    	// just simple delay
		usDelay(1000);

    	// check for other zero at GPIOA
    	if((GpioDataRegs.GPBDAT.all | (~mask_portB)) != ((0xFFFFFFFF)&(~(my_1<<j))))  
    		{ 
				scia_msg("\r\nSHORT GPIOB3\0");
				scia_xmit('2'+j);
				test_flag=1;
      			Stop();  
    		}

	// check for other zero at GPIOA
		if((GpioDataRegs.GPADAT.all | (~mask_portA)) != 0xFFFFFFFF)  				
			{ 
				scia_msg("\r\nSHORT GPIOB3\0");
				scia_xmit('2'+j);
				scia_msg(" with GPIOA\0");  			//second  optional test
				Stop(); 
			}
	// check for other zero at GPAIO
		if ((GpioDataRegs.AIODAT.all | ~mask_portAIO) != 0xFFFFFFFF)
			{
				scia_msg("\r\nSHORT GPIOB3\0");
				scia_xmit('2'+j);
	  			scia_msg(" with GPAIO\0"); 
	  			test_flag=1;
	  			Stop();
			}
		EDIS;		
		if (Number_Ext != UEXT) Test_ADC_Pins();
    }

	// loop for GPAIO
		EALLOW;
		GpioCtrlRegs.GPBDIR.all = 0;			//restore GPIOB direction
		GpioDataRegs.GPASET.bit.GPIO12 = 1;		//set pull_pin 
		GpioCtrlRegs.GPADIR.all = PULL_PIN;			//pull_pin is output
		for(j=0; j<16; j++) 
	 	{			
	    	if(!((mask_portAIO)&(my_1<<j))) continue;

			EALLOW;
	    	GpioDataRegs.AIOCLEAR.all = (my_1<<j);
			GpioCtrlRegs.AIODIR.all = (my_1<<j);

	    	// just simple delay
			usDelay(1000);
	    	// check for other zero at GPAIO
	    	if((GpioDataRegs.AIODAT.all | (~mask_portAIO)) != ((0xFFFFFFFF)&(~(my_1<<j))))  
	    		{ 
					Print_SHORT_GPAIO(dec,number,j);
					test_flag=1;
	      			Stop();  
	    		}

		// check for other zero at GPIOA
	    		if((GpioDataRegs.GPADAT.all | (~mask_portA)) != 0xFFFFFFFF)
	    		{ 
					Print_SHORT_GPAIO(dec,number,j);
					scia_msg(" with GPIOA\0"); 
					test_flag=1;
	      			Stop();  
	    		}

		// check for other zero at GPIOB
			if ((GpioDataRegs.GPBDAT.all | ~mask_portB) != 0xFFFFFFFF)
				{
					Print_SHORT_GPAIO(dec,number,j);
		  			scia_msg(" with GPIOB\0"); 
		  			test_flag=1;
		  			Stop();
				}	
			EDIS;		
			if (Number_Ext != UEXT) Test_ADC_Pins();
  	}

	if (Number_Ext == EXT)
	{
		if (test_flag == 0) scia_msg("\r\nTEST EXTENSION OK!!!\0");		
		Number_Ext = MOTOR;
		mask_portA = mask_portA_Motor_EXT;
		mask_portB = mask_portB_Motor_EXT;
		mask_portAIO = mask_portAIO_Motor_EXT;
		scia_msg("\r\nREMOVE EXTENSION, PUT MOTOR_EXTENSION AND PRESS ANY KEY\n\0");
	    Wait_For_Any_Key ();
		goto TEST_AGAIN;
	}
	if (Number_Ext == MOTOR)
	{
		if (test_flag == 0) scia_msg("\r\nTEST MOTOR EXTENSION OK!!!\0");		
		Number_Ext = UEXT;
		scia_msg("\r\nREMOVE MOTOR EXTENSION, PUT UEXT AND PRESS ANY KEY\n\0");
	    Wait_For_Any_Key ();
		mask_portA = mask_portA_UEXT;
		mask_portB = mask_portB_UEXT;
		mask_portAIO = mask_portAIO_UEXT;
		goto TEST_AGAIN;
	}
	if (Number_Ext == UEXT) 
	{
		scia_msg("\r\nTEST UEXT OK\r\n\0");
		scia_msg("\r\nNow Test UART ECHO, BUTTON and TRIMMER\r\n\0");
		return;
	}
	EDIS;
}



























