/*
 * Semestralka_complete.c
 *
 * Created: 23.3.2013 17:00:06
 *  Author: Kubrt
 */ 

//////////////////////////////////////////////////////////////////////////////////////////
//	PORTA				PORTB				PORTC				PORTD					//
//	PA0		ADC (Dout)	PB0		-			PC0		I2C	(scl)	PD0		LCD	(#Reset)	//
//	PA1		ADC	(Busy)	PB1		-			PC1		I2C	(sda)	PD1		LCD	(CS)		//
//	PA2		ADC	(DIN)	PB2		-			PC2		USB	(#RD)	PD2		LCD	(D/#C)		//
//	PA3		ADC	(#CS)	PB3		-			PC3		USB	(D3)	PD3		LCD	(Sdata)		//
//	PA4		ADC	(Dclk)	PB4		-			PC4		USB	(D6)	PD4		LCD	(Sclk)		//
//	PA5		USB (D0)	PB5		button L	PC5		USB	D5)		PD5		USB	(#TXF)		//
//	PA6		USB	(D4)	PB6		button R	PC6		USB	(D5)	PD6		USB	(RXF)		//
//	PA7		USB (D2)	PB7		button Ok	PC7		USB	(D5)	PD7		USB	(RW)		//
//																						//
//////////////////////////////////////////////////////////////////////////////////////////


#define F_CPU 16000000
#define F_TWI 4000000UL

#define L	1
#define R	2
#define OK	3

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

#include "USB_data.h"
#include "TW_interface.h"
#include "ADC_interface.h"
#include "LCD_display.h"
#include "internal_EEPROM.h"

volatile uint8_t Menu;	// proměnná stavového automatu
uint8_t cidla;			// aktivní čidla
uint8_t interval;		// intervaly měření
uint8_t typy_cidel;		// Pt/Ni, 1 = Ni, 0 = Pt
uint16_t aktualni_cas;	// aktuální čas max 1800s
uint8_t zapis;			// informace jestli probíhá záznam (1)
uint16_t adresa_hlavicky;//adresa hlavičky
uint16_t adresa_zaznamu;//adresa aktuálního záznamu
uint16_t delka_zaznamu;	//aktuální délka záznamu
uint8_t pocet_cidel;	//počet čidel k záznamu
uint16_t pocet_zaznamu;	//počet vzorků
uint8_t sprava_dat;		//pozice při prohlížení dat
uint8_t USB_mode;
uint8_t blikatko;
uint8_t tlacitka;

