/*
Az eredeti ex_fat.c átalakított verziója.
A behelyezett SD kártya tartalma legyen egy "szgep.txt" file, 
amibe tetszőleges (jelenleg max 255 karakter hosszú) szöveget írtunk.
Legyen egy torol.txt; ezt simán le fogjuk törölni.
A picben szgep.txt tartalmát a mybuffer[255]-be másoljuk, majd a létrehozott
/picdir/dirfile.txt-be írjuk.
Nekem csak akkor működnek a funkciók, ha a kártyát WinHex programban feltöltöm 00-val,
aztán a picben formázom a saját funkciójával (FAT32, 512byte). Így a Windows7 zokszó nélkül ír-olvas rajta,
aztán a pic is helyesen kezeli (Régi 128MB Kingston SD kártya). 
Számomra rendszertelennek tűnő módon olykor "megmakacsolja magát", és nem tudja 
bezárni a fájlt, esetleg olyasmit hoz létre amit a Windows letörölni sem tud,
nemhogy megnyitni. Ilyenkor az újraformázás után megint jó minden.
*/


#include <18F4550.h>
#device PASS_STRINGS = IN_RAM
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL5,CPUDIV1,NOBROWNOUT   //20MHz kvarc
#use delay(clock=48M)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B3, errors)
#include <stdlib.h> 
#use fast_io (all)
#define MMCSD_PIN_SCL     PIN_B1 //o
#define MMCSD_PIN_SDI     PIN_B0 //i
#define MMCSD_PIN_SDO     PIN_C7 //o
#define MMCSD_PIN_SELECT  PIN_D4 //o
#include <mmcsd.c>
#include <fat.c>


int mybuffer[255];

/*
Summary: Deletes a file.
Param: The full path of the file to delete.
Returns: None.
*/
void DeleteFile(char *fileName)
{
   printf("\r\nDeleting '%s': ",fileName);
   if(rm_file(fileName)!=GOODEC)
   {
      printf("Error deleting file");
      return;
   }
   printf("OK");
}

/*
Summary: Creates a file.
Param: The full path of the file to create.
Returns: None.
Example Usage: \> make "Log.txt"
*/
void MakeFile(char *fileName)
{
   printf("\r\nMaking file '%s': ",fileName);
   if(mk_file(fileName)!=GOODEC)
   {
      printf("Error creating file");
      return;
   }
   printf("OK");
}

/*
Summary: Append a string to a file.
Param: The full path of the file to append to.
Param: A pointer to a string to append to the file.
Returns: None.
Example Usage: \> append "Log.txt" "This will be appended to the end of Log.txt"
Note: A "\r\n" will be appended after the appendString.
*/

void AppendFile(char *fileName, char *appendString)
{
   FILE stream;
   printf("\r\nAppending '%s' to '%s': ",appendString,fileName);
   if(fatopen(fileName,"a",&stream)!=GOODEC)
   {
      printf("Error opening file");
      return;
   }
   
   fatputs(appendString,&stream);
   fatputs("\r\n",&stream);
   if(fatclose(&stream)!=GOODEC)
   {
      printf("Error closing file");
      return;
   }
   printf("OK");
}

/*
Summary: Create a directory.
Param: The full path of the directory to create.
Returns: None.
Example Usage: /> mkdir "Backlog"
*/
void MakeDirectory(char *dir)
{
   //append a/to the end of the filename if it doesn't exist
   //making an assumption here that newCWD can hold 1 more character
   if(dir[strlen(dir)-1]!='/')
   strcat(dir,"/");
   printf("\r\nMaking directory '%s': ",dir);
   if(mk_dir(dir)!=GOODEC)
   {
      printf("Error creating directory");
      return;
   }
   printf("OK");
}


/*
Egy .txt filet beolvas mybuffer-be. Később az AppendFile ezt ki tudja írni egy másik fájlba, vagy használhatjuk a 8bites adatainkat.
Lényegében ezzel lehet használható módon kinyerni a file tartalmát, a beíráshoz jó az appendfile továbbra is.
*/
void file2block (char *fileName)
{
unsigned int i;
FILE stream;
 
fatopen(fileName,"r",&stream);
fatread(mybuffer,1,255,&stream);  //ez bepakolta mybuffer[255] elejére a karaktereket

/*
//Ha az értékeket kiírnánk:
   for(i=0;i<255;i++)
   {
      printf("%c",mybuffer[i]);
   }
   printf("\n\r");
*/

fatclose(&stream);   //KÖTELEZŐ bezárni írás után
}


void init()
{
   setup_adc(ADC_OFF);
   set_tris_a(0b00000011);
   set_tris_b(0b00011001);
   set_tris_c(0b00000000);
   set_tris_d(0b00000000);
}

void main(void)
{
   init();
   if (fat_init())  printf("\r\n\nERROR INITIALIZING FAT\r\n\n");   //fat_init !=0 ha hiba van
   
   printf("uart ok\n\r");
   
//A '/' jelek nélkül nem fogja érteni mit akarunk, nem lehet lespórolni.

   MakeFile("/log.txt");
   MakeFile("/picfile.txt");
   AppendFile("/picfile.txt","probaszoveg a picben");
   DeleteFile("/torol.txt");
   MakeDirectory("/picdir/");
   MakeFile("/picdir/dirfile.txt");
   AppendFile("/picdir/dirfile.txt","start");
   file2block("/szgep.txt");
   AppendFile("/picdir/dirfile.txt",mybuffer);
}
