/*
 * tester_slave.c
 *
 * Created: 13.4.2016 12:06:47
 *  Author: tomino
 */ 


#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include "TWI_slave.h"
#include "testy_slave.h"


uint8_t mod=0, adresa_moje=102, *p_data;
uint8_t data[408];

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


void vymaz_pamet (void)
{
	uint8_t i=0;
	//vymaze vnitrni pamet pri restartu pristroje
	for (i=0;i<204;i++)
	{
		data[2*i]=0;
		data[2*i+1]=0;
	}
	
}



/**********************************************************************************
								VEKTORY PRERUSENI
**********************************************************************************/

ISR(USI_START_vect)
{
	uint8_t co_delat=0, instrukce=0, adresa=0;
	co_delat=checkuj_adresu();
	switch (co_delat)
	{
		case 1:		//soukroma adresa cteni z CMT
		{
			adresa = precti_instrukci();			//nacte pozici v pameti kam se maji data ulozit
			instrukce = precti_instrukci();			//precte numerickou hodnotu dat nebo instrukce
			if (data[3*(adresa)+1] == 0) data[3*(adresa)+1]=instrukce;		//ulozi na prvni pozici kdyz je volna
			else data[3*(adresa)+2]=instrukce;							//uklada na druhou pozici
		}
		break;
		case 2:									//doptavani se na vysledky
			adresa = precti_instrukci();
			p_data = &data[0];
			instrukce = test_soukromy(p_data, adresa);
			odesli_odpoved(instrukce);
		break;
		case 3:									//zapis instrukce
		{
			
			adresa=precti_instrukci();
			switch (adresa)
			{
			case 254:
				vymaz_pamet();
				break;
			default:
				break;
			}
			break;
		}
		case 4:									//ptani se na vysledky
			adresa=precti_instrukci();
			p_data = &data[0];
			instrukce = test_verejny(p_data, adresa);
			if (instrukce != 25) odesli_odpoved(instrukce);
			break;
	}
	USICR=0b10101000;
	USISR=0b11110000;
}


/******************************************************************************************************
										HLAVNÍ SMYÈKA PROGRAMU
******************************************************************************************************/

int main(void)
{
	zapniTWI_slave(adresa_moje);
	vymaz_pamet();
	p_data = &data[0];
    sei();
	
	while(1)
    {
       //proste ceka na preruseni
    }
}