#include "MainUAct.h"
#include "Interrupts.h"
#include "ADC.h"
#include "usart.h"
#include "Timer.h"

#pragma code high_vector=0x8

void high_vector (void)
{
_asm goto Interrupts _endasm
}

#pragma code 
#pragma interrupt Interrupts

void Interrupts (void)
{

unsigned int receive, ad, dummy, n, dummyAD;
unsigned char msg, high, low, ADh[16], send[16];


//interrupt de recepção na porta serie
if (PIR1bits.RCIF == 1){
	

		receive=RCREG;
		msg=(receive>>7);
		
	if (msg==0 & rec_n==16)
	{
		high=((receive & 0x78)>>3);
		low=(receive & 0x07);

		if ((high==ESTADO) & (low <16))
		{
			rec_n=ESTADO;
			estado=low;
		}
		
	}
	else if (msg==1 & rec_n==ESTADO)
	{		
		switch(estado){
//			case ACTUALIZAR:
//				actualiza();
//				break;	
			case LEDS:
				leds=(receive & 1);
				break;
			case VALVO:
				PORTBbits.RB2=(receive & 1);
				break;
			case VALVC:
				PORTBbits.RB5 =!PORTBbits.RB5;
				PORTBbits.RB3=(receive & 1);

				break;
		}		
		
		rec_n=16;	
	}
	}
	
	if (PIR1bits.ADIF == 1){
		
		PORTBbits.RB4 =!PORTBbits.RB4;
		
		ADh[nch]=ADRESH;
		dummyAD=ADRESL;
		send[nch]=(ADh[nch]<<1) | (dummyAD>>7);
		
		nch++;
		
		PIR1bits.ADIF = 0;
	
	if(nch<=1){
		
		SetADCChannel (nch);
		ADCON0bits.GO_DONE=1;
		
	}
	
	if(nch==2){	

		data_act[0]=(0 << 7 | GARRA << 3 | 0);
		data_act[1]=((1 << 7) | 1);
		data_act[2]=(0 << 7 | DISTANCIA << 3 | 0);
		data_act[3]=(1 << 7 | ((send[0]*128)/256));
		data_act[4]=(0 << 7 | DISTANCIA << 3 | 1);
		data_act[5]=(1 << 7 | ((send[1]*128)/256));
		data_act[6]=(0 << 7 | DISTANCIA << 3 | 2);
		data_act[7]=0b10000000;
		data_act[8]=(0 << 7 | DISTANCIA << 3 | 3);
		data_act[9]=((1 << 7) | 19);
		
		for(n=0;n<=9;n++)
		{
		while(!TXSTAbits.TRMT);
		TXREG = data_act[n];
		}
	
	}
			
	}
	//interrupt do timer2
	if (PIR1bits.TMR2IF == 1)
	{
		tmr2_c++;
		if(tmr2_c==10){
			
		PORTBbits.RB0 =!PORTBbits.RB0;
		
		tmr2_c=0;
		
		nch=0;	
		SetADCChannel (nch);

		ADCON0bits.GO_DONE=1;
		}
	
	if(leds==0){
		PORTBbits.RB0 =0;
		PORTBbits.RB1 =0;
	}else if(leds==1){	
		PORTBbits.RB0 =1;
		PORTBbits.RB1 =0;
	}
	
		PIR1bits.TMR2IF=0;
	}
}