/*
 * menu.c
 *
 * Created: 3.3.2016 0:04:36
 *  Author: tomino
 */ 

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "displej.h"
#include "TWI_MASTER.h"
#include "SPI_master.h"


char nazev[13];
uint8_t ukaz_min=0, stav=0;
uint16_t ukaz=0;

void sipky (int radek)
{
	for (stav=3; stav<5; stav++)
	{
		skoc(stav,1);
		zapisbajt(' ', 1);
		skoc(stav,20);
		zapisbajt(' ', 1);
	}
	skoc(radek,1);
	zapisbajt(0b11110110, 1);
	skoc(radek,20);
	zapisbajt(0b11110111, 1);
}

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

uint8_t nacti_jmeno (uint8_t ukazatel)
{
	//ziskani adresy
	uint32_t adr=0;
	uint8_t adr_1=0, adr_2=0, adr_3=0;
	adr=adresa(ukazatel);				//4bajty, tri z nich obsahuji adresu
	//deleni adresy do jednotlivych bajtu
	adr_3=adr;
	adr_2=adr>>8;
	adr_1=adr>>16;
	
	PORTB &= ~(1<<PB0);				//CS je nula pro otevreni kanalu
	SPI_nahrej(3);					//prikaz pro cteni
	
	//adresa (3byty)
	SPI_nahrej(adr_1);
	SPI_nahrej(adr_2);
	SPI_nahrej(adr_3);
		
	//cteni
	adr=0;
	SPI_nahrej(15);
	if ((SPDR<48) | (SPDR > 122)) 
	{
		PORTB |= (1<<PB0);				//uzavre kanal k pameti
		return 1;						//pozice je prázdná
	}
	while (adr<13)
	{
		nazev[adr]=SPDR;
		adr++;
		SPI_nahrej(15);
	}
	nazev[13]=0;
	PORTB |= (1<<PB0);				//uzavre kanal k pameti
	return 2;						//nacteni probehlo v poradku
}

uint8_t vypis_na_LCD(uint16_t ukazatel)
{
	uint16_t pomocnik=0;
/*****************************PROSTREDNI POLOZKA*******************/
	pomocnik=ukazatel;
	vycistiLCD();
	stav=nacti_jmeno(pomocnik);
	while (stav == 1)
	{
		if (ukazatel<255) pomocnik++;
		stav=nacti_jmeno(pomocnik);
		if (pomocnik == 255)
		{
			stav=2;
		}
	}
	if (pomocnik!=255)
	{
		zapistext(3,5,nazev);
		zapiscislo(3,15,pomocnik,3);
		ukaz=pomocnik;
		ukazatel=pomocnik;
		sipky(3);
	} 
	else
	{
		zapistext(3,5,"PRAZDNA PAMET");
		return 0;
	}
/********************PRVNI POLOZKA***************************/
	if(ukazatel>0) 
	{
		pomocnik=ukazatel-1;
		stav=nacti_jmeno(pomocnik);
	}
	else
	{
		zapistext(2,5,"nic tu neni");
		stav=2;
	}
	while (stav == 1)
	{
		if (pomocnik>0) pomocnik--;
		stav=nacti_jmeno(pomocnik);
		if (pomocnik == 0)
		{
			stav=2;
		}
	}
	if (pomocnik!=0)
	{
		zapistext(2,5,nazev);
		zapiscislo(2,15,pomocnik,3);
	}
		
/********************POSLEDNI POLOZKA*************************/
	if(ukazatel<255) 
	{
		pomocnik=ukazatel+1;
		stav=0;
		stav=nacti_jmeno(pomocnik);
	}
	else
	{
		stav=2;
		pomocnik=255;
	}
	while (stav == 1)
	{
		if (pomocnik<255) pomocnik++;
		stav=nacti_jmeno(pomocnik);
		if (pomocnik == 255)
		{
			stav=2;
		}
	}
	if (pomocnik<255)
	{
		zapistext(4,5,nazev);
		zapiscislo(4,15,pomocnik,3);
	}
	
	
	return 0;
}

