/*
 * FreeRTOS+FAT V2.3.3
 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

#ifndef FF_DEFAULTCONFIG_H
#define FF_DEFAULTCONFIG_H

/* The error numbers defined in this file will be moved to the core FreeRTOS
 * code in future versions of FreeRTOS - at which time the following header file
 * will be removed. */
#include "FreeRTOS_errno_FAT.h"

#define FF_PRINTF printf
#define ffconfigBYTE_ORDER                                             pdFREERTOS_LITTLE_ENDIAN
#define ffconfigCWD_THREAD_LOCAL_INDEX                    0

#if !defined( ffconfigBYTE_ORDER )

/* Must be set to either pdFREERTOS_LITTLE_ENDIAN or pdFREERTOS_BIG_ENDIAN,
 * depending on the endian of the architecture on which FreeRTOS is running. */
    #error Invalid FreeRTOSFATConfig.h file: ffconfigBYTE_ORDER must be set to either pdFREERTOS_LITTLE_ENDIAN or pdFREERTOS_BIG_ENDIAN
#endif

#if ( ffconfigBYTE_ORDER != pdFREERTOS_LITTLE_ENDIAN ) && ( ffconfigBYTE_ORDER != pdFREERTOS_BIG_ENDIAN )
    #error Invalid FreeRTOSFATConfig.h file: ffconfigBYTE_ORDER must be set to either pdFREERTOS_LITTLE_ENDIAN or pdFREERTOS_BIG_ENDIAN
#endif

#if ( pdFREERTOS_LITTLE_ENDIAN != 0 ) || ( pdFREERTOS_BIG_ENDIAN != 1 )
    #error Invalid projdefs.h or FreeRTOS_errno_FAT.h file
#endif

#if !defined( ffconfigHAS_CWD )

/* Set to 1 to maintain a current working directory (CWD) for each task that
 * accesses the file system, allowing relative paths to be used.
 *
 * Set to 0 not to use a CWD, in which case full paths must be used for each
 * file access. */
    #define ffconfigHAS_CWD    0

    #if !defined( ffconfigCWD_THREAD_LOCAL_INDEX )
        #error ffconfigCWD_THREAD_LOCAL_INDEX must be set to a free position within FreeRTOSs thread local storage pointer array for storage of a pointer to the CWD structure.
    #endif

#endif

#if !defined( ffconfigLFN_SUPPORT )

/* Set to 1 to include long file name support.  Set to 0 to exclude long
 * file name support.
 *
 * If long file name support is excluded then only 8.3 file names can be used.
 * Long file names will be recognised but ignored.
 *
 * Users should familiarise themselves with any patent issues that may
 * potentially exist around the use of long file names in FAT file systems
 * before enabling long file name support. */
    #define ffconfigLFN_SUPPORT    0
#endif

#if !defined( ffconfigINCLUDE_SHORT_NAME )

/* Only used when ffconfigLFN_SUPPORT is set to 1.
 *
 * Set to 1 to include a file's short name when listing a directory, i.e. when
 * calling findfirst()/findnext().  The short name will be stored in the
 * 'pcShortName' field of FF_DirEnt_t.
 *
 * Set to 0 to only include a file's long name. */
    #define ffconfigINCLUDE_SHORT_NAME    0
#endif

#if !defined( ffconfigSHORTNAME_CASE )

/* Set to 1 to recognise and apply the case bits used by Windows XP+ when
 * using short file names - storing file names such as "readme.TXT" or
 * "SETUP.exe" in a short-name entry.  This is the recommended setting for
 * maximum compatibility.
 *
 * Set to 0 to ignore the case bits. */
    #define ffconfigSHORTNAME_CASE    0
#endif

#if !defined( ipconfigQUICK_SHORT_FILENAME_CREATION )

