Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Revision:
0:50cedd586816
Child:
15:5433f9d94cd7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simplelink/G_functions/fPtr_func.cpp	Wed Jun 24 09:54:16 2015 +0000
@@ -0,0 +1,1221 @@
+/*
+ *  - CC31xx/CC32xx Host Driver Implementation
+ *
+ * Copyright (C) 2014 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.
+ *
+*/
+
+#include "simplelink/cc3100_simplelink.h"
+
+#include "simplelink/cc3100.h"
+#include "simplelink/cc3100_driver.h"
+#include "simplelink/G_functions/fPtr_func.h"
+#include "simplelink/cc3100_nonos.h"
+#include "cli_uart.h"
+#include "Led_config.h"
+
+#include "cc3100_trace.h"
+#include "myBoardInit.h"
+    
+using namespace mbed_cc3100;
+
+#if (THIS_BOARD == Seeed_Arch_Max)       
+cc3100 _cc3100_(NC, NC, PD_12, PD_13, PD_11, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max  irq, nHib, cs, mosi, miso, sck
+#elif (THIS_BOARD == EA_MBED_LPC4088)
+cc3100 _cc3100_(p14, p15, p9, p10, p8, SPI(p5, p6, p7));//LPC4088  irq, nHib, cs, mosi, miso, sck
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+unsigned char POST_token[] = "__SL_P_ULD";
+unsigned char GET_token[]  = "__SL_G_ULD";
+
+
+#define PRINT_BUF_LEN    128
+extern int8_t print_buf[PRINT_BUF_LEN];
+
+#define LED_STRING              "LED"
+#define LED1_STRING             "LED1_"
+#define LED2_STRING             ",LED2_"
+#define LED_ON_STRING           "ON"
+#define LED_OFF_STRING          "OFF" 
+
+/* General Events handling*/
+#if defined (EXT_LIB_REGISTERED_GENERAL_EVENTS)
+
+typedef _SlEventPropogationStatus_e (*general_callback) (SlDeviceEvent_t *);
+
+static const general_callback  general_callbacks[] =
+{
+#ifdef SlExtLib1GeneralEventHandler
+    SlExtLib1GeneralEventHandler,
+#endif
+
+#ifdef SlExtLib2GeneralEventHandler
+    SlExtLib2GeneralEventHandler,
+#endif
+
+#ifdef SlExtLib3GeneralEventHandler
+    SlExtLib3GeneralEventHandler,
+#endif
+
+#ifdef SlExtLib4GeneralEventHandler
+    SlExtLib4GeneralEventHandler,
+#endif
+
+#ifdef SlExtLib5GeneralEventHandler
+    SlExtLib5GeneralEventHandler,
+#endif
+};
+
+#undef _SlDrvHandleGeneralEvents
+
+/********************************************************************
+  _SlDrvHandleGeneralEvents
+  Iterates through all the general(device) event handlers which are
+  registered by   the external libs/user application.
+*********************************************************************/
+void _SlDrvHandleGeneralEvents(SlDeviceEvent_t *slGeneralEvent)
+{
+    uint8_t i;
+
+    /* Iterate over all the extenal libs handlers */
+    for ( i = 0 ; i < sizeof(general_callbacks)/sizeof(general_callbacks[0]) ; i++ )
+    {
+        if (EVENT_PROPAGATION_BLOCK == general_callbacks[i](slGeneralEvent) )
+        {
+            /* exit immediately and do not call the user specific handler as well */
+            return;
+        }
+    }
+
+/* At last call the Application specific handler if registered */
+#ifdef sl_GeneralEvtHdlr
+    sl_GeneralEvtHdlr(slGeneralEvent);
+#endif
+
+}
+#endif
+
+
+
+/* WLAN Events handling*/
+
+#if defined (EXT_LIB_REGISTERED_WLAN_EVENTS)
+
+typedef _SlEventPropogationStatus_e (*wlan_callback) (SlWlanEvent_t *);
+
+static wlan_callback  wlan_callbacks[] =
+{
+#ifdef SlExtLib1WlanEventHandler
+        SlExtLib1WlanEventHandler,
+#endif
+
+#ifdef SlExtLib2WlanEventHandler
+        SlExtLib2WlanEventHandler,
+#endif
+
+#ifdef SlExtLib3WlanEventHandler
+        SlExtLib3WlanEventHandler,
+#endif
+
+#ifdef SlExtLib4WlanEventHandler
+        SlExtLib4WlanEventHandler,
+#endif
+
+#ifdef SlExtLib5WlanEventHandler
+        SlExtLib5WlanEventHandler,
+#endif
+};
+
+#undef _SlDrvHandleWlanEvents
+
+/***********************************************************
+  _SlDrvHandleWlanEvents
+  Iterates through all the wlan event handlers which are
+  registered by the external libs/user application.
+************************************************************/
+void _SlDrvHandleWlanEvents(SlWlanEvent_t *slWlanEvent)
+{
+    uint8_t i;
+
+    /* Iterate over all the extenal libs handlers */
+    for ( i = 0 ; i < sizeof(wlan_callbacks)/sizeof(wlan_callbacks[0]) ; i++ )
+    {
+        if ( EVENT_PROPAGATION_BLOCK == wlan_callbacks[i](slWlanEvent) )
+        {
+            /* exit immediately and do not call the user specific handler as well */
+            return;
+        }
+    }
+
+/* At last call the Application specific handler if registered */
+#ifdef sl_WlanEvtHdlr
+    sl_WlanEvtHdlr(slWlanEvent);
+#endif
+
+}
+#endif
+
+
+/* NetApp Events handling */
+#if defined (EXT_LIB_REGISTERED_NETAPP_EVENTS)
+
+typedef _SlEventPropogationStatus_e (*netApp_callback) (SlNetAppEvent_t *);
+
+static const netApp_callback  netApp_callbacks[] =
+{
+#ifdef SlExtLib1NetAppEventHandler
+     SlExtLib1NetAppEventHandler,
+#endif
+
+#ifdef SlExtLib2NetAppEventHandler
+     SlExtLib2NetAppEventHandler,
+#endif
+
+#ifdef SlExtLib3NetAppEventHandler
+     SlExtLib3NetAppEventHandler,
+#endif
+
+#ifdef SlExtLib4NetAppEventHandler
+     SlExtLib4NetAppEventHandler,
+#endif
+
+#ifdef SlExtLib5NetAppEventHandler
+     SlExtLib5NetAppEventHandler,
+#endif
+};
+
+#undef _SlDrvHandleNetAppEvents
+
+/************************************************************
+  _SlDrvHandleNetAppEvents
+  Iterates through all the net app event handlers which are
+  registered by   the external libs/user application.
+************************************************************/
+void _SlDrvHandleNetAppEvents(SlNetAppEvent_t *slNetAppEvent)
+{
+    uint8_t i;
+
+    /* Iterate over all the extenal libs handlers */
+    for ( i = 0 ; i < sizeof(netApp_callbacks)/sizeof(netApp_callbacks[0]) ; i++ )
+    {
+        if (EVENT_PROPAGATION_BLOCK == netApp_callbacks[i](slNetAppEvent) )
+        {
+            /* exit immediately and do not call the user specific handler as well */
+            return;
+        }
+    }
+
+/* At last call the Application specific handler if registered */
+#ifdef sl_NetAppEvtHdlr
+    sl_NetAppEvtHdlr(slNetAppEvent);
+#endif
+
+}
+#endif
+
+
+/* Http Server Events handling */
+#if defined (EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
+
+typedef _SlEventPropogationStatus_e (*httpServer_callback) (SlHttpServerEvent_t*, SlHttpServerResponse_t*);
+
+static const httpServer_callback  httpServer_callbacks[] =
+{
+#ifdef SlExtLib1HttpServerEventHandler
+        SlExtLib1HttpServerEventHandler,
+#endif
+
+#ifdef SlExtLib2HttpServerEventHandler
+        SlExtLib2HttpServerEventHandler,
+#endif
+
+#ifdef SlExtLib3HttpServerEventHandler
+        SlExtLib3HttpServerEventHandler,
+#endif
+
+#ifdef SlExtLib4HttpServerEventHandler
+        SlExtLib4HttpServerEventHandler,
+#endif
+
+#ifdef SlExtLib5HttpServerEventHandler
+      SlExtLib5HttpServerEventHandler,
+#endif
+};
+
+#undef _SlDrvHandleHttpServerEvents
+
+/*******************************************************************
+  _SlDrvHandleHttpServerEvents
+  Iterates through all the http server event handlers which are
+  registered by the external libs/user application.
+********************************************************************/
+void _SlDrvHandleHttpServerEvents(SlHttpServerEvent_t *slHttpServerEvent, SlHttpServerResponse_t *slHttpServerResponse)
+{
+    _u8 i;
+
+    /* Iterate over all the external libs handlers */
+    for ( i = 0 ; i < sizeof(httpServer_callbacks)/sizeof(httpServer_callbacks[0]) ; i++ )
+    {
+        if ( EVENT_PROPAGATION_BLOCK == httpServer_callbacks[i](slHttpServerEvent, slHttpServerResponse) )
+        {
+            /* exit immediately and do not call the user specific handler as well */
+            return;
+        }
+    }
+
+/* At last call the Application specific handler if registered */
+#ifdef sl_HttpServerCallback
+    sl_HttpServerCallback(slHttpServerEvent, slHttpServerResponse);
+#endif
+
+}
+#endif
+
+
+/* Socket Events */
+#if defined (EXT_LIB_REGISTERED_SOCK_EVENTS)
+
+typedef _SlEventPropogationStatus_e (*sock_callback) (SlSockEvent_t *);
+
+static const sock_callback  sock_callbacks[] =
+{
+#ifdef SlExtLib1SockEventHandler
+        SlExtLib1SockEventHandler,
+#endif
+
+#ifdef SlExtLib2SockEventHandler
+        SlExtLib2SockEventHandler,
+#endif
+
+#ifdef SlExtLib3SockEventHandler
+        SlExtLib3SockEventHandler,
+#endif
+
+#ifdef SlExtLib4SockEventHandler
+        SlExtLib4SockEventHandler,
+#endif
+
+#ifdef SlExtLib5SockEventHandler
+        SlExtLib5SockEventHandler,
+#endif
+};
+
+/*************************************************************
+  _SlDrvHandleSockEvents
+  Iterates through all the socket event handlers which are
+  registered by the external libs/user application.
+**************************************************************/
+void _SlDrvHandleSockEvents(SlSockEvent_t *slSockEvent)
+{
+    uint8_t i;
+
+    /* Iterate over all the external libs handlers */
+    for ( i = 0 ; i < sizeof(sock_callbacks)/sizeof(sock_callbacks[0]) ; i++ )
+    {
+        if ( EVENT_PROPAGATION_BLOCK == sock_callbacks[i](slSockEvent) )
+        {
+            /* exit immediately and do not call the user specific handler as well */
+            return;
+        }
+    }
+
+/* At last call the Application specific handler if registered */
+#ifdef sl_SockEvtHdlr
+    sl_SockEvtHdlr(slSockEvent);
+#endif
+
+}
+
+#endif   
+
+/*!
+    \brief This function handles ping report events
+
+    \param[in]      pPingReport holds the ping report statistics
+
+    \return         None
+
+    \note
+
+    \warning
+*/
+void SimpleLinkPingReport(SlPingReport_t *pPingReport)
+{
+    _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
+
+    if(pPingReport == NULL)
+        Uart_Write((uint8_t *)" [PING REPORT] NULL Pointer Error\r\n");
+
+    g_PingPacketsRecv = pPingReport->PacketsReceived;
+}
+
+
+/*******************************************************************************/
+/*   _sl_HandleAsync_Accept */
+/*******************************************************************************/
+#ifndef SL_TINY_EXT
+void _sl_HandleAsync_Accept(void *pVoidBuf)
+{
+    _SocketAddrResponse_u *pMsgArgs = (_SocketAddrResponse_u *)_SL_RESP_ARGS_START(pVoidBuf);
+
+    _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
+
+    VERIFY_PROTOCOL(( pMsgArgs->IpV4.sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS);
+    VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
+
+    memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,sizeof(_SocketAddrResponse_u));
+    _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
+
+    _cc3100_._driver._SlDrvProtectionObjUnLock();
+    return;
+}
+
+/*******************************************************************************/
+/*   _sl_HandleAsync_Connect */
+/*******************************************************************************/
+void _sl_HandleAsync_Connect(void *pVoidBuf)
+{
+    _SocketResponse_t *pMsgArgs = (_SocketResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
+
+    _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
+
+    VERIFY_PROTOCOL((pMsgArgs->sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS);
+    VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
+
+    ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->sd = pMsgArgs->sd;
+    ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->statusOrLen = pMsgArgs->statusOrLen;
+
+    _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
+    _cc3100_._driver._SlDrvProtectionObjUnLock();
+    return;
+}
+
+/*******************************************************************************/
+/*   _sl_HandleAsync_Select */
+/*******************************************************************************/
+void _sl_HandleAsync_Select(void *pVoidBuf)
+{
+    _SelectAsyncResponse_t     *pMsgArgs   = (_SelectAsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
+
+    _cc3100_._driver._SlDrvProtectionObjLockWaitForever();    
+
+    VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
+
+    memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_SelectAsyncResponse_t));
+
+    _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
+    _cc3100_._driver._SlDrvProtectionObjUnLock();
+
+    return;
+}
+
+#endif
+
+/******************************************************************************/
+/*  _sl_HandleAsync_DnsGetHostByName */
+/******************************************************************************/
+void _sl_HandleAsync_DnsGetHostByName(void *pVoidBuf)
+{
+    _GetHostByNameIPv4AsyncResponse_t *pMsgArgs = (_GetHostByNameIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
+
+    _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
+
+    VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
+
+    /*IPv6 */
+    if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) {
+        memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv6AsyncResponse_t));
+    }
+    /*IPv4 */
+    else 
+    {
+        memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv4AsyncResponse_t));
+    }
+    
+    _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
+    _cc3100_._driver._SlDrvProtectionObjUnLock();
+    
+    return;
+}
+
+/******************************************************************************/
+
+/******************************************************************************
+    _sl_HandleAsync_DnsGetHostByService
+
+    CALLER          NWP - Async event on sl_DnsGetHostByService with IPv4 Family
+
+
+    DESCRIPTION:
+
+                    Async event on sl_DnsGetHostByService command with IPv4 Family.
+                    Return service attributes like IP address, port and text according to service name.
+                    The user sets a service name Full/Part (see example below), and should get the:
+                    1. IP of the service
+                    2. The port of service.
+                    3. The text of service.
+
+                    Hence it can make a connection to the specific service and use it.
+                    It is similar to get host by name method.
+
+                    It is done by a single shot query with PTR type on the service name.
+
+
+
+                    Note:
+                    1. The return's attributes are belonged to first service that is found.
+                    It can be other services with the same service name will response to
+                    the query. The results of these responses are saved in the peer cache of the NWP, and
+                    should be read by another API.
+
+
+        PARAMETERS:
+
+                  pVoidBuf - is point to opcode of the event.
+                  it contains the outputs that are given to the user
+
+                  outputs description:
+
+                   1.out_pAddr[]                    - output: Contain the IP address of the service.
+                   2.out_pPort                      - output: Contain the port of the service.
+                   3.inout_TextLen                  - Input:  Contain the max length of the text that the user wants to get.
+                                                              it means that if the test of service is bigger that its value than
+                                                              the text is cut to inout_TextLen value.
+                                                      Output: Contain the length of the text that is returned. Can be full text or part
+                                                              of the text (see above).
+
+                   4.out_pText                      - Contain the text of the service (full or part see above- inout_TextLen description).
+
+  *
+
+
+    RETURNS:        success or fail.
+
+******************************************************************************/
+#ifndef SL_TINY_EXT
+void _sl_HandleAsync_DnsGetHostByService(void *pVoidBuf)
+{
+    _GetHostByServiceAsyncResponse_t* Res;
+    uint16_t TextLen;
+    uint16_t UserTextLen;
+
+    /*pVoidBuf - is point to opcode of the event.*/
+
+    /*set pMsgArgs to point to the attribute of the event.*/
+    _GetHostByServiceIPv4AsyncResponse_t *pMsgArgs = (_GetHostByServiceIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
+
+    VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs);
+
+    /*IPv6*/
+    if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) {
+        return;
+    }
+    /*IPv4*/
+    else {
+        /*************************************************************************************************
+
+        1. Copy the attribute part of the evnt to the attribute part of the response
+        memcpy(g_pCB->GetHostByServiceCB.pAsyncRsp, pMsgArgs, sizeof(_GetHostByServiceIPv4AsyncResponse_t));
+
+        set to TextLen the text length of the service.*/
+        TextLen = pMsgArgs->TextLen;
+
+        /*Res pointed to mDNS global object struct */
+        Res = (_GetHostByServiceAsyncResponse_t*)g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs;
+
+
+
+        /*It is 4 bytes so we avoid from memcpy*/
+        Res->out_pAddr[0]   = pMsgArgs->Address;
+        Res->out_pPort[0]   = pMsgArgs->Port;
+        Res->Status         = pMsgArgs->Status;
+
+        /*set to TextLen the text length of the user (input fromthe user).*/
+        UserTextLen = Res->inout_TextLen[0];
+
+        /*Cut the service text if the user requested for smaller text.*/
+        UserTextLen = (TextLen <= UserTextLen) ? TextLen : UserTextLen;
+        Res->inout_TextLen[0] = UserTextLen ;
+
+        /**************************************************************************************************
+
+        2. Copy the payload part of the evnt (the text) to the payload part of the response
+        the lenght of the copy is according to the text length in the attribute part. */
+
+
+        memcpy(Res->out_pText,
+                  (int8_t *)(& pMsgArgs[1]),   /* & pMsgArgs[1] -> 1st byte after the fixed header = 1st byte of variable text.*/
+                  UserTextLen);
+
+
+        /**************************************************************************************************/
+        _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
+        return;
+    }
+}
+#endif
+
+/*****************************************************************************/
+/*  _sl_HandleAsync_PingResponse */
+/*****************************************************************************/
+#ifndef SL_TINY_EXT
+void _sl_HandleAsync_PingResponse(void *pVoidBuf)
+{
+    _PingReportResponse_t *pMsgArgs  = (_PingReportResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
+    SlPingReport_t pingReport;
+
+    if(pPingCallBackFunc) {
+        _cc3100_._netapp.CopyPingResultsToReport(pMsgArgs,&pingReport);
+        pPingCallBackFunc(&pingReport);
+    } else {
+
+        _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
+        VERIFY_SOCKET_CB(NULL != g_pCB->PingCB.PingAsync.pAsyncRsp);
+
+        if (NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs) {
+            memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_PingReportResponse_t));
+            _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
+        }
+        _cc3100_._driver._SlDrvProtectionObjUnLock();
+    }
+    return;
+}
+#endif
+
+/* ******************************************************************************/
+/*  _SlDrvMsgReadSpawnCtx                                                       */
+/* ******************************************************************************/
+_SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue)
+{
+
+#ifdef SL_POLLING_MODE_USED
+    int16_t retCode = OSI_OK;
+    /*  for polling based systems */
+    do {
+        retCode = _cc3100_._nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, 0);
+        if ( OSI_OK != retCode ) {
+            if (TRUE == g_pCB->IsCmdRespWaited) {
+                OSI_RET_OK_CHECK( _cc3100_._nonos.sl_SyncObjSignal(&g_pCB->CmdSyncObj) );
+                return SL_RET_CODE_OK;
+            }
+        }
+
+    } while (OSI_OK != retCode);
+
+#else 
+#ifndef SL_PLATFORM_MULTI_THREADED
+    _cc3100_._driver._SlDrvObjLockWaitForever(&g_pCB->GlobalLockObj); 
+//    OSI_RET_OK_CHECK(_cc3100_._nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, SL_OS_WAIT_FOREVER) );
+#else    
+    OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->GlobalLockObj, SL_OS_WAIT_FOREVER) );
+#endif    
+#endif    
+    g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;/*  buffer must be allocated by _SlDrvMsgRead */
+    g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler= NULL;
+    g_pCB->FunctionParams.AsyncExt.RxMsgClass = CMD_RESP_CLASS;/* init to illegal value and verify it's overwritten with the valid one */
+
+    /*  Messages might have been read by CmdResp context. Therefore after */
+    /*  getting LockObj, check again where the Pending Rx Msg is still present. */
+    if(FALSE == (_cc3100_._driver._SL_PENDING_RX_MSG(g_pCB))) {
+#ifndef SL_PLATFORM_MULTI_THREADED
+        _cc3100_._driver._SlDrvObjUnLock(&g_pCB->GlobalLockObj);       
+//        OSI_RET_OK_CHECK(_cc3100_._nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj));
+#else        
+        OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->GlobalLockObj));
+#endif        
+        return SL_RET_CODE_OK;
+    }
+   
+    VERIFY_RET_OK(_cc3100_._driver._SlDrvMsgRead());
+
+    g_pCB->RxDoneCnt++;
+
+    switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass) {
+        case ASYNC_EVT_CLASS:
+            /*  If got here and protected by LockObj a message is waiting  */
+            /*  to be read */
+            VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
+
+            _cc3100_._driver._SlAsyncEventGenericHandler();
+
+#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC)
+            g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
+#else
+            free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
+#endif
+            break;
+        case DUMMY_MSG_CLASS:
+        case RECV_RESP_CLASS:
+            /* These types are legal in this context. Do nothing */
+            break;
+        case CMD_RESP_CLASS:
+            /* Command response is illegal in this context. */
+            /* No 'break' here: Assert! */
+        default:
+            VERIFY_PROTOCOL(0);
+    }
+#ifndef SL_PLATFORM_MULTI_THREADED
+    _cc3100_._driver._SlDrvObjUnLock(&g_pCB->GlobalLockObj);
+//    OSI_RET_OK_CHECK(_cc3100_._nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj));
+#else    
+    OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->GlobalLockObj));
+#endif    
+    return(SL_RET_CODE_OK);   
+
+}
+
+/***************************************************************************
+_sl_HandleAsync_Stop - handles stop signalling to
+a waiting object
+****************************************************************************/
+void _sl_HandleAsync_Stop(void *pVoidBuf)
+{
+    _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
+
+    VERIFY_SOCKET_CB(NULL != g_pCB->StopCB.pAsyncRsp);
+
+    _cc3100_._driver._SlDrvProtectionObjLockWaitForever();
+
+    memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_BasicResponse_t));
+    _cc3100_._driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
+    _cc3100_._driver._SlDrvProtectionObjUnLock();
+    return;
+}
+
+/******************************************************************************
+_SlDrvDeviceEventHandler - handles internally device async events
+******************************************************************************/
+void _SlDrvDeviceEventHandler(void *pArgs)
+{
+    _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs;
+   
+    switch(pHdr->GenHeader.Opcode) {
+        case SL_OPCODE_DEVICE_INITCOMPLETE:
+            _cc3100_._sl_HandleAsync_InitComplete(pHdr);
+            
+            break;
+        case SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE:
+            _sl_HandleAsync_Stop(pHdr);
+            
+            break;
+        
+
+        case SL_OPCODE_DEVICE_ABORT:
+            {
+#if defined (sl_GeneralEvtHdlr) || defined(EXT_LIB_REGISTERED_GENERAL_EVENTS)
+                SlDeviceEvent_t      devHandler;
+                devHandler.Event = SL_DEVICE_ABORT_ERROR_EVENT; 
+                devHandler.EventData.deviceReport.AbortType = *((uint32_t*)pArgs + 2);
+                devHandler.EventData.deviceReport.AbortData = *((uint32_t*)pArgs + 3);
+                _SlDrvHandleGeneralEvents(&devHandler);
+#endif      
+            }
+        break;    
+        case  SL_OPCODE_DEVICE_DEVICEASYNCFATALERROR:
+#if defined (sl_GeneralEvtHdlr) || defined(EXT_LIB_REGISTERED_GENERAL_EVENTS)
+        {
+            _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pHdr);
+            SlDeviceEvent_t devHandler;
+            devHandler.Event = SL_DEVICE_FATAL_ERROR_EVENT;
+            devHandler.EventData.deviceEvent.status = pMsgArgs->status & 0xFF;
+            devHandler.EventData.deviceEvent.sender = (SlErrorSender_e)((pMsgArgs->status >> 8) & 0xFF);
+            _SlDrvHandleGeneralEvents(&devHandler);
+        }
+#endif
+        break;
+        default:
+            SL_ERROR_TRACE2(MSG_306, "ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
+            //printf("ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
+            
+    }
+}
+
+/*****************************************************************************/
+/* _SlDrvNetAppEventHandler */
+/*****************************************************************************/
+void _SlDrvNetAppEventHandler(void *pArgs)
+{
+    _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs;
+#if defined(sl_HttpServerCallback) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
+    SlHttpServerEvent_t     httpServerEvent;    
+    SlHttpServerResponse_t  httpServerResponse;
+#endif
+    switch(pHdr->GenHeader.Opcode) {
+        case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE:
+        case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE_V6:
+            _sl_HandleAsync_DnsGetHostByName(pArgs);
+            break;
+#ifndef SL_TINY_EXT             
+        case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE:
+        case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE_V6:
+            _sl_HandleAsync_DnsGetHostByService(pArgs);
+            break;
+        case SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE:
+            _sl_HandleAsync_PingResponse(pArgs);
+            break;
+#endif
+
+#if defined(sl_HttpServerCallback) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)            
+        case SL_OPCODE_NETAPP_HTTPGETTOKENVALUE: {
+
+            uint8_t *pTokenName;
+            slHttpServerData_t Token_value;
+            sl_NetAppHttpServerGetToken_t *httpGetToken = (sl_NetAppHttpServerGetToken_t *)_SL_RESP_ARGS_START(pHdr);
+            pTokenName = (uint8_t *)((sl_NetAppHttpServerGetToken_t *)httpGetToken + 1);
+
+            httpServerResponse.Response = SL_NETAPP_HTTPSETTOKENVALUE;
+            httpServerResponse.ResponseData.token_value.len = MAX_TOKEN_VALUE_LEN;
+
+            /* Reuse the async buffer for getting the token value response from the user */
+            httpServerResponse.ResponseData.token_value.data = (uint8_t *)_SL_RESP_ARGS_START(pHdr) + MAX_TOKEN_NAME_LEN;
+            httpServerEvent.Event = SL_NETAPP_HTTPGETTOKENVALUE_EVENT;
+
+            httpServerEvent.EventData.httpTokenName.len = httpGetToken->token_name_len;
+            httpServerEvent.EventData.httpTokenName.data = pTokenName;
+
+            Token_value.token_name =  pTokenName;
+
+            _SlDrvHandleHttpServerEvents (&httpServerEvent, &httpServerResponse);
+
+            Token_value.value_len = httpServerResponse.ResponseData.token_value.len;
+            Token_value.name_len = httpServerEvent.EventData.httpTokenName.len;
+
+            Token_value.token_value = httpServerResponse.ResponseData.token_value.data;
+
+
+            _cc3100_._netapp.sl_NetAppSendTokenValue(&Token_value);
+#endif
+        }
+        break;
+
+        case SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE: {
+#ifdef sl_HttpServerCallback
+            uint8_t *pPostParams;
+
+            sl_NetAppHttpServerPostToken_t *httpPostTokenArgs = (sl_NetAppHttpServerPostToken_t *)_SL_RESP_ARGS_START(pHdr);
+            pPostParams = (uint8_t *)((sl_NetAppHttpServerPostToken_t *)httpPostTokenArgs + 1);
+
+            httpServerEvent.Event = SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT;
+
+            httpServerEvent.EventData.httpPostData.action.len = httpPostTokenArgs->post_action_len;
+            httpServerEvent.EventData.httpPostData.action.data = pPostParams;
+            pPostParams+=httpPostTokenArgs->post_action_len;
+
+            httpServerEvent.EventData.httpPostData.token_name.len = httpPostTokenArgs->token_name_len;
+            httpServerEvent.EventData.httpPostData.token_name.data = pPostParams;
+            pPostParams+=httpPostTokenArgs->token_name_len;
+
+            httpServerEvent.EventData.httpPostData.token_value.len = httpPostTokenArgs->token_value_len;
+            httpServerEvent.EventData.httpPostData.token_value.data = pPostParams;
+
+            httpServerResponse.Response = SL_NETAPP_RESPONSE_NONE;
+
+
+            _SlDrvHandleHttpServerEvents (&httpServerEvent, &httpServerResponse);
+        }
+        break;
+#endif        
+        default:
+            SL_ERROR_TRACE2(MSG_305, "ASSERT: _SlDrvNetAppEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
+            VERIFY_PROTOCOL(0);
+    }
+}
+
+/*
+ * ASYNCHRONOUS EVENT HANDLERS -- Start
+ */
+
+/*!
+    \brief This function handles WLAN events
+
+    \param[in]      pWlanEvent is the event passed to the handler
+
+    \return         None
+
+    \note
+
+    \warning
+*/
+#if (defined(sl_WlanEvtHdlr))
+void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent)
+{
+    unsigned char  g_ucConnectionSSID[32+1]; //Connection SSID
+    unsigned char  g_ucConnectionBSSID[6]; //Connection BSSID
+    
+    if(pWlanEvent == NULL)
+        Uart_Write((uint8_t *)" [WLAN EVENT] NULL Pointer Error \n\r");
+
+    switch(pWlanEvent->Event) {
+        case SL_WLAN_CONNECT_EVENT: {
+            _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION);
+            
+            // Copy new connection SSID and BSSID to global parameters
+            memcpy(g_ucConnectionSSID,pWlanEvent->EventData.
+                   STAandP2PModeWlanConnected.ssid_name,
+                   pWlanEvent->EventData.STAandP2PModeWlanConnected.ssid_len);
+            memcpy(g_ucConnectionBSSID,
+                   pWlanEvent->EventData.STAandP2PModeWlanConnected.bssid,
+                   SL_BSSID_LENGTH);
+            memset(print_buf, 0x00, PRINT_BUF_LEN);
+            sprintf((char*) print_buf, "[WLAN EVENT] STA Connected to the AP: %s ,""BSSID: %x:%x:%x:%x:%x:%x\n\r",
+                       g_ucConnectionSSID,g_ucConnectionBSSID[0],
+                       g_ucConnectionBSSID[1],g_ucConnectionBSSID[2],
+                       g_ucConnectionBSSID[3],g_ucConnectionBSSID[4],
+                       g_ucConnectionBSSID[5]);
+            Uart_Write((uint8_t *) print_buf);           
+            /*
+             * Information about the connected AP (like name, MAC etc) will be
+             * available in 'slWlanConnectAsyncResponse_t' - Applications
+             * can use it if required
+             *
+             * slWlanConnectAsyncResponse_t *pEventData = NULL;
+             * pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected;
+             *
+             */
+        }
+        break;
+
+        case SL_WLAN_DISCONNECT_EVENT: {
+            slWlanConnectAsyncResponse_t*  pEventData = NULL;
+
+            _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION);
+            _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED);
+
+            pEventData = &pWlanEvent->EventData.STAandP2PModeDisconnected;
+
+            /* If the user has initiated 'Disconnect' request, 'reason_code' is SL_USER_INITIATED_DISCONNECTION */
+            if(SL_USER_INITIATED_DISCONNECTION == pEventData->reason_code) {
+                memset(print_buf, 0x00, PRINT_BUF_LEN);
+                sprintf((char*) print_buf, "[WLAN EVENT]Device disconnected from the AP: %s,"
+                    "BSSID: %x:%x:%x:%x:%x:%x on application's request \n\r",
+                           g_ucConnectionSSID,g_ucConnectionBSSID[0],
+                           g_ucConnectionBSSID[1],g_ucConnectionBSSID[2],
+                           g_ucConnectionBSSID[3],g_ucConnectionBSSID[4],
+                           g_ucConnectionBSSID[5]);
+                Uart_Write((uint8_t *) print_buf);
+            } else {
+                memset(print_buf, 0x00, PRINT_BUF_LEN);
+                sprintf((char*) print_buf, "[WLAN ERROR]Device disconnected from the AP AP: %s,"
+                        "BSSID: %x:%x:%x:%x:%x:%x on an ERROR..!! \n\r",
+                           g_ucConnectionSSID,g_ucConnectionBSSID[0],
+                           g_ucConnectionBSSID[1],g_ucConnectionBSSID[2],
+                           g_ucConnectionBSSID[3],g_ucConnectionBSSID[4],
+                           g_ucConnectionBSSID[5]);
+                Uart_Write((uint8_t *) print_buf);            
+            }
+            memset(g_ucConnectionSSID,0,sizeof(g_ucConnectionSSID));
+            memset(g_ucConnectionBSSID,0,sizeof(g_ucConnectionBSSID));
+        }
+        break;
+
+        case SL_WLAN_STA_CONNECTED_EVENT: {
+            _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED);
+        }
+        break;
+
+        case SL_WLAN_STA_DISCONNECTED_EVENT: {
+            _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED);
+            _cc3100_.CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED);
+        }
+        break;
+
+        default: {
+            memset(print_buf, 0x00, PRINT_BUF_LEN);
+            sprintf((char*) print_buf, "[WLAN EVENT] Unexpected event [0x%x]\n\r",pWlanEvent->Event);
+            Uart_Write((uint8_t *) print_buf); 
+        }
+        break;
+    }
+}
+#endif
+
+/*!
+    \brief This function handles events for IP address acquisition via DHCP
+           indication
+
+    \param[in]      pNetAppEvent is the event passed to the handler
+
+    \return         None
+
+    \note
+
+    \warning
+*/
+#if (defined(sl_NetAppEvtHdlr))
+void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent)
+{
+    
+    if(pNetAppEvent == NULL){
+        Uart_Write((uint8_t *)" [NETAPP EVENT] NULL Pointer Error \n\r");
+    }
+    
+    switch(pNetAppEvent->Event) {
+        case SL_NETAPP_IPV4_IPACQUIRED_EVENT: {
+            SlIpV4AcquiredAsync_t *pEventData = NULL;
+            _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED);            
+            pEventData = &pNetAppEvent->EventData.ipAcquiredV4;           
+            g_GatewayIP = pEventData->gateway;
+            
+            memset(print_buf, 0x00, PRINT_BUF_LEN);
+            sprintf((char*) print_buf, "[NETAPP EVENT] IP Acquired: IP=%d.%d.%d.%d , ""Gateway=%d.%d.%d.%d\n\r",
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,3),
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,2),
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,1),
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,0),
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,3),
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,2),
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,1),
+            _cc3100_._netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,0));
+            Uart_Write((uint8_t *) print_buf);
+        }
+        break;
+
+        case SL_NETAPP_IP_LEASED_EVENT: {           
+            g_StationIP = pNetAppEvent->EventData.ipLeased.ip_address;          
+            _cc3100_.SET_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED);
+                       
+        }
+        break;
+
+        default: {
+            memset(print_buf, 0x00, PRINT_BUF_LEN);
+            sprintf((char*) print_buf, "[NETAPP EVENT] Unexpected event [0x%x] \n\r",pNetAppEvent->Event);
+            Uart_Write((uint8_t *) print_buf);
+        }
+        break;
+    }
+}
+#endif 
+
+/*!
+    \brief This function handles socket events indication
+
+    \param[in]      pSock is the event passed to the handler
+
+    \return         None
+*/
+#if (defined(sl_SockEvtHdlr))
+void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
+{
+    if(pSock == NULL)
+        Uart_Write((uint8_t *)" [SOCK EVENT] NULL Pointer Error \n\r");
+    
+    switch( pSock->Event )
+    {
+        case SL_SOCKET_TX_FAILED_EVENT:
+            /*
+             * TX Failed
+             *
+             * Information about the socket descriptor and status will be
+             * available in 'SlSockEventData_t' - Applications can use it if
+             * required
+             *
+             * SlSockEventData_t *pEventData = NULL;
+             * pEventData = & pSock->EventData;
+             */
+            
+            switch( pSock->socketAsyncEvent.SockTxFailData.status )
+            {
+                case SL_ECLOSE:
+                    Uart_Write((uint8_t *)" [SOCK EVENT] Close socket operation, failed to transmit all queued packets\n\r");
+                    break;
+                default:
+                     memset(print_buf, 0x00, PRINT_BUF_LEN);
+                     sprintf((char*) print_buf, "[SOCK ERROR] - TX FAILED : socket %d , reason""(%d) \n\n", pSock->socketAsyncEvent.SockTxFailData.sd, pSock->socketAsyncEvent.SockTxFailData.status);           
+                     Uart_Write((uint8_t *) print_buf);
+                 
+                    break;
+            }
+            break;
+
+        default:
+            memset(print_buf, 0x00, PRINT_BUF_LEN);
+            sprintf((char*) print_buf, "[SOCK EVENT] - Unexpected Event [%x0x]\n\n",pSock->Event);
+            Uart_Write((uint8_t *) print_buf);
+            break;
+    }
+}
+#endif
+
+/*!
+    \brief This function handles callback for the HTTP server events
+
+    \param[in]      pHttpEvent - Contains the relevant event information
+    \param[in]      pHttpResponse - Should be filled by the user with the
+                    relevant response information
+
+    \return         None
+
+    \note
+
+    \warning
+*/
+#if (defined(sl_HttpServerCallback))
+void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pSlHttpServerEvent, SlHttpServerResponse_t *pSlHttpServerResponse)
+{
+     unsigned char strLenVal = 0;
+
+    if(!pSlHttpServerEvent || !pSlHttpServerResponse)
+    {
+        return;
+    }
+    
+    switch (pSlHttpServerEvent->Event)
+    {
+        case SL_NETAPP_HTTPGETTOKENVALUE_EVENT:
+        {
+          unsigned char status, *ptr;
+
+          ptr = pSlHttpServerResponse->ResponseData.token_value.data;
+          pSlHttpServerResponse->ResponseData.token_value.len = 0;
+          if(memcmp(pSlHttpServerEvent->EventData.httpTokenName.data, GET_token,
+                    strlen((const char *)GET_token)) == 0)
+          {
+            status = GPIO_IF_LedStatus(MCU_RED_LED_GPIO);
+            strLenVal = strlen(LED1_STRING);
+            memcpy(ptr, LED1_STRING, strLenVal);
+            ptr += strLenVal;
+            pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
+            if(status & 0x01)
+            {
+              strLenVal = strlen(LED_ON_STRING);
+              memcpy(ptr, LED_ON_STRING, strLenVal);
+              ptr += strLenVal;
+              pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
+            }
+            else
+            {
+              strLenVal = strlen(LED_OFF_STRING);
+              memcpy(ptr, LED_OFF_STRING, strLenVal);
+              ptr += strLenVal;
+              pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
+            }
+            status = GPIO_IF_LedStatus(MCU_GREEN_LED_GPIO);
+            strLenVal = strlen(LED2_STRING);
+            memcpy(ptr, LED2_STRING, strLenVal);
+            ptr += strLenVal;
+            pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
+            if(status & 0x01)
+            {
+              strLenVal = strlen(LED_ON_STRING);
+              memcpy(ptr, LED_ON_STRING, strLenVal);
+              ptr += strLenVal;
+              pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
+            }
+            else
+            {
+              strLenVal = strlen(LED_OFF_STRING);
+              memcpy(ptr, LED_OFF_STRING, strLenVal);
+              ptr += strLenVal;
+              pSlHttpServerResponse->ResponseData.token_value.len += strLenVal;
+            }
+            *ptr = '\0';
+          }
+
+        }
+        break;
+
+        case SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT:
+        {
+          unsigned char led;
+          unsigned char *ptr = pSlHttpServerEvent->EventData.httpPostData.token_name.data;
+
+          if(memcmp(ptr, POST_token, strlen((const char *)POST_token)) == 0)
+          {
+            ptr = pSlHttpServerEvent->EventData.httpPostData.token_value.data;
+            strLenVal = strlen(LED_STRING);
+            if(memcmp(ptr, LED_STRING, strLenVal) != 0)
+              break;
+            ptr += strLenVal;
+            led = *ptr;
+            strLenVal = strlen(LED_ON_STRING);
+            ptr += strLenVal;
+            if(led == '1')
+            {
+              if(memcmp(ptr, LED_ON_STRING, strLenVal) == 0)
+              {
+                      GPIO_IF_LedOn(MCU_RED_LED_GPIO);
+              }
+              else
+              {
+                      GPIO_IF_LedOff(MCU_RED_LED_GPIO);
+              }
+            }
+            else if(led == '2')
+            {
+              if(memcmp(ptr, LED_ON_STRING, strLenVal) == 0)
+              {
+                      GPIO_IF_LedOn(MCU_GREEN_LED_GPIO);
+              }
+              else
+              {
+                      GPIO_IF_LedOff(MCU_GREEN_LED_GPIO);
+              }
+            }
+
+          }
+        }
+          break;
+        default:
+          break;
+    }
+}
+#endif
+/*!
+    \brief This function handles general error events indication
+
+    \param[in]      pDevEvent is the event passed to the handler
+
+    \return         None
+*/
+#if (defined(sl_GeneralEvtHdlr))
+void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent)
+{
+    /*
+     * Most of the general errors are not FATAL are are to be handled
+     * appropriately by the application
+     */
+    memset(print_buf, 0x00, PRINT_BUF_LEN);
+    sprintf((char*) print_buf, "[GENERAL EVENT] - ID=[%d] Sender=[%d]\n\n", pDevEvent->EventData.deviceEvent.status, pDevEvent->EventData.deviceEvent.sender); 
+    Uart_Write((uint8_t *) print_buf);
+}
+#endif
+
+#ifdef  __cplusplus
+}
+#endif /*  __cplusplus */
+
+//}//namespace