#include	<xc.h>

#define _XTAL_FREQ 	FREQ_64MHz

#include "SetUp.c"
#include "stdio.h"
#include <math.h>


void delay_us ( unsigned char time );
void delay_ms ( int time );


#define	SINE				0x00
#define	SQUARE				0x01
#define	TRIANGULAR			0x02
#define	SAWTOOTH			0x03
#define	SAWTOOTH_INVERTED	0x04

unsigned char WaveFormSecuence [ 5 ] = { SINE, 
										TRIANGULAR, 
										SQUARE, 
										SAWTOOTH,
										SAWTOOTH_INVERTED };

int setWaveForms ( char waveForm );
int setSquareWaveForm ( void );
int setSineWaveForm ( void );
int setTriangularWaveForm ( void );
int setSawToothWaveForm ( void );
int setSawToothInvertedWaveForm ( void );
int setSawToothWaveForm ( void );

char n;
//const int time = 10;
float step, sinAngle;
float stepAngle = 0.0174533;  // 1 degree in radians.
char set [ 91 ];



char i;
char time = 0x00;

void interrupt IOCisr ( void )
{
/* BUTTONS ( IOC ) ISR */
	if ( RBIE && RBIF ) 
	{
		unsigned char Change;
		unsigned char LastPORTB = 0xFF;
		unsigned int l;
	
		Change = LastPORTB ^ PORTB;
	
		switch ( Change )
		{
			case 0x10:
//				LATCbits  . LATC0 ^= 0x01;

				break;

			case 0x20:
//				LATCbits  . LATC1 ^= 0x01;

				if ( i >= SAWTOOTH_INVERTED )
					i = SINE;
				
				else
					WaveFormSecuence [ i++ ];

				break;

			case 0x40:
				time++;
					
				if ( time >= 50 )
					time = 50;

				break;

			case 0x80:
				time--;
					
				if ( time <= 0 )
					time = 0;

				break;

			default:
				break;
			}	
		}	

	INTCONbits . RBIF = 0x00;
		
	WaveFormSecuence [ setWaveForms ( i ) ];

	return;
	}	// isr buttons ( IOC ).





char k;

int main ( string [ ], args )	 //@ 0x180
{
//	char k = 0;
	
	SetUp ( );

	printfUART ( "Application Ready...\n" ); 

	OpAmp_POWER_SUPPLY_ON;
	
	while ( TRUE )
	{

		while ( i == SINE || i == SQUARE || i == TRIANGULAR )
		{	
			for ( n = 0; n < 91; n++ )
			{
				LATA = ( 100 + set [ n ] );

				while ( k < time )
					k++;

				k = 0;
				}
	
			for ( n = 89; n > 0; n-- )
			{
				LATA = ( 100 + set [ n ] );

				while ( k < time )
					k++;

				k = 0;
				}
	
			for ( n = 0; n < 91; n++ )
			{
				LATA = ( 100 - set [ n ] );

				while ( k < time )
					k++;

				k = 0;
				}	
	
			for ( n = 89; n > 0; n-- )
			{
				LATA = ( 100 - set [ n ] );
	
				while ( k < time )
					k++;

				k = 0;
				}
			}	// while i == something.		

		while ( i == SAWTOOTH )
		{	
			for ( n = 0; n < 91; n++ )
			{
				LATA = ( 100 + set [ n ] );
	//			delay_us ( 1 );
				}

			for ( n = 89; n > 0; n-- )
			{
				LATA = ( 100 - set [ n ] );
	//			delay_us ( 1 );
				}
			}	// while i == something.

		while ( i == SAWTOOTH_INVERTED )
		{	
			for ( n = 89; n > 0; n-- )
			{
				LATA = ( 100 + set [ n ] );
	//			delay_us ( 1 );
				}

			for ( n = 0; n < 91; n++ )
			{
				LATA = ( 100 - set [ n ] );
	//			delay_us ( 1 );
				}	
			}	// while i == something.


		}	// while ( infinity loop ).	

	return 0x00;
	}	// main.


void delay_us ( unsigned char time )
{
	int i = 0;
	
	while ( i <= time )
		i++;
	}
	
void delay_ms ( int time )
{
	int i;
	
	for ( i = 0; i == time; i++ )
		__delay_ms ( 1 );
	}

int setSquareWaveForm ( void )
{
	for ( n = 0; n < 91; n++ )			// Square.
	{
		set [ n ] = 100;
		}
	
	return 0x00;
	}
	
int setSineWaveForm ( void )
{
	step = 0x00;
	
	for ( n = 0; n < 91; n++ )			// Sinewave.
	{
		sinAngle = sin ( step * stepAngle );
		set [ n ] = ( char ) floor ( sinAngle * 100.0 );
		step = step + 1;
		}
		
	return 0x00;
	}		
	
int setTriangularWaveForm ( void )
{
	for ( n = 0; n < 91; n++ )			// Triangular.
	{
		set [ n ] = n;
		}

	return 0x00;
	}	
	
int setSawToothWaveForm ( void )
{
	for ( n = 0; n < 91; n++ )			// Sawtooth.
	{
		set [ n ] = n;
		}

	return 0x00;
	}
	
	
int setSawToothInvertedWaveForm ( void )
{
	for ( n = 0; n < 91; n++ )			// Sawtooth Inverted.
	{
		set [ n ] = n;
		}

	return 0x00;
	}
	
int setWaveForms ( char waveForm )		//@ 0x2000
{
	switch ( waveForm )
	{
		case SINE:
			SINEWAVE_LED_ON;
			
			SAWTOOTH_LED_OFF;
			TRIANGULAR_LED_OFF;	
			SQUARE_LED_OFF;		

			setSineWaveForm ( );
			break;
	
		case SQUARE:
			SQUARE_LED_ON;		
			
			SAWTOOTH_LED_OFF;
			TRIANGULAR_LED_OFF;	
			SINEWAVE_LED_OFF;

			setSquareWaveForm ( );
			break;
	
		case TRIANGULAR:
			TRIANGULAR_LED_ON;	
			
			SAWTOOTH_LED_OFF;
			SQUARE_LED_OFF;		
			SINEWAVE_LED_OFF;

			setTriangularWaveForm ( );
			break;
	
		case SAWTOOTH:
			SAWTOOTH_LED_ON;
			
			TRIANGULAR_LED_OFF;	
			SQUARE_LED_OFF;		
			SINEWAVE_LED_OFF;

			setTriangularWaveForm ( );
			break;
	
		default:
			break;
		}	
	
	return 0x00;
	}