Maxim Integrated / Mbed OS MAXREFDES155#

Dependencies:   MaximInterface

Committer:
IanBenzMaxim
Date:
Thu Mar 02 10:15:53 2017 -0600
Revision:
3:d2799d8497c0
Parent:
0:33d4e66780c0
Child:
13:6a6225690c2e
Fixed error when removing non-printable characters from Text objects. Program is now running on GCC.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 0:33d4e66780c0 1 /*******************************************************************************
IanBenzMaxim 0:33d4e66780c0 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 0:33d4e66780c0 3 *
IanBenzMaxim 0:33d4e66780c0 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 0:33d4e66780c0 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 0:33d4e66780c0 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 0:33d4e66780c0 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 0:33d4e66780c0 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 0:33d4e66780c0 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 0:33d4e66780c0 10 *
IanBenzMaxim 0:33d4e66780c0 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 0:33d4e66780c0 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 0:33d4e66780c0 13 *
IanBenzMaxim 0:33d4e66780c0 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 0:33d4e66780c0 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 0:33d4e66780c0 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 0:33d4e66780c0 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 0:33d4e66780c0 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 0:33d4e66780c0 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 0:33d4e66780c0 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 0:33d4e66780c0 21 *
IanBenzMaxim 0:33d4e66780c0 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 0:33d4e66780c0 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 0:33d4e66780c0 24 * Products, Inc. Branding Policy.
IanBenzMaxim 0:33d4e66780c0 25 *
IanBenzMaxim 0:33d4e66780c0 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 0:33d4e66780c0 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 0:33d4e66780c0 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 0:33d4e66780c0 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 0:33d4e66780c0 30 * ownership rights.
IanBenzMaxim 0:33d4e66780c0 31 *******************************************************************************/
IanBenzMaxim 0:33d4e66780c0 32
IanBenzMaxim 3:d2799d8497c0 33 #include <cstdio>
IanBenzMaxim 3:d2799d8497c0 34 #include <cstring>
IanBenzMaxim 0:33d4e66780c0 35 #include <simplelink.h>
IanBenzMaxim 0:33d4e66780c0 36 #include <wait_api.h>
IanBenzMaxim 0:33d4e66780c0 37 #include "CC3100.hpp"
IanBenzMaxim 0:33d4e66780c0 38 #include "CC3100_transport.h"
IanBenzMaxim 0:33d4e66780c0 39 #include "CC3100_pins.h"
IanBenzMaxim 0:33d4e66780c0 40
IanBenzMaxim 3:d2799d8497c0 41 using std::printf;
IanBenzMaxim 3:d2799d8497c0 42 using std::strlen;
IanBenzMaxim 3:d2799d8497c0 43
IanBenzMaxim 0:33d4e66780c0 44 static CC3100::State currentState = CC3100::Stopped;
IanBenzMaxim 0:33d4e66780c0 45
IanBenzMaxim 0:33d4e66780c0 46 /*!
IanBenzMaxim 0:33d4e66780c0 47 \brief This function handles general error events indication
IanBenzMaxim 0:33d4e66780c0 48
IanBenzMaxim 0:33d4e66780c0 49 \param[in] pDevEvent is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 50
IanBenzMaxim 0:33d4e66780c0 51 \return None
IanBenzMaxim 0:33d4e66780c0 52 */
IanBenzMaxim 3:d2799d8497c0 53 void SimpleLinkGeneralEventHandler(SlDeviceEvent_t * pDevEvent)
IanBenzMaxim 0:33d4e66780c0 54 {
IanBenzMaxim 0:33d4e66780c0 55 /*
IanBenzMaxim 0:33d4e66780c0 56 * Most of the general errors are not FATAL are are to be handled
IanBenzMaxim 0:33d4e66780c0 57 * appropriately by the application
IanBenzMaxim 0:33d4e66780c0 58 */
IanBenzMaxim 0:33d4e66780c0 59 printf(" [GENERAL EVENT] \n\r");
IanBenzMaxim 0:33d4e66780c0 60 }
IanBenzMaxim 0:33d4e66780c0 61
IanBenzMaxim 0:33d4e66780c0 62 /*!
IanBenzMaxim 0:33d4e66780c0 63 \brief This function handles WLAN events
IanBenzMaxim 0:33d4e66780c0 64
IanBenzMaxim 0:33d4e66780c0 65 \param[in] pWlanEvent is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 66
IanBenzMaxim 0:33d4e66780c0 67 \return None
IanBenzMaxim 0:33d4e66780c0 68
IanBenzMaxim 0:33d4e66780c0 69 \note
IanBenzMaxim 0:33d4e66780c0 70
IanBenzMaxim 0:33d4e66780c0 71 \warning
IanBenzMaxim 0:33d4e66780c0 72 */
IanBenzMaxim 3:d2799d8497c0 73 void SimpleLinkWlanEventHandler(SlWlanEvent_t * pWlanEvent)
IanBenzMaxim 0:33d4e66780c0 74 {
IanBenzMaxim 0:33d4e66780c0 75 if(pWlanEvent == NULL)
IanBenzMaxim 0:33d4e66780c0 76 {
IanBenzMaxim 0:33d4e66780c0 77 printf(" [WLAN EVENT] NULL Pointer Error \n\r");
IanBenzMaxim 0:33d4e66780c0 78 return;
IanBenzMaxim 0:33d4e66780c0 79 }
IanBenzMaxim 0:33d4e66780c0 80
IanBenzMaxim 3:d2799d8497c0 81 switch (pWlanEvent->Event)
IanBenzMaxim 0:33d4e66780c0 82 {
IanBenzMaxim 3:d2799d8497c0 83 case SL_WLAN_CONNECT_EVENT:
IanBenzMaxim 3:d2799d8497c0 84 currentState = CC3100::Connected;
IanBenzMaxim 0:33d4e66780c0 85
IanBenzMaxim 3:d2799d8497c0 86 /*
IanBenzMaxim 3:d2799d8497c0 87 * Information about the connected AP (like name, MAC etc) will be
IanBenzMaxim 3:d2799d8497c0 88 * available in 'slWlanConnectAsyncResponse_t' - Applications
IanBenzMaxim 3:d2799d8497c0 89 * can use it if required
IanBenzMaxim 3:d2799d8497c0 90 *
IanBenzMaxim 3:d2799d8497c0 91 * slWlanConnectAsyncResponse_t *pEventData = NULL;
IanBenzMaxim 3:d2799d8497c0 92 * pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected;
IanBenzMaxim 3:d2799d8497c0 93 *
IanBenzMaxim 3:d2799d8497c0 94 */
IanBenzMaxim 0:33d4e66780c0 95 break;
IanBenzMaxim 0:33d4e66780c0 96
IanBenzMaxim 3:d2799d8497c0 97 case SL_WLAN_DISCONNECT_EVENT:
IanBenzMaxim 0:33d4e66780c0 98 {
IanBenzMaxim 0:33d4e66780c0 99 currentState = CC3100::Disconnected;
IanBenzMaxim 0:33d4e66780c0 100
IanBenzMaxim 3:d2799d8497c0 101 slWlanConnectAsyncResponse_t & pEventData = pWlanEvent->EventData.STAandP2PModeDisconnected;
IanBenzMaxim 0:33d4e66780c0 102
IanBenzMaxim 0:33d4e66780c0 103 /* If the user has initiated 'Disconnect' request, 'reason_code' is SL_USER_INITIATED_DISCONNECTION */
IanBenzMaxim 3:d2799d8497c0 104 if(SL_WLAN_DISCONNECT_USER_INITIATED_DISCONNECTION == pEventData.reason_code)
IanBenzMaxim 0:33d4e66780c0 105 {
IanBenzMaxim 0:33d4e66780c0 106 printf(" Device disconnected from the AP on application's request \n\r");
IanBenzMaxim 0:33d4e66780c0 107 }
IanBenzMaxim 0:33d4e66780c0 108 else
IanBenzMaxim 0:33d4e66780c0 109 {
IanBenzMaxim 0:33d4e66780c0 110 printf(" Device disconnected from the AP on an ERROR..!! \n\r");
IanBenzMaxim 0:33d4e66780c0 111 }
IanBenzMaxim 0:33d4e66780c0 112 }
IanBenzMaxim 0:33d4e66780c0 113 break;
IanBenzMaxim 0:33d4e66780c0 114
IanBenzMaxim 3:d2799d8497c0 115 default:
IanBenzMaxim 3:d2799d8497c0 116 printf(" [WLAN EVENT] Unexpected event \n\r");
IanBenzMaxim 0:33d4e66780c0 117 break;
IanBenzMaxim 0:33d4e66780c0 118 }
IanBenzMaxim 0:33d4e66780c0 119 }
IanBenzMaxim 0:33d4e66780c0 120
IanBenzMaxim 0:33d4e66780c0 121 /*!
IanBenzMaxim 0:33d4e66780c0 122 \brief This function handles events for IP address acquisition via DHCP
IanBenzMaxim 0:33d4e66780c0 123 indication
IanBenzMaxim 0:33d4e66780c0 124
IanBenzMaxim 0:33d4e66780c0 125 \param[in] pNetAppEvent is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 126
IanBenzMaxim 0:33d4e66780c0 127 \return None
IanBenzMaxim 0:33d4e66780c0 128
IanBenzMaxim 0:33d4e66780c0 129 \note
IanBenzMaxim 0:33d4e66780c0 130
IanBenzMaxim 0:33d4e66780c0 131 \warning
IanBenzMaxim 0:33d4e66780c0 132 */
IanBenzMaxim 3:d2799d8497c0 133 void SimpleLinkNetAppEventHandler(SlNetAppEvent_t * pNetAppEvent)
IanBenzMaxim 0:33d4e66780c0 134 {
IanBenzMaxim 3:d2799d8497c0 135 if (pNetAppEvent == NULL)
IanBenzMaxim 0:33d4e66780c0 136 {
IanBenzMaxim 0:33d4e66780c0 137 printf(" [NETAPP EVENT] NULL Pointer Error \n\r");
IanBenzMaxim 0:33d4e66780c0 138 return;
IanBenzMaxim 0:33d4e66780c0 139 }
IanBenzMaxim 0:33d4e66780c0 140
IanBenzMaxim 3:d2799d8497c0 141 switch (pNetAppEvent->Event)
IanBenzMaxim 0:33d4e66780c0 142 {
IanBenzMaxim 3:d2799d8497c0 143 case SL_NETAPP_IPV4_IPACQUIRED_EVENT:
IanBenzMaxim 3:d2799d8497c0 144 currentState = CC3100::Connected;
IanBenzMaxim 0:33d4e66780c0 145
IanBenzMaxim 3:d2799d8497c0 146 //SlIpV4AcquiredAsync_t & pEventData = pNetAppEvent->EventData.ipAcquiredV4;
IanBenzMaxim 0:33d4e66780c0 147 break;
IanBenzMaxim 0:33d4e66780c0 148
IanBenzMaxim 3:d2799d8497c0 149 default:
IanBenzMaxim 3:d2799d8497c0 150 printf(" [NETAPP EVENT] Unexpected event \n\r");
IanBenzMaxim 0:33d4e66780c0 151 break;
IanBenzMaxim 0:33d4e66780c0 152 }
IanBenzMaxim 0:33d4e66780c0 153 }
IanBenzMaxim 0:33d4e66780c0 154
IanBenzMaxim 0:33d4e66780c0 155 /*!
IanBenzMaxim 0:33d4e66780c0 156 \brief This function handles socket events indication
IanBenzMaxim 0:33d4e66780c0 157
IanBenzMaxim 0:33d4e66780c0 158 \param[in] pSock is the event passed to the handler
IanBenzMaxim 0:33d4e66780c0 159
IanBenzMaxim 0:33d4e66780c0 160 \return None
IanBenzMaxim 0:33d4e66780c0 161 */
IanBenzMaxim 0:33d4e66780c0 162 void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
IanBenzMaxim 0:33d4e66780c0 163 {
IanBenzMaxim 0:33d4e66780c0 164 if(pSock == NULL)
IanBenzMaxim 0:33d4e66780c0 165 {
IanBenzMaxim 0:33d4e66780c0 166 printf(" [SOCK EVENT] NULL Pointer Error \n\r");
IanBenzMaxim 0:33d4e66780c0 167 return;
IanBenzMaxim 0:33d4e66780c0 168 }
IanBenzMaxim 0:33d4e66780c0 169
IanBenzMaxim 0:33d4e66780c0 170 switch( pSock->Event )
IanBenzMaxim 0:33d4e66780c0 171 {
IanBenzMaxim 3:d2799d8497c0 172 case SL_SOCKET_TX_FAILED_EVENT:
IanBenzMaxim 3:d2799d8497c0 173 /*
IanBenzMaxim 3:d2799d8497c0 174 * TX Failed
IanBenzMaxim 3:d2799d8497c0 175 *
IanBenzMaxim 3:d2799d8497c0 176 * Information about the socket descriptor and status will be
IanBenzMaxim 3:d2799d8497c0 177 * available in 'SlSockEventData_t' - Applications can use it if
IanBenzMaxim 3:d2799d8497c0 178 * required
IanBenzMaxim 3:d2799d8497c0 179 *
IanBenzMaxim 3:d2799d8497c0 180 * SlSockEventData_u *pEventData = NULL;
IanBenzMaxim 3:d2799d8497c0 181 * pEventData = & pSock->socketAsyncEvent;
IanBenzMaxim 3:d2799d8497c0 182 */
IanBenzMaxim 3:d2799d8497c0 183 switch (pSock->socketAsyncEvent.SockTxFailData.status)
IanBenzMaxim 0:33d4e66780c0 184 {
IanBenzMaxim 3:d2799d8497c0 185 case SL_ECLOSE:
IanBenzMaxim 3:d2799d8497c0 186 printf(" [SOCK EVENT] Close socket operation failed to transmit all queued packets\n\r");
IanBenzMaxim 3:d2799d8497c0 187 break;
IanBenzMaxim 0:33d4e66780c0 188
IanBenzMaxim 3:d2799d8497c0 189 default:
IanBenzMaxim 3:d2799d8497c0 190 printf(" [SOCK EVENT] Unexpected event \n\r");
IanBenzMaxim 3:d2799d8497c0 191 break;
IanBenzMaxim 0:33d4e66780c0 192 }
IanBenzMaxim 0:33d4e66780c0 193 break;
IanBenzMaxim 0:33d4e66780c0 194
IanBenzMaxim 3:d2799d8497c0 195 default:
IanBenzMaxim 3:d2799d8497c0 196 printf(" [SOCK EVENT] Unexpected event \n\r");
IanBenzMaxim 0:33d4e66780c0 197 break;
IanBenzMaxim 0:33d4e66780c0 198 }
IanBenzMaxim 0:33d4e66780c0 199 }
IanBenzMaxim 0:33d4e66780c0 200
IanBenzMaxim 0:33d4e66780c0 201 /*!
IanBenzMaxim 0:33d4e66780c0 202 \brief This function handles ping report events
IanBenzMaxim 0:33d4e66780c0 203
IanBenzMaxim 0:33d4e66780c0 204 \param[in] pPingReport holds the ping report statistics
IanBenzMaxim 0:33d4e66780c0 205
IanBenzMaxim 0:33d4e66780c0 206 \return None
IanBenzMaxim 0:33d4e66780c0 207
IanBenzMaxim 0:33d4e66780c0 208 \note
IanBenzMaxim 0:33d4e66780c0 209
IanBenzMaxim 0:33d4e66780c0 210 \warning
IanBenzMaxim 0:33d4e66780c0 211 */
IanBenzMaxim 3:d2799d8497c0 212 static void SimpleLinkPingReport(SlPingReport_t * pPingReport)
IanBenzMaxim 0:33d4e66780c0 213 {
IanBenzMaxim 0:33d4e66780c0 214 currentState = CC3100::Connected;
IanBenzMaxim 0:33d4e66780c0 215
IanBenzMaxim 0:33d4e66780c0 216 if(pPingReport == NULL)
IanBenzMaxim 0:33d4e66780c0 217 {
IanBenzMaxim 0:33d4e66780c0 218 printf(" [PING REPORT] NULL Pointer Error\r\n");
IanBenzMaxim 0:33d4e66780c0 219 return;
IanBenzMaxim 0:33d4e66780c0 220 }
IanBenzMaxim 0:33d4e66780c0 221
IanBenzMaxim 3:d2799d8497c0 222 printf(" [PING REPORT] Sent: %lu, Received: %lu\r\n", pPingReport->PacketsSent, pPingReport->PacketsReceived);
IanBenzMaxim 0:33d4e66780c0 223 }
IanBenzMaxim 0:33d4e66780c0 224
IanBenzMaxim 3:d2799d8497c0 225 CC3100::SPI::SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel) : spi(mosi, miso, sclk), cs(ssel, 1) { }
IanBenzMaxim 0:33d4e66780c0 226
IanBenzMaxim 0:33d4e66780c0 227 void CC3100::SPI::transfer(const uint8_t * txData, size_t dataSize, uint8_t * rxData)
IanBenzMaxim 0:33d4e66780c0 228 {
IanBenzMaxim 0:33d4e66780c0 229 const int cs_delay_ms = 5;
IanBenzMaxim 0:33d4e66780c0 230
IanBenzMaxim 0:33d4e66780c0 231 cs = 0;
IanBenzMaxim 0:33d4e66780c0 232 wait_ms(cs_delay_ms);
IanBenzMaxim 0:33d4e66780c0 233 for (size_t i = 0; i < dataSize; i++)
IanBenzMaxim 0:33d4e66780c0 234 {
IanBenzMaxim 0:33d4e66780c0 235 if (rxData == NULL)
IanBenzMaxim 0:33d4e66780c0 236 spi.write(txData[i]);
IanBenzMaxim 0:33d4e66780c0 237 else
IanBenzMaxim 0:33d4e66780c0 238 rxData[i] = spi.write(txData[i]);
IanBenzMaxim 0:33d4e66780c0 239 }
IanBenzMaxim 0:33d4e66780c0 240 wait_ms(cs_delay_ms);
IanBenzMaxim 0:33d4e66780c0 241 cs = 1;
IanBenzMaxim 0:33d4e66780c0 242 }
IanBenzMaxim 0:33d4e66780c0 243
IanBenzMaxim 0:33d4e66780c0 244 CC3100::CC3100() : spi(HOST_SPI_MOSI_PIN, HOST_SPI_MISO_PIN, HOST_SPI_CLK_PIN, HOST_SPI_nCS_PIN) { }
IanBenzMaxim 0:33d4e66780c0 245
IanBenzMaxim 0:33d4e66780c0 246 CC3100 & CC3100::instance()
IanBenzMaxim 0:33d4e66780c0 247 {
IanBenzMaxim 0:33d4e66780c0 248 static CC3100 instance;
IanBenzMaxim 0:33d4e66780c0 249 return instance;
IanBenzMaxim 0:33d4e66780c0 250 }
IanBenzMaxim 0:33d4e66780c0 251
IanBenzMaxim 0:33d4e66780c0 252 int CC3100::start()
IanBenzMaxim 0:33d4e66780c0 253 {
IanBenzMaxim 0:33d4e66780c0 254 // Adapter should be stopped.
IanBenzMaxim 0:33d4e66780c0 255 if (currentState != Stopped)
IanBenzMaxim 0:33d4e66780c0 256 return invalidState;
IanBenzMaxim 0:33d4e66780c0 257
IanBenzMaxim 0:33d4e66780c0 258 int result = sl_Start(&spi, NULL, NULL);
IanBenzMaxim 0:33d4e66780c0 259 if (result >= 0)
IanBenzMaxim 0:33d4e66780c0 260 currentState = Disconnected;
IanBenzMaxim 0:33d4e66780c0 261 return result;
IanBenzMaxim 0:33d4e66780c0 262 }
IanBenzMaxim 0:33d4e66780c0 263
IanBenzMaxim 0:33d4e66780c0 264 CC3100::State CC3100::state() const
IanBenzMaxim 0:33d4e66780c0 265 {
IanBenzMaxim 0:33d4e66780c0 266 return currentState;
IanBenzMaxim 0:33d4e66780c0 267 }
IanBenzMaxim 0:33d4e66780c0 268
IanBenzMaxim 0:33d4e66780c0 269 int CC3100::stop()
IanBenzMaxim 0:33d4e66780c0 270 {
IanBenzMaxim 0:33d4e66780c0 271 // Adapter should not be stopped.
IanBenzMaxim 0:33d4e66780c0 272 if (currentState == Stopped)
IanBenzMaxim 0:33d4e66780c0 273 return invalidState;
IanBenzMaxim 0:33d4e66780c0 274
IanBenzMaxim 0:33d4e66780c0 275 int result = sl_Stop(0xFF);
IanBenzMaxim 0:33d4e66780c0 276 if (result >= 0)
IanBenzMaxim 0:33d4e66780c0 277 currentState = Stopped;
IanBenzMaxim 0:33d4e66780c0 278 return result;
IanBenzMaxim 0:33d4e66780c0 279 }
IanBenzMaxim 0:33d4e66780c0 280
IanBenzMaxim 0:33d4e66780c0 281 void CC3100::update()
IanBenzMaxim 0:33d4e66780c0 282 {
IanBenzMaxim 0:33d4e66780c0 283 sl_Task();
IanBenzMaxim 0:33d4e66780c0 284 }
IanBenzMaxim 0:33d4e66780c0 285
IanBenzMaxim 3:d2799d8497c0 286 int CC3100::setDateTime(const std::tm & dateTime)
IanBenzMaxim 0:33d4e66780c0 287 {
IanBenzMaxim 0:33d4e66780c0 288 SlDateTime_t slDateTime = {
IanBenzMaxim 3:d2799d8497c0 289 static_cast<_u32>(dateTime.tm_sec), // sl_tm_sec
IanBenzMaxim 3:d2799d8497c0 290 static_cast<_u32>(dateTime.tm_min), // sl_tm_min
IanBenzMaxim 3:d2799d8497c0 291 static_cast<_u32>(dateTime.tm_hour), // sl_tm_hour
IanBenzMaxim 3:d2799d8497c0 292 static_cast<_u32>(dateTime.tm_mday), // sl_tm_day
IanBenzMaxim 3:d2799d8497c0 293 static_cast<_u32>(dateTime.tm_mon), // sl_tm_mon
IanBenzMaxim 3:d2799d8497c0 294 static_cast<_u32>(dateTime.tm_year) // sl_tm_year
IanBenzMaxim 0:33d4e66780c0 295 };
IanBenzMaxim 0:33d4e66780c0 296 return sl_DevSet(SL_DEVICE_GENERAL_CONFIGURATION,
IanBenzMaxim 0:33d4e66780c0 297 SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME,
IanBenzMaxim 0:33d4e66780c0 298 sizeof(SlDateTime_t),
IanBenzMaxim 3:d2799d8497c0 299 reinterpret_cast<const _u8 *>(&slDateTime));
IanBenzMaxim 0:33d4e66780c0 300 }
IanBenzMaxim 0:33d4e66780c0 301
IanBenzMaxim 0:33d4e66780c0 302 int CC3100::set_credentials(const char * ssid, const char * pass, nsapi_security_t security)
IanBenzMaxim 0:33d4e66780c0 303 {
IanBenzMaxim 0:33d4e66780c0 304 this->ssid.assign(ssid);
IanBenzMaxim 0:33d4e66780c0 305 this->pass.assign(pass);
IanBenzMaxim 0:33d4e66780c0 306 this->security = security;
IanBenzMaxim 0:33d4e66780c0 307 return 0;
IanBenzMaxim 0:33d4e66780c0 308 }
IanBenzMaxim 0:33d4e66780c0 309
IanBenzMaxim 0:33d4e66780c0 310 int CC3100::connect(const char * ssid, const char * pass, nsapi_security_t security, uint8_t channel)
IanBenzMaxim 0:33d4e66780c0 311 {
IanBenzMaxim 0:33d4e66780c0 312 // Adapter should be disconnected.
IanBenzMaxim 0:33d4e66780c0 313 if (currentState != Disconnected)
IanBenzMaxim 0:33d4e66780c0 314 return invalidState;
IanBenzMaxim 0:33d4e66780c0 315
IanBenzMaxim 0:33d4e66780c0 316 SlSecParams_t secParams = {
IanBenzMaxim 3:d2799d8497c0 317 SL_SEC_TYPE_OPEN, // Type
IanBenzMaxim 3:d2799d8497c0 318 const_cast<_i8 *>(reinterpret_cast<const _i8 *>(pass)), // Key
IanBenzMaxim 3:d2799d8497c0 319 static_cast<_u8>(strlen(pass)), // KeyLen
IanBenzMaxim 0:33d4e66780c0 320 };
IanBenzMaxim 0:33d4e66780c0 321 switch (security)
IanBenzMaxim 0:33d4e66780c0 322 {
IanBenzMaxim 0:33d4e66780c0 323 case NSAPI_SECURITY_WPA2:
IanBenzMaxim 0:33d4e66780c0 324 case NSAPI_SECURITY_WPA:
IanBenzMaxim 3:d2799d8497c0 325 case NSAPI_SECURITY_WPA_WPA2:
IanBenzMaxim 0:33d4e66780c0 326 secParams.Type = SL_SEC_TYPE_WPA_WPA2;
IanBenzMaxim 0:33d4e66780c0 327 break;
IanBenzMaxim 0:33d4e66780c0 328
IanBenzMaxim 0:33d4e66780c0 329 case NSAPI_SECURITY_WEP:
IanBenzMaxim 0:33d4e66780c0 330 secParams.Type = SL_SEC_TYPE_WEP;
IanBenzMaxim 0:33d4e66780c0 331 break;
IanBenzMaxim 3:d2799d8497c0 332
IanBenzMaxim 3:d2799d8497c0 333 case NSAPI_SECURITY_NONE:
IanBenzMaxim 3:d2799d8497c0 334 case NSAPI_SECURITY_UNKNOWN:
IanBenzMaxim 3:d2799d8497c0 335 secParams.Type = SL_SEC_TYPE_OPEN;
IanBenzMaxim 3:d2799d8497c0 336 break;
IanBenzMaxim 0:33d4e66780c0 337 }
IanBenzMaxim 3:d2799d8497c0 338 int result = sl_WlanConnect(reinterpret_cast<const _i8 *>(ssid), strlen(ssid), NULL, &secParams, NULL);
IanBenzMaxim 0:33d4e66780c0 339 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 340 {
IanBenzMaxim 0:33d4e66780c0 341 // Wait for completion.
IanBenzMaxim 0:33d4e66780c0 342 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 343 do
IanBenzMaxim 0:33d4e66780c0 344 {
IanBenzMaxim 0:33d4e66780c0 345 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 346 update();
IanBenzMaxim 0:33d4e66780c0 347 } while ((currentState != Connected) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 348 if (attempts == 0)
IanBenzMaxim 0:33d4e66780c0 349 result = SL_RET_CODE_ABORT;
IanBenzMaxim 0:33d4e66780c0 350 }
IanBenzMaxim 0:33d4e66780c0 351 return result;
IanBenzMaxim 0:33d4e66780c0 352 }
IanBenzMaxim 0:33d4e66780c0 353
IanBenzMaxim 0:33d4e66780c0 354 int CC3100::connect(const char * ssid, const char * username, const char * password)
IanBenzMaxim 0:33d4e66780c0 355 {
IanBenzMaxim 0:33d4e66780c0 356 // Adapter should be disconnected.
IanBenzMaxim 0:33d4e66780c0 357 if (currentState != Disconnected)
IanBenzMaxim 0:33d4e66780c0 358 return invalidState;
IanBenzMaxim 0:33d4e66780c0 359
IanBenzMaxim 0:33d4e66780c0 360 uint8_t values = 0;
IanBenzMaxim 0:33d4e66780c0 361 sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, 19, 1, &values);
IanBenzMaxim 0:33d4e66780c0 362
IanBenzMaxim 0:33d4e66780c0 363 SlSecParams_t secParams = {
IanBenzMaxim 3:d2799d8497c0 364 SL_SEC_TYPE_WPA_ENT, // Type
IanBenzMaxim 3:d2799d8497c0 365 const_cast<_i8 *>(reinterpret_cast<const _i8 *>(password)), // Key
IanBenzMaxim 3:d2799d8497c0 366 static_cast<_u8>(strlen(password)) // KeyLen
IanBenzMaxim 0:33d4e66780c0 367 };
IanBenzMaxim 0:33d4e66780c0 368 SlSecParamsExt_t secParamsExt = {
IanBenzMaxim 3:d2799d8497c0 369 const_cast<_i8 *>(reinterpret_cast<const _i8 *>(username)), // User
IanBenzMaxim 3:d2799d8497c0 370 static_cast<_u8>(strlen(username)), // UserLen
IanBenzMaxim 3:d2799d8497c0 371 NULL, // AnonUser
IanBenzMaxim 3:d2799d8497c0 372 0, // AnonUserLen
IanBenzMaxim 3:d2799d8497c0 373 0, // CertIndex
IanBenzMaxim 3:d2799d8497c0 374 SL_ENT_EAP_METHOD_PEAP0_MSCHAPv2 // EapMethod
IanBenzMaxim 0:33d4e66780c0 375 };
IanBenzMaxim 3:d2799d8497c0 376 int result = sl_WlanConnect(reinterpret_cast<const _i8 *>(ssid), strlen(ssid), NULL, &secParams, &secParamsExt);
IanBenzMaxim 0:33d4e66780c0 377 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 378 {
IanBenzMaxim 0:33d4e66780c0 379 // Wait for completion.
IanBenzMaxim 0:33d4e66780c0 380 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 381 do
IanBenzMaxim 0:33d4e66780c0 382 {
IanBenzMaxim 0:33d4e66780c0 383 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 384 update();
IanBenzMaxim 0:33d4e66780c0 385 } while ((currentState != Connected) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 386 if (attempts == 0)
IanBenzMaxim 0:33d4e66780c0 387 result = SL_RET_CODE_ABORT;
IanBenzMaxim 0:33d4e66780c0 388 }
IanBenzMaxim 0:33d4e66780c0 389 return result;
IanBenzMaxim 0:33d4e66780c0 390 }
IanBenzMaxim 0:33d4e66780c0 391
IanBenzMaxim 0:33d4e66780c0 392 int CC3100::disconnect()
IanBenzMaxim 0:33d4e66780c0 393 {
IanBenzMaxim 0:33d4e66780c0 394 // Adapter should be connected.
IanBenzMaxim 0:33d4e66780c0 395 if (currentState != Connected)
IanBenzMaxim 0:33d4e66780c0 396 return invalidState;
IanBenzMaxim 0:33d4e66780c0 397
IanBenzMaxim 0:33d4e66780c0 398 return sl_WlanDisconnect();
IanBenzMaxim 0:33d4e66780c0 399 }
IanBenzMaxim 0:33d4e66780c0 400
IanBenzMaxim 0:33d4e66780c0 401 int CC3100::gethostbyname(const char *host, SocketAddress *address, nsapi_version_t version)
IanBenzMaxim 0:33d4e66780c0 402 {
IanBenzMaxim 0:33d4e66780c0 403 // TODO: Add IPv6 support
IanBenzMaxim 0:33d4e66780c0 404
IanBenzMaxim 0:33d4e66780c0 405 // Adapter should be connected.
IanBenzMaxim 0:33d4e66780c0 406 if (currentState != Connected)
IanBenzMaxim 0:33d4e66780c0 407 return invalidState;
IanBenzMaxim 0:33d4e66780c0 408
IanBenzMaxim 0:33d4e66780c0 409 uint32_t addressInt;
IanBenzMaxim 0:33d4e66780c0 410 int result;
IanBenzMaxim 0:33d4e66780c0 411 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 412 do // Wait for DNS servers.
IanBenzMaxim 0:33d4e66780c0 413 {
IanBenzMaxim 0:33d4e66780c0 414 wait_ms(10);
IanBenzMaxim 3:d2799d8497c0 415 result = sl_NetAppDnsGetHostByName(const_cast<_i8 *>(reinterpret_cast<const _i8 *>(host)), strlen(host),
IanBenzMaxim 3:d2799d8497c0 416 reinterpret_cast<_u32 *>(&addressInt), SL_AF_INET);
IanBenzMaxim 0:33d4e66780c0 417 } while ((result == SL_NET_APP_DNS_NO_SERVER) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 418 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 419 {
IanBenzMaxim 0:33d4e66780c0 420 nsapi_addr_t addressBytes = {
IanBenzMaxim 0:33d4e66780c0 421 NSAPI_IPv4, // version
IanBenzMaxim 0:33d4e66780c0 422 0, // bytes
IanBenzMaxim 0:33d4e66780c0 423 };
IanBenzMaxim 3:d2799d8497c0 424 for (int i = 4; i > 0; i--)
IanBenzMaxim 0:33d4e66780c0 425 {
IanBenzMaxim 3:d2799d8497c0 426 addressBytes.bytes[i - 1] = addressInt;
IanBenzMaxim 0:33d4e66780c0 427 addressInt >>= 8;
IanBenzMaxim 0:33d4e66780c0 428 }
IanBenzMaxim 0:33d4e66780c0 429 address->set_addr(addressBytes);
IanBenzMaxim 0:33d4e66780c0 430 }
IanBenzMaxim 0:33d4e66780c0 431 return result;
IanBenzMaxim 0:33d4e66780c0 432 }
IanBenzMaxim 0:33d4e66780c0 433
IanBenzMaxim 0:33d4e66780c0 434 int CC3100::ping(const SocketAddress & address)
IanBenzMaxim 0:33d4e66780c0 435 {
IanBenzMaxim 0:33d4e66780c0 436 // Adapter should be connected.
IanBenzMaxim 0:33d4e66780c0 437 if (currentState != Connected)
IanBenzMaxim 0:33d4e66780c0 438 return invalidState;
IanBenzMaxim 0:33d4e66780c0 439
IanBenzMaxim 0:33d4e66780c0 440 SlPingStartCommand_t pingParams = {
IanBenzMaxim 0:33d4e66780c0 441 1000, // PingIntervalTime
IanBenzMaxim 0:33d4e66780c0 442 20, // PingSize
IanBenzMaxim 0:33d4e66780c0 443 3000, // PingRequestTimeout
IanBenzMaxim 0:33d4e66780c0 444 3, // TotalNumberOfAttempts
IanBenzMaxim 0:33d4e66780c0 445 0, // Flags
IanBenzMaxim 0:33d4e66780c0 446 0 // Ip
IanBenzMaxim 0:33d4e66780c0 447 };
IanBenzMaxim 3:d2799d8497c0 448 for (int i = 0; i < 4; i++)
IanBenzMaxim 0:33d4e66780c0 449 {
IanBenzMaxim 0:33d4e66780c0 450 pingParams.Ip <<= 8;
IanBenzMaxim 0:33d4e66780c0 451 pingParams.Ip |= address.get_addr().bytes[i];
IanBenzMaxim 0:33d4e66780c0 452 }
IanBenzMaxim 0:33d4e66780c0 453 SlPingReport_t pingReport;
IanBenzMaxim 0:33d4e66780c0 454 int result = sl_NetAppPingStart((SlPingStartCommand_t*)&pingParams, SL_AF_INET,
IanBenzMaxim 3:d2799d8497c0 455 static_cast<SlPingReport_t *>(&pingReport), SimpleLinkPingReport);
IanBenzMaxim 0:33d4e66780c0 456 if (result == SL_RET_CODE_OK)
IanBenzMaxim 0:33d4e66780c0 457 {
IanBenzMaxim 0:33d4e66780c0 458 // Wait for completion.
IanBenzMaxim 0:33d4e66780c0 459 currentState = Pinging;
IanBenzMaxim 0:33d4e66780c0 460 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 461 do
IanBenzMaxim 0:33d4e66780c0 462 {
IanBenzMaxim 0:33d4e66780c0 463 wait_ms(10);
IanBenzMaxim 0:33d4e66780c0 464 update();
IanBenzMaxim 0:33d4e66780c0 465 } while ((currentState == Pinging) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 466 if (attempts == 0)
IanBenzMaxim 0:33d4e66780c0 467 result = SL_RET_CODE_ABORT;
IanBenzMaxim 0:33d4e66780c0 468 }
IanBenzMaxim 0:33d4e66780c0 469 return result;
IanBenzMaxim 0:33d4e66780c0 470 }
IanBenzMaxim 0:33d4e66780c0 471
IanBenzMaxim 0:33d4e66780c0 472 int CC3100::socket_open(nsapi_socket_t *handle, nsapi_protocol_t proto)
IanBenzMaxim 0:33d4e66780c0 473 {
IanBenzMaxim 0:33d4e66780c0 474 int16_t result;
IanBenzMaxim 0:33d4e66780c0 475 switch (proto)
IanBenzMaxim 0:33d4e66780c0 476 {
IanBenzMaxim 0:33d4e66780c0 477 case NSAPI_TCP:
IanBenzMaxim 0:33d4e66780c0 478 result = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, 0);
IanBenzMaxim 0:33d4e66780c0 479 break;
IanBenzMaxim 0:33d4e66780c0 480
IanBenzMaxim 0:33d4e66780c0 481 case NSAPI_UDP:
IanBenzMaxim 0:33d4e66780c0 482 result = sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, 0);
IanBenzMaxim 0:33d4e66780c0 483 break;
IanBenzMaxim 0:33d4e66780c0 484
IanBenzMaxim 3:d2799d8497c0 485 /*case SL_SEC_SOCKET:
IanBenzMaxim 0:33d4e66780c0 486 result = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, SL_SEC_SOCKET);
IanBenzMaxim 3:d2799d8497c0 487 break;*/
IanBenzMaxim 0:33d4e66780c0 488
IanBenzMaxim 0:33d4e66780c0 489 default:
IanBenzMaxim 0:33d4e66780c0 490 result = SL_SOC_ERROR;
IanBenzMaxim 0:33d4e66780c0 491 break;
IanBenzMaxim 0:33d4e66780c0 492 }
IanBenzMaxim 0:33d4e66780c0 493 if (result >= 0)
IanBenzMaxim 0:33d4e66780c0 494 {
IanBenzMaxim 0:33d4e66780c0 495 *handle = new int16_t(result);
IanBenzMaxim 0:33d4e66780c0 496
IanBenzMaxim 0:33d4e66780c0 497 // Set non-blocking.
IanBenzMaxim 0:33d4e66780c0 498 SlSockNonblocking_t enableOption = {
IanBenzMaxim 0:33d4e66780c0 499 1 // NonblockingEnabled
IanBenzMaxim 0:33d4e66780c0 500 };
IanBenzMaxim 3:d2799d8497c0 501 result = sl_SetSockOpt(*static_cast<int16_t *>(*handle), SL_SOL_SOCKET,SL_SO_NONBLOCKING,
IanBenzMaxim 3:d2799d8497c0 502 reinterpret_cast<_u8 *>(&enableOption), sizeof(enableOption));
IanBenzMaxim 0:33d4e66780c0 503
IanBenzMaxim 0:33d4e66780c0 504 if (result < 0)
IanBenzMaxim 0:33d4e66780c0 505 socket_close(*handle);
IanBenzMaxim 0:33d4e66780c0 506 }
IanBenzMaxim 0:33d4e66780c0 507 return result;
IanBenzMaxim 0:33d4e66780c0 508 }
IanBenzMaxim 0:33d4e66780c0 509
IanBenzMaxim 0:33d4e66780c0 510 int CC3100::socket_set_cert_path(nsapi_socket_t handle, const char * certPath)
IanBenzMaxim 0:33d4e66780c0 511 {
IanBenzMaxim 0:33d4e66780c0 512 // Set CA certificate.
IanBenzMaxim 3:d2799d8497c0 513 return sl_SetSockOpt(*static_cast<int16_t *>(handle), SL_SOL_SOCKET, SL_SO_SECURE_FILES_CA_FILE_NAME,
IanBenzMaxim 0:33d4e66780c0 514 certPath, strlen(certPath));
IanBenzMaxim 0:33d4e66780c0 515 }
IanBenzMaxim 0:33d4e66780c0 516
IanBenzMaxim 0:33d4e66780c0 517 int CC3100::socket_close(nsapi_socket_t handle)
IanBenzMaxim 0:33d4e66780c0 518 {
IanBenzMaxim 3:d2799d8497c0 519 int16_t * castedHandle = static_cast<int16_t *>(handle);
IanBenzMaxim 3:d2799d8497c0 520 int result = sl_Close(*castedHandle);
IanBenzMaxim 3:d2799d8497c0 521 delete castedHandle;
IanBenzMaxim 0:33d4e66780c0 522 return result;
IanBenzMaxim 0:33d4e66780c0 523 }
IanBenzMaxim 0:33d4e66780c0 524
IanBenzMaxim 0:33d4e66780c0 525 int CC3100::socket_bind(nsapi_socket_t handle, const SocketAddress &address)
IanBenzMaxim 0:33d4e66780c0 526 {
IanBenzMaxim 0:33d4e66780c0 527 // TODO: Add IPv6 support
IanBenzMaxim 0:33d4e66780c0 528 if (address.get_addr().version != NSAPI_IPv4)
IanBenzMaxim 0:33d4e66780c0 529 return SL_SOC_ERROR;
IanBenzMaxim 0:33d4e66780c0 530
IanBenzMaxim 0:33d4e66780c0 531 SlSockAddrIn_t localAddr = {
IanBenzMaxim 0:33d4e66780c0 532 AF_INET, // sin_family
IanBenzMaxim 0:33d4e66780c0 533 sl_Htons(address.get_port()), // sin_port
IanBenzMaxim 0:33d4e66780c0 534 { // sin_addr
IanBenzMaxim 0:33d4e66780c0 535 0 // s_addr
IanBenzMaxim 0:33d4e66780c0 536 }
IanBenzMaxim 0:33d4e66780c0 537 };
IanBenzMaxim 3:d2799d8497c0 538 for (int i = 4; i > 0; i--)
IanBenzMaxim 0:33d4e66780c0 539 {
IanBenzMaxim 0:33d4e66780c0 540 localAddr.sin_addr.s_addr <<= 8;
IanBenzMaxim 3:d2799d8497c0 541 localAddr.sin_addr.s_addr |= address.get_addr().bytes[i - 1];
IanBenzMaxim 0:33d4e66780c0 542 }
IanBenzMaxim 3:d2799d8497c0 543 return sl_Bind(*static_cast<int16_t *>(handle), reinterpret_cast<SlSockAddr_t *>(&localAddr), sizeof(localAddr));
IanBenzMaxim 0:33d4e66780c0 544 }
IanBenzMaxim 0:33d4e66780c0 545
IanBenzMaxim 0:33d4e66780c0 546 int CC3100::socket_listen(nsapi_socket_t handle, int backlog)
IanBenzMaxim 0:33d4e66780c0 547 {
IanBenzMaxim 3:d2799d8497c0 548 return sl_Listen(*static_cast<int16_t *>(handle), backlog);
IanBenzMaxim 0:33d4e66780c0 549 }
IanBenzMaxim 0:33d4e66780c0 550
IanBenzMaxim 0:33d4e66780c0 551 int CC3100::socket_connect(nsapi_socket_t handle, const SocketAddress &address)
IanBenzMaxim 0:33d4e66780c0 552 {
IanBenzMaxim 0:33d4e66780c0 553 // TODO: Add IPv6 support
IanBenzMaxim 0:33d4e66780c0 554 if (address.get_addr().version != NSAPI_IPv4)
IanBenzMaxim 0:33d4e66780c0 555 return SL_SOC_ERROR;
IanBenzMaxim 0:33d4e66780c0 556
IanBenzMaxim 0:33d4e66780c0 557 SlSockAddrIn_t addr = {
IanBenzMaxim 0:33d4e66780c0 558 AF_INET, // sin_family
IanBenzMaxim 0:33d4e66780c0 559 sl_Htons(address.get_port()), // sin_port
IanBenzMaxim 0:33d4e66780c0 560 { // sin_addr
IanBenzMaxim 0:33d4e66780c0 561 0 // s_addr
IanBenzMaxim 0:33d4e66780c0 562 }
IanBenzMaxim 0:33d4e66780c0 563 };
IanBenzMaxim 3:d2799d8497c0 564 for (int i = 4; i > 0; i--)
IanBenzMaxim 0:33d4e66780c0 565 {
IanBenzMaxim 0:33d4e66780c0 566 addr.sin_addr.s_addr <<= 8;
IanBenzMaxim 3:d2799d8497c0 567 addr.sin_addr.s_addr |= address.get_addr().bytes[i - 1];
IanBenzMaxim 0:33d4e66780c0 568 }
IanBenzMaxim 0:33d4e66780c0 569 int result;
IanBenzMaxim 0:33d4e66780c0 570 int attempts = 1000;
IanBenzMaxim 0:33d4e66780c0 571 do
IanBenzMaxim 0:33d4e66780c0 572 {
IanBenzMaxim 0:33d4e66780c0 573 wait_ms(10);
IanBenzMaxim 3:d2799d8497c0 574 result = sl_Connect(*static_cast<int16_t *>(handle), reinterpret_cast<SlSockAddr_t *>(&addr), sizeof(addr));
IanBenzMaxim 0:33d4e66780c0 575 } while ((result == SL_EALREADY) && (--attempts > 0));
IanBenzMaxim 0:33d4e66780c0 576 if (result > 0)
IanBenzMaxim 0:33d4e66780c0 577 result = 0;
IanBenzMaxim 0:33d4e66780c0 578 return result;
IanBenzMaxim 0:33d4e66780c0 579 }
IanBenzMaxim 0:33d4e66780c0 580
IanBenzMaxim 0:33d4e66780c0 581 int CC3100::socket_send(nsapi_socket_t handle, const void *data, unsigned size)
IanBenzMaxim 0:33d4e66780c0 582 {
IanBenzMaxim 3:d2799d8497c0 583 return sl_Send(*static_cast<int16_t *>(handle), data, size, 0);
IanBenzMaxim 0:33d4e66780c0 584 }
IanBenzMaxim 0:33d4e66780c0 585
IanBenzMaxim 0:33d4e66780c0 586 int CC3100::socket_recv(nsapi_socket_t handle, void *data, unsigned size)
IanBenzMaxim 0:33d4e66780c0 587 {
IanBenzMaxim 3:d2799d8497c0 588 int result = sl_Recv(*static_cast<int16_t *>(handle), data, size, 0);
IanBenzMaxim 0:33d4e66780c0 589 if (result == SL_EAGAIN)
IanBenzMaxim 0:33d4e66780c0 590 result = NSAPI_ERROR_WOULD_BLOCK;
IanBenzMaxim 0:33d4e66780c0 591 return result;
IanBenzMaxim 0:33d4e66780c0 592 }