uint8_t autotest_nahrani (const uint8_t *progdata, uint8_t *data)
{
	//nacteni dat
	uint8_t data_1=pgm_read_byte(progdata), data_2=pgm_read_byte(progdata+1), data_3=pgm_read_byte(progdata+2), data_4=pgm_read_byte(progdata+3),
	i=0, adresa=0;
	
	//probiha pouze pokud prvni dva bajty dat nejsou nulove, tudiz na dane pozici je nejaky test
	while ((data_1!=0) | (data_2!=0))
	{
		data[3*i+1]=data_1;
		data[3*i+2]=data_2;
		if ((data_2 & 0b00000010)==0)	adresa = 100;		//inicializacni adresa
		else							adresa = 200;
		while (data_3>50)
		{
			data_3=data_3-51;								//smycka pro nastaveni ciloveho pinu kontroleru
			adresa=adresa+2;								//pricita adresu ciloveho kontroleru po dvou kvuli smeru komunikace
		}
		data_3=data_3+128;									//prictenim se oznaci jako vystup
		data_1=TWI_data(i,data_3+1,adresa);							//odesle data ke kontroleru
		if (data_1==15)
		{
			vycistiLCD();
			zapistext(2,5,"!!!CHYBA!!!");
			_delay_ms(2000);
			return 1;
		}
		if ((data_2 & 0b00000001)==0)	adresa = 100;		//inicializacni adresa
		else							adresa = 200;
		while (data_4>50)
		{
			data_4=data_4-51;								//smycka pro nastaveni ciloveho pinu kontroleru
			adresa=adresa+2;								//pricita adresu ciloveho kontroleru po dvou kvuli smeru komunikace
		}
		data_1=TWI_data(i,data_4+1,adresa);							//odesle data ke kontroleru
		if (data_1==15)
		{
			vycistiLCD();
			zapistext(2,5,"!!!CHYBA!!!");
			_delay_ms(2000);
			return 1;
		}
		i++;
		data_1=pgm_read_byte(progdata+(4*i));
		data_2=pgm_read_byte(progdata+(4*i+1));
		data_3=pgm_read_byte(progdata+(4*i+2));
		data_4=pgm_read_byte(progdata+(4*i+3));
	}
	return 0;
}

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


/*NAVRATOVA HODNOTA JE 243 PRO SIPKU NAHORU, 252 PRO POTVRZENI, 143 PRO SIPKU DOLU*/
uint8_t tlacitka()
{
	uint8_t tlacitka=255;
	while (tlacitka == 255)
	{
		tlacitka = PINC;
	}
	_delay_ms(250);
	while (PINC != 255) {}		//pocka na pusteni tlacitka
	if (tlacitka==249) return 243;
	else if (tlacitka==231) return 252;
	else if (tlacitka==31) return 143;
	else if (tlacitka==25) return 131;
	else return tlacitka;
	
}

uint16_t vyber_svazku(void)
{
	uint16_t pomocnik=0;
	uint8_t priznak=0;
	vymazLCD();
	vypis_na_LCD(ukaz);
	zapistext(1,1,"___vyberte svazek___");
	while (1)
	{
		priznak=tlacitka();
		switch (priznak)
		{
		case 143:
			if (ukaz<255)	
			{
				pomocnik=ukaz+1;
				stav=nacti_jmeno(pomocnik);
				while (stav==1)
				{
					if (pomocnik <255) pomocnik++;
					stav=nacti_jmeno(pomocnik);
					if (pomocnik==255) stav=2;
				}
			}
			else 
			{
				pomocnik=ukaz;
			}
			if (pomocnik<255) ukaz=pomocnik;
			vypis_na_LCD(ukaz);
			break;
		
		case 252:
			vycistiLCD();
			return ukaz;
			break;
		
		case 243:
			if (ukaz>0)
			{
				pomocnik=ukaz-1;
				stav=nacti_jmeno(pomocnik);
				while (stav==1)
				{
					if (pomocnik >0) pomocnik--;
					stav=nacti_jmeno(pomocnik);
					if (pomocnik==0) stav=2;
				}
			}
			else
			{
				pomocnik=ukaz;
			}
			if (pomocnik>0) ukaz=pomocnik;
			vypis_na_LCD(ukaz);
			break;
		}
	}
	
	return ukaz;
}

