#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "delay.h"
#include "kostka.h"
#include "vizualizace.h"

//Globální proměnné
char Img[CUBE_ORDER][CUBE_ORDER];	//aktualni zobrazovany obrazek


unsigned char currentX = 0; 		//aktualni osmice v ose X
unsigned char currentY = 0; 		//aktualni osmice v ose Y
unsigned char currentImg = 0; 		//index aktualniho obrazeku
unsigned char currentViz = 0;		//index aktualni vizualizace
unsigned char zmena = 0;

char time = 0;
//----------------------------------------------------------------------


//Změna obrázku
void changeImg(char refresh) {
	char i;
	char *pImg = &Img[0][0];

	while(1) {
		if (time == 0 || refresh) {
			//nacteni obrazku z Flash do RAM
			time = pgm_read_byte((char*) (Data[currentViz][2] + currentImg));
			if (time != 0) {
				for (i = 0; i < 64; i++) {
					*pImg = pgm_read_byte(Data[currentViz][1] + 64*currentImg + i);
					pImg++;
				}
			}
			if (currentImg > Data[currentViz][0] - 2) {
				currentImg = 0;
			} else {
				currentImg++;
			}
		}
		if (time != 0) {
			time --;
			return;
		}
	}
}
//----------------------------------------------------------------------



//refresh obrázku
ISR(TIMER0_COMP_vect) {
	KOSTKA_PORT_A = 0x00;
	delay_us(10);				//čekej 10us
	KOSTKA_PORT_B = ~(1<<currentY);
	delay_us(10);				//čekej 10us
	KOSTKA_PORT_C = ~(1<<currentX);
	delay_us(10);				//čekej 10us
	
	KOSTKA_PORT_A = Img[currentY][currentX];

//výběr další osmice LED
	if (++currentX > 7) {
		currentX = 0;
		if (++currentY > 7) {
			currentY = 0;
			zmena = 1;
		}
	}
}
//-------------------------------------------------------------------



//Funkce main
int main(void) {
	char state = 0;	//V jakém stavu je kostka: 0 = zobrazeni cisla, 1 = zobrazena vizualizace

//port C jsou sloupce 1 (vždy jeden pin), spínání v nule
//port B jsou sloupce 2 (vždy jeden pin), spínání v nule
//port A jsou vrstvy - (lib. počet pinů), spínání v jedné

	KOSTKA_DDR_A = 0xff;
	KOSTKA_PORT_A = 0x00;

	KOSTKA_DDR_B = 0xff;
	KOSTKA_PORT_B = 0xff;

	KOSTKA_DDR_C = 0xff;
	KOSTKA_PORT_C = 0xff;


	TIMSK |= (1 << OCIE0);
	TCCR0 = (1<<WGM01)|(1<<WGM01)|(1 << CS02)|(0 << CS01)|(0 << CS00);
	OCR0 = REG_OCR0(256);	//256 je hodnota předdělička čítače/časovače 0

	sei();
	while(1) {
	//zmena obrazku
		if (zmena) {
			zmena = 0;
			changeImg(0);
		}

	//tlacitko NEXT
		if (state == 0) {
			if (bit_is_clear(TLAC_PIN, TLAC_START)) {
				//cekej 1ms
				delay_us(1000);
				if (bit_is_clear(TLAC_PIN, TLAC_START)) {
					if ((currentViz + 2) > VIZ_COUNT) {
						currentViz = 0;
					} else {
						currentViz++;
					}
					currentImg = 0;
					changeImg(1);
				}
				//cekani dokud je tlacitko zmackle
				while (bit_is_clear(TLAC_PIN, TLAC_START));
				//cekej 1ms
				delay_us(1000);
			}
		}

	//tlacitko PREV
		if (state == 0) {
			if (bit_is_clear(TLAC_PIN, TLAC_PREV)) {
				//cekej 1ms
				delay_us(1000);
				if (bit_is_clear(TLAC_PIN, TLAC_PREV)) {
					if (currentViz == 0) {
						currentViz = VIZ_COUNT - 1;
					} else {
						currentViz--;
					}
					currentImg = 0;
					changeImg(1);
				}
				//cekani dokud je tlacitko zmackle
				while (bit_is_clear(TLAC_PIN, TLAC_PREV));
				//cekej 1ms
				delay_us(1000);
			}
		}

	//Tlacitko START/STOP
		if (bit_is_clear(TLAC_PIN, TLAC_NEXT)) {
			delay_us(1000);
			if (bit_is_clear(TLAC_PIN, TLAC_NEXT)) {
				if (state == 0) {
					state = 1;
					currentViz += NUM_COUNT;
				} else {
					state = 0;
					currentViz -= NUM_COUNT;
				}
				currentImg = 0;
				changeImg(1);
			}
			//cekani dokud je tlacitko zmackle
			while (bit_is_clear(TLAC_PIN, TLAC_NEXT));
			//cekej 1ms
			delay_us(1000);
		}
	}
}
