/*
 * testy_master.c
 *
 * Created: 15.5.2016 12:47:25
 *  Author: tomino
 */ 

#include <avr/io.h>			//zakladni ATMega funkce
#include <util/delay.h>		//zpozdeni
#include "displej.h"		//vypis vysledku
#include "menu.h"			//nutne pro tlacitka
#include "TWI_MASTER.h"		//vysilani pozadavku na testy

/***************************************************************************************************************
											VNITRNI FUNKCE  
***************************************************************************************************************/

//vodivost je stejna jako rezistor, pripadne rezistor s diodou

void propoj (uint8_t cislo, uint8_t *data)
{
	uint8_t vysledek=0, adresa=100, dotaz=0;
	vysledek = TWI_zeptej_se(0, cislo);
	if(vysledek != 3)	data[3*cislo] = vysledek;			//dale jede jen pokud dojde k rozpojeni
	else
	{
		data[3*cislo] = 3;
		for (adresa=100; adresa<113;adresa++)
		{
			dotaz = TWI_zeptej_se(adresa,cislo);
			if (dotaz == 2)									//v pripade prohozeni 
			{
				data[3*cislo] = 2;						//ulozi prohozeni vodicu
				adresa = 115;								//zajisti vyskoceni z ifu
			}
			adresa++;				//zajisti pricitani po dvou
		}
	}
}

uint8_t rele (uint8_t cislo, uint8_t *data)
{
	uint8_t vysledek=0, adresa=0;
	vysledek = TWI_zeptej_se(0,cislo);
	if (vysledek == 1)
	{
		data[3*cislo] = 5;
		return 0;
	}
	//sepnuti civky a delay
	_delay_ms(30);
	vysledek = TWI_zeptej_se(0,cislo);
	data[3*cislo] = vysledek;					//ulozi stav vodičů vodicu
	if (vysledek == 3)
	{
	for (adresa=100; adresa<113;adresa++)
	{
		vysledek = TWI_zeptej_se(adresa,cislo);
		if (vysledek == 2)									//v pripade prohozeni
		{
			data[3*cislo] = vysledek;
			adresa = 115;								//zajisti vyskoceni z ifu
		}
		adresa++;				//zajisti pricitani po dvou
	}
	}
	//rozepnuti civky a delay
	_delay_ms(30);
	vysledek = TWI_zeptej_se(0,cislo);
	if (vysledek == 1)
	{
		data[3*cislo] = 5;
		return 0;
	}
	
	return 1;		//pokud doslo az sem, je to cajk
}

void prepinac (uint8_t cislo, uint8_t *data)
{
	uint8_t vysledek_1=0, vysledek_2=0, tlac=0, adresa=0;
	int vodic=0;
	vysledek_1 = TWI_zeptej_se(0,cislo);
	if (vysledek_1 == 3)
	{
		for (adresa=100; adresa<113;adresa++)
		{
			tlac = TWI_zeptej_se(adresa,cislo);
			if (tlac == 2)									//v pripade prohozeni
			{
				vysledek_1 = 2;						//ulozi prohozeni vodicu
				adresa = 115;								//zajisti vyskoceni z ifu
			}
			adresa++;				//zajisti pricitani po dvou
		}
	} 
	vodic = data[3*cislo+1] << 8;
	vodic = vodic | data[3*cislo+2];
	vodic = vodic >> 6;
	zapistext(3,3,"tlacitko c.:");
	zapiscislo(3,15,vodic,3);
	while (tlac != 252)
	{
		tlac = tlacitka();
	}
	vysledek_2 = TWI_zeptej_se(0,cislo);
	if (vysledek_2 == 3)
	{
		for (adresa=100; adresa<113;adresa++)
		{
			tlac = TWI_zeptej_se(adresa,cislo);
			if (tlac == 2)									//v pripade prohozeni
			{
				vysledek_2 = 2;						//ulozi prohozeni vodicu
				adresa = 115;								//zajisti vyskoceni z ifu
			}
			adresa++;				//zajisti pricitani po dvou
		}
	}
	//celkove vyhodnoceni obou testu
	if (vysledek_1 != vysledek_2)
	{
		if ((vysledek_1==1) | (vysledek_2 ==1)) data[3*cislo]=1;
		else if ((vysledek_1==2) | (vysledek_2==2)) data[3*cislo]=2;
	}
	else
	{
		if (vysledek_1 == 1) data[3*cislo]=5;
		else if (vysledek_1 == 2) data[3*cislo]=5;
		else data[3*cislo]=3;
	}
}

