#include <AT898252.H>
#include "visual.h"
#include "lcd_4bit.h"
#include "delay.h"
#include "adc0808.h"
#include "rs232.h"

//Configuracion de canales q queremos leer(usamos bdata para q sea accesible bit a bit)
//OJO!!!!
//Chapuza absoluta, no se pueden malgastar 8 bytes asi cuando deberia bastar con 8 bits!!!!
//Pero funciona :P
extern UCHAR code mascara_canal[]={1,0,1,0,0,0,0,0};
//Donde guardamos los datos(usamos idata por q su tamaņano es considerable
extern UCHAR idata buffer[8] ; 
extern bit F_MANDADO ;




//Textos(usamos code pq son estaticos)
UCHAR code * cabecera="Canal ";
UCHAR code * medio=" : ";
UCHAR code * magnitud=" V.";

//Matriz para pasar de digitos hexadecimales a decimales ASCII
UCHAR code conversion[]={0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};  


//Hace un barrido sin comprobar conf canales
void barrido_total(void)
{
	barrido(buffer,8);
}

//esta hace un barrido solo de los canales q le digamos
void barrido_selectivo(void)
{
	UCHAR i;
	for(i=0;i<8;i++)				//Corremos los 8 canales
	{
		if(mascara_canal[i]==1)		//Comprobamos si esta activada la mascara de este canal
		{
			buffer[i]=leer_dato(i);	//Si lo esta leemos el canal
		}
		else
		{
			buffer[i]=0x00;			//Sino metemos un 0
		}//Fin del if-else
//		mascara_canal>>1;			//rotamos un bit a la derecha
	}//fin del for

}//Fin de barrido_selectivo


//Esta funcion coje un UCHAR y lo saca como ASCII de 3 cifras(centenas, decenas y unidades)
void mostrar_dato(UCHAR dato)
{
	lcd_caracter( conversion[dato / 100]);			//Mostramos las centenas
	lcd_caracter( conversion[(dato % 100) / 10]);	//Mostramos las decenas
	lcd_caracter( conversion[dato % 10]);			//Y finalmente las unidades
}

//Esta funcion coje un valor y muestra el voltage correspondiente por el LCD
//NOTA:referenciado a 5V!!!! 
//Escalon cuantico 19,6mV, por eso se multiplica 196
void mostrar_voltage(UINT dato)
{
	lcd_caracter( conversion[dato*196 / 10000]);			//Mostramos las unidades
	lcd_caracter(0x2C);							
	lcd_caracter( conversion[(dato*196 % 10000) / 1000]);	//Mostramos las decimas
	lcd_caracter( conversion[dato*196 % 1000/100]);			//Y finalmente las centesimas
	
}

void enviar_serie_voltage(UINT dato)
{
	init_serie_int();
	enviar_serie( conversion[dato*196 / 10000]);			//Mostramos las unidades
	while(F_MANDADO==0);
	F_MANDADO=0;
	enviar_serie(0x2C);							
	while(F_MANDADO==0);
	F_MANDADO=0;
	enviar_serie( conversion[(dato*196 % 10000) / 1000]);	//Mostramos las decimas
	while(F_MANDADO==0);
	F_MANDADO=0;
	enviar_serie( conversion[dato*196 % 1000/100]);			//Y finalmente las centesimas
	while(F_MANDADO==0);
	F_MANDADO=0;

	
}



//Rutina q se encarga de mostrar 2 lineas con el valor de la posicion del buffer i e i+1
void mostrar(UCHAR i)
{
	poner_linea_1();					//Vamos a la primera linea;
	display(cabecera);					//Ponemos la cabecera
	lcd_caracter(conversion[i]); 		//Ponemos el numero del canal
	display(medio);						//Ponemos :
	mostrar_voltage(buffer[i]);
	display(magnitud);				

	poner_linea_2();					//vamos a la segunda linea;
	display(cabecera);					//Ponemos la cabecera
	if (i==7)							//Hay q comprobar si estamos al final
	{lcd_caracter(conversion[0]);		//Si lo estamos en vez de 7+1 sacaremos la posicion 0
	display(medio);						//ponemos :
	mostrar_voltage(buffer[0]);
	}
	else								//Si no estamos al final sacaremos la posicion i+1
	{lcd_caracter(conversion[i+1]);		//Ponemos el numero del canal
	display(medio);						//ponemos :
	mostrar_voltage(buffer[i+1]);
	}//Fin del else
	display(magnitud);				
}//Fin de mostar

