/*
 * FreeRTOS+FAT FS V1.0.0 (C) 2013 HCC Embedded
 *
 * The FreeRTOS+FAT SL license terms are different to the FreeRTOS license 
 * terms.
 * 
 * FreeRTOS+FAT SL uses a dual license model that allows the software to be used
 * under a pure GPL open source license (as opposed to the modified GPL licence
 * under which FreeRTOS is distributed) or a commercial license.  Details of 
 * both license options follow:
 * 
 * - Open source licensing -
 * FreeRTOS+FAT SL is a free download and may be used, modified, evaluated and
 * distributed without charge provided the user adheres to version two of the 
 * GNU General Public License (GPL) and does not remove the copyright notice or 
 * this text.  The GPL V2 text is available on the gnu.org web site, and on the
 * following URL: http://www.FreeRTOS.org/gpl-2.0.txt.
 * 
 * - Commercial licensing -
 * Businesses and individuals who for commercial or other reasons cannot comply
 * with the terms of the GPL V2 license must obtain a commercial license before 
 * incorporating FreeRTOS+FAT SL into proprietary software for distribution in 
 * any form.  Commercial licenses can be purchased from 
 * http://shop.freertos.org/fat_sl and do not require any source files to be 
 * changed.
 *
 * FreeRTOS+FAT SL is distributed in the hope that it will be useful.  You
 * cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as
 * is'.  FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the
 * implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all
 * conditions and terms, be they implied, expressed, or statutory.
 *
 * http://www.FreeRTOS.org
 * http://www.FreeRTOS.org/FreeRTOS-Plus
 *
 */

#ifndef _API_FAT_SL_H_
#define _API_FAT_SL_H_

#include "config_fat_sl.h"

#include "../version/ver_fat_sl.h"
#if VER_FAT_SL_MAJOR != 3 || VER_FAT_SL_MINOR != 2
 #error Incompatible FAT_SL version number!
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define F_MAXNAME 8                  /* 8 byte name */
#define F_MAXEXT  3                  /* 3 byte extension */

typedef struct
{
  char  path[F_MAXPATH];        /*  /directory1/dir2/  */
  char  filename[F_MAXNAME];    /* filename */
  char  fileext[F_MAXEXT];      /* extension */
} F_NAME;

typedef struct
{
  unsigned long  cluster;
  unsigned long  sector;
  unsigned long  sectorend;
  unsigned long  pos;
} F_POS;

typedef struct
{
  char            filename[F_MAXPATH]; /*file name+ext*/
  char            name[F_MAXNAME];     /*file name*/
  char            ext[F_MAXEXT];       /*file extension*/
  unsigned char   attr;                /*attribute of the file*/

  unsigned short  ctime;        /*creation time*/
  unsigned short  cdate;        /*creation date*/
  unsigned long   cluster;

  long            filesize;         /*length of file*/

  F_NAME          findfsname;   /*find properties*/
  F_POS           pos;
} F_FIND;

/* definitions for ctime */
#define F_CTIME_SEC_SHIFT   0
#define F_CTIME_SEC_MASK    0x001f  /*0-30 in 2seconds*/
#define F_CTIME_MIN_SHIFT   5
#define F_CTIME_MIN_MASK    0x07e0  /*0-59 */
#define F_CTIME_HOUR_SHIFT  11
#define F_CTIME_HOUR_MASK   0xf800  /*0-23*/


/* definitions for cdate */
#define F_CDATE_DAY_SHIFT   0
#define F_CDATE_DAY_MASK    0x001f  /*0-31*/
#define F_CDATE_MONTH_SHIFT 5
#define F_CDATE_MONTH_MASK  0x01e0  /*1-12*/
#define F_CDATE_YEAR_SHIFT  9
#define F_CDATE_YEAR_MASK   0xfe00  /*0-119 (1980+value)*/

#define F_ATTR_ARC         0x20
#define F_ATTR_DIR         0x10
#define F_ATTR_VOLUME      0x08
#define F_ATTR_SYSTEM      0x04
#define F_ATTR_HIDDEN      0x02
#define F_ATTR_READONLY    0x01

#define F_CLUSTER_FREE     ( (unsigned long)0x00000000 )
#define F_CLUSTER_RESERVED ( (unsigned long)0x0ffffff0 )
#define F_CLUSTER_BAD      ( (unsigned long)0x0ffffff7 )
#define F_CLUSTER_LAST     ( (unsigned long)0x0ffffff8 )
#define F_CLUSTER_LASTF32R ( (unsigned long)0x0fffffff )

