/*
 * 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
 *
 */

#include "../../api/fat_sl.h"
#include "../../psp/include/psp_string.h"

#include "drv.h"
#include "util.h"
#include "volume.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

F_DRIVER * mdrv = NULL;  /* driver structure */


/****************************************************************************
 *
 * _f_checkstatus
 *
 * checking a volume driver status, if media is removed or has been changed
 *
 * RETURNS
 *
 * error code or zero if successful
 *
 ***************************************************************************/
unsigned char _f_checkstatus ( void )
{
  if ( mdrv->getstatus != NULL )
  {
    if ( mdrv->getstatus( mdrv ) & ( F_ST_MISSING | F_ST_CHANGED ) )
    {
      gl_volume.state = F_STATE_NEEDMOUNT; /*card has been removed;*/
      return F_ERR_CARDREMOVED;
    }
  }

  return F_NO_ERROR;
}


/****************************************************************************
 *
 * _f_writesector
 *
 * write sector data on a volume, it calls low level driver function, it
 * writes a complete sector
 *
 * INPUTS
 * sector - which physical sector
 *
 * RETURNS
 * error code or zero if successful
 *
 ***************************************************************************/
unsigned char _f_writeglsector ( unsigned long sector )
{
  unsigned char  retry;

  if ( mdrv->writesector == NULL )
  {
    gl_volume.state = F_STATE_NEEDMOUNT; /*no write function*/
    return F_ERR_ACCESSDENIED;
  }

  if ( sector == (unsigned long)-1 )
  {
    if ( gl_file.modified )
    {
      sector = gl_file.pos.sector;
    }
    else
    {
      sector = gl_volume.actsector;
    }
  }

  if ( sector != (unsigned long)-1 )
  {
    if ( mdrv->getstatus != NULL )
    {
      unsigned int  status;

      status = mdrv->getstatus( mdrv );

      if ( status & ( F_ST_MISSING | F_ST_CHANGED ) )
      {
        gl_volume.state = F_STATE_NEEDMOUNT; /*card has been removed;*/
        return F_ERR_CARDREMOVED;
      }

      if ( status & ( F_ST_WRPROTECT ) )
      {
        gl_volume.state = F_STATE_NEEDMOUNT;  /*card has been removed;*/
        return F_ERR_WRITEPROTECT;
      }
    }

    gl_volume.modified = 0;
    gl_file.modified = 0;
    gl_volume.actsector = sector;
    for ( retry = 3 ; retry ; retry-- )
    {
      int mdrv_ret;
      mdrv_ret = mdrv->writesector( mdrv, (unsigned char *)gl_sector, sector );
      if ( !mdrv_ret )
      {
        return F_NO_ERROR;
      }

      if ( mdrv_ret == -1 )
      {
        gl_volume.state = F_STATE_NEEDMOUNT; /*card has been removed;*/
        return F_ERR_CARDREMOVED;
      }
    }
  }


  return F_ERR_ONDRIVE;
} /* _f_writeglsector */


/****************************************************************************
 *
 * _f_readsector
 *
 * read sector data from a volume, it calls low level driver function, it
 * reads a complete sector
 *
 * INPUTS
 * sector - which physical sector is read
 *
 * RETURNS
 * error code or zero if successful
 *
 ***************************************************************************/
unsigned char _f_readglsector ( unsigned long sector )
{
  unsigned char  retry;
  unsigned char  ret;

  if ( sector == gl_volume.actsector )
  {
    return F_NO_ERROR;
  }

  if ( gl_volume.modified || gl_file.modified )
  {
    ret = _f_writeglsector( (unsigned long)-1 );
    if ( ret )
    {
      return ret;
    }
  }


  for ( retry = 3 ; retry ; retry-- )
  {
    int mdrv_ret;
    mdrv_ret = mdrv->readsector( mdrv, (unsigned char *)gl_sector, sector );
    if ( !mdrv_ret )
    {
      gl_volume.actsector = sector;
      return F_NO_ERROR;
    }

    if ( mdrv_ret == -1 )
    {
      gl_volume.state = F_STATE_NEEDMOUNT; /*card has been removed;*/
      return F_ERR_CARDREMOVED;
    }
  }

  gl_volume.actsector = (unsigned long)-1;
  return F_ERR_ONDRIVE;
} /* _f_readglsector */

