#include <stdlib.h>

#include "inttypes.h"
#include "led.h"
#include "lcd.h"


#include "startup/general.h"
#include "startup/printf_P.h"
#include "startup/ea_init.h"
#include "startup/lpc2xxx.h" //definicje
#include "startup/consol.h"
#include "startup/config.h"

#include "pff2/src/pff.h"

#include "functions.h"

#include "wave.h"

#include "dac.h"

#include "adc.h"

#include "timer.h"

#include <string.h>

static void hang(void){
	initLed(4);
	while(1){
		turnOnLed(4);
		delayT(0x100000);
		turnOffLed(4);
		delayT(0x100000);
	}
}

void delayS (void)  {                   //definicja funkcji opóźniającej
  uint32 i;   //deklaracja zmiennej, która posłuży jako licznik petli
  for(i = 0; i <= 0x100000; i++){};                //opóznienie czasowe
}



FATFS fatfs;			/* File system object */
DIR dir;				/* Directory object */
FILINFO fno;			/* File information object */
DWORD rc;



int main (void) {
	eaInit();   //initialize printf

	srand(102); //inicjalizacja generatora liczb losowy, liczba startowa
				//uzyskana losowo od mojej siostry ;)

	printf("*******************************************************\n");
	printf("*                                                     *\n");
	printf("* EmPeCzy                                             *\n");
	printf("*                                                     *\n");
	printf("*******************************************************\n");


	//ustawimy nasz ekran
	lcdInit();
	lcdColor(0xff,0x00);//białe tło, czarny tekst
	lcdClrscr();

	//init DAC
	initDac();

	//init ADC
	initAdc();

	//init LED
	initLeds();

	//init accel
	initAccel();

	printf("\nMontuje wolumin.\n");
	rc = pf_mount(&fatfs);
	if (rc){
		printf("blad po mount %x \n", rc);
		if( FR_DISK_ERR == rc || FR_NOT_READY == rc ){
			lcdGotoxy(0,0);
			lcdPuts("BLAD INTERFEJSU");
			printf("Blad interfejsu");
		}else if( FR_NO_FILESYSTEM == rc ){
			lcdGotoxy(0,0);;
			lcdPuts("BLAD SYSTEMU_PL");
			printf("Nieprawidlowy system plikow na karcie pamieci");
		}
		hang();
	}


	rc = listDir("/", TRUE); //pokaż dokładną zawartość karty
	if (rc){
		printf("listDir, rc=%x\n", rc);
	}

	char pliki[256 * 12];

	uint32 filesCount = filesList("/", pliki) ; // stwórz liste plików
	if( filesCount == 0){
		printf("fileList => brak plikow, lub nie mozna ich odczytac");
		hang();
	}

	printf("Liczba plikow WAV: %d\n", filesCount);

	int32 i = 0;

	PlayerStatus status;
	status = Player_Stoped;

	TimerStatus timerStatus;
	timerStatus = Timer_UP;

	char nazwa[12];

	strncpy(nazwa, &pliki[i*12],12);
	printf("Aktualny plik: %s\n", nazwa);
	lcdGotoxy(0,0);
	lcdPuts(nazwa);

	lcdGotoxy(15*8,0);
	lcdPuts("#");
	while(1){ //główna pętla programu
		updateStatus( &status, &timerStatus, TRUE ); //sprawdź przyciski
		if( i < 0 )
			i = filesCount - 1;
		if( i >= filesCount )
			i = 0;

		if( status == Player_Next ){
			printf("nastepny\n");
			status = Player_Stoped;
			i++;
			strncpy(nazwa, &pliki[(i%filesCount)*12],12);
			printf("Aktualny plik: %s\n", nazwa);
			lcdGotoxy(0,0);
			lcdPuts(nazwa);
			lcdGotoxy(12*8,0);
			lcdPuts(" ");
			continue;
		}

		if( status == Player_Prev ){
			printf("poprzedni\n");
			status = Player_Stoped;
			i--;
			strncpy(nazwa, &pliki[(i%filesCount)*12],12);
			printf("Aktualny plik: %s\n", nazwa);
			lcdGotoxy(0,0);
			lcdPuts(nazwa);
			lcdGotoxy(12*8,0);
			lcdPuts(" ");
			continue;
		}

		if( status == Player_Random ){ //potrząśnięto akcelerometrem
			printf("losowy");
			status = Player_Playing;
			i = rand() % filesCount;
			strncpy(nazwa, &pliki[(i%filesCount)*12],12);
			printf("Aktualny plik: %s\n", nazwa);
			lcdGotoxy(0,0);
			lcdPuts(nazwa);
			lcdGotoxy(12*8,0);
			lcdPuts(" ");
			//continue;
		}

		if( status == Player_Playing ){ //wciśnięto przycisk play

			lcdRect(0,32,9*8,16, 0xff); //wyczyść miejsce gdze pokazywany czas
			lcdGotoxy(15*8,0);
			lcdPuts(">"); //umieść symbol w prawym górnym rogu

			strncpy(nazwa, &pliki[i*12],12);

			lcdGotoxy(0,0);
			lcdPuts(nazwa); //pokaż nazwe odtwarzanego pliku

			printf("\nOtwieram plik: %s.\n", nazwa);
			rc = pf_open(nazwa);
			if (rc){
				lcdPuts("NIE MOGE OTWORZYC");
				printf("nie moge otworzyc pliku (%s),", nazwa);
				printf(" rc=%x\n", rc);
				if( FR_NO_FILE == rc )
					printf("nie ma takiego pliku\n");
				if( FR_NOT_ENABLED == rc )
					printf("problem z systemem plikow\n");
				hang();
			}


			if( playerInit() ){ //inicjacja nagłówków wave

				if( playWave( &status, &timerStatus ) ) //odtwarzamy
					i++; //gdy zakończone naturalnie, przeskocz do następnego

				lcdRect(0,32,9*8,16, 0xff);
				lcdGotoxy(15*8,0);
				lcdPuts("#");
			}else{
				printf("Nie udalo sie zainicjowac pliku\n");
				status = Player_Stoped;
				lcdGotoxy(15*8,0);
				lcdPuts("X");
			}
		}

	}

	//tutaj nie ma prawa nigdy dojść, ale w razie czego trzeba zadbać o parę
	//rzeczy, dlak dla spokojnego ducha.

	//odmontuj system plików
	printf("\nodmontuj system plikow\n");
	rc = pf_mount(0);
	if( rc )
		printf("jakis blad przy odmontowywaniu, rc=%x\n");

	initLed(1);

  while(1) { //pętla nieskończona, mrugaj dioda P1.17
	  turnOnLed(1);
	  zegarek(2000000);
	  //delayS();

	  turnOffLed(1);
	  zegarek(2000000);
	  //delayS();
  }
}
