//#include <16F877A.h>
#include <16F877.H> // configurar para o controlador a ser usado e o seu caminho
#include <regs_16f87x.h>
#include <Remota.h>
#include <Lcd_remota.c>
//#include <rs232.c>


#define usart0_buffer_size 17

boolean serial_recived=0, status_janela=true, Aj_Temp=true;
char usart_buffer;
char serial_buffer[usart0_buffer_size];
unsigned char posicao_buffer_serial=0;



#int_rda
void Trata_serial()
{

	if (kbhit())
	{

	serial_buffer[posicao_buffer_serial] = getchar();
	posicao_buffer_serial ++;
	
		if(posicao_buffer_serial>16 && serial_buffer[16]=='W'){
			posicao_buffer_serial=0;
			serial_recived=1;
      		
		}
	}
}

#int_timer0
void trata_t0()
{
	set_timer0(39 - get_timer0());
	output_high(pin_d7);
   delay_us(val_pwm);
	output_low(pin_d7);
}

void main()
{
int remota=0, aux=0;
   uC_inicia();


	lcd_pos_xy(1,1);
   printf(lcd_escreve,"Conectando...");

   while (true)
   {


	if(serial_recived==1){
		serial_recived=0;
		for(aux=0;aux<17;aux++)printf(serial_buffer[aux]);
		if(serial_buffer[5]=='S' && serial_buffer[8]=='J' && serial_buffer[16]=='W'){
			lcd_pos_xy(1,1);
      		printf(lcd_escreve,"Sala Conectada:");
			
			for(remota=0;remota<3;remota++){
				if(serial_buffer[9]=='A'&&!status_janela){
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve," Abrir Janela  ");
					delay_ms(1000);
					Controle_Janela(1);
				}else if(serial_buffer[9]=='F'&&status_janela) {
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve," Fechar Janela ");
					delay_ms(1000);
					Controle_Janela(0);
		   		}
				if(serial_buffer[13]=='T'){
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Temp. Aj. Manual  ");
					Aj_Temp=false;
					cont_Temp=0;
					delay_ms(1000);
				}else {
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Aj_Temp = %d oC  ",serial_buffer[13]);
					Aj_Temp=true;
					cont_Temp=serial_buffer[13];
					delay_ms(1000);
					Controle_Temperatura();
		   		}
				
				if(serial_buffer[15]=='C'){
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Amb: * Cinema * ");
				}else if(serial_buffer[15]=='F') {
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Amb: ** Festa ** ");
		   		}else if(serial_buffer[14]=='M'){
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Cor_Ilumin = %d   ",serial_buffer[15]);				
				}else if(serial_buffer[14]=='A'){
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Lux = %d         ",serial_buffer[15]);				
				}delay_ms(1000);
				if(serial_buffer[11]=='M'){
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Aj_Parede_Manual  ");				
				}else if(serial_buffer[10]=='P'){
					lcd_pos_xy(1,2);
					printf(lcd_escreve,"");
      				printf(lcd_escreve,"Cor_Parede = %d  ",serial_buffer[11]);
				}
				delay_ms(1000);
				//delay_ms(2000);
			}
		}else{
			lcd_pos_xy(1,1);
      				printf(lcd_escreve,"Nao Encontrado");
			lcd_pos_xy(1,2);
      				printf(lcd_escreve,"");
		}
	}

   delay_ms(100);
   Controle_Temperatura();
   Controle_Luminosidade();

	}


}
//-------------------


void uC_inicia(void){

	//enable_interrupts(global | int_timer0 | int_rda);
	enable_interrupts(int_rda);
	enable_interrupts(int_timer0);
	enable_interrupts(global);
	setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
   
   	set_timer0(39);  // para contagem timer0 de 216
   	setup_ADC_ports(RA0_RA1_RA3_ANALOG);
  	set_adc_channel(0);
  	setup_adc(ADC_CLOCK_INTERNAL);


   set_tris_D (0x00);  // configura todo o port_D como saida
   set_tris_A (0xff);
   set_tris_B (0xFF);  // seta port B como entrada
   port_b_pullups(true);  // ativa resistores de pull up no port b
   	

   output_low(pin_C1);  // zera  R/W
   output_low(pin_C0); // zera o RS
   lcd_ini();
   
	delay_ms(100);
   output_high(pin_C0); // seta o RS
	lcd_pos_xy(1,1);
    printf(lcd_escreve,"Eng. Eletrica");
	lcd_pos_xy(1,2);
    printf(lcd_escreve,"Inicializando...");
//	rs232_inicializa();

	Controle_Janela(janela);
}

/* FUNCAO CONTROLE TEMPERATURA  */
void Controle_Temperatura(void){
//	set_adc_channel(0);
//   delay_us(20);
//   valor_L = read_adc(); // efetua a conversao A/D;
   set_adc_channel(1);
   delay_us(20);
   valor_T = (read_adc()); // efetua a conversao A/D;
   val_Temp=(valor_T*0.005)/0.01;
    lcd_pos_xy(1,2);
	printf(lcd_escreve,"");
	printf(lcd_escreve,"%3.2foC ",val_Temp);
	
	if(Aj_Temp)
		if((val_Temp>=cont_Temp))output_high(pin_d6);
			else output_low(pin_d6);
	else if(!Aj_Temp && input(pin_b3)==0)output_high(pin_d6);
			else output_low(pin_d6);

	


}

/* FUNCAO CONTROLE Luminosidade  */
void Controle_Luminosidade(void){

   set_adc_channel(0);
   delay_us(20);
   valor_L = read_adc(); // efetua a conversao A/D;
   aux_lux=(valor_L*0.00488);
   if(aux_lux>=0.855){
		val_Lux=((aux_lux*aux_lux*aux_lux)*(-30.688))+(235.34*(aux_lux*aux_lux))-(612.11*aux_lux)+566.78;
    	val_Lux+=100;
	}
	if(aux_lux<0.855){
		val_Lux=((aux_lux*aux_lux*aux_lux)*(-8697.9))+(17262*(aux_lux*aux_lux))-(11990*aux_lux)+3214.7;
		val_Lux+=100;
	}
	if(val_Lux>=0){
      lcd_pos_xy(9,2);
      printf(lcd_escreve,"%4.1fLx  ",val_Lux);
	}


}

/* FUNCAO CONTROLE Janela  */
void Controle_Janela(boolean c_janela){
	
	if(!c_janela)
		loop:
		while(!c_janela){
			val_pwm=2500;
			if(input(pin_b0)){
				output_high(pin_d0);
				status_janela=false;				
				c_janela=!c_janela;
				break;
			}else output_low(pin_d0);
		}
	else if(c_janela){
			val_pwm=700;
			delay_ms(2600);
			val_pwm=1692;
			status_janela=true;
		}
	val_pwm=1692;

}