#define F_ST_MISSING       0x00000001
#define F_ST_CHANGED       0x00000002
#define F_ST_WRPROTECT     0x00000004

typedef struct
{
  unsigned long  abspos;
  unsigned long  filesize;
  unsigned long  startcluster;
  unsigned long  prevcluster;
  unsigned long  relpos;
  unsigned char  modified;
  unsigned char  mode;
  unsigned char  _tdata[F_SECTOR_SIZE];
  F_POS          pos;
  F_POS          dirpos;
#if F_FILE_CHANGED_EVENT
  char           filename[F_MAXPATH];   /* filename with full path */
#endif
} F_FILE;

enum
{
  F_UNKNOWN_MEDIA
  , F_FAT12_MEDIA
  , F_FAT16_MEDIA
  , F_FAT32_MEDIA
};

enum
{
/*  0 */
  F_NO_ERROR,

/*  1 */ F_ERR_RESERVED_1,

/*  2 */ F_ERR_NOTFORMATTED,

/*  3 */ F_ERR_INVALIDDIR,

/*  4 */ F_ERR_INVALIDNAME,

/*  5 */ F_ERR_NOTFOUND,

/*  6 */ F_ERR_DUPLICATED,

/*  7 */ F_ERR_NOMOREENTRY,

/*  8 */ F_ERR_NOTOPEN,

/*  9 */ F_ERR_EOF,

/* 10 */ F_ERR_RESERVED_2,

/* 11 */ F_ERR_NOTUSEABLE,

/* 12 */ F_ERR_LOCKED,

/* 13 */ F_ERR_ACCESSDENIED,

/* 14 */ F_ERR_NOTEMPTY,

/* 15 */ F_ERR_INITFUNC,

/* 16 */ F_ERR_CARDREMOVED,

/* 17 */ F_ERR_ONDRIVE,

/* 18 */ F_ERR_INVALIDSECTOR,

/* 19 */ F_ERR_READ,

/* 20 */ F_ERR_WRITE,

/* 21 */ F_ERR_INVALIDMEDIA,

/* 22 */ F_ERR_BUSY,

/* 23 */ F_ERR_WRITEPROTECT,

/* 24 */ F_ERR_INVFATTYPE,

/* 25 */ F_ERR_MEDIATOOSMALL,

/* 26 */ F_ERR_MEDIATOOLARGE,

/* 27 */ F_ERR_NOTSUPPSECTORSIZE

/* 28 */, F_ERR_ALLOCATION

#if F_FS_THREAD_AWARE == 1
/* 29 */, F_ERR_OS = 29
#endif /* F_FS_THREAD_AWARE */
};

typedef struct
{
  unsigned long  total;
  unsigned long  free;
  unsigned long  used;
  unsigned long  bad;

  unsigned long  total_high;
  unsigned long  free_high;
  unsigned long  used_high;
  unsigned long  bad_high;
} F_SPACE;

enum
{
  F_SEEK_SET   /*Beginning of file*/
  , F_SEEK_CUR /*Current position of file pointer*/
  , F_SEEK_END /*End of file*/
};


/****************************************************************************
 *
 * for file changed events
 *
 ***************************************************************************/
#ifndef F_FILE_CHANGED_EVENT
	#define F_FILE_CHANGED_EVENT 0
#endif

#if F_FILE_CHANGED_EVENT

typedef struct
{
  unsigned char   action;
  unsigned char   flags;
  unsigned char   attr;
  unsigned short  ctime;
  unsigned short  cdate;
  unsigned long   filesize;
  char            filename[F_MAXPATH];
} ST_FILE_CHANGED;

typedef void ( *F_FILE_CHANGED_EVENTFUNC )( ST_FILE_CHANGED * fc );

extern F_FILE_CHANGED_EVENTFUNC  f_filechangedevent;

 #define f_setfilechangedevent( filechangeevent ) f_filechangedevent = filechangeevent

/* flags */

 #define FFLAGS_NONE              0x00000000

 #define FFLAGS_FILE_NAME         0x00000001
 #define FFLAGS_DIR_NAME          0x00000002
 #define FFLAGS_NAME              0x00000003
 #define FFLAGS_ATTRIBUTES        0x00000004
 #define FFLAGS_SIZE              0x00000008
 #define FFLAGS_LAST_WRITE        0x00000010

