/*
 * main.c
 *
 *  Created on: 14-12-2012
 *      Author: Mirosław Kardaś
 */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>
#include <util/delay.h>

#include "LCD/lcd44780.h"
#include "IR_UNI/ir_config.h"
#include "MK_USART/mkuart.h"

#include "SNAKE/snake.h"
#include "ekrany.h"
#include "menu.h"


void snake_ir_keys(uint8_t adr, uint8_t cmd, uint8_t key_time);
void menu_ir_keys(uint8_t adr, uint8_t cmd, uint8_t key_time);
void uart_keys(void);


// timery programowe
volatile uint16_t Timer1;

uint8_t game_on;


// ------------ główna funkcja programu - main() -------------------------------
int main(void) {



	DDRA |= (1<<PA7);
	PORTA |= (1<<PA7);

	/* Timer2 – konfigurcajca silnika timerów programowych */
	TCCR2 	|= (1<<WGM21);			// tryb pracy CTC
	TCCR2 	|= (1<<CS22)|(1<<CS21)|(1<<CS20);	// preskaler = 1024
	OCR2 	= 78;			// przerwanie porównania co 10ms (100Hz)
	TIMSK 	= (1<<OCIE2);	// Odblokowanie przerwania CompareMatch

	//rejestracja własnej funkcji do analizy ramek IR z pilota
	register_ir_event_callback( snake_ir_keys );

	check_and_load_defaults();

	USART_Init(__UBRR);

	ir_init();				// inicjalizacja podczerwieni
	lcd_init();				// inicjalizacja lcd

	register_start_screen_callback( display_init );

	register_end_screen_callback( ekran_koncowy );

	snake_init( ram_cfg.users_cnt );	// inicjalizacja węży

	sei();					// globalne zezwolenie na przerwania

	game_on = 1;

	//*********** pętla główna programu
	while(1) {

		IR_EVENT();



		if( !game_on ) {
			register_ir_event_callback( menu_ir_keys );	// podmiania obsługi IR na klawisze MENU
			main_menu();								// wywołanie MENU
			snake_init( ram_cfg.users_cnt );			// inicjalizacja węży
			game_on = 1;								// powrót do gry
			register_ir_event_callback( snake_ir_keys );	// przywrócenie obsługi klawiszy węży
		}

		if( game_on && !Timer1 ) {

			uart_keys();

			if( snakes(0)->draw_snake_fun ) snakes(0)->draw_snake_fun( snakes(0) );

			if(  snakes(1) && snakes(1)->draw_snake_fun ) snakes(1)->draw_snake_fun( snakes(1) );

			Timer1 = snakes(0)->speed;
		}

	}
}


void uart_keys(void) {

	uint8_t znak = uart_getc() & 0xdf;

	if( znak == 'A' ) 	snakes(0)->direction = left;
	if( znak == 'D' ) 	snakes(0)->direction = right;
	if( znak == 'W' )  	snakes(0)->direction = up;
	if( znak == 'S' )  	snakes(0)->direction = down;

}


// własna funkcja do obsługi klawiszy SNAKE IR
void snake_ir_keys(uint8_t adr, uint8_t cmd, uint8_t key_time) {

	if( command == snakes(0)->keys[left] ) 			snakes(0)->direction = left;
	else if( command == snakes(0)->keys[right] ) 	snakes(0)->direction = right;
	else if( command == snakes(0)->keys[up] ) 		snakes(0)->direction = up;
	else if( command == snakes(0)->keys[down] ) 	snakes(0)->direction = down;
	else if( command == 59 ) restart = 1;

	if( snakes(1) && command == snakes(1)->keys[left] ) 		snakes(1)->direction = left;
	else if( snakes(1) && command == snakes(1)->keys[right] ) 	snakes(1)->direction = right;
	else if( snakes(1) && command == snakes(1)->keys[up] ) 		snakes(1)->direction = up;
	else if( snakes(1) && command == snakes(1)->keys[down] ) 	snakes(1)->direction = down;

	if( command == MENU && key_time == 0 ) {
		game_on = 0;
		restart = 1;
	}

}

// własna funkcja do obsługi klawiszy MENU IR
void menu_ir_keys(uint8_t adr, uint8_t cmd, uint8_t key_time) {

	if( command == MENU && key_time == 0 ) menu_break=1;

	if( key_time == 0 ) ir_key = command;

}



//*** przerwanie Timer2 CompareM
ISR(TIMER2_COMP_vect) {

	uint16_t n;

	n = Timer1;		/* 100Hz Timer1 */
	if (n) Timer1 = --n;

}