uint16_t mazani_svazku(void)
{
	uint16_t pomocnik=0;
	uint8_t priznak=0;
	vymazLCD();
	vypis_na_LCD(ukaz);
	zapistext(1,1,"___smazat svazek____");
	while (1)
	{
		priznak=tlacitka();
		switch (priznak)
		{
			case 143:
			if (ukaz<255)
			{
				pomocnik=ukaz+1;
				stav=nacti_jmeno(pomocnik);
				while (stav==1)
				{
					if (pomocnik <255) pomocnik++;
					stav=nacti_jmeno(pomocnik);
					if (pomocnik==255) stav=2;
				}
			}
			else
			{
				pomocnik=ukaz;
			}
			if (pomocnik<255) ukaz=pomocnik;
			vypis_na_LCD(ukaz);
			break;
			
			case 252:
			vycistiLCD();
			return ukaz;
			break;
			
			case 243:
			if (ukaz>0)
			{
				pomocnik=ukaz-1;
				stav=nacti_jmeno(pomocnik);
				while (stav==1)
				{
					if (pomocnik >0) pomocnik--;
					stav=nacti_jmeno(pomocnik);
					if (pomocnik==0) stav=2;
				}
			}
			else
			{
				pomocnik=ukaz;
			}
			if (pomocnik>0) ukaz=pomocnik;
			vypis_na_LCD(ukaz);
			break;
		}
	}
	
	return ukaz;
}

void skryte_menu(const uint8_t *data, uint8_t *pamet)
{
	uint8_t priznak=3, ukazatel=0, funkce=0;
	vymazLCD();
	zapistext(1,1,"__SERVISNI NABIDKA__");
	zapistext(2,1,"CO SI PREJETE DELAT?");
	zapistext(4,5,"   MAZAT      ");
	zapistext(3,5,"  AUTOTEST    ");
	sipky(priznak);
	ukazatel=tlacitka();
	ukazatel=231;
	while (ukazatel != 252)
	{									//while dokud se nepotvrdi vyber stiskem prostr. tlacitka
		switch (ukazatel)
		{
			case 243:
			priznak = 3;
			break;
			
			case 143:
			priznak = 4;
			break;
		}
		sipky(priznak);
		ukazatel=tlacitka();
	}
	if (priznak==3)
	{
		//nacteni dat z "data", ulozeni do "pamet" a provedeni selftestu
		vymazLCD();
		zapistext(1,6,"SELFTEST");
		autotest_nahrani(data, pamet);
	}
	else
	{
		while (funkce == 0)
		{
		ukazatel=mazani_svazku();	//vypis nazvu svazků
		vycisti_radek(2);
		vycisti_radek(4);
		SPI_vymaz(ukazatel);		//vymaze vybrany svazek, pak se zepta zda se bude mazat dalsi
		
		zapistext(2,5,"smazat dalsi?  ");
		zapistext(3,5,"   ANO         ");
		zapistext(4,5,"   NE          ");
		sipky(priznak);
		ukazatel=tlacitka();
		while (ukazatel != 252)
		{
			sipky(priznak);
			switch (ukazatel)
			{
				case 243:
				priznak = 3;
				break;
				
				case 143:
				priznak = 4;
				break;
			}
			sipky(priznak);
			ukazatel=tlacitka();
		}
		if (priznak == 4)			//NE
		{
			funkce = 5;
			//nedela nic
		}
		else
		{
			ukazatel = 0b00011001;
			priznak=4;
		}
		
		}
	}
	
}