/* actions */

 #define FACTION_ADDED            0x00000001
 #define FACTION_REMOVED          0x00000002
 #define FACTION_MODIFIED         0x00000003

#endif /* if F_FILE_CHANGED_EVENT */

unsigned char fn_initvolume ( F_DRIVERINIT initfunc );
unsigned char fn_delvolume ( void );

unsigned char fn_getfreespace ( F_SPACE * pspace );

unsigned char fn_chdir ( const char * dirname );
unsigned char fn_mkdir ( const char * dirname );
unsigned char fn_rmdir ( const char * dirname );

unsigned char fn_findfirst ( const char * filename, F_FIND * find );
unsigned char fn_findnext ( F_FIND * find );

long fn_filelength ( const char * filename );

unsigned char fn_close ( F_FILE * filehandle );
F_FILE * fn_open ( const char * filename, const char * mode );

long fn_read ( void * buf, long size, long _size_t, F_FILE * filehandle );

long fn_write ( const void * buf, long size, long _size_t, F_FILE * filehandle );

unsigned char fn_seek ( F_FILE * filehandle, long offset, unsigned char whence );

long fn_tell ( F_FILE * filehandle );
int fn_getc ( F_FILE * filehandle );
int fn_putc ( int ch, F_FILE * filehandle );
unsigned char fn_rewind ( F_FILE * filehandle );
unsigned char fn_eof ( F_FILE * filehandle );

unsigned char fn_delete ( const char * filename );

unsigned char fn_seteof ( F_FILE * );

F_FILE * fn_truncate ( const char *, long );

unsigned char fn_getcwd ( char * buffer, unsigned char maxlen, char root );

unsigned char fn_hardformat ( unsigned char fattype );
unsigned char fn_format ( unsigned char fattype );

unsigned char fn_getserial ( unsigned long * );


#if F_FS_THREAD_AWARE == 1

#include "FreeRTOS.h"
#include "semphr.h"
#ifndef FS_MUTEX_DEFINED
	extern xSemaphoreHandle fs_lock_semaphore;
#endif /* FS_MUTEX_DEFINED */

unsigned char fn_init ( void );
#define f_init fn_init
#define f_initvolume fn_initvolume
#define f_delvolume  fn_delvolume

unsigned char fr_hardformat ( unsigned char fattype );
#define f_hardformat( fattype ) fr_hardformat( fattype )
#define f_format( fattype )    fr_hardformat( fattype )

unsigned char fr_getcwd ( char * buffer, unsigned char maxlen, char root );
#define f_getcwd( buffer, maxlen ) fr_getcwd( buffer, maxlen, 1 )

unsigned char fr_getfreespace ( F_SPACE * pspace );
#define f_getfreespace fr_getfreespace


unsigned char fr_chdir ( const char * dirname );
#define f_chdir( dirname ) fr_chdir( dirname )
unsigned char fr_mkdir ( const char * dirname );
#define f_mkdir( dirname ) fr_mkdir( dirname )
unsigned char fr_rmdir ( const char * dirname );
#define f_rmdir( dirname ) fr_rmdir( dirname )

unsigned char fr_findfirst ( const char * filename, F_FIND * find );
unsigned char fr_findnext ( F_FIND * find );
#define f_findfirst( filename, find ) fr_findfirst( filename, find )
#define f_findnext( find )            fr_findnext( find )

long fr_filelength ( const char * filename );
#define f_filelength( filename ) fr_filelength( filename )

unsigned char fr_close ( F_FILE * filehandle );
F_FILE * fr_open ( const char * filename, const char * mode );

long fr_read ( void * buf, long size, long _size_t, F_FILE * filehandle );

unsigned char fr_getserial ( unsigned long * );
#define f_getserial( serial )  fr_getserial( serial )

unsigned char fr_flush ( F_FILE * f );
#define f_flush( filehandle ) fr_flush( filehandle )

long fr_write ( const void * buf, long size, long _size_t, F_FILE * filehandle );
#define f_write( buf, size, _size_t, filehandle ) fr_write( buf, size, _size_t, filehandle )

