/*
 * FreeRTOS+FAT SL V1.0.1 (C) 2014 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 standard GPL open source license, or a commercial license.  The 
 * standard GPL license (unlike the modified GPL license under which FreeRTOS 
 * itself is distributed) requires that all software statically linked with 
 * FreeRTOS+FAT SL is also distributed under the same GPL V2 license terms.  
 * 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_rtc.h"
#include "dir.h"

#include "util.h"

#include "../../version/ver_fat_sl.h"
#if VER_FAT_SL_MAJOR != 5 || VER_FAT_SL_MINOR != 2
 #error Incompatible FAT_SL version number!
#endif


/****************************************************************************
 *
 * _f_getword
 *
 * get a word 16bit number from a memory (it uses LITTLE ENDIAN mode always)
 *
 * INPUTS
 *
 * ptr - pointer where data is
 *
 * RETURNS
 *
 * word number
 *
 ***************************************************************************/
unsigned short _f_getword ( void * ptr )
{
  unsigned char * sptr = (unsigned char *)ptr;
  unsigned short  ret;

  ret = (unsigned short)( sptr[1] & 0xff );
  ret <<= 8;
  ret |= ( sptr[0] & 0xff );
  return ret;
}


/****************************************************************************
 *
 * _f_setword
 *
 * set a word 16bit number into a memory (it uses LITTLE ENDIAN mode always)
 *
 * INPUTS
 *
 * ptr - where to store data
 * num - 16 bit number to store
 *
 ***************************************************************************/
void _f_setword ( void * ptr, unsigned short num )
{
  unsigned char * sptr = (unsigned char *)ptr;

  sptr[1] = (unsigned char)( num >> 8 );
  sptr[0] = (unsigned char)( num );
}


/****************************************************************************
 *
 * _f_getlong
 *
 * get a long 32bit number from a memory (it uses LITTLE ENDIAN mode always)
 *
 * INPUTS
 *
 * ptr - pointer where data is
 *
 * RETURNS
 *
 * long number
 *
 ***************************************************************************/
unsigned long _f_getlong ( void * ptr )
{
  unsigned char * sptr = (unsigned char *)ptr;
  unsigned long   ret;

  ret = (unsigned long)( sptr[3] & 0xff );
  ret <<= 8;
  ret |= ( sptr[2] & 0xff );
  ret <<= 8;
  ret |= ( sptr[1] & 0xff );
  ret <<= 8;
  ret |= ( sptr[0] & 0xff );
  return ret;
}


/****************************************************************************
 *
 * _f_setlong
 *
 * set a long 32bit number into a memory (it uses LITTLE ENDIAN mode always)
 *
 * INPUTS
 *
 * ptr - where to store data
 * num - 32 bit number to store
 *
 ***************************************************************************/
void _f_setlong ( void * ptr, unsigned long num )
{
  unsigned char * sptr = (unsigned char *)ptr;

  sptr[3] = (unsigned char)( num >> 24 );
  sptr[2] = (unsigned char)( num >> 16 );
  sptr[1] = (unsigned char)( num >> 8 );
  sptr[0] = (unsigned char)( num );
}


/****************************************************************************
 *
 * _setcharzero
 *
 * fills with zero charater to memory
 *
 * INPUTS
 *
 * num - number of characters
 * ptr - where to store data
 *
 * RETURNS
 *
 * last write position
 *
 ***************************************************************************/
unsigned char * _setcharzero ( int num, unsigned char * ptr )
{
  while ( num-- )
  {
    *ptr++ = 0;
  }

  return ptr;
}


/****************************************************************************
 *
 * _setchar
 *
 * copy a charater string to memory
 *
 * INPUTS
 *
 * array - original code what to copy
 * num - number of characters
 * ptr - where to store data
 *
 * RETURNS
 *
 * last write position
 *
 ***************************************************************************/
unsigned char * _setchar ( const unsigned char * array, int num, unsigned char * ptr )
{
  if ( !array )
  {
    return _setcharzero( num, ptr );
  }

  while ( num-- )
  {
    *ptr++ = *array++;
  }

  return ptr;
}


/****************************************************************************
 *
 * _setword
 *
 * store a 16bit word into memory
 *
 * INPUTS
 *
 * num - 16bit number to store
 * ptr - where to store data
 *
 * RETURNS
 *
 * last write position
 *
 ***************************************************************************/
unsigned char * _setword ( unsigned short num, unsigned char * ptr )
{
  _f_setword( ptr, num );
  return ptr + 2;
}


/****************************************************************************
 *
 * _setlong
 *
 * store a 32bit long number into memory
 *
 * INPUTS
 *
 * num - 32bit number to store
 * ptr - where to store data
 *
 * RETURNS
 *
 * last write position
 *
 ***************************************************************************/
unsigned char * _setlong ( unsigned long num, unsigned char * ptr )
{
  _f_setlong( ptr, num );
  return ptr + 4;
}


/****************************************************************************
 *
 * _f_toupper
 *
 * convert a string into lower case
 *
 * INPUTS
 *
 * s - input string to convert
 *
 ***************************************************************************/
char _f_toupper ( char ch )
{
  if ( ( ch >= 'a' ) && ( ch <= 'z' ) )
  {
    return (char)( ch - 'a' + 'A' );
  }

  return ch;
}


/****************************************************************************
 *
 * f_igettimedate
 *
 * INPUTS
 *    time - pointer to time variable
 *    date - pointer to date variable
 * OUTPUTS
 *    time - current time
 *    date - current date
 *
 * RETURNS
 *    none
 *
 ***************************************************************************/
void f_igettimedate ( unsigned short * time, unsigned short * date )
{
  t_psp_timedate  s_timedate;

  psp_getcurrenttimedate( &s_timedate );

  *time = ( ( (uint16_t)s_timedate.hour << F_CTIME_HOUR_SHIFT ) & F_CTIME_HOUR_MASK )
          | ( ( (uint16_t)s_timedate.min << F_CTIME_MIN_SHIFT )  & F_CTIME_MIN_MASK )
          | ( ( ( (uint16_t)s_timedate.sec >> 1 ) << F_CTIME_SEC_SHIFT )  & F_CTIME_SEC_MASK );

  *date = ( ( ( s_timedate.year - 1980 ) << F_CDATE_YEAR_SHIFT ) & F_CDATE_YEAR_MASK )
          | ( ( (uint16_t)s_timedate.month << F_CDATE_MONTH_SHIFT ) & F_CDATE_MONTH_MASK )
          | ( ( (uint16_t)s_timedate.day << F_CDATE_DAY_SHIFT ) & F_CDATE_DAY_MASK );

  return;
}









