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


unsigned char data_rec;			// premenná, do ktorej sa ukladajú prijaté dáta (po zachytení adresy)
unsigned char gencall;			// premenná, do ktorej sa ukladajú prijaté dáta (po zachytení všeobecného volania)

unsigned char gencall3;			// obsah dát, ktoré odosiela riadiaca doska pri 	
unsigned char gencall0;			// všeobecnom volaní (záleží na hodnote nack)
unsigned char gencall1;
unsigned char gencall2;


unsigned char adresa ;			// hodnota adresy, ktorá sa aktuálne priraďuje (počiatočná hodnota 1)
unsigned char adresadek;		// hodnota poslednej priadenej adresy

extern unsigned char ch,k;		// pomocné premenné
unsigned char i,j;				// premenné určujúce index v poli dosky, pri procese priraďovania adries
unsigned char nack;				// počet nepotvrdených dosiek, počiatočná hodnota 1
unsigned char dosky [8][8];		// pole, ktorého sa zapisujú adresy a poloha dosiek v zoskupení

unsigned char setD;				// dáta, ktoré posiela riadiaca doska pri procese prideľovania adries
unsigned char setL;				// podľa hodnoty premennej nack 
unsigned char setU;
unsigned char setR;

extern unsigned char master;   	// premenná, ktorá určuje status dosky : 0->podriadená, 1->riadiaca		

unsigned char init;				// štartovacia adresa pre podriadené dosky 

unsigned char status_write;		// výstupná hodnota funkcie odosielanie (určuje či adresovaná doska rozoznala svoju adresu)
unsigned char kont;				// pomocná premenná, zapíše sa do nej oddelený kód pinu
unsigned char init_end;			// premenná určuje či sa proces pridelovania adries už skončil(1) alebo nie (0)
extern unsigned char offset;	// parameter svetelného efektu, časový offset
extern unsigned char data_slave;// premenná, ktorú podriadená doska odosiela riadiacej, určuje či a kde vznikol svetelných efekt 
unsigned char offset1;			// premenná určuje hodnotu offset (v rámci odoslané bytu sa nachádza vo vyššom nibli, preto bitový posun)


void twi_init (void);			// funkcia, ktorá riadi proces prideľovania adries
unsigned char twi_start_address(unsigned char slave,unsigned char rw);	// funkcia na odosielanie adresy a R/W bitu
void twi_write(unsigned char data );	// funkcia na odoslanie dát
void twi_stop( void );			// vyšle na zbernicu ukončovací signál
unsigned char twi_read (void);	// funkcia uloží prijaté dáta

void delay (void);				// funkcia zdržania (prázdny cyklus)
void pin_init(void);			// funkcia na určenie statusu dosky
void registry_master(void);		// nastavenie registrov pre riadiacu dosku
void registry_slave(void);		// nastavenie registrov pore podriadenú dosku


void gen (unsigned char gencall);	// funkcia na analýzu dát prijatých po všeobecnom volaní
void data_receive (unsigned char data_rec);	// funkcia na analýzu dát prijatých po rozoznaní adresy dosky
void set_parameters	(unsigned char max1,unsigned char offset);	// funkcia zapíše parametre efektu do pola fronta
void twi_zapis (unsigned char adresa, unsigned char data);	// odoslanie adresy a dát
void dosky_switch (unsigned char receive, unsigned char index1, unsigned char index2);	//zariadi poslanie informácii o reakciu pre susedné dosky

ISR (TWI_vect);					// obsluha prerušenia po činnosti na zbernici