void rezistor (uint8_t cislo, uint8_t *data)
{
	uint8_t vysledek=0;
	vysledek = TWI_zeptej_se(0, cislo);
	data[3*cislo] = vysledek;			
}


/***************************************************************************************************************
											VOLATELNE FUNKCE
***************************************************************************************************************/

void testuj (uint8_t *data)
{
	uint8_t i=0,  soucastka=0;
	zapistext(2,5,"testuju");
	while ((data[3*i+1] != 0) | (data[3*i+2] != 0))			//pokud jsou na danych pozicich data
	{
		soucastka = (data[3*i+2] & 0b00111100);
		switch (soucastka)
		{
		case 0b00000000:
			propoj(i,data);
			break;
		case 0b00001000:
			rele(i,data);
			break;
		case 0b00010000:
			prepinac(i,data);
			break;
		case 0b00100000:
			rezistor(i,data);
			break;
		}
		zapiscislo(3,1,i,3);
		i++;
	}
}

uint8_t vypis_vysledku (uint8_t *data)
{
	uint8_t ukazatel=0, tlac=0;
	uint16_t vodic=0;
	//zapis sipek
	vymazLCD();
	zapistext(1,1,"______VYSLEDKY______");
	skoc(3,1);
	zapisbajt(0b11110110, 1);
	skoc(3,20);
	zapisbajt(0b11110111, 1);	
	while((data[3*ukazatel] == 1) & (ukazatel < 205)) ukazatel++;
	if (ukazatel == 205)
	{
		zapistext(3,3,"vse v poradku");
		return 1;
	}
	while (tlac != 252)
	{
		if (data[3*ukazatel] != 0)
		{
		switch (data[3*ukazatel])
			{
			case 2:
				zapistext(3,4,"prohozeny  ");
				break;
			case 3:
				zapistext(3,4,"rozpojeny  ");
				break;
			case 4:
				zapistext(3,4,"zkratovany  ");
				break;
			case 5:
				zapistext(3,4,"komponenta  ");
				break;
			default:
				zapistext(3,4,"            ");
			}
			vodic = data[3*ukazatel+1] << 8;
			vodic = vodic | data[3*ukazatel+2];
			vodic = vodic >> 6;
			zapiscislo(3,15,vodic,4);
		}
		if (ukazatel > 0) 
		{
		tlac = ukazatel-1;
		while ((data[3*tlac] == 1) & (tlac > 0)) tlac--;
		if ((tlac >= 0) & (data[3*tlac] != 1))
		{
			switch (data[3*tlac])
			{
				case 2:
					zapistext(2,4,"prohozeny  ");
					break;
				case 3:
					zapistext(2,4,"rozpojeny  ");
					break;
				case 4:
					zapistext(2,4,"zkratovany  ");
					break;
				case 5:
					zapistext(2,4,"komponenta  ");
					break;
				default:
					zapistext(2,4,"            ");
			}
			vodic = data[3*tlac+1] << 8;
			vodic = vodic | data[3*tlac+2];
			vodic = vodic >> 6;
			zapiscislo(2,15,vodic,4);
		}
		else vycisti_radek(2);
		}
		else vycisti_radek(2);
		tlac = ukazatel+1;
		while((data[3*tlac] == 1) & (tlac < 205)) tlac++;
		if ((tlac < 205) & (data[3*tlac] != 0)) 
		{	
			switch (data[3*tlac])
			{
				case 2:
					zapistext(4,4,"prohozeny  ");
					break;
				case 3:
					zapistext(4,4,"rozpojeny  ");
					break;
				case 4:
					zapistext(4,4,"zkratovany  ");
					break;
				case 5:
					zapistext(4,4,"komponenta  ");
					break;
				default:
					zapistext(4,4,"            ");
			}
			vodic = data[3*tlac+1] << 8;
			vodic = vodic | data[3*tlac+2];
			vodic = vodic >> 6;
			zapiscislo(4,15,vodic,4);
		}
		else vycisti_radek(4);
		//reakce na tlacitka
		tlac = tlacitka();
		if ((tlac == 143) & (ukazatel < 204))
		{
			tlac = ukazatel+1;
			while((data[3*tlac] == 1) & (3*tlac < 205)) tlac++;
			if ((tlac < 205) & (data[3*tlac] != 0)) ukazatel = tlac;			
		}
		else if ((tlac == 243) & (ukazatel > 0))
		{
			tlac = ukazatel-1;
			while ((data[3*tlac] == 1) & (tlac > 0)) tlac--;
			if ((tlac >= 0) & (data[3*tlac] != 1)) ukazatel = tlac;
		}
	}
	vymazLCD();
	return 1;
}