unsigned char fr_seek ( F_FILE * filehandle, long offset, unsigned char whence );
#define f_seek( filehandle, offset, whence ) fr_seek( filehandle, offset, whence )

long fr_tell ( F_FILE * filehandle );
#define f_tell( filehandle )     fr_tell( filehandle )
int fr_getc ( F_FILE * filehandle );
#define f_getc( filehandle )     fr_getc( filehandle )
int fr_putc ( int ch, F_FILE * filehandle );
#define f_putc( ch, filehandle ) fr_putc( ch, filehandle )
unsigned char fr_rewind ( F_FILE * filehandle );
#define f_rewind( filehandle )   fr_rewind( filehandle )
unsigned char fr_eof ( F_FILE * filehandle );
#define f_eof( filehandle )      fr_eof( filehandle )

unsigned char fr_delete ( const char * filename );
#define f_delete( filename ) fr_delete( filename )

unsigned char fr_seteof ( F_FILE * );
#define f_seteof( file ) fr_seteof( file )

F_FILE * fr_truncate ( const char *, long );
#define f_truncate( filename, filesize ) fr_truncate( filename, filesize )

#define f_close( filehandle )                    fr_close( filehandle )
#define f_open( filename, mode )                 fr_open( filename, mode )
#define f_read( buf, size, _size_t, filehandle ) fr_read( buf, size, _size_t, filehandle )

#else /* F_FS_THREAD_AWARE */

unsigned char fn_init ( void );
#define f_init fn_init
#define f_initvolume fn_initvolume
#define f_delvolume  fn_delvolume

#define f_hardformat( fattype ) fn_hardformat( fattype )
#define f_format( fattype )    fn_hardformat( fattype )

#define f_getcwd( buffer, maxlen ) fn_getcwd( buffer, maxlen, 1 )

unsigned char fn_getfreespace ( F_SPACE * pspace );
#define f_getfreespace fn_getfreespace


unsigned char fn_chdir ( const char * dirname );
#define f_chdir( dirname ) fn_chdir( dirname )
unsigned char fn_mkdir ( const char * dirname );
#define f_mkdir( dirname ) fn_mkdir( dirname )
unsigned char fn_rmdir ( const char * dirname );
#define f_rmdir( dirname ) fn_rmdir( dirname )

unsigned char fn_findfirst ( const char * filename, F_FIND * find );
unsigned char fn_findnext ( F_FIND * find );
#define f_findfirst( filename, find ) fn_findfirst( filename, find )
#define f_findnext( find )            fn_findnext( find )

#define f_filelength( filename ) fn_filelength( filename )

#define f_getserial( serial )  fn_getserial( serial )

unsigned char fn_flush ( F_FILE * f );
#define f_flush( filehandle ) fn_flush( filehandle )

#define f_write( buf, size, _size_t, filehandle ) fn_write( buf, size, _size_t, filehandle )

#define f_seek( filehandle, offset, whence ) fn_seek( filehandle, offset, whence )

long fn_tell ( F_FILE * filehandle );
#define f_tell( filehandle )     fn_tell( filehandle )
int fn_getc ( F_FILE * filehandle );
#define f_getc( filehandle )     fn_getc( filehandle )
int fn_putc ( int ch, F_FILE * filehandle );
#define f_putc( ch, filehandle ) fn_putc( ch, filehandle )
unsigned char fn_rewind ( F_FILE * filehandle );
#define f_rewind( filehandle )   fn_rewind( filehandle )
unsigned char fn_eof ( F_FILE * filehandle );
#define f_eof( filehandle )      fn_eof( filehandle )

unsigned char fn_delete ( const char * filename );
#define f_delete( filename ) fn_delete( filename )

unsigned char fn_seteof ( F_FILE * );
#define f_seteof( file ) fn_seteof( file )

F_FILE * fn_truncate ( const char *, long );
#define f_truncate( filename, filesize ) fn_truncate( filename, filesize )

#define f_close( filehandle )                    fn_close( filehandle )
#define f_open( filename, mode )                 fn_open( filename, mode )
#define f_read( buf, size, _size_t, filehandle ) fn_read( buf, size, _size_t, filehandle )

#endif /* F_FS_THREAD_AWARE */

/****************************************************************************
 *
 * end of fat_sl.h
 *
 ***************************************************************************/
#ifdef __cplusplus
}
#endif

#endif /*_API_FAT_SL_H_*/