void PORTs_init()
{
	DDRA = 0b00011100;
	DDRC = 0b00000111;
	DDRD = 0b10011111;
	
	PORTD = 0b00000000;	
	PORTB = 0b11100000;	//pull-up odpory pro tlačítka
}
uint8_t zahajit_zaznam()
{
	uint16_t posledni, aktualni;
	uint8_t pocet_cidel_predchazejici = 0;
	cli();
	
	pocet_cidel = 0;
	for (uint8_t i = 0; i < 4; i++)
	{
		if (cidla & (1 << i))
			pocet_cidel++;
	}
	
	aktualni_cas = 0;
	TCNT1 = 0;
	zapis = 1;
	if (adresa_hlavicky == 0)
	{
		
		for (uint16_t i = 0 ; ; i++)
		{
			aktualni = (EEPROM_read(i*8)<<8) + EEPROM_read(i*8+1);//aktualni cislo zaznamu
			if (i == 0)//kvůli prvnímu cyklu, kde se může splnit následující podmínka jen pro 0xFFFF
				posledni = aktualni - 1;
			if (aktualni == 0xFFFF || posledni != (aktualni - 1))
			{
				adresa_hlavicky = i*8;
				break;
			}				
			posledni = aktualni;
		}
	}
	else
	{
		adresa_hlavicky += 8;
	}
	if (adresa_hlavicky == 0)
		adresa_zaznamu = 2048;
	else
	{
		aktualni = EEPROM_read(adresa_hlavicky-4)>>4;//aktualni pouzito pro nacteni počtu čidel předcházejícího záznamu
		for (uint8_t i = 0; i < 4; i++)
			if (aktualni & (1<<i))
				pocet_cidel_predchazejici++;
		adresa_zaznamu = (EEPROM_read(adresa_hlavicky-6)<<8) + EEPROM_read(adresa_hlavicky-5) + ((EEPROM_read(adresa_hlavicky-2)<<8) + EEPROM_read(adresa_hlavicky-1))*pocet_cidel_predchazejici*2;//adresa záznamu předchozího + délka
	}		
	
	if (adresa_hlavicky >= (2048-8) || adresa_zaznamu >= 0xFFFC)
	{
		zapis = 0;
		sei();
		return 1;	
	}		
	posledni = (EEPROM_read(0xFFFE) << 8 ) + EEPROM_read(0xFFFF) + 1;//poslední je využito pro číslo záznamu
	EEPROM_write(0xFFFE,posledni>>8);		//aktualizace čísla záznamu H (+1)
	EEPROM_write(0xFFFF,posledni);			//aktualizace čísla záznamu L (+1)
	
	EEPROM_write(adresa_hlavicky  , posledni>>8);	//číslo záznamu H
	EEPROM_write(adresa_hlavicky+1, posledni);		//číslo záznamu L
	EEPROM_write(adresa_hlavicky+2, adresa_zaznamu>>8);	//ukazatel do paměti H
	EEPROM_write(adresa_hlavicky+3, adresa_zaznamu);		//ukazatel do paměti L
	EEPROM_write(adresa_hlavicky+4, (cidla<<4)+interval);	//počet čidel + interval
	EEPROM_write(adresa_hlavicky+5, typy_cidel);		//Pt / Ni
	EEPROM_write(adresa_hlavicky+6, 0);					//délka záznamu H
	EEPROM_write(adresa_hlavicky+7, 0);					//délka záznamu L
	
	/*LCD_gotoXY(0,0);
	LCD_writeNumber((EEPROM_read(adresa_hlavicky+2)<<8)+EEPROM_read(adresa_hlavicky+3));*/

	
	delka_zaznamu = 0;
	sei();
	return 0;
}
void hl_obraz(void)
{
		
	LCD_gotoXY(8,1);
	LCD_writeString_F("T1:");
	LCD_gotoXY(8,2);
	LCD_writeString_F("T2:");
	LCD_gotoXY(8,3);
	LCD_writeString_F("T3:");
	LCD_gotoXY(8,4);
	LCD_writeString_F("T4:");
	LCD_gotoXY(8,5);
	LCD_writeString_F("cas:");
	switch (interval%5)
	{
		case 0:
			LCD_writeString_F("1");
			break;
		case 1:
			LCD_writeString_F("2");
			break;
		case 2:
			LCD_writeString_F("5");
			break;
		case 3:
			LCD_writeString_F("10");
			break;
		case 4:
			LCD_writeString_F("30");
			break;
	}
	if (interval <= 4)
	{
		LCD_writeString_F("s  ");
	}
	else
	{
		LCD_writeString_F("min");
	}
}
void zobraz_data(uint16_t poradi)
{
	create_menu(18,50,"","Storno");
	create_frame();
	LCD_gotoXY(2,0);
	LCD_writeNumber(poradi+1);
	LCD_writeString_F("/");
	LCD_writeNumber(pocet_zaznamu);
	
	poradi *= 8;
	uint16_t nazev = (EEPROM_read(poradi)<<8) + EEPROM_read(poradi+1);
	uint8_t cidla_interval = EEPROM_read(poradi + 4);
	uint8_t Pt_Ni = EEPROM_read(poradi + 5);
	uint16_t delka = (EEPROM_read(poradi + 6) << 8) + EEPROM_read(poradi + 7);
	//-------------------------------------------------
	LCD_gotoXY(7,1);

	for (uint8_t i = 4; i < 8; i++)
	{
		if (cidla_interval & (1 << i))
			LCD_writeString_F(" + ");
		else
			LCD_writeString_F(" * ");
	}
	//-------------------------------------------------
	LCD_gotoXY(11,2);
	for (uint8_t i = 0; i < 4; i++)
	{
		if (Pt_Ni & (1 << i))
			LCD_writeString_F("Ni ");
		else
			LCD_writeString_F("Pt ");
	}
	//-----------------------------------------------------
	LCD_gotoXY(2,3);
	LCD_writeString_F("i.d.:");
	LCD_writeNumber(nazev);
	//-----------------------------------------------------
	LCD_gotoXY(2,4);
	LCD_writeString_F("int:");
	switch ((cidla_interval & 0x0F)%5)
	{
		case 0:
			LCD_writeString_F("1");
			break;
		case 1:
			LCD_writeString_F("2");
			break;
		case 2:
			LCD_writeString_F("5");
			break;
		case 3:
			LCD_writeString_F("10");
			break;
		case 4:
			LCD_writeString_F("30");
			break;
	}
	if (interval <= 4)
	{
		LCD_writeString_F("s  ");
	}
	else
	{
		LCD_writeString_F("min");
	}
	//----------------------------------------
	LCD_gotoXY(2,5);
	LCD_writeString_F("vzorku:");
	LCD_writeNumber(delka);
}
void inline hl_menu(void)
{
	create_menu(18,50,"Ok","Storno");
	LCD_gotoXY(1,1);
	LCD_writeString_F("\\Zaznamenavat");
	LCD_gotoXY(8,2);
	LCD_writeString_F("Pocet cidel");
	LCD_gotoXY(8,3);
	LCD_writeString_F("Intervaly");
	LCD_gotoXY(8,4);
	LCD_writeString_F("Typy snimacu");
	LCD_gotoXY(8,5);
	LCD_writeString_F("Sprava dat");
	Menu = 10;
}
void menuAction(uint8_t button)
{
	cli();
	switch (Menu/10)//filtrace prvního čísla
	{
	case 0 :		// hlavni obrazovka
		if (button != L)
			break;
		hl_menu();
		break;
	case 1 :	//hlavni menu
		switch (button)
		{
			case L:
				switch (Menu%10)
				{
					case 0:			//zaznamenat
						if (!(cidla&0x0F))
							break;
						if(zahajit_zaznam())
						{
							break;
						}
						LCD_gotoXY(30,0);
						create_menu(10,57,"STOP", "");
						hl_obraz();
						Menu = 60;
						break;
					case 1:			//počet čidel
						create_menu(18,50,"Ok","Zmena");
						LCD_gotoXY(1,1);
						LCD_writeString_F("\\T1 ");
						LCD_writeString_F(cidla&0x01 ? "[" : "]");
						LCD_gotoXY(8,2);
						LCD_writeString_F("T2 ");
						LCD_writeString_F(cidla&0x02 ? "[" : "]");
						LCD_gotoXY(8,3);
						LCD_writeString_F("T3 ");
						LCD_writeString_F(cidla&0x04 ? "[" : "]");
						LCD_gotoXY(8,4);
						LCD_writeString_F("T4 ");
						LCD_writeString_F(cidla&0x08 ? "[" : "]");
						Menu = 20;
						break;
					case 2:			//intervaly
						create_menu(18,50,"Ok","Storno");
						LCD_gotoXY(8,1);
						LCD_writeString_F("1s");
						LCD_gotoXY(8,2);
						LCD_writeString_F("2s");
						LCD_gotoXY(8,3);
						LCD_writeString_F("5s");
						LCD_gotoXY(8,4);
						LCD_writeString_F("10s");
						LCD_gotoXY(8,5);
						LCD_writeString_F("30s");
						
						LCD_gotoXY(50,1);
						LCD_writeString_F("1min");
						LCD_gotoXY(50,2);
						LCD_writeString_F("2min");
						LCD_gotoXY(50,3);
						LCD_writeString_F("5min");
						LCD_gotoXY(50,4);
						LCD_writeString_F("10min");
						LCD_gotoXY(50,5);
						LCD_writeString_F("30min");
						
						LCD_gotoXY(interval <= 4 ? 1 : 44, interval % 5 + 1);	
						LCD_writeString_F("\\");
						Menu = interval + 30;
						break;
					case 3:			//typy snímačů
						create_menu(18,50,"Ok","Zmena");
						LCD_gotoXY(1,1);
						LCD_writeString_F("\\T1 ");
						LCD_writeString_F(typy_cidel & 0x01 ? "Ni" : "Pt");
						LCD_gotoXY(8,2);
						LCD_writeString_F("T2 ");
						LCD_writeString_F(typy_cidel & 0x02 ? "Ni" : "Pt");
						LCD_gotoXY(8,3);
						LCD_writeString_F("T3 ");
						LCD_writeString_F(typy_cidel & 0x04 ? "Ni" : "Pt");
						LCD_gotoXY(8,4);
						LCD_writeString_F("T4 ");
						LCD_writeString_F(typy_cidel & 0x08 ? "Ni" : "Pt");
						Menu = 40;
						break;
					case 4:			//Správa dat
						for (uint16_t posledni, i = 0 ; ; i++)
						{
							pocet_zaznamu = (EEPROM_read(i*8)<<8) + EEPROM_read(i*8+1);//aktualni cislo zaznamu
							if (i == 0)//kvůli prvnímu cyklu, kde se může splnit následující podmínka jen pro 0xFFFF
								posledni = pocet_zaznamu - 1;
							if (pocet_zaznamu == 0xFFFF || posledni != (pocet_zaznamu - 1))
							{
								pocet_zaznamu = i;
								break;
							}				
							posledni = pocet_zaznamu;
						}
						if (pocet_zaznamu == 0)
							break;
						//create_menu(18,50,"","Storno");
						zobraz_data(0);		
						sprava_dat = 0;
						
						Menu = 50;				
					break;
				}
				break;
			case R:
				create_menu(10,57,"MENU", "");
				LCD_gotoXY(8,1);
				LCD_writeString_F("T1:");
				LCD_gotoXY(8,2);
				LCD_writeString_F("T2:");
				LCD_gotoXY(8,3);
				LCD_writeString_F("T3:");
				LCD_gotoXY(8,4);
				LCD_writeString_F("T4:");
				LCD_gotoXY(8,5);
				LCD_writeString_F("cas:");
				switch (interval%5)
				{
					case 0:
						LCD_writeString_F("1");
						break;
					case 1:
						LCD_writeString_F("2");
						break;
					case 2:
						LCD_writeString_F("5");
						break;
					case 3:
						LCD_writeString_F("10");
						break;
					case 4:
						LCD_writeString_F("30");
						break;
				}
				if (interval <= 4)
				{
					LCD_writeString_F("s  ");
				}
				else
				{
					LCD_writeString_F("min");
				}
				Menu = 0;
				break;
			case OK:
				LCD_gotoXY(1,Menu-9);
				LCD_writeString_F(" ");
				if (Menu != 14)
				{
					LCD_gotoXY(1,Menu-8);
					LCD_writeString_F("\\");
					Menu++;
					break;
				}					
				LCD_gotoXY(1, 1);
				LCD_writeString_F("\\");
				Menu = 10;
				break;	
		}
		break;
	case 2 :			//počet čidel
		switch (button)
		{
			case L:
				hl_menu();
				internal_EEPROM_write(0,cidla);
				break;
			case R:
				LCD_gotoXY(29, Menu%20+1);
				cidla ^= 1<<Menu%20;
				LCD_writeString_F(cidla&(1 << Menu%20) ? "[" : "]");
				break;
			case OK:
				LCD_gotoXY(1,Menu-19);
				LCD_writeString_F(" ");
				if (Menu == 23)
				{
					LCD_gotoXY(1,1);
					LCD_writeString_F("\\");
					Menu = 20;
					break;
				}
				LCD_gotoXY(1,Menu-18);
				LCD_writeString_F("\\");
				Menu++;
				break;
		}
	
		break;
	case 3 :			//intervaly
		switch(button)
		{
			case L:
				interval = Menu-30;
				internal_EEPROM_write(1,interval);
			case R:
				hl_menu();
				break;
			case OK:
				LCD_gotoXY(Menu < 35 ? 1 : 44,(Menu-30)%5+1);
				LCD_writeString_F(" ");
				if (Menu != 39)
				{
					Menu++;
					LCD_gotoXY(Menu < 35 ? 1 : 44,(Menu-30)%5+1);
					LCD_writeString_F("\\");
					break;
				}					
				LCD_gotoXY(1, 1);
				LCD_writeString_F("\\");
				Menu = 30;
			break;
		}
		break;
	case 4 :
		switch (button)
		{
			case L:
				hl_menu();
				internal_EEPROM_write(2,typy_cidel);
				break;
			case R:
				LCD_gotoXY(29, Menu%10+1);
				typy_cidel ^= 1<<Menu%10;
				LCD_writeString_F(typy_cidel&(1 << Menu%10) ? "Ni" : "Pt");
				break;
			case OK:
				LCD_gotoXY(1,Menu-39);
				LCD_writeString_F(" ");
				if (Menu == 43)
				{
					LCD_gotoXY(1,1);
					LCD_writeString_F("\\");
					Menu = 40;
					break;
				}
				LCD_gotoXY(1,Menu-38);
				LCD_writeString_F("\\");
				Menu++;
				break;
		}
		break;
	case 5:	//správa dat
		switch(button)
		{
			case L:
				break;
			case R:
				create_frame();
				create_menu(18,50,"Ok","Storno");
				hl_menu();
				Menu = 10;
			break;
			
			case OK:
				if ((++sprava_dat)>=pocet_zaznamu)
					sprava_dat = 0;
				zobraz_data(sprava_dat);
			break;
		}
		break;
		
	case 6://zápis
		if (button == L)
		{
			create_menu(10,57,"MENU", "");
			hl_obraz();
			zapis = 0;
			Menu = 0;
		}		
		break;
	}
	sei();
}
ISR (TIMER1_COMPA_vect)
{
	uint16_t hodnota;
	uint8_t zapisovat = 0;		// informace, jestli se má zapisovat
	uint8_t poradi_cidla = 0;	// pro spočítání, kam ze 1-4 míst zapisovat
		
	if (!(PIND & (1 << 6)))
	{
		uint8_t data;
		USB_mode = 0;
		while (!(PIND & (1 << 6)))
		{
			data = USB_read();
			switch (data)
			{
				case 0xAA:		//žádost o ohlášení
					USB_mode = 1;	
				break;
				
				case 0xF0:		//žádost o tabulku záznamů
					USB_mode = 2;
					return;
				break;
				
				case 0x0F:		//žádost o záznam
					USB_mode = 3;
					return;
				break;
				
				case 0x77:		//Smazat paměť
					USB_mode = 4;
					return;
				break;
				
				default:
					USB_mode = 0;
				break;
			}
		}
		if (USB_mode)
		{
			USB_send(0x55);
			return;			
		}			
	}	
	else
		USB_mode = 0;
	
	
	if (zapis)
	{
		if (aktualni_cas == 0)
			zapisovat = 1;
		aktualni_cas++;
		
		if (interval == 0 && aktualni_cas != 1)
			goto pokracovat	;
		else if (interval == 1 && aktualni_cas != 2)
			goto pokracovat	;
		else if (interval == 2 && aktualni_cas != 5)
			goto pokracovat	;
		else if (interval == 3 && aktualni_cas != 10)
			goto pokracovat	;
		else if (interval == 4 && aktualni_cas != 30)
			goto pokracovat	;
		else if (interval == 5 && aktualni_cas != 60)
			goto pokracovat	;
		else if (interval == 6 && aktualni_cas != 120)
			goto pokracovat	;
		else if (interval == 7 && aktualni_cas != 300)
			goto pokracovat	;
		else if (interval == 8 && aktualni_cas != 600)
			goto pokracovat	;
		else if (interval == 9 && aktualni_cas != 1800)
			goto pokracovat	;
		aktualni_cas = 0;
	}
pokracovat:	if(Menu == 0 || Menu == 60)
	{
		
		for (uint8_t i = 0; i < 4; i++)
		{
			if (adresa_zaznamu+delka_zaznamu*pocet_cidel*2 > 0xFFFC)
				menuAction(L);
			if (cidla & (1 << i))
			{
				hodnota = (ADC_read(i)-0x8000)>>3;
				if (zapisovat)
				{
					EEPROM_write(adresa_zaznamu+delka_zaznamu*pocet_cidel*2+poradi_cidla*2,hodnota>>8);
					EEPROM_write(adresa_zaznamu+delka_zaznamu*pocet_cidel*2+poradi_cidla*2+1,hodnota);
					poradi_cidla++;
					if (poradi_cidla == pocet_cidel )
					{
						EEPROM_write(adresa_hlavicky+6,(++delka_zaznamu)>>8);
						EEPROM_write(adresa_hlavicky+7,delka_zaznamu);
						LCD_gotoXY(68,7);
						LCD_writeString_F(delka_zaznamu%2?"*":"+");
						zapisovat = 0;
					}
						
				}
				LCD_gotoXY(30,i+1);
				if (hodnota/45-60 > 150)
				{
					LCD_writeString_F("        ");
					continue;
				}					
				if (typy_cidel & (1 << i))
					LCD_writeNumber(hodnota/45-60);//Ni	dopsat!!!!!!!!!!
				else
					LCD_writeNumber(hodnota/45-60);//Pt
				LCD_writeString_F("\x60");
				LCD_writeString_F("C  ");
			}
			else
			{
				LCD_gotoXY(30,i+1);
				LCD_writeString_F("N/A");
			}				
		}			
	}
}
void nacteni_promennych(void)
{
	cidla = internal_EEPROM_read(0);
	interval = internal_EEPROM_read(1);
	typy_cidel = internal_EEPROM_read(2);
	adresa_hlavicky = 0;
	zapis = 0;
	USB_mode = 0;
	tlacitka = 0x00;	//1___L | 2___P | 4___Ok
	Menu = 0;
}
int main(void)
{
	_delay_ms(100);
	PORTs_init();
	TWI_init();
	LCD_init();
	nacteni_promennych();

	TCCR1B = (1<<WGM12)|(1<<CS12);		// předdělička /256, čítat do OCR1A
	TIMSK = 1<<OCIE1A;					//ocie1A povolení přerušení od OCR1A
	OCR1A = 62500;						//číslo, do kterého počítá čítač
	sei();								//povolit globální přerušení
	
	create_frame();	
	create_menu(10,57,"MENU", "");
	hl_obraz();
	
    while(1)
    {
		if (!(PINB&0x20)&&(!(tlacitka&0x01)))	//Left_click
		{
			tlacitka |= 0x01;
			menuAction(1);
			_delay_ms(30);
		}
		else if (PINB&0x20)
		{
			tlacitka &= ~0x01;
			_delay_ms(30);
		}			
			
			
		if (!(PINB&0x40)&&(!(tlacitka&0x02)))	//Right_click
		{
			tlacitka |= 0x02;	
			menuAction(2);
			_delay_ms(30);
		}
		else if (PINB&0x40)
		{
			tlacitka &= ~0x02;
			_delay_ms(30);
		}			
			

		if (!(PINB&0x80)&&(!(tlacitka&0x04)))	//Ok_click
		{
			tlacitka |= 0x04;
			menuAction(3);
			_delay_ms(30);
		}
		else if (PINB&0x80)
		{
			tlacitka &= ~0x04;
			_delay_ms(30);
		}		
		
		
		if (!(PIND & (1 << 6)))
		{
			uint8_t data = USB_read();
			if (data == 0xAA)// 0xAA = žádost o ohlášení
			{
				if (zapis)
				{
					USB_send(0xAA);	//nemám čas
				}
				else
				{
					USB_send(0x55);	//potvrzení USB módu
					USB_mode = 1;
					TCNT1 = 0;		//vynulování čítače
					create_menu(10,10,"","");
					LCD_gotoXY(15,3);
					LCD_writeString_F("USB mode");
					while(USB_mode)
					{
						_delay_ms(3);
						switch (USB_mode)
						{
							case 1://udržování spojení
								continue;
							break;
							case 2://žádost o tabulku
								cli();
								USB_send(0x00);//-----------------------------------------------------------
								for (uint16_t posledni, i = 0 ; ; i++)
								{
									pocet_zaznamu = (EEPROM_read(i*8)<<8) + EEPROM_read(i*8+1);//aktualni cislo zaznamu
									if (i == 0)//kvůli prvnímu cyklu, kde se může splnit následující podmínka jen pro 0xFFFF
										posledni = pocet_zaznamu - 1;
									if (pocet_zaznamu == 0xFFFF || posledni != (pocet_zaznamu - 1))
									{
										pocet_zaznamu = i;
										break;
									}				
									posledni = pocet_zaznamu;
								}
								//--------------------------------------------------------------------------------
								for (uint16_t i = 0; i < pocet_zaznamu; i++)
								{
									USB_send(EEPROM_read(i*8));
									USB_send(EEPROM_read(i*8+1));
									USB_send(EEPROM_read(i*8+4));
									USB_send(EEPROM_read(i*8+5));
									USB_send(EEPROM_read(i*8+6));
									USB_send(EEPROM_read(i*8+7));
								}
								USB_send(0xFF);
								USB_mode = 1;
								TCNT1 = 0;
								sei();
							break;
							case 3://žádost o záznam
								cli();
								uint16_t id, delka;
								uint8_t pocet;
								while (PIND & (1 << 6));			//čtení id
									id = ((uint16_t)USB_read())<<8;
								while (PIND & (1 << 6));
									id += USB_read();								
								for (uint16_t i = 0; i < 255 ; i++)
								{
									if ((EEPROM_read(i*8) == ((uint8_t)(id>>8))) && (EEPROM_read(i*8+1) == (uint8_t)id))
									{
										id = ((uint16_t)EEPROM_read(i*8+2))<<8;			//čtení adresy
										id += EEPROM_read(i*8+3);
										pocet = EEPROM_read(i*8+4) & 0xF0;				//načtení počtu čidel
										delka = ((uint16_t)EEPROM_read(i*8+6))<<8;		//čtení délky
										delka += EEPROM_read(i*8+7);
										break;
									}
								}
								for (uint8_t i = 4; i < 8 ;i++)
								{
									if (pocet & (1 << i))
										pocet++;
								}
								pocet &= 0x0F;
								
								
								delka = delka * 2 * pocet;
								USB_send(0x00);//-----------------------------------------------------------
								for (uint16_t i = 0; i < delka; i++)
								{
									USB_send(EEPROM_read(id+i));
								}	
								USB_send(0xFF);
								USB_mode = 1;
								TCNT1 = 0;
								sei();
							break;
								
							case 4://smazat paměť
								cli();
								USB_send(0x55);
								_delay_ms(100);
								if (PIND & (1 << 6))
								{
									sei();
									USB_mode = 1;
									break;
								}
								if (USB_read() == 0xEE)
								{
									USB_send(0xAA);
									EEPROM_write(0,0xFF);
									EEPROM_write(1,0xFF);
									adresa_hlavicky = 0;
									USB_mode = 1;
									TCNT1 = 0;
									sei();
								}
								
							break;
						}
					}
					Menu = 0;
					create_menu(10,57,"MENU", "");
					hl_obraz();
				}
			}
		}	
	}			

}