/* This method saves a lot of time when creating directories with
 * many similar file names: when the short name version of a LFN already
 * exists, try at most 3 entries with a tilde:
 *  README~1.TXT
 *  README~2.TXT
 *  README~3.TXT
 * After that create entries with pseudo-random 4-digit hex digits:
 *  REA~E7BB.TXT
 *  REA~BA32.TXT
 *  REA~D394.TXT
 */
    #define ipconfigQUICK_SHORT_FILENAME_CREATION    1
#endif

/* ASCII versus UNICODE, UTF-16 versus UTF-8 :
 * FAT directories, when using Long File Names, always store file and directory
 * names UTF-16 encoded.
 * The user can select how these names must be represented internally:
 * - ASCII  (default)
 * - UTF-8  (ffconfigUNICODE_UTF8_SUPPORT = 1)
 * - UTF-16 (ffconfigUNICODE_UTF16_SUPPORT = 1)
 */
#if !defined( ffconfigUNICODE_UTF16_SUPPORT )

/* Only used when ffconfigLFN_SUPPORT is set to 1.
 *
 * Set to 1 to use UTF-16 (wide-characters) for file and directory names.
 *
 * Set to 0 to use either 8-bit ASCII or UTF-8 for file and directory names
 * (see the ffconfigUNICODE_UTF8_SUPPORT). */
    #define ffconfigUNICODE_UTF16_SUPPORT    0
#endif

#if !defined( ffconfigUNICODE_UTF8_SUPPORT )

/* Only used when ffconfigLFN_SUPPORT is set to 1.
 *
 * Set to 1 to use UTF-8 encoding for file and directory names.
 *
 * Set to 0 to use either 8-bit ASCII or UTF-16 for file and directory
 * names (see the ffconfig_UTF_16_SUPPORT setting). */
    #define ffconfigUNICODE_UTF8_SUPPORT    0
#endif

#if ( ffconfigUNICODE_UTF16_SUPPORT != 0 ) && ( ffconfigUNICODE_UTF8_SUPPORT != 0 )
    #error Can not use both UTF-16 and UTF-8
#endif

#if !defined( ffconfigFAT12_SUPPORT )

/* Set to 1 to include FAT12 support.
 *
 * Set to 0 to exclude FAT12 support.
 *
 * FAT16 and FAT32 are always enabled. */
    #define ffconfigFAT12_SUPPORT    0
#endif

#if !defined( ffconfigOPTIMISE_UNALIGNED_ACCESS )

/* When writing and reading data, i/o becomes less efficient if sizes other
 * than the sector size (usually 512 bytes) are being used.  When set to 1, each file handle will
 * allocate a one sector size character buffer to facilitate "unaligned access". */
    #define ffconfigOPTIMISE_UNALIGNED_ACCESS    0
#endif

#if !defined( ffconfigCACHE_WRITE_THROUGH )

/* Input and output to a disk uses buffers that are only flushed at the
 *  following times:
 *
 *  - When a new buffer is needed and no other buffers are available.
 *  - When opening a buffer in READ mode for a sector that has just been changed.
 *  - After creating, removing or closing a file or a directory.
 *
 *  Normally this is quick enough and it is efficient.  If
 *  ffconfigCACHE_WRITE_THROUGH is set to 1 then buffers will also be flushed each
 *  time a buffer is released - which is less efficient but more secure. */
    #define ffconfigCACHE_WRITE_THROUGH    0
#endif

#if !defined( ffconfigWRITE_BOTH_FATS )

/* In most cases, the FAT table has two identical copies on the disk,
 * allowing the second copy to be used in the case of a read error.  If
 *
 * Set to 1 to use both FATs - this is less efficient but more	secure.
 *
 * Set to 0 to use only one FAT - the second FAT will never be written to. */
    #define ffconfigWRITE_BOTH_FATS    0
#endif

#if !defined( ffconfigWRITE_FREE_COUNT )

/* Set to 1 to have the number of free clusters and the first free cluster
 * to be written to the FS info sector each time one of those values changes.
 *
 * Set to 0 not to store these values in the FS info sector, making booting
 * slower, but making changes faster. */
    #define ffconfigWRITE_FREE_COUNT    0
