Update revision to use TI's mqtt and Freertos.

Dependencies:   mbed client server

Fork of cc3100_Test_mqtt_CM3 by David Fletcher

Revision:
3:a8c249046181
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simplelink_V2/cc3100.h	Thu Sep 03 14:02:37 2015 +0000
@@ -0,0 +1,827 @@
+/*
+ * device.h - 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.
+ *
+*/
+
+#ifndef DEVICE_H_
+#define DEVICE_H_
+
+/*****************************************************************************/
+/* Include files                                                             */
+/*****************************************************************************/
+#include "mbed.h"
+#include "cc3100_simplelink.h"
+#include "cc3100_driver.h"
+#include "cc3100_wlan_rx_filters.h"
+
+#include "cc3100_spi.h"
+#include "cc3100_netcfg.h"
+
+namespace mbed_cc3100 {
+
+/*!
+
+    \addtogroup device
+    @{
+
+*/
+    const int16_t ROLE_UNKNOWN_ERR          =            -1;
+
+    const uint16_t   MAX_BUFF_SIZE =  1460;
+    extern uint32_t  g_PingPacketsRecv;
+    extern uint32_t  g_GatewayIP;
+    extern uint32_t  g_StationIP;
+    extern uint32_t  g_DestinationIP;
+    extern uint32_t  g_BytesReceived; // variable to store the file size 
+    extern uint32_t  g_Status;
+    extern uint8_t   g_buff[MAX_BUFF_SIZE+1];
+    extern int32_t   g_SockID;
+
+
+/* File on the serial flash */
+#define FILE_NAME "cc3000_module.pdf"
+#define HOST_NAME       "www.ti.com"
+
+#define HTTP_FILE_NOT_FOUND    "404 Not Found" /* HTTP file not found response */
+#define HTTP_STATUS_OK         "200 OK"  /* HTTP status ok response */
+#define HTTP_CONTENT_LENGTH    "Content-Length:"  /* HTTP content length header */
+#define HTTP_TRANSFER_ENCODING "Transfer-Encoding:" /* HTTP transfer encoding header */
+#define HTTP_ENCODING_CHUNKED  "chunked" /* HTTP transfer encoding header value */
+#define HTTP_CONNECTION        "Connection:" /* HTTP Connection header */
+#define HTTP_CONNECTION_CLOSE  "close"  /* HTTP Connection header value */
+#define HTTP_END_OF_HEADER  "\r\n\r\n"  /* string marking the end of headers in response */
+
+/*****************************************************************************/
+/* Macro declarations                                                        */
+/*****************************************************************************/
+
+const uint16_t IP_LEASE_TIME    =    3600;
+
+const uint16_t SIZE_45K      =  46080;  /* Serial flash file size 45 KB */
+const uint16_t READ_SIZE     =  1450;
+const uint8_t SPACE          =  32;
+
+const uint16_t PING_INTERVAL   =   1000;
+const uint8_t  PING_SIZE       =   20;
+const uint16_t PING_TIMEOUT    =   3000;
+const uint8_t  PING_ATTEMPTS   =   3;
+const uint8_t  PING_PKT_SIZE   =   20; 
+
+const uint8_t SL_STOP_TIMEOUT    =    0xFF;
+
+/* SL internal Error codes */
+
+/* Receive this error in case there are no resources to issue the command
+   If possible, increase the number of MAX_CUNCURENT_ACTIONS (result in memory increase)
+   If not, try again later */
+const int16_t SL_POOL_IS_EMPTY  = (-2000);
+
+/* Receive this error in case a given length for RX buffer was too small.
+   Receive payload was bigger than the given buffer size. Therefore, payload is cut according to receive size
+   Recommend to increase buffer size */
+const int16_t SL_ESMALLBUF      = (-2001);
+
+/* Receive this error in case zero length is supplied to a "get" API
+   Recommend to supply length according to requested information (view options defines for help) */
+const int16_t SL_EZEROLEN       = (-2002);
+
+/* User supplied invalid parameter */
+const int16_t SL_INVALPARAM     = (-2003);
+
+/* Failed to open interface  */
+const int16_t SL_BAD_INTERFACE  = (-2004);
+
+/* End of SL internal Error codes */
+
+/*****************************************************************************/
+/* Errors returned from the general error async event                        */
+/*****************************************************************************/        
+    
+/* Use bit 32: Lower bits of status variable are used for NWP events
+ *      1 in a 'status_variable', the device has completed the ping operation
+ *      0 in a 'status_variable', the device has not completed the ping operation
+ */
+//const uint32_t STATUS_BIT_PING_DONE = 31;
+
+/* Status bits - These are used to set/reset the corresponding bits in a 'status_variable' */
+typedef enum {
+    STATUS_BIT_CONNECTION =  0, /* If this bit is:
+                                 *      1 in a 'status_variable', the device is connected to the AP
+                                 *      0 in a 'status_variable', the device is not connected to the AP
+                                 */
+
+    STATUS_BIT_STA_CONNECTED,    /* If this bit is:
+                                  *      1 in a 'status_variable', client is connected to device
+                                  *      0 in a 'status_variable', client is not connected to device
+                                  */
+
+    STATUS_BIT_IP_ACQUIRED,       /* If this bit is:
+                                   *      1 in a 'status_variable', the device has acquired an IP
+                                   *      0 in a 'status_variable', the device has not acquired an IP
+                                   */
+
+    STATUS_BIT_IP_LEASED,           /* If this bit is:
+                                      *      1 in a 'status_variable', the device has leased an IP
+                                      *      0 in a 'status_variable', the device has not leased an IP
+                                      */
+
+    STATUS_BIT_CONNECTION_FAILED,   /* If this bit is:
+                                     *      1 in a 'status_variable', failed to connect to device
+                                     *      0 in a 'status_variable'
+                                     */
+
+    STATUS_BIT_P2P_NEG_REQ_RECEIVED,/* If this bit is:
+                                     *      1 in a 'status_variable', connection requested by remote wifi-direct device
+                                     *      0 in a 'status_variable',
+                                     */
+    STATUS_BIT_SMARTCONFIG_DONE,    /* If this bit is:
+                                     *      1 in a 'status_variable', smartconfig completed
+                                     *      0 in a 'status_variable', smartconfig event couldn't complete
+                                     */
+
+    STATUS_BIT_SMARTCONFIG_STOPPED,  /* If this bit is:
+                                     *      1 in a 'status_variable', smartconfig process stopped
+                                     *      0 in a 'status_variable', smartconfig process running
+                                     */
+                                     
+    STATUS_BIT_PING_DONE = 31
+                                     /* Use bit 32: Lower bits of status variable are used for NWP events
+                                      *      1 in a 'status_variable', the device has completed the ping operation
+                                      *      0 in a 'status_variable', the device has not completed the ping operation
+                                      */                                 
+
+} e_StatusBits;        
+    
+/* Application specific status/error codes */
+typedef enum {
+    LAN_CONNECTION_FAILED = -0x7D0,        /* Choosing this number to avoid overlap with host-driver's error codes */
+    INTERNET_CONNECTION_FAILED = LAN_CONNECTION_FAILED - 1,
+    DEVICE_NOT_IN_STATION_MODE = INTERNET_CONNECTION_FAILED - 1,
+    HTTP_SEND_ERROR = DEVICE_NOT_IN_STATION_MODE - 1,
+    HTTP_RECV_ERROR = HTTP_SEND_ERROR - 1,
+    HTTP_INVALID_RESPONSE = HTTP_RECV_ERROR -1,
+    SNTP_SEND_ERROR = DEVICE_NOT_IN_STATION_MODE - 1,
+    SNTP_RECV_ERROR = SNTP_SEND_ERROR - 1,
+    SNTP_SERVER_RESPONSE_ERROR = SNTP_RECV_ERROR - 1,
+    INVALID_HEX_STRING = DEVICE_NOT_IN_STATION_MODE - 1,
+    TCP_RECV_ERROR = INVALID_HEX_STRING - 1,
+    TCP_SEND_ERROR = TCP_RECV_ERROR - 1,
+    FILE_NOT_FOUND_ERROR = TCP_SEND_ERROR - 1,
+    INVALID_SERVER_RESPONSE = FILE_NOT_FOUND_ERROR - 1,
+    FORMAT_NOT_SUPPORTED = INVALID_SERVER_RESPONSE - 1,
+    FILE_WRITE_ERROR = FORMAT_NOT_SUPPORTED - 1,
+    INVALID_FILE = FILE_WRITE_ERROR - 1,
+
+    STATUS_CODE_MAX = -0xBB8
+} e_AppStatusCodes;    
+    
+    /* Send types */
+typedef enum {
+    SL_ERR_SENDER_HEALTH_MON,
+    SL_ERR_SENDER_CLI_UART,
+    SL_ERR_SENDER_SUPPLICANT,
+    SL_ERR_SENDER_NETWORK_STACK,
+    SL_ERR_SENDER_WLAN_DRV_IF,
+    SL_ERR_SENDER_WILINK,
+    SL_ERR_SENDER_INIT_APP,
+    SL_ERR_SENDER_NETX,
+    SL_ERR_SENDER_HOST_APD,
+    SL_ERR_SENDER_MDNS,
+    SL_ERR_SENDER_HTTP_SERVER,
+    SL_ERR_SENDER_DHCP_SERVER,
+    SL_ERR_SENDER_DHCP_CLIENT,
+    SL_ERR_DISPATCHER,
+    SL_ERR_NUM_SENDER_LAST=0xFF
+} SlErrorSender_e;
+
+/* Error codes */
+const int8_t SL_ERROR_STATIC_ADDR_SUBNET_ERROR                  = (-60);  /* network stack error*/
+const int8_t SL_ERROR_ILLEGAL_CHANNEL                           = (-61);  /* supplicant error */
+const int8_t SL_ERROR_SUPPLICANT_ERROR                          = (-72);  /* init error code */
+const int8_t SL_ERROR_HOSTAPD_INIT_FAIL                         = (-73);  /* init error code */
+const int8_t SL_ERROR_HOSTAPD_INIT_IF_FAIL                      = (-74);  /* init error code */
+const int8_t SL_ERROR_WLAN_DRV_INIT_FAIL                        = (-75);  /* init error code */
+const int8_t SL_ERROR_WLAN_DRV_START_FAIL                       = (-76);  /* wlan start error */
+const int8_t SL_ERROR_FS_FILE_TABLE_LOAD_FAILED                 = (-77);  /* init file system failed */
+const int8_t SL_ERROR_PREFERRED_NETWORKS_FILE_LOAD_FAILED       = (-78);  /* init file system failed */
+const int8_t SL_ERROR_HOSTAPD_BSSID_VALIDATION_ERROR            = (-79);  /* Ap configurations BSSID error */
+const int8_t SL_ERROR_HOSTAPD_FAILED_TO_SETUP_INTERFACE         = (-80);  /* Ap configurations interface error */
+const int8_t SL_ERROR_MDNS_ENABLE_FAIL                          = (-81);  /* mDNS enable failed                */
+const int8_t SL_ERROR_HTTP_SERVER_ENABLE_FAILED                 = (-82);  /* HTTP server enable failed         */
+const int8_t SL_ERROR_DHCP_SERVER_ENABLE_FAILED                 = (-83);  /* DHCP server enable failed         */
+const int8_t SL_ERROR_PREFERRED_NETWORK_LIST_FULL               = (-93);  /* supplicant error  */
+const int8_t SL_ERROR_PREFERRED_NETWORKS_FILE_WRITE_FAILED      = (-94);  /* supplicant error  */
+const int8_t SL_ERROR_DHCP_CLIENT_RENEW_FAILED                  = (-100); /* DHCP client error */
+/* WLAN Connection management status */
+const int8_t SL_ERROR_CON_MGMT_STATUS_UNSPECIFIED               = (-102);
+const int8_t SL_ERROR_CON_MGMT_STATUS_AUTH_REJECT               = (-103);
+const int8_t SL_ERROR_CON_MGMT_STATUS_ASSOC_REJECT              = (-104);
+const int8_t SL_ERROR_CON_MGMT_STATUS_SECURITY_FAILURE          = (-105);
+const int8_t SL_ERROR_CON_MGMT_STATUS_AP_DEAUTHENTICATE         = (-106);
+const int8_t SL_ERROR_CON_MGMT_STATUS_AP_DISASSOCIATE           = (-107);
+const int8_t SL_ERROR_CON_MGMT_STATUS_ROAMING_TRIGGER           = (-108);
+const int8_t SL_ERROR_CON_MGMT_STATUS_DISCONNECT_DURING_CONNECT = (-109);
+const int8_t SL_ERROR_CON_MGMT_STATUS_SG_RESELECT               = (-110);
+const int8_t SL_ERROR_CON_MGMT_STATUS_ROC_FAILURE               = (-111);
+const int8_t SL_ERROR_CON_MGMT_STATUS_MIC_FAILURE               = (-112);
+/* end of WLAN connection management error statuses */
+const int8_t SL_ERROR_WAKELOCK_ERROR_PREFIX                     = (-115);  /* Wake lock expired */
+const int8_t SL_ERROR_LENGTH_ERROR_PREFIX                       = (-116);  /* Uart header length error */
+const int8_t SL_ERROR_MDNS_CREATE_FAIL                          = (-121);  /* mDNS create failed */
+const int8_t SL_ERROR_GENERAL_ERROR                             = (-127);
+
+
+
+const int8_t SL_DEVICE_GENERAL_CONFIGURATION           = (1);
+const int8_t SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME = (11);
+const int8_t SL_DEVICE_GENERAL_VERSION                 = (12);
+const int8_t SL_DEVICE_STATUS                          = (2);
+
+/*
+    Declare the different event group classifications
+    The SimpleLink device send asynchronous events. Each event has a group
+    classification according to its nature.
+*/
+#if 1
+/* SL_EVENT_CLASS_WLAN connection user events */
+const int8_t SL_WLAN_CONNECT_EVENT                   =  (1);
+const int8_t SL_WLAN_DISCONNECT_EVENT                =  (2);
+/* WLAN Smart Config user events */
+const int8_t SL_WLAN_SMART_CONFIG_COMPLETE_EVENT     =  (3);
+const int8_t SL_WLAN_SMART_CONFIG_STOP_EVENT         =  (4);
+/* WLAN AP user events */
+const int8_t SL_WLAN_STA_CONNECTED_EVENT             =  (5);
+const int8_t SL_WLAN_STA_DISCONNECTED_EVENT          =  (6);
+/* WLAN P2P user events */
+const int8_t SL_WLAN_P2P_DEV_FOUND_EVENT             =  (7);
+const int8_t    SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT   =  (8);
+const int8_t SL_WLAN_CONNECTION_FAILED_EVENT         =  (9);
+/* SL_EVENT_CLASS_DEVICE user events */
+const int8_t SL_DEVICE_FATAL_ERROR_EVENT             =  (1);
+const int8_t SL_DEVICE_ABORT_ERROR_EVENT             =  (2);
+/* SL_EVENT_CLASS_BSD user events */
+const int8_t    SL_SOCKET_TX_FAILED_EVENT            =  (1);
+const int8_t SL_SOCKET_ASYNC_EVENT                   =  (2);
+/* SL_EVENT_CLASS_NETAPP user events */
+const int8_t    SL_NETAPP_IPV4_IPACQUIRED_EVENT      =  (1);
+const int8_t    SL_NETAPP_IPV6_IPACQUIRED_EVENT      =  (2);
+const int8_t SL_NETAPP_IP_LEASED_EVENT               =  (3);
+const int8_t SL_NETAPP_IP_RELEASED_EVENT             =  (4);
+
+/* Server Events */
+const int8_t SL_NETAPP_HTTPGETTOKENVALUE_EVENT       =   (1);
+const int8_t SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT      =   (2);
+#endif
+
+/*
+    Declare the different event group classifications for sl_DevGet
+    for getting status indications
+ */
+
+/* Events list to mask/unmask*/
+const int8_t SL_EVENT_CLASS_GLOBAL                   =  (0);
+const int8_t SL_EVENT_CLASS_DEVICE                   =  (1);
+const int8_t SL_EVENT_CLASS_WLAN                     =  (2);
+const int8_t SL_EVENT_CLASS_BSD                      =  (3);
+const int8_t SL_EVENT_CLASS_NETAPP                   =  (4);
+const int8_t SL_EVENT_CLASS_NETCFG                   =  (5);
+const int8_t SL_EVENT_CLASS_FS                       =  (6);
+
+
+/******************  DEVICE CLASS status ****************/
+const uint32_t EVENT_DROPPED_DEVICE_ASYNC_GENERAL_ERROR         = (0x00000001L);
+const uint32_t STATUS_DEVICE_SMART_CONFIG_ACTIVE                = (0x80000000L);
+
+/******************  WLAN CLASS status ****************/
+const uint32_t EVENT_DROPPED_WLAN_WLANASYNCONNECTEDRESPONSE     = (0x00000001L);
+const uint32_t EVENT_DROPPED_WLAN_WLANASYNCDISCONNECTEDRESPONSE = (0x00000002L);
+const uint32_t EVENT_DROPPED_WLAN_STA_CONNECTED                 = (0x00000004L);
+const uint32_t EVENT_DROPPED_WLAN_STA_DISCONNECTED              = (0x00000008L);
+const uint32_t STATUS_WLAN_STA_CONNECTED                        = (0x80000000L);
+
+/******************  NETAPP CLASS status ****************/
+const uint32_t EVENT_DROPPED_NETAPP_IPACQUIRED                  = (0x00000001L);
+const uint32_t EVENT_DROPPED_NETAPP_IPACQUIRED_V6               = (0x00000002L);
+const uint32_t EVENT_DROPPED_NETAPP_IP_LEASED                   = (0x00000004L);
+const uint32_t EVENT_DROPPED_NETAPP_IP_RELEASED                 = (0x00000008L);
+
+/******************  BSD CLASS status ****************/
+const uint32_t EVENT_DROPPED_SOCKET_TXFAILEDASYNCRESPONSE       = (0x00000001L);
+
+/******************  FS CLASS  ****************/
+
+/*****************************************************************************/
+/* Structure/Enum declarations                                               */
+/*****************************************************************************/
+
+#ifdef SL_IF_TYPE_UART
+typedef struct {
+    uint32_t             BaudRate;
+    uint8_t              FlowControlEnable;
+    uint8_t              CommPort;
+} SlUartIfParams_t;
+#endif
+
+typedef struct {
+    uint32_t               ChipId;
+    uint32_t               FwVersion[4];
+    uint8_t                PhyVersion[4];
+} _SlPartialVersion;
+
+typedef struct {
+    _SlPartialVersion ChipFwAndPhyVersion;
+    uint32_t               NwpVersion[4];
+    uint16_t               RomVersion;
+    uint16_t               Padding;
+} SlVersionFull;
+
+typedef struct
+{
+    uint32_t                AbortType;
+    uint32_t                AbortData;
+}sl_DeviceReportAbort;
+
+typedef struct {
+    int8_t                status;
+    SlErrorSender_e        sender;
+} sl_DeviceReport;
+
+typedef union {
+    sl_DeviceReport           deviceEvent;
+    sl_DeviceReportAbort      deviceReport;
+} _SlDeviceEventData_u;
+
+typedef struct {
+    uint32_t             Event;
+    _SlDeviceEventData_u EventData;
+} SlDeviceEvent_t;
+
+typedef struct {
+    /* time */
+    uint32_t                sl_tm_sec;
+    uint32_t                sl_tm_min;
+    uint32_t                sl_tm_hour;
+    /* date */
+    uint32_t                sl_tm_day; /* 1-31 */
+    uint32_t                sl_tm_mon; /* 1-12 */
+    uint32_t                sl_tm_year; /*  YYYY 4 digits  */
+    uint32_t                sl_tm_week_day; /* not required */
+    uint32_t                sl_tm_year_day; /* not required */
+    uint32_t                reserved[3];
+} SlDateTime_t;
+
+/******************************************************************************/
+/* Type declarations                                                          */
+/******************************************************************************/
+typedef void (*P_INIT_CALLBACK)(uint32_t Status);
+
+class cc3100_netcfg;
+
+class cc3100
+{
+
+public:
+
+    cc3100(PinName button1_irq, PinName button2_irq, PinName cc3100_irq, PinName cc3100_nHIB, PinName cc3100_cs, SPI cc3100_spi);
+
+    ~cc3100();
+
+    /*****************************************************************************/
+    /* Function prototypes                                                       */
+    /*****************************************************************************/
+    int32_t initializeAppVariables();
+    
+    int32_t establishConnectionWithAP(void);
+    
+    int32_t checkLanConnection(void);
+    
+    int32_t checkInternetConnection(void);
+    
+    int32_t createUDPConnection(void);
+    
+    int32_t createConnection(uint32_t DestinationIP);
+
+    int32_t getChunkSize(int32_t *len, uint8_t **p_Buff, uint32_t *chunk_size);
+    
+    int32_t hexToi(unsigned char *ptr);
+    
+//    int32_t getFile(void);
+    
+    int32_t disconnectFromAP(void);
+    
+    uint16_t itoa(int16_t cNum, uint8_t *cString);
+    
+    int32_t configureSimpleLinkToDefaultState(void);
+    
+    int16_t _sl_GetStartResponseConvert(uint32_t Status);
+
+    void _sl_HandleAsync_InitComplete(void *pVoidBuf); 
+    
+    bool IS_PING_DONE(uint32_t status_variable,const uint32_t bit);
+    bool IS_CONNECTED(uint32_t status_variable,const uint32_t bit);
+    bool IS_STA_CONNECTED(uint32_t status_variable,const uint32_t bit);
+    bool IS_IP_ACQUIRED(uint32_t status_variable,const uint32_t bit);
+    bool IS_IP_LEASED(uint32_t status_variable,const uint32_t bit);
+    bool IS_CONNECTION_FAILED(uint32_t status_variable,const uint32_t bit);
+    bool IS_P2P_NEG_REQ_RECEIVED(uint32_t status_variable,const uint32_t bit);
+    bool IS_SMARTCONFIG_DONE(uint32_t status_variable,const uint32_t bit);
+    bool IS_SMARTCONFIG_STOPPED(uint32_t status_variable,const uint32_t bit);
+    
+    
+    
+    void CLR_STATUS_BIT(uint32_t status_variable, const uint32_t bit);
+    void SET_STATUS_BIT(uint32_t status_variable, const uint32_t bit);
+    
+
+    /*!
+        \brief Start the SimpleLink device
+
+        This function initialize the communication interface, set the enable pin
+        of the device, and call to the init complete callback.
+
+        \param[in]      pIfHdl              Opened Interface Object. In case the interface
+                                            must be opened outside the SimpleLink Driver, the
+                                            user might give the handler to be used in \n
+                                            any access of the communication interface with the
+                                            device (UART/SPI). \n
+                                            The SimpleLink driver will open an interface port
+                                            only if this parameter is null! \n
+        \param[in]      pDevName            The name of the device to open. Could be used when
+                                            the pIfHdl is null, to transfer information to the
+                                            open interface function \n
+                                            This pointer could be used to pass additional information to
+                                            sl_IfOpen in case it is required (e.g. UART com port name)
+        \param[in]      pInitCallBack       Pointer to function that would be called
+                                            on completion of the initialization process.\n
+                                            If this parameter is NULL the function is
+                                            blocked until the device initialization
+                                            is completed, otherwise the function returns
+                                            immediately.
+
+        \return         Returns the current active role (STA/AP/P2P) or an error code:
+                        - ROLE_STA, ROLE_AP, ROLE_P2P in case of success,
+                          otherwise in failure one of the following is return:
+                        - ROLE_STA_ERR  (Failure to load MAC/PHY in STA role)
+                        - ROLE_AP_ERR  (Failure to load MAC/PHY in AP role)
+                        - ROLE_P2P_ERR  (Failure to load MAC/PHY in P2P role)
+
+
+         \sa             sl_Stop
+
+        \note           belongs to \ref basic_api
+
+        \warning        This function must be called before any other SimpleLink API is used, or after sl_Stop is called for reinit the device
+        \par            Example:
+        \code
+                       An example for open interface without callback routine. The interface name and handler are
+                       handled by the sl_IfOpen routine:
+
+                        if( sl_Start(NULL, NULL, NULL) < 0 )
+                       {
+                           LOG("Error opening interface to device\n");
+                       }
+        \endcode
+    */
+#if _SL_INCLUDE_FUNC(sl_Start)
+    int16_t sl_Start(const void* pIfHdl, int8_t*  pDevName, const P_INIT_CALLBACK pInitCallBack);
+#endif
+
+    /*!
+        \brief Stop the SimpleLink device
+
+        This function clears the enable pin of the device, closes the communication \n
+        interface and invokes the stop complete callback
+
+        \param[in]      timeout                       Stop timeout in msec. Should be used to give the device time to finish \n
+                                                      any transmission/reception that is not completed when the function was called. \n
+                        Additional options:
+                        - 0                             Enter to hibernate immediately \n
+                        - 0xFFFF                        Host waits for device's response before \n
+                                                        hibernating, without timeout protection \n
+                        - 0 < Timeout[msec] < 0xFFFF    Host waits for device's response before \n
+                                                        hibernating, with a defined timeout protection \n
+                                                        This timeout defines the max time to wait. The NWP \n
+                                                        response can be sent earlier than this timeout.
+
+        \return         On success, zero is returned. On error, -1 is returned
+
+        \sa             sl_Start
+
+        \note           This API will shutdown the device and invoke the "i/f close" function regardless \n
+                        if it was opened implicitly or explicitly. \n
+                        It is up to the platform interface library to properly handle interface close \n
+                        routine \n
+                        belongs to \ref basic_api \n
+        \warning
+    */
+#if _SL_INCLUDE_FUNC(sl_Stop)
+    int16_t sl_Stop(const uint16_t timeout);
+#endif
+
+
+    /*!
+        \brief     Internal function for setting device configurations
+
+        \return    On success, zero is returned. On error, -1 is
+                   returned
+
+        \param[in] DeviceSetId   configuration id
+        \param[in] Option         configurations option
+        \param[in] ConfigLen     configurations len
+        \param[in] pValues         configurations values
+
+        \sa
+        \note
+        \warning
+        \par   Examples:
+        \code
+             Setting device time and date example:
+
+             SlDateTime_t dateTime= {0};
+             dateTime.sl_tm_day =   (uint32_t)23;          // Day of month (DD format) range 1-13
+             dateTime.sl_tm_mon =   (uint32_t)6;           // Month (MM format) in the range of 1-12
+             dateTime.sl_tm_year =  (uint32_t)2014;        // Year (YYYY format)
+             dateTime.sl_tm_hour =  (uint32_t)17;          // Hours in the range of 0-23
+             dateTime.sl_tm_min =   (uint32_t)55;          // Minutes in the range of 0-59
+             dateTime.sl_tm_sec =   (uint32_t)22;          // Seconds in the range of  0-59
+             sl_DevSet(SL_DEVICE_GENERAL_CONFIGURATION,
+                       SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME,
+                       sizeof(SlDateTime_t),
+                       (uint8_t *)(&dateTime));
+
+        \endcode
+    */
+#if _SL_INCLUDE_FUNC(sl_DevSet)
+    int32_t sl_DevSet(const uint8_t DeviceSetId , const uint8_t Option, const uint8_t ConfigLen, const uint8_t *pValues);
+#endif
+
+    /*!
+        \brief      Internal function for getting device configurations
+        \return     On success, zero is returned. On error, -1 is
+                    returned
+        \param[in]  DeviceGetId   configuration id - example SL_DEVICE_STATUS
+        \param[out] pOption   Get configurations option, example for get status options
+                                - SL_EVENT_CLASS_GLOBAL
+                                - SL_EVENT_CLASS_DEVICE
+                                - SL_EVENT_CLASS_WLAN
+                                - SL_EVENT_CLASS_BSD
+                                - SL_EVENT_CLASS_NETAPP
+                                - SL_EVENT_CLASS_NETCFG
+                                - SL_EVENT_CLASS_FS
+        \param[out] pConfigLen   The length of the allocated memory as input, when the
+                                 function complete, the value of this parameter would be
+                                 the len that actually read from the device.\n
+                                 If the device return length that is longer from the input
+                                 value, the function will cut the end of the returned structure
+                                 and will return SL_ESMALLBUF
+        \param[out] pValues      Get configurations values
+        \sa
+        \note
+        \warning
+        \par        Examples:
+        \code
+         Example for getting WLAN class status:
+         uint32_t statusWlan;
+         uint8_t pConfigOpt;
+         uint8_t pConfigLen;
+         pConfigLen = sizeof(_u32);
+         pConfigOpt = SL_EVENT_CLASS_WLAN;
+         sl_DevGet(SL_DEVICE_STATUS,&pConfigOpt,&pConfigLen,(uint8_t *)(&statusWlan));
+         Example for getting version:
+         SlVersionFull ver;
+         pConfigLen = sizeof(ver);
+         pConfigOpt = SL_DEVICE_GENERAL_VERSION;
+         sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION,&pConfigOpt,&pConfigLen,(uint8_t *)(&ver));
+         printf("CHIP %d\nMAC 31.%d.%d.%d.%d\nPHY %d.%d.%d.%d\nNWP %d.%d.%d.%d\nROM %d\nHOST %d.%d.%d.%d\n",
+                 ver.ChipFwAndPhyVersion.ChipId,
+                 ver.ChipFwAndPhyVersion.FwVersion[0],ver.ChipFwAndPhyVersion.FwVersion[1],
+                 ver.ChipFwAndPhyVersion.FwVersion[2],ver.ChipFwAndPhyVersion.FwVersion[3],
+                 ver.ChipFwAndPhyVersion.PhyVersion[0],ver.ChipFwAndPhyVersion.PhyVersion[1],
+                 ver.ChipFwAndPhyVersion.PhyVersion[2],ver.ChipFwAndPhyVersion.PhyVersion[3],
+                 ver.NwpVersion[0],ver.NwpVersion[1],ver.NwpVersion[2],ver.NwpVersion[3],
+                 ver.RomVersion,
+                 SL_MAJOR_VERSION_NUM,SL_MINOR_VERSION_NUM,SL_VERSION_NUM,SL_SUB_VERSION_NUM);
+
+         \endcode
+         \code
+             Getting Device time and date example:
+
+             SlDateTime_t dateTime =  {0};
+             int8_t configLen = sizeof(SlDateTime_t);
+             int8_t configOpt = SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME;
+             sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION,&configOpt, &configLen,(uint8_t *)(&dateTime));
+
+             printf("Day %d,Mon %d,Year %d,Hour %,Min %d,Sec %d\n",dateTime.sl_tm_day,dateTime.sl_tm_mon,dateTime.sl_tm_year
+                     dateTime.sl_tm_hour,dateTime.sl_tm_min,dateTime.sl_tm_sec);
+         \endcode
+    */
+#if _SL_INCLUDE_FUNC(sl_DevGet)
+    int32_t sl_DevGet(const uint8_t DeviceGetId, uint8_t *pOption,uint8_t *pConfigLen, uint8_t *pValues);
+#endif
+
+
+    /*!
+        \brief          Set asynchronous event mask
+
+        Mask asynchronous events from the device. Masked events do not
+        generate asynchronous messages from the device.
+        By default - all events are active
+
+        \param[in]      EventClass          The classification groups that the
+                                            mask is referred to. Need to be one of
+                                            the following:
+                                            - SL_EVENT_CLASS_GLOBAL
+                                            - SL_EVENT_CLASS_DEVICE
+                                            - SL_EVENT_CLASS_WLAN
+                                            - SL_EVENT_CLASS_BSD
+                                            - SL_EVENT_CLASS_NETAPP
+                                            - SL_EVENT_CLASS_NETCFG
+                                            - SL_EVENT_CLASS_FS
+
+
+        \param[in]      Mask               Event Mask bitmap. Valid mask are (per group):
+                                            - SL_EVENT_CLASS_WLAN user events
+                                              - SL_WLAN_CONNECT_EVENT
+                                              - SL_WLAN_DISCONNECT_EVENT
+                                            - SL_EVENT_CLASS_DEVICE user events
+                                              - SL_DEVICE_FATAL_ERROR_EVENT
+                                            - SL_EVENT_CLASS_BSD user events
+                                              - SL_SOCKET_TX_FAILED_EVENT
+                                              - SL_SOCKET_ASYNC_EVENT
+                                            - SL_EVENT_CLASS_NETAPP user events
+                                              - SL_NETAPP_IPV4_IPACQUIRED_EVENT
+                                              - SL_NETAPP_IPV6_IPACQUIRED_EVENT
+
+        \return         On success, zero is returned. On error, -1 is returned
+
+        \sa             sl_EventMaskGet
+
+        \note           belongs to \ref ext_api
+
+        \warning
+        \par           Example:
+        \code
+
+        An example of masking connection/disconnection async events from WLAN class:
+                       sl_EventMaskSet(SL_EVENT_CLASS_WLAN, (SL_WLAN_CONNECT_EVENT | SL_WLAN_DISCONNECT_EVENT) );
+
+        \endcode
+    */
+#if _SL_INCLUDE_FUNC(sl_EventMaskSet)
+    int16_t sl_EventMaskSet(const uint8_t EventClass , const uint32_t Mask);
+#endif
+
+    /*!
+        \brief Get current event mask of the device
+
+        return the events bit mask from the device. In case that event is
+        masked, the device is not sending this event.
+
+        \param[in]      EventClass          The classification groups that the
+                                            mask is referred to. Need to be one of
+                                            the following:
+                                            - SL_EVENT_CLASS_GLOBAL
+                                            - SL_EVENT_CLASS_DEVICE
+                                            - SL_EVENT_CLASS_WLAN
+                                            - SL_EVENT_CLASS_BSD
+                                            - SL_EVENT_CLASS_NETAPP
+                                            - SL_EVENT_CLASS_NETCFG
+                                            - SL_EVENT_CLASS_FS
+
+        \param[out]      pMask              Pointer to Mask bitmap where the
+                                            value should be stored. Bitmasks are the same as in \ref sl_EventMaskSet
+
+        \return         On success, zero is returned. On error, -1 is returned
+
+        \sa             sl_EventMaskSet
+
+        \note           belongs to \ref ext_api
+
+        \warning
+        \par           Example:
+        \code
+
+        An example of getting an event mask for WLAN class
+        uint32_t maskWlan;
+                       sl_StatusGet(SL_EVENT_CLASS_WLAN,&maskWlan);
+
+       \endcode
+    */
+#if _SL_INCLUDE_FUNC(sl_EventMaskGet)
+    int16_t sl_EventMaskGet(const uint8_t EventClass, uint32_t *pMask);
+#endif
+
+
+    /*!
+        \brief the simple link task entry
+
+        \Param
+        This function must be called from the main loop or from dedicated thread in
+        the following cases:
+            - Non-Os Platform - should be called from the mail loop
+            - Multi Threaded Platform when the user does not implement the external spawn functions -
+               should be called from dedicated thread allocated to the simplelink driver.
+               In this mode the function never return.
+
+        \return         None
+
+        \sa             sl_Stop
+
+        \note           belongs to \ref basic_api
+
+        \warning        This function must be called from a thread that is start running before
+                        any call to other simple link API
+    */
+#if _SL_INCLUDE_FUNC(sl_Task)
+    void sl_Task(void);
+#endif
+
+
+    /*!
+        \brief Setting the internal uart mode
+
+        \param[in]      pUartParams          Pointer to the uart configuration parameter set:
+                                             baudrate     - up to 711 Kbps
+                                             flow control - enable/disable
+                                             comm port    - the comm port number
+
+        \return         On success zero is returned, otherwise - Failed.
+
+        \sa             sl_Stop
+
+        \note           belongs to \ref basic_api
+
+        \warning        This function must consider the host uart capability
+    */
+#ifdef SL_IF_TYPE_UART
+#if _SL_INCLUDE_FUNC(sl_UartSetMode)
+    int16_t sl_UartSetMode(const SlUartIfParams_t* pUartParams);
+#endif
+#endif
+
+public:
+    
+    cc3100_spi               _spi;
+    cc3100_driver            _driver;
+#ifndef SL_PLATFORM_MULTI_THREADED   
+    cc3100_nonos             _nonos;
+#endif    
+    cc3100_wlan              _wlan;
+    cc3100_wlan_rx_filters   _wlan_filters;    
+    cc3100_netapp            _netapp;
+    cc3100_fs                _fs;
+    cc3100_netcfg            _netcfg;    
+    cc3100_socket            _socket;
+    cc3100_flowcont          _flowcont;
+
+
+protected:
+    
+
+};//class
+
+}//namespace mbed_cc3100
+
+/*!
+
+ Close the Doxygen group.
+ @}
+
+ */
+
+
+#endif  /*  __DEVICE_H__ */
+
+
+