#include <8051.c>

#include "lcd.h"

// 8 bits donde guardaremos el resultado de la comprobación (1 ERROR - 0 OK) 
unsigned char erroneos = 0;

// Función principal
int main (void)
{
	initUC();
	initLCD();

	borrarLCD();
	posicionarLCD(0,0);
	escriuStrLCD("COMPROBADOR CABLES RJ45");

	for (;;) {
		switch (P3) {
			case 0xFE:		// pulsamos P3_0
				reset();
				break;
			case 0xFD:		// pulsamos P3_1
				comprobar();
				imprimir_resultado();
				break;
			case 0xFB:		// pulsamos P3_2
				comprobar_cruzado();
				imprimir_resultado();
				break;
			case 0xF7:		// pulsamos P3_3
				deteccion();
				break;
			default: 
				break;
		}
	}
			
}

// Inicialización del microcontrolador
void initUC (void)
{
	EA = 1;
}

// Inicialización del LCD
void init_lcd (void)
{
	initLCD();
}

// Resetear el sistema
void reset (void)
{
	erroneos = 0x00;
	borrarLCD();
}

// Comprobación de cable "no cruzado"
int comprobar (void)
{
	int i;
	
	P2 = 0x00;
	P0 = 0x00;

	for (i=0;i<8;i++) {
		P0 = P0 | (1<<i);
		if (P2 != P0) {
			erroneos = erroneos | (1<<i);
		}
	}
	
	if (erroneos != 0)
		return -1;
	return 0;
}

// Comprobación de cable cruzado
int comprobar_cruzado (void)
{
	P2 = 0x00;
	P0 = 0x00;

	for (i=0;i<8;i++) {
		P0 = P0 | (1<<i);
		switch (P0) {
			case 0x01:
				if (P2 != 0x04) 
					erroneos = erroneos | (1<<i);
				break;
			case 0x03:
				if (P2 != 0x24) 
					erroneos = erroneos | (1<<i);
				break;
			case 0x07:
				if (P2 != 25)
					erroneos = erroneos | (1<<i);
				break;
			case 0x0F:
				if (P2 != 2D)
					erroneos = erroneos | (1<<i);
				break;
			case 0x1F:
				if (P2 != 3D) 
					erroneos = erroneos | (1<<i);
				break;
			case 0x3F:
				if (P2 != 3F) 
					erroneos = erroneos | (1<<i);
				break;
			case 0x7F:
				if (P2 != 7F) 
					erroneos = erroneos | (1<<i);
				break;
			case 0xFF:
				if (P2 != FF) 
					erroneos = erroneos | (1<<i);
				break;
			default: 
				break;
		}
	}

	if (erroneos != 0)
		return -1;
	return 0;

}

// Detección del tipo de cable
void deteccion (void)
{
	if (comprobar() == 0) {
		borrarLCD();
		posicionarLCD(0,0);
		escriuStrLCD("Cable recto.");
	} else if (comprobar_cruzado() == 0) {
		borrarLCD();
		posicionarLCD(0,0);
		escriuStrLCD("Cable cruzado.");
	} else {
		borrarLCD();
		posicionarLCD(0,0);
		escriuStrLCD("ERROR: cable con fallos.");
	}
}

// Imprime el contenido de la variable 'resultado'
void imprimir_resultado (void)
{
	int i;
	if (erroneos != 0) {
		//printf("Cable incorrecto:");
		borrarLCD();
		posicionarLCD(0,0);
		escriuStrLCD("Cable incorrecto: ");
		for (i=0;i<8;i++) {
			if (erroneos & (1<<i) == 0) {
				printf(" %d",i+1);
			}
		}
	} else {
		//printf("Cable correcto.");
		borrarLCD();
		posicionarLCD(0,0);
		escriuStrLCD("Cable correcto.");
	}
}