#endif

#if !defined( ffconfigTIME_SUPPORT )

/* Set to 1 to maintain file and directory time stamps for creation, modify
 * and last access.
 *
 * Set to 0 to exclude	time stamps.
 *
 * If time support is used, the following function must be supplied:
 *
 *  time_t FreeRTOS_time( time_t *pxTime );
 *
 * FreeRTOS_time has the same semantics as the standard time() function. */
    #define ffconfigTIME_SUPPORT    0
#endif

#if !defined( ffconfigREMOVABLE_MEDIA )

/* Set to 1 if the media is removable (such as a memory card).
 *
 * Set to 0 if the media is not removable.
 *
 * When set to 1 all file handles will be "invalidated" if the media is
 * extracted.  If set to 0 then file handles will not be invalidated.
 * In that case the user will have to confirm that the media is still present
 * before every access. */
    #define ffconfigREMOVABLE_MEDIA    0
#endif

#if !defined( ffconfigMOUNT_FIND_FREE )

/* Set to 1 to determine the disk's free space and the disk's first free
 * cluster when a disk is mounted.
 *
 * Set to 0 to find these two values when they	are first needed.  Determining
 * the values can take some time. */
    #define ffconfigMOUNT_FIND_FREE    0
#endif

#if !defined( ffconfigFSINFO_TRUSTED )

/* Set to 1 to 'trust' the contents of the 'ulLastFreeCluster' and
 * ulFreeClusterCount fields.
 *
 * Set to 0 not to 'trust' these fields.*/
    #define ffconfigFSINFO_TRUSTED    0
#endif

#if !defined( ffconfigFINDAPI_ALLOW_WILDCARDS )
    /* For now must be set to 0. */
    #define ffconfigFINDAPI_ALLOW_WILDCARDS    0
#endif

#if !defined( ffconfigWILDCARD_CASE_INSENSITIVE )
    /* For now must be set to 0. */
    #define ffconfigWILDCARD_CASE_INSENSITIVE    0
#endif

#if !defined( ffconfigPATH_CACHE )

/* Set to 1 to store recent paths in a cache, enabling much faster access
 * when the path is deep within a directory structure at the expense of
 * additional RAM usage.
 *
 * Set to 0 to not use a path cache. */
    #define ffconfigPATH_CACHE    0
#endif

#if !defined( ffconfigPATH_CACHE_DEPTH )

/* Only used if ffconfigPATH_CACHE is 1.
 *
 * Sets the maximum number of paths that can exist in the patch cache at any
 * one time. */
    #define ffconfigPATH_CACHE_DEPTH    5
#endif

#if !defined( ffconfigHASH_CACHE )

/* Set to 1 to calculate a HASH value for each existing short file name.
 * Use of HASH values can improve performance when working with large
 * directories, or with files that have a similar name.
 *
 * Set to 0 not to calculate a HASH value. */
    #define ffconfigHASH_CACHE    0
#endif

#if ( ffconfigHASH_CACHE != 0 )
    #if !defined( ffconfigHASH_FUNCTION )

/* Only used if ffconfigHASH_CACHE is set to 1
 *
 * Set to CRC8 or CRC16 to use 8-bit or 16-bit HASH values respectively. */
        #define ffconfigHASH_FUNCTION    CRC16
    #endif

    #if ffconfigHASH_FUNCTION == CRC16
        #define ffconfigHASH_TABLE_SIZE    8192
    #elif ffconfigHASH_FUNCTION == CRC8
        #define ffconfigHASH_TABLE_SIZE    32
    #else
        #error Invalid Hashing function selected. CRC16 or CRC8. See your FreeRTOSFATConfig.h.
    #endif
#endif /* ffconfigHASH_CACHE != 0 */

#if !defined( ffconfigMKDIR_RECURSIVE )

/* Set to 1 to add a parameter to ff_mkdir() that allows an entire directory
 * tree to be created in one go, rather than having to create one directory in
 * the tree at a time.  For example mkdir( "/etc/settings/network", pdTRUE );.
 *
 * Set to 0 to use the normal mkdir() semantics (without the additional
 * parameter). */
    #define ffconfigMKDIR_RECURSIVE    0
#endif

#if !defined( ffconfigMALLOC )

/* Set to a function that will be used for all dynamic memory allocations.
 * Setting to pvPortMalloc() will use the same memory allocator as FreeRTOS. */
    #define ffconfigMALLOC( size )    pvPortMalloc( size )
#endif

#if !defined( ffconfigFREE )

/* Set to a function that matches the above allocator defined with
 * ffconfigMALLOC.  Setting to vPortFree() will use the same memory free
 * function as	FreeRTOS. */
    #define ffconfigFREE( ptr )    vPortFree( ptr )
#endif

#if !defined( ffconfig64_NUM_SUPPORT )

/* Set to 1 to calculate the free size and volume size as a 64-bit number.
 *
 * Set to 0 to calculate these values as a 32-bit number. */
    #define ffconfig64_NUM_SUPPORT    0
#endif

#if !defined( ffconfigMAX_PARTITIONS )

/* Defines the maximum number of partitions (and also logical partitions)
 * that can be recognised. */
    #define ffconfigMAX_PARTITIONS    4
#endif

#if ( ffconfigMAX_PARTITIONS < 1 ) || ( ffconfigMAX_PARTITIONS > 8 )
    #error ffconfigMAX_PARTITIONS must be between 1 and 8
#endif

#if !defined( ffconfigMAX_FILE_SYS )

/* Defines how many drives can be combined in total.  Should be set to at
 * least 2. */
    #define ffconfigMAX_FILE_SYS    4
#endif

#if !defined( ffconfigDRIVER_BUSY_SLEEP_MS )

/* In case the low-level driver returns an error 'FF_ERR_DRIVER_BUSY',
 * the library will pause for a number of ms, defined in
 * ffconfigDRIVER_BUSY_SLEEP_MS before re-trying. */
    #define ffconfigDRIVER_BUSY_SLEEP_MS    20
#endif

#if !defined( ffconfigFPRINTF_SUPPORT )

/* Set to 1 to include the ff_fprintf() function.
 *
 * Set to 0 to exclude the ff_fprintf() function.
 *
 * ff_fprintf() is quite a heavy function because it allocates RAM and
 * brings in a lot of string and variable argument handling code.  If
 * ff_fprintf() is not being used then the code size can be reduced by setting
 * ffconfigFPRINTF_SUPPORT to 0. */
    #define ffconfigFPRINTF_SUPPORT    0
#endif

#if !defined( ffconfigFPRINTF_BUFFER_LENGTH )

/* ff_fprintf() will allocate a buffer of this size in which it will create
 * its formatted string.  The buffer will be freed before the function
 * exits. */
    #define ffconfigFPRINTF_BUFFER_LENGTH    128
#endif

#if !defined( ffconfigDEBUG )
    #define ffconfigDEBUG    0
#endif

#if !defined( ffconfigLONG_ERR_MSG )
    #define ffconfigLONG_ERR_MSG    0
#endif

#if ( ffconfigDEBUG != 0 )
    #if !defined( ffconfigHAS_FUNCTION_TAB )
        #define ffconfigHAS_FUNCTION_TAB    1
    #endif
#endif

#if !defined( ffconfigINLINE_MEMORY_ACCESS )

/* Set to 1 to inline some internal memory access functions.
 *
 * Set to 0 to not inline the memory access functions. */
    #define ffconfigINLINE_MEMORY_ACCESS    0
#endif

#if !defined( ffconfigMIRROR_FATS_UMOUNT )
    /*_RB_ not sure. */
    #define ffconfigMIRROR_FATS_UMOUNT    0
#endif

#if !defined( ffconfigFAT_CHECK )

/* Officially the only criteria to determine the FAT type (12, 16, or 32
 * bits) is the total number of clusters:
 * if( ulNumberOfClusters  <  4085 ) : Volume is FAT12
 * if( ulNumberOfClusters  < 65525 ) : Volume is FAT16
 * if( ulNumberOfClusters >= 65525 ) : Volume is FAT32
 * Not every formatted device follows the above rule.
 *
 * Set to 1 to perform additional checks over and above inspecting the
 * number of clusters on a disk to determine the FAT type.
 *
 * Set to 0 to only look at the number of clusters on a disk to determine the
 * FAT type. */
    #define ffconfigFAT_CHECK    0
#endif

#if !defined( ffconfigMAX_FILENAME )

/* Sets the maximum length for file names, including the path.
 * Note that the value of this define is directly related to the maximum stack
 * use of the +FAT library. In some API's, a character buffer of size
 * 'ffconfigMAX_FILENAME' will be declared on stack. As such, this value should
 * include space for the null byte. */
    #define ffconfigMAX_FILENAME    129
#endif

#if !defined( ffconfigUSE_DELTREE )

/* By default, do not include the recursive function ff_deltree() as
 * recursion breaches the coding standard - USE WITH CARE. */
    #define ffconfigUSE_DELTREE    0
#endif

#if !defined( ffconfigFILE_EXTEND_FLUSHES_BUFFERS )

/* When writing large files, the contents of the FAT entries will be flushed
 * after every call to FF_Write().  This flushing can be inhibited, by defining
 * ffconfigFILE_EXTEND_FLUSHES_BUFFERS as 0. */
    #define ffconfigFILE_EXTEND_FLUSHES_BUFFERS    1
#endif

#if !defined( FF_PRINTF )
    #define FF_PRINTF    FF_PRINTF
    static portINLINE void FF_PRINTF( const char * pcFormat,
                                      ... )
    {
        ( void ) pcFormat;
    }
#endif

#ifndef ffconfigFAT_USES_STAT

/* When enabled, the library keeps statistics about the use of cache
 * buffers.  This can be useful while configuring or optimising the
 * cache size. */
    #define ffconfigFAT_USES_STAT    0
#endif

#ifndef ffconfigUSE_NOTIFY

/* When defined, the driver will call a user hook "callFileEvents()"
 * for certain events: creation, change, and deletion of a file or
 * directory.
 * For instance: it can be useful to get an event as soon as a set-up
 * file has changed, or when a lock-file has been placed or removed.
 */
    #define ffconfigUSE_NOTIFY    0
#endif

#ifndef ffconfigDEV_SUPPORT

/* A rarely used feature of FreeRTOS+FAT which lets files behave
 * as 'devices'. */
    #define ffconfigDEV_SUPPORT    0
#endif

#ifndef USE_SOFT_WDT

/* When true. a user-provided function `clearWDT()` will be called
 * during a long action. */
    #define USE_SOFT_WDT    0
#endif

#ifndef ffconfigNOT_USED_FOR_NOW

/* This macro was once used for debugging.
 * When defined as 1, the function 'FF_Utf16ctoUtf32c()'
 * will be compiled */
    #define ffconfigNOT_USED_FOR_NOW    0
#endif

#ifndef FF_NOSTRCASECMP
    /* When zero, the function 'strcasecmp()' will be defined. */
    #define FF_NOSTRCASECMP    0
#endif

/* Allow backword compatibility if desired */
#ifndef ffconfigENABLE_BACKWARD_COMPATIBILITY
    #define ffconfigENABLE_BACKWARD_COMPATIBILITY    1
#endif

#if ffconfigENABLE_BACKWARD_COMPATIBILITY == 1
    #define FF_CreateIOManger    FF_CreateIOManager
#endif /* ffconfigENABLE_BACKWARD_COMPATIBILITY */

#endif /* ifndef FF_DEFAULTCONFIG_H */