//Rutina q se encarga de mostrar 2 lineas con el valor de la posicion del buffer i e i+1
void leer_y_mostrar(UCHAR i)
{
	UINT temp=1;
	poner_linea_1();					//Vamos a la primera linea;
	display(cabecera);					//Ponemos la cabecera
	lcd_caracter(conversion[i]); 		//Ponemos el numero del canal
	display(medio);						//Ponemos :
	mostrar_voltage(leer_dato(i));
	display(magnitud);				

	poner_linea_2();					//vamos a la segunda linea;
	display(cabecera);					//Ponemos la cabecera
	if (i==7)							//Hay q comprobar si estamos al final
	{lcd_caracter(conversion[0]);		//Si lo estamos en vez de 7+1 sacaremos la posicion 0
	display(medio);						//ponemos :
	mostrar_voltage(leer_dato(0));
	}
	else								//Si no estamos al final sacaremos la posicion i+1
	{lcd_caracter(conversion[i+1]);		//Ponemos el numero del canal
	display(medio);						//ponemos :
	mostrar_voltage(leer_dato(i+1));
	}//Fin del else
	display(magnitud);				

}//Fin de mostar

//Esta funcion lee un canal y manda el valor leido en voltage por el puerto serie
void leer_y_mandar_serie(UCHAR i)
{
	init_serie_int();
	//Rutinas para enviar los datos por serie
	enviar_serie_int(0x0D);
	while(F_MANDADO==0);
	F_MANDADO=0;
	enviar_cadena_serie(cabecera);					//Ponemos la cabecera
	enviar_serie(conversion[i]); 				//Ponemos el numero del canal
	while(F_MANDADO==0);
	F_MANDADO=0;
	enviar_cadena_serie(medio);						//Ponemos :
	enviar_serie_voltage(leer_dato(i));
	enviar_cadena_serie(magnitud);				
}//Fin de leer_y_mandar_serie

void leer_y_mostrar_con_mascara(UCHAR i)
{
poner_linea_1();					//Vamos a la primera linea;
if(mascara_canal[i]==1)
{

	display(cabecera);					//Ponemos la cabecera
	lcd_caracter(conversion[i]); 		//Ponemos el numero del canal
	display(medio);						//Ponemos :
	mostrar_voltage(leer_dato(i));
	display(magnitud);				
}

poner_linea_2();					//vamos a la segunda linea;


	if (i==7)							//Hay q comprobar si estamos al final
	{
	if(mascara_canal[0]==1)	
	{
		display(cabecera);					//Ponemos la cabecera
		lcd_caracter(conversion[0]);		//Si lo estamos en vez de 7+1 sacaremos la posicion 0
		display(medio);						//ponemos :
		mostrar_voltage(leer_dato(0));
		display(magnitud);				
	}//Fin del if mascara.....
	}//Fin del if(i==7)
	else								//Si no estamos al final sacaremos la posicion i+1
	{
	if(mascara_canal[i+1]==1)	
		{
		display(cabecera);					//Ponemos la cabecera
		lcd_caracter(conversion[i+1]);		//Ponemos el numero del canal
		display(medio);						//ponemos :
		mostrar_voltage(leer_dato(i+1));
		display(magnitud);				
		}//Fin del if mascara
	}//Fin del else

}//Fin de mostar

//Esta funcion es la principal. 
//Ella se encarga de la representacion y la interaccion con el usuario

UCHAR ver (UCHAR i)
{
	UCHAR cont;
		if (ADELANTE==1) 						//Esta pulsado el boton ADELANTE?
		{
			//el usuario quiere reset???
			if(ATRAS)						//Dos pulsadores pulsados ==> reset
			{
//				if(ATRAS & ADELANTE){ break ;}			//De aqui saldra manteniendo pulsados los 2 botones
				//Si no quiere reset manipulamos el contador
				if(i==7){i=0;}else{i++;}
			}//Fin del if de reseteo
		}//Fin if ADELANTE

		if (ATRAS==1) 						//Esta pulsado el boton ATRAS?
		{
			//el usuario quiere reset???
			if(ADELANTE)				//Dos pulsadores pulsados ==> reset
			{
//				if(ADELANTE & ATRAS){ break ;}	//De aqui saldra manteniendo pulsados los 2 botones
				//Si no quiere reset manipulamos el contador
				if(i==0){i=7;}else{i--;}
			}//Fin del if de reseteo
		}//Fin if ATRAS
		leer_y_mostrar(i);							//Mostramos las lineas deseadas
//		leer_y_mandar_serie(i);
		//Ahora mandamos por el puerto serie el valor de los 8 canales.
		init_serie_int();
		barrido_total();
		for(cont=0;cont<8;cont++)
		{
			while(F_MANDADO==0);
			enviar_serie_int(buffer[cont]);
		}
	return(i);	//devolvemos el nuevo valor de i
}//Fin de ver()	
