/*
 * user.h - CC31xx/CC32xx Host Driver Implementation
 *
 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/ 
 * 
 * 
 *  Redistribution and use in source and binary forms, with or without 
 *  modification, are permitted provided that the following conditions 
 *  are met:
 *
 *    Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer.
 *
 *    Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the 
 *    documentation and/or other materials provided with the   
 *    distribution.
 *
 *    Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
*/

/******************************************************************************
*	user.h - CC31xx/CC32xx Host Driver Implementation
******************************************************************************/

#ifndef __USER_H__
#define __USER_H__

#ifdef  __cplusplus
extern "C" {
#endif

  
#include <string.h>
#include <ti/drivers/net/wifi/porting/cc_pal.h>

typedef signed int _SlFd_t;

#define SL_TIMESTAMP_TICKS_IN_10_MILLISECONDS     (_u32)(10)
#define SL_TIMESTAMP_MAX_VALUE                    (_u32)(0xFFFFFFFF)

/*!
	\def		MAX_CONCURRENT_ACTIONS

    \brief      Defines the maximum number of concurrent action in the system
				Min:1 , Max: 32

                Actions which has async events as return, can be

    \sa

    \note       In case there are not enough resources for the actions needed in the system,
	        	error is received: POOL_IS_EMPTY
			    one option is to increase MAX_CONCURRENT_ACTIONS
				(improves performance but results in memory consumption)
		     	Other option is to call the API later (decrease performance)

    \warning    In case of setting to one, recommend to use non-blocking recv\recvfrom to allow
				multiple socket recv
*/
#ifndef SL_TINY_EXT
#define MAX_CONCURRENT_ACTIONS 10
#else
#define MAX_CONCURRENT_ACTIONS 1
#endif

/*!
	\def		CPU_FREQ_IN_MHZ
    \brief      Defines CPU frequency for Host side, for better accuracy of busy loops, if any
    \sa             
    \note       

    \warning    If not set the default CPU frequency is set to 200MHz
                This option will be deprecated in future release
*/

/* #define CPU_FREQ_IN_MHZ        80 */


/*!
 ******************************************************************************

    \defgroup       configuration_capabilities        Configuration - Capabilities Set

    This section IS NOT REQUIRED in case one of the following pre defined
    capabilities set is in use:
    - SL_TINY
    - SL_SMALL
    - SL_FULL

    PORTING ACTION:
        - Define one of the pre-defined capabilities set or uncomment the
          relevant definitions below to select the required capabilities

    @{

 *******************************************************************************
*/
/*!
    \def        SL_RUNTIME_EVENT_REGISTERATION

    \brief      Defines whether the SimpleLink driver uses dynamic event registration
                or static precompiled event mechanism
    \sa

    \note       belongs to \ref configuration_sec

*/
#define SL_RUNTIME_EVENT_REGISTERATION


/*!
	\def		SL_INC_ARG_CHECK

    \brief      Defines whether the SimpleLink driver perform argument check 
                or not
                    
                When defined, the SimpleLink driver perform argument check on 
                function call. Removing this define could reduce some code 
                size and improve slightly the performances but may impact in 
                unpredictable behavior in case of invalid arguments

    \sa             

    \note       belongs to \ref configuration_sec

    \warning    Removing argument check may cause unpredictable behavior in 
                case of invalid arguments. 
                In this case the user is responsible to argument validity 
                (for example all handlers must not be NULL)
*/
#define SL_INC_ARG_CHECK


/*!
    \def		SL_INC_INTERNAL_ERRNO

    \brief      Defines whether SimpleLink driver should employ it's internal errno
                setter and getter to comply with BSD.
                (Usually, this kind of mechanism should be handled by the OS).

                When defined, the SimpleLink driver would set and manage the errno variable
                per thread, to the various returned errors by the standard BSD API.
                The BSD API includes the following functions:
                socket, close, accept, bind, listen, connect, select,
                setsockopt, getsockopt, recv, recvfrom, send, sendto,
                gethostbyname. Furthermore, the user's application can read errno's value.
                When not defined, user must provide an errno setter, such that the SimpleLink driver
                would use the users's external errno meachnism to set an error code.

    \sa         slcb_SetErrno

    \note       belongs to \ref configuration_sec

    \warning    Query errno in the user's application is by simply invoking the macro 'errno'
                which returns a dereferenced pointer to the allocated calling thread's errno value.
                If the user choose to change, write to or modifiy the value of errno in any way,
                It might overwrite the errno value allocated to any other thread at the point in time.
                (Once errno has been read, the driver assumes it can be allocated to another thread).
*/

#define SL_INC_INTERNAL_ERRNO

/*!
    \brief      Defines whether to include extended API in SimpleLink driver
                or not
    
                When defined, the SimpleLink driver will include also all 
                exteded API of the included packages

    \sa         ext_api

    \note       belongs to \ref configuration_sec

    \warning    
*/
#define SL_INC_EXT_API


/*!
    \brief      Defines whether to include WLAN package in SimpleLink driver 
                or not
    
                When defined, the SimpleLink driver will include also 
                the WLAN package

    \sa         

    \note       belongs to \ref configuration_sec

    \warning        
*/
#define SL_INC_WLAN_PKG


/*!
    \brief      Defines whether to include SOCKET package in SimpleLink 
                driver or not
    
                When defined, the SimpleLink driver will include also 
                the SOCKET package

    \sa         

    \note       belongs to \ref configuration_sec

    \warning        
*/
#define SL_INC_SOCKET_PKG


/*!
    \brief      Defines whether to include NET_APP package in SimpleLink 
                driver or not
    
                When defined, the SimpleLink driver will include also the 
                NET_APP package

    \sa         

    \note       belongs to \ref configuration_sec

    \warning        
*/
#define SL_INC_NET_APP_PKG


/*!
    \brief      Defines whether to include NET_CFG package in SimpleLink 
                driver or not
    
                When defined, the SimpleLink driver will include also 
                the NET_CFG package

    \sa         

    \note       belongs to \ref configuration_sec

    \warning        
*/
#define SL_INC_NET_CFG_PKG


/*!
    \brief      Defines whether to include NVMEM package in SimpleLink 
                driver or not
    
                When defined, the SimpleLink driver will include also the 
                NVMEM package

    \sa         

    \note       belongs to \ref configuration_sec

    \warning        
*/ 
#define SL_INC_NVMEM_PKG


/*!
    \brief      Defines whether to include NVMEM extended package in SimpleLink
                driver or not

                When defined, the SimpleLink driver will include also the
                NVMEM extended package

    \sa

    \note       belongs to \ref nvmem_ext

    \warning
*/
#define SL_INC_NVMEM_EXT_PKG


/*!
    \brief      Defines whether to include socket server side APIs 
                in SimpleLink driver or not
    
                When defined, the SimpleLink driver will include also socket 
                server side APIs

    \sa         server_side

    \note       

    \warning        
*/
#define SL_INC_SOCK_SERVER_SIDE_API


/*!
    \brief      Defines whether to include socket client side APIs in SimpleLink 
                driver or not
    
                When defined, the SimpleLink driver will include also socket 
                client side APIs

    \sa         client_side

    \note       belongs to \ref configuration_sec

    \warning        
*/
#define SL_INC_SOCK_CLIENT_SIDE_API


/*!
    \brief      Defines whether to include socket receive APIs in SimpleLink 
                driver or not
    
                When defined, the SimpleLink driver will include also socket 
                receive side APIs

    \sa         recv_api

    \note       belongs to \ref configuration_sec

    \warning        
*/
#define SL_INC_SOCK_RECV_API


/*!
    \brief      Defines whether to include socket send APIs in SimpleLink 
                driver or not
    
                When defined, the SimpleLink driver will include also socket 
                send side APIs

    \sa         send_api

    \note       belongs to \ref configuration_sec

    \warning        
*/
#define SL_INC_SOCK_SEND_API


/*!

 Close the Doxygen group.
 @}

 */


/*!
 ******************************************************************************

    \defgroup   configuration_enable_device       Configuration - Device Enable/Disable

    The enable/disable API provide mechanism to enable/disable the network processor

   
    porting ACTION:
        - None
    @{

 ******************************************************************************
 */

/*!
    \brief		Preamble to the enabling the Network Processor.
                        Placeholder to implement any pre-process operations
                        before enabling networking operations.

    \sa			sl_DeviceEnable

    \note       belongs to \ref configuration_sec

*/
#define sl_DeviceEnablePreamble()



/*!
    \brief		Enable the Network Processor

    \sa			sl_DeviceDisable

    \note       belongs to \ref configuration_sec

*/
#define sl_DeviceEnable()			NwpPowerOn()


/*!
    \brief		Disable the Network Processor

    \sa			sl_DeviceEnable

    \note       belongs to \ref configuration_sec
*/
#define sl_DeviceDisable() 			NwpPowerOff()


/*!

 Close the Doxygen group.
 @}

 */

/*!
 ******************************************************************************

    \defgroup   configuration_interface         Configuration - Communication Interface

	The SimpleLink device supports several standard communication protocol among SPI and
	UART. CC32XX Host Driver implements SPI Communication Interface


    \note       	In CC32XX, SPI implementation uses DMA in order to increase the utilization
 			of the communication channel. If user prefers to user UART, these interfaces 
 			need to be redefined


    porting ACTION:	
        - None

    @{

 ******************************************************************************
*/

#define _SlFd_t					Fd_t


/*!
    \brief      Opens an interface communication port to be used for communicating
                with a SimpleLink device
	
	            Given an interface name and option flags, this function opens 
                the communication port and creates a file descriptor. 
                This file descriptor is used afterwards to read and write 
                data from and to this specific communication channel.
	            The speed, clock polarity, clock phase, chip select and all other 
                specific attributes of the channel are all should be set to hardcoded
                in this function.
	
	\param	 	ifName  -   points to the interface name/path. The interface name is an 
                            optional attributes that the SimpleLink driver receives
                            on opening the driver (sl_Start). 
                            In systems that the spi channel is not implemented as 
                            part of the os device drivers, this parameter could be NULL.

	\param      flags   -   optional flags parameters for future use

	\return     upon successful completion, the function shall open the channel 
                and return a non-negative integer representing the file descriptor.
                Otherwise, -1 shall be returned 
					
    \sa         sl_IfClose , sl_IfRead , sl_IfWrite

	\note       The prototype of the function is as follow:
                    Fd_t xxx_IfOpen(char* pIfName , unsigned long flags);

    \note       belongs to \ref configuration_sec

    \warning
*/
#define sl_IfOpen                           spi_Open


/*!
    \brief      Closes an opened interface communication port
	
	\param	 	fd  -   file descriptor of opened communication channel

	\return		upon successful completion, the function shall return 0. 
			    Otherwise, -1 shall be returned 
					
    \sa         sl_IfOpen , sl_IfRead , sl_IfWrite

	\note       The prototype of the function is as follow:
                    int xxx_IfClose(Fd_t Fd);

    \note       belongs to \ref configuration_sec

    \warning
*/
#define sl_IfClose                          spi_Close


/*!
    \brief      Attempts to read up to len bytes from an opened communication channel 
                into a buffer starting at pBuff.
	
	\param	 	fd      -   file descriptor of an opened communication channel
	
	\param		pBuff   -   pointer to the first location of a buffer that contains enough 
                            space for all expected data

	\param      len     -   number of bytes to read from the communication channel

	\return     upon successful completion, the function shall return the number of read bytes. 
                Otherwise, 0 shall be returned 
					
    \sa         sl_IfClose , sl_IfOpen , sl_IfWrite


	\note       The prototype of the function is as follow:
                    int xxx_IfRead(Fd_t Fd , char* pBuff , int Len);

    \note       belongs to \ref configuration_sec

    \warning
*/
#define sl_IfRead                           spi_Read


/*!
    \brief attempts to write up to len bytes to the SPI channel
	
	\param	 	fd      -   file descriptor of an opened communication channel
	
	\param		pBuff   -   pointer to the first location of a buffer that contains 
                            the data to send over the communication channel

	\param      len     -   number of bytes to write to the communication channel

	\return     upon successful completion, the function shall return the number of sent bytes. 
				therwise, 0 shall be returned 
					
    \sa         sl_IfClose , sl_IfOpen , sl_IfRead

	\note       This function could be implemented as zero copy and return only upon successful completion
                of writing the whole buffer, but in cases that memory allocation is not too tight, the 
                function could copy the data to internal buffer, return back and complete the write in 
                parallel to other activities as long as the other SPI activities would be blocked until 
                the entire buffer write would be completed 

               The prototype of the function is as follow:
                    int xxx_IfWrite(Fd_t Fd , char* pBuff , int Len);

    \note       belongs to \ref configuration_sec

    \warning
*/
#define sl_IfWrite                          spi_Write


/*!
    \brief 		register an interrupt handler routine for the host IRQ

	\param	 	InterruptHdl	-	pointer to interrupt handler routine

	\param 		pValue			-	pointer to a memory structure that is passed
									to the interrupt handler.

	\return		upon successful registration, the function shall return 0.
				Otherwise, -1 shall be returned

    \sa

	\note		If there is already registered interrupt handler, the function
				should overwrite the old handler with the new one

	\note       If the handler is a null pointer, the function should un-register the
	            interrupt handler, and the interrupts can be disabled.

    \note       belongs to \ref configuration_sec

    \warning
*/
#define sl_IfRegIntHdlr(InterruptHdl , pValue)          NwpRegisterInterruptHandler(InterruptHdl , pValue)   


/*!
    \brief 		Masks the Host IRQ

    \sa		sl_IfUnMaskIntHdlr



    \note       belongs to \ref configuration_sec

    \warning
*/
#define sl_IfMaskIntHdlr()								NwpMaskInterrupt()


/*!
    \brief 		Unmasks the Host IRQ

    \sa		sl_IfMaskIntHdlr



    \note       belongs to \ref configuration_sec

    \warning
*/
#define sl_IfUnMaskIntHdlr()							NwpUnMaskInterrupt()


/*!
    \brief 		Write Handers for statistics debug on write 

	\param	 	interface handler	-	pointer to interrupt handler routine


	\return		no return value

    \sa

	\note		An optional hooks for monitoring before and after write info

    \note       belongs to \ref configuration_sec

    \warning        
*/
/* #define SL_START_WRITE_STAT */

#ifdef SL_START_WRITE_STAT
#define sl_IfStartWriteSequence
#define sl_IfEndWriteSequence
#endif


/*!
    \brief 		Get the timer counter value (timestamp).
				The timer must count from zero to its MAX value.

	\param	 	None.


	\return		Returns 32-bit timer counter value (ticks unit) 

    \sa

	\note		 

    \note       belongs to \ref porting_sec

    \warning        
*/
#ifndef SL_TINY_EXT
#undef slcb_GetTimestamp
/* A timer must be started before using this function */ 
#define slcb_GetTimestamp           TimerGetCurrentTimestamp
#endif


/*!
    \brief 		This macro wait for the NWP to raise a ready for shutdown indication.

	\param	 	None.

	\note       This function is unique for the CC32XX family

    \warning
*/

#define WAIT_NWP_SHUTDOWN_READY          NwpWaitForShutDownInd()

/*!
    \brief      User's errno setter function. User must provide an errno setter
                in order to let the SimpleLink Wi-Fi driver to support BSD API
                alongside the user's errno mechanism.

    \param      None.

    \sa         SL_INC_INTERNAL_ERRNO

    \note

    \note       belongs to \ref porting_sec

    \warning
*/
#ifndef SL_INC_INTERNAL_ERRNO
#define slcb_SetErrno
#endif

/*!
 Close the Doxygen group.
 @}

*/

/*!
 ******************************************************************************

    \defgroup   configuration_os          Configuration - Operating System

	The SimpleLink driver could run on two kind of platforms:
	   -# Non-Os / Single Threaded (default)
	   -# Multi-Threaded
	
	CC32XX SimpleLink Host Driver is ported on both Non-Os and Multi Threaded OS enviroment. 
	The Host driver is made OS independent by implementing an OS Abstraction layer. 
	Reference implementation for OS Abstraction is available for FreeRTOS and TI-RTOS. 
	
	
	If you choose to work in multi-threaded environment under different operating system you 
	will have to provide some basic adaptation routines to allow the driver to protect access to 
	resources for different threads (locking object) and to allow synchronization between threads 
	(sync objects). In additional the driver support running without dedicated thread allocated solely
	to the SimpleLink driver. If you choose to work in this mode, you should also supply a spawn
	method that will enable to run function on a temporary context.

	\note - This Macro is defined in the IDE to generate Driver for both OS and Non-OS 
	
	 porting ACTION: 
		 - None
	 
	 @{

 ******************************************************************************
*/

/*
#define SL_PLATFORM_MULTI_THREADED
*/

#ifdef SL_PLATFORM_MULTI_THREADED

/*!
    \brief
    \sa
    \note           belongs to \ref configuration_sec
    \warning
*/
#define SL_OS_RET_CODE_OK                       ((int)OS_OK)

/*!
    \brief
    \sa
    \note           belongs to \ref configuration_sec
    \warning
*/
#define SL_OS_WAIT_FOREVER                      ((uint32_t)OS_WAIT_FOREVER)

/*!
    \brief
    \sa
    \note           belongs to \ref configuration_sec
    \warning
*/
#define SL_OS_NO_WAIT	                        ((uint32_t)OS_NO_WAIT)

/*!
	\brief type definition for a time value

	\note	On each configuration or platform the type could be whatever is needed - integer, pointer to structure etc.

    \note       belongs to \ref configuration_sec
*/
#define _SlTime_t				uint32_t


#endif //SL_PLATFORM_MULTI_THREADED

/*!
	\brief 	type definition for a sync object container

	Sync object is object used to synchronize between two threads or thread and interrupt handler.
	One thread is waiting on the object and the other thread send a signal, which then
	release the waiting thread.
	The signal must be able to be sent from interrupt context.
	This object is generally implemented by binary semaphore or events.

	\note	On each configuration or platform the type could be whatever is needed - integer, structure etc.

    \note       belongs to \ref configuration_sec
*/
#define _SlSyncObj_t			    SemaphoreP_Handle

    
/*!
	\brief 	This function creates a sync object

	The sync object is used for synchronization between diffrent thread or ISR and
	a thread.

	\param	pSyncObj	-	pointer to the sync object control block

	\return upon successful creation the function should return 0
			Otherwise, a negative value indicating the error code shall be returned

    \note       belongs to \ref configuration_sec
    \warning
*/
#define sl_SyncObjCreate(pSyncObj,pName)            Semaphore_create_handle(pSyncObj)


/*!
	\brief 	This function deletes a sync object

	\param	pSyncObj	-	pointer to the sync object control block

	\return upon successful deletion the function should return 0
			Otherwise, a negative value indicating the error code shall be returned
    \note       belongs to \ref configuration_sec
    \warning
*/
#define sl_SyncObjDelete(pSyncObj)                  SemaphoreP_delete_handle(pSyncObj)


/*!
	\brief 		This function generates a sync signal for the object.

	All suspended threads waiting on this sync object are resumed

	\param		pSyncObj	-	pointer to the sync object control block

	\return 	upon successful signaling the function should return 0
				Otherwise, a negative value indicating the error code shall be returned
	\note		the function could be called from ISR context
    \warning
*/
#define sl_SyncObjSignal(pSyncObj)                SemaphoreP_post_handle(pSyncObj)


/*!
	\brief 		This function generates a sync signal for the object from Interrupt

	This is for RTOS that should signal from IRQ using a dedicated API

	\param		pSyncObj	-	pointer to the sync object control block

	\return 	upon successful signaling the function should return 0
				Otherwise, a negative value indicating the error code shall be returned
	\note		the function could be called from ISR context
	\warning
*/
#define sl_SyncObjSignalFromIRQ(pSyncObj)           SemaphoreP_post_handle(pSyncObj)


/*!
	\brief 	This function waits for a sync signal of the specific sync object

	\param	pSyncObj	-	pointer to the sync object control block
	\param	Timeout		-	numeric value specifies the maximum number of mSec to
							stay suspended while waiting for the sync signal
							Currently, the SimpleLink driver uses only two values:
								- OSI_WAIT_FOREVER
								- OSI_NO_WAIT

	\return upon successful reception of the signal within the timeout window return 0
			Otherwise, a negative value indicating the error code shall be returned
    \note       belongs to \ref configuration_sec
    \warning
*/
#define sl_SyncObjWait(pSyncObj,Timeout)            SemaphoreP_pend((*(pSyncObj)),Timeout)


/*!
	\brief 	type definition for a locking object container

	Locking object are used to protect a resource from mutual accesses of two or more threads.
	The locking object should suppurt reentrant locks by a signal thread.
	This object is generally implemented by mutex semaphore

	\note	On each configuration or platform the type could be whatever is needed - integer, structure etc.
    \note       belongs to \ref configuration_sec
*/
#define _SlLockObj_t 			             MutexP_Handle

/*!
	\brief 	This function creates a locking object.

	The locking object is used for protecting a shared resources between different
	threads.

	\param	pLockObj	-	pointer to the locking object control block

	\return upon successful creation the function should return 0
			Otherwise, a negative value indicating the error code shall be returned
    \note       belongs to \ref configuration_sec
    \warning
*/
#define sl_LockObjCreate(pLockObj, pName)     Mutex_create_handle(pLockObj)


/*!
	\brief 	This function deletes a locking object.

	\param	pLockObj	-	pointer to the locking object control block

	\return upon successful deletion the function should return 0
			Otherwise, a negative value indicating the error code shall be returned
    \note       belongs to \ref configuration_sec
    \warning
*/
#define sl_LockObjDelete(pLockObj)                  MutexP_delete_handle(pLockObj)


/*!
	\brief 	This function locks a locking object.

	All other threads that call this function before this thread calls
	the osi_LockObjUnlock would be suspended

	\param	pLockObj	-	pointer to the locking object control block
	\param	Timeout		-	numeric value specifies the maximum number of mSec to
							stay suspended while waiting for the locking object
							Currently, the SimpleLink driver uses only two values:
								- OSI_WAIT_FOREVER
								- OSI_NO_WAIT


	\return upon successful reception of the locking object the function should return 0
			Otherwise, a negative value indicating the error code shall be returned
    \note       belongs to \ref configuration_sec
    \warning
*/
#define sl_LockObjLock(pLockObj,Timeout)          Mutex_lock(*(pLockObj))


/*!
	\brief 	This function unlock a locking object.

	\param	pLockObj	-	pointer to the locking object control block

	\return upon successful unlocking the function should return 0
			Otherwise, a negative value indicating the error code shall be returned
    \note       belongs to \ref configuration_sec
    \warning
*/
#define sl_LockObjUnlock(pLockObj)                   Mutex_unlock(*(pLockObj))


/*!
	\brief 	This function call the pEntry callback from a different context

	\param	pEntry		-	pointer to the entry callback function

	\param	pValue		- 	pointer to any type of memory structure that would be
							passed to pEntry callback from the execution thread.

	\param	flags		- 	execution flags - reserved for future usage

	\return upon successful registration of the spawn the function should return 0
			(the function is not blocked till the end of the execution of the function
			and could be returned before the execution is actually completed)
			Otherwise, a negative value indicating the error code shall be returned
    \note       belongs to \ref configuration_sec
    
    \warning                User must implement it's own 'os_Spawn' function.
*/
#define SL_PLATFORM_EXTERNAL_SPAWN

#ifdef SL_PLATFORM_EXTERNAL_SPAWN
extern  _i16 os_Spawn(P_OS_SPAWN_ENTRY pEntry, void *pValue, unsigned long flags);
#define sl_Spawn(pEntry,pValue,flags)       os_Spawn(pEntry,pValue,flags)
#endif

/*!
 *
 Close the Doxygen group.
 @}

 */
/*!
 ******************************************************************************

    \defgroup   configuration_mem_mgm             Configuration - Memory Management

    This section declare in which memory management model the SimpleLink driver
    will run:
        -# Static
        -# Dynamic

    This section IS NOT REQUIRED in case Static model is selected.

    The default memory model is Static


    @{

 *****************************************************************************
*/

/*!
    \brief      Defines whether the SimpleLink driver is working in dynamic
                memory model or not

                When defined, the SimpleLink driver use dynamic allocations
                if dynamic allocation is selected malloc and free functions
                must be retrieved

    \sa

    \note       belongs to \ref configuration_sec

    \warning
*/
/*
#define SL_MEMORY_MGMT_DYNAMIC 	1
#define SL_MEMORY_MGMT_STATIC  0

#define SL_MEMORY_MGMT  SL_MEMORY_MGMT_DYNAMIC
*/
#ifdef SL_MEMORY_MGMT_DYNAMIC

#ifdef SL_PLATFORM_MULTI_THREADED

/*!
    \brief
    \sa
    \note           belongs to \ref configuration_sec
    \warning
*/
#define sl_Malloc(Size)                                 mem_Malloc(Size)

/*!
    \brief
    \sa
    \note           belongs to \ref configuration_sec
    \warning
*/
#define sl_Free(pMem)                                   mem_Free(pMem)

#else
#include <stdlib.h>
/*!
    \brief
    \sa
    \note           belongs to \ref configuration_sec
    \warning        
*/
#define sl_Malloc(Size)                                 malloc(Size)

/*!
    \brief
    \sa
    \note           belongs to \ref configuration_sec
    \warning        
*/
#define sl_Free(pMem)                                   free(pMem)
#endif
                        
#endif

/*!

 Close the Doxygen group.
 @}

*/

/*!
 ******************************************************************************

    \defgroup       configuration_events      Configuration - Event Handlers

    This section includes the asynchronous event handlers routines

    porting ACTION:
        -define your routine as the value of this handler

    @{

 ******************************************************************************
 */



/*!
    \brief      Fatal Error async event for inspecting fatal error events.
				This event handles events/errors reported from the device/host driver
	
	\param[out]	pSlFatalErrorEvent
	
	\par
             Parameters:
			 
			 - <b> slFatalErrorEvent->Id = SL_DEVICE_EVENT_FATAL_DEVICE_ABORT </b>,
			 
			 - <b> slFatalErrorEvent->Id = SL_DEVICE_EVENT_FATAL_DRIVER_ABORT </b>,
			 
			 - <b> slFatalErrorEvent->Id = SL_DEVICE_EVENT_FATAL_NO_CMD_ACK </b>,
			
			 - <b> slFatalErrorEvent->Id = SL_DEVICE_EVENT_FATAL_SYNC_LOSS </b>,
			
			 - <b> slFatalErrorEvent->Id = SL_DEVICE_EVENT_FATAL_CMD_TIMEOUT </b>,
			

    \note       belongs to \ref configuration_sec

    \warning
*/

#define slcb_DeviceFatalErrorEvtHdlr      SimpleLinkFatalErrorEventHandler

/*!
    \brief      General async event for inspecting general events.
				This event handles events/errors reported from the device/host driver
    \sa

    \note       belongs to \ref configuration_sec

    \warning
*/

#define slcb_DeviceGeneralEvtHdlr		  SimpleLinkGeneralEventHandler

/*!
    \brief WLAN Async event handler
    
    \param[out]      pSlWlanEvent   pointer to SlWlanEvent_t data 
    
    \par
             Parameters:
             
             - <b>pSlWlanEvent->Event = SL_WLAN_CONNECT_EVENT </b>, STA or P2P client connection indication event
                 - pSlWlanEvent->EventData.STAandP2PModeWlanConnected main fields:
                      - ssid_name
                      - ssid_len
                      - bssid
                      - go_peer_device_name
                      - go_peer_device_name_len
                       
             - <b>pSlWlanEvent->Event = SL_WLAN_DISCONNECT_EVENT </b>, STA or P2P client disconnection event                          
                 - pSlWlanEvent->EventData.STAandP2PModeDisconnected main fields:
                      - ssid_name
                      - ssid_len
                      - reason_code

             - <b>pSlWlanEvent->Event = SL_WLAN_STA_CONNECTED_EVENT </b>, AP/P2P(Go) connected STA/P2P(Client)                  
                  - pSlWlanEvent->EventData.APModeStaConnected fields:
                      - go_peer_device_name
                      - mac
                      - go_peer_device_name_len
                      - wps_dev_password_id
                      - own_ssid:  relevant for event sta-connected only
                      - own_ssid_len:  relevant for event sta-connected only
                      
             - <b>pSlWlanEvent->Event = SL_WLAN_STA_DISCONNECTED_EVENT </b>, AP/P2P(Go) disconnected STA/P2P(Client)                        
                  - pSlWlanEvent->EventData.APModestaDisconnected fields:
                      - go_peer_device_name
                      - mac
                      - go_peer_device_name_len
                      - wps_dev_password_id
                      - own_ssid:  relevant for event sta-connected only
                      - own_ssid_len:  relevant for event sta-connected only

             - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_COMPLETE_EVENT </b>                             
                  - pSlWlanEvent->EventData.smartConfigStartResponse fields:
                     - status
                     - ssid_len
                     - ssid
                     - private_token_len
                     - private_token
                     
             - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_STOP_EVENT </b>                 
                     - pSlWlanEvent->EventData.smartConfigStopResponse fields:       
                         - status
                         
             - <b>pSlWlanEvent->Event = SL_WLAN_P2P_DEV_FOUND_EVENT </b>         
                     - pSlWlanEvent->EventData.P2PModeDevFound fields:
                         - go_peer_device_name
                         - mac
                         - go_peer_device_name_len
                         - wps_dev_password_id
                         - own_ssid:  relevant for event sta-connected only
                         - own_ssid_len:  relevant for event sta-connected only
                         
             - <b>pSlWlanEvent->Event = SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT </b>                             
                      - pSlWlanEvent->EventData.P2PModeNegReqReceived fields
                          - go_peer_device_name
                          - mac
                          - go_peer_device_name_len
                          - wps_dev_password_id
                          - own_ssid:  relevant for event sta-connected only
                           
             - <b>pSlWlanEvent->Event = SL_WLAN_CONNECTION_FAILED_EVENT </b>, P2P only
                       - pSlWlanEvent->EventData.P2PModewlanConnectionFailure fields:
                           - status   

    \sa

    \note           belongs to \ref configuration_sec

    \warning
*/

#define slcb_WlanEvtHdlr                     SimpleLinkWlanEventHandler         


/*!
    \brief NETAPP Async event handler
    
    \param[out]      pSlNetApp   pointer to SlNetAppEvent_t data    
    
    \par
             Parameters:
              - <b>pSlWlanEvent->Event = SL_NETAPP_IPV4_IPACQUIRED_EVENT</b>, IPV4 acquired event
                  - pSlWlanEvent->EventData.ipAcquiredV4 fields:
                       - ip
                       - gateway
                       - dns
                           
              - <b>pSlWlanEvent->Event = SL_NETAPP_IP_LEASED_EVENT</b>, AP or P2P go dhcp lease event
                  - pSlWlanEvent->EventData.ipLeased  fields:
                       - ip_address
                       - lease_time
                       - mac

              - <b>pSlWlanEvent->Event = SL_NETAPP_IP_RELEASED_EVENT</b>, AP or P2P go dhcp ip release event
                   - pSlWlanEvent->EventData.ipReleased fields
                       - ip_address
                       - mac
                       - reason


    \sa

    \note           belongs to \ref configuration_sec

    \warning
*/

#define slcb_NetAppEvtHdlr              		SimpleLinkNetAppEventHandler              

/*!
    \brief HTTP server async event

    \param[out] pSlHttpServerEvent   pointer to SlHttpServerEvent_t
    \param[in] pSlHttpServerResponse pointer to SlHttpServerResponse_t

    \par
          Parameters: \n

          - <b>pSlHttpServerEvent->Event = SL_NETAPP_HTTPGETTOKENVALUE_EVENT</b>
             - pSlHttpServerEvent->EventData fields:
                 - httpTokenName
                     - data
                     - len
             - pSlHttpServerResponse->ResponseData fields:
                     - data
                     - len
             
          - <b>pSlHttpServerEvent->Event = SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT</b>
              - pSlHttpServerEvent->EventData.httpPostData fields:
                     - action
                     - token_name
                     - token_value                     
              - pSlHttpServerResponse->ResponseData fields:
                     - data
                     - len  


    \sa

    \note           belongs to \ref configuration_sec

    \warning
*/

#define slcb_NetAppHttpServerHdlr   SimpleLinkHttpServerEventHandler



/*!
    \brief          A handler for handling Netapp requests.
                    Netapp request types:
                    For HTTP server: GET / POST (future: PUT / DELETE)

	\param

	\param

    \sa

    \note           belongs to \ref porting_sec

    \warning
*/

#define slcb_NetAppRequestHdlr  SimpleLinkNetAppRequestEventHandler



/*!
    \brief          A handler for freeing the memory of the NetApp response.

	\param

	\param

    \sa

    \note           belongs to \ref porting_sec

    \warning
*/

#define slcb_NetAppRequestMemFree  SimpleLinkNetAppRequestMemFreeEventHandler



/*!
    \brief Socket Async event handler
    
    \param[out]      pSlSockEvent   pointer to SlSockEvent_t data 
    
    \par
             Parameters:\n
             - <b>pSlSockEvent->Event = SL_SOCKET_TX_FAILED_EVENT</b>
                 - pSlSockEvent->EventData fields:
                     - sd
                     - status
             - <b>pSlSockEvent->Event = SL_SOCKET_ASYNC_EVENT</b>
                - pSlSockEvent->EventData fields:
                     - sd
                     - type: SSL_ACCEPT  or RX_FRAGMENTATION_TOO_BIG or OTHER_SIDE_CLOSE_SSL_DATA_NOT_ENCRYPTED 
                     - val

    \sa

    \note           belongs to \ref configuration_sec

    \warning
*/

#define slcb_SockEvtHdlr         SimpleLinkSockEventHandler


/*!
    \brief Trigger Async event handler. If define, sl_Select operates only in trigger mode.
                           To disable trigger mode, handler should not be defined.

    \param[out]      pSlTriggerEvent   pointer to SlSockTriggerEvent_t data

    \par
             Parameters:\n
             - <b>pSlTriggerEvent->Event = SL_SOCKET_TRIGGER_EVENT_SELECT</b>
             - pSlTriggerEvent->EventData: Not in use


    \sa

    \note           belongs to \ref configuration_sec

    \warning
*/
#ifndef SL_PLATFORM_MULTI_THREADED
#define slcb_SocketTriggerEventHandler SimpleLinkSocketTriggerEventHandler
#endif
/*!

 Close the Doxygen group.
 @}

 */


#ifdef  __cplusplus
}
#endif // __cplusplus

#endif // __USER_H__
