/*******************************************************************************
*  Network Interface file
*
*  Summary:
*   Network Interface file for FreeRTOS-Plus-TCP stack
*
*  Description:
*   - Interfaces PIC32 to the FreeRTOS TCP/IP stack
*******************************************************************************/

/*******************************************************************************
*  File Name:  pic32_NetworkInterface.c
*  Copyright 2017 Microchip Technology Incorporated and its subsidiaries.
*
*  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
*******************************************************************************/
#ifndef PIC32_USE_ETHERNET
#include <sys/kmem.h>

#include "FreeRTOS.h"
#include "semphr.h"
#include "event_groups.h"
#include "FreeRTOS_IP.h"
#include "FreeRTOS_IP_Private.h"

#include "NetworkInterface.h"
#include "NetworkBufferManagement.h"
#include "peripheral/eth/plib_eth.h"

#include "system_config.h"
#include "system/console/sys_console.h"
#include "system/debug/sys_debug.h"
#include "system/command/sys_command.h"

#include "driver/ethmac/drv_ethmac.h"
#include "driver/miim/drv_miim.h"
#include "m2m_types.h"

#include "tcpip/tcpip.h"
#include "tcpip/src/tcpip_private.h"
#include "tcpip/src/link_list.h"
#include "wilc1000_task.h"

#include "NetworkConfig.h"


    #include "iot_wifi.h"

    /* local definitions and data */


    /* FreeRTOS implementation functions */
    BaseType_t xNetworkInterfaceInitialise( void )
    {
        WIFINetworkParams_t xNetworkParams;

        xNetworkParams.pcSSID = clientcredentialWIFI_SSID;
        xNetworkParams.ucSSIDLength = sizeof( clientcredentialWIFI_SSID );
        xNetworkParams.pcPassword = clientcredentialWIFI_PASSWORD;
        xNetworkParams.ucPasswordLength = sizeof( clientcredentialWIFI_PASSWORD );
        xNetworkParams.xSecurity = clientcredentialWIFI_SECURITY;
        xNetworkParams.cChannel = M2M_WIFI_CH_ALL; /* Scan all channels (255) */

        /*Turn  WiFi ON */
        if( WIFI_On() != eWiFiSuccess )
        {
            return pdFAIL;
        }

        /* Connect to the AP */
        if( WIFI_ConnectAP( &xNetworkParams ) != eWiFiSuccess )
        {
            return pdFAIL;
        }

        return pdPASS;
    }


    /*-----------------------------------------------------------*/

    BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescriptor,
                                        BaseType_t xReleaseAfterSend )
    {
        BaseType_t retRes = pdFALSE;

        if( ( pxDescriptor != 0 ) && ( pxDescriptor->pucEthernetBuffer != 0 ) && ( pxDescriptor->xDataLength != 0 ) )
        {
            /* There you go */
            if( WDRV_EXT_DataSend( pxDescriptor->xDataLength, pxDescriptor->pucEthernetBuffer ) == 0 )
            {
                retRes = pdTRUE;
            }

            /* The buffer has been sent so can be released. */
            if( xReleaseAfterSend != pdFALSE )
            {
                vReleaseNetworkBufferAndDescriptor( pxDescriptor );
            }
        }

        return retRes;
    }


    /************************************* Section: helper functions ************************************************** */
    /* */



    /************************************* Section: worker code ************************************************** */
    /* */

    void xNetworkFrameReceived( uint32_t len,
                                uint8_t const * const frame )
    {
        bool pktSuccess, pktLost;
        NetworkBufferDescriptor_t * pxNetworkBuffer = NULL;
        IPStackEvent_t xRxEvent = { eNetworkRxEvent, NULL };

        pktSuccess = pktLost = false;

        while( true )
        {
            if( eConsiderFrameForProcessing( frame ) != eProcessBuffer )
            {
                break;
            }

            /* get the network descriptor (no data buffer) to hold this packet */
            pxNetworkBuffer = pxGetNetworkBufferWithDescriptor( len, 0 );

            if( pxNetworkBuffer == NULL )
            {
                pktLost = true;
                break;
            }

            /* Set the actual packet length, in case a larger buffer was 
            returned. */
            pxNetworkBuffer->xDataLength = len;
            
            /* Copy the packet. */
            memcpy( pxNetworkBuffer->pucEthernetBuffer, frame, len );

            /* Send the data to the TCP/IP stack. */
            xRxEvent.pvData = ( void * ) pxNetworkBuffer;

            if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE )
            { /* failed */
                pktLost = true;
            }
            else
            { /* success */
                pktSuccess = true;
                iptraceNETWORK_INTERFACE_RECEIVE();
            }

            break;
        }

        if( !pktSuccess )
        { /* smth went wrong; nothing sent to the */
            if( pxNetworkBuffer != NULL )
            {
                pxNetworkBuffer->pucEthernetBuffer = 0;
                vReleaseNetworkBufferAndDescriptor( pxNetworkBuffer );
            }

            if( pktLost )
            {
                iptraceETHERNET_RX_EVENT_LOST();
            }
        }
    }

#endif /* #ifndef PIC32_USE_ETHERNET */
