TI's MQTT Demo with freertos CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Thu Sep 03 14:07:01 2015 +0000
Revision:
0:1e7b5dd9edb4
First commit, it's been hanging around for a while. Updated SPI mode change 1 to 0.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:1e7b5dd9edb4 1 /*
dflet 0:1e7b5dd9edb4 2 * device.c - CC31xx/CC32xx Host Driver Implementation
dflet 0:1e7b5dd9edb4 3 *
dflet 0:1e7b5dd9edb4 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:1e7b5dd9edb4 5 *
dflet 0:1e7b5dd9edb4 6 *
dflet 0:1e7b5dd9edb4 7 * Redistribution and use in source and binary forms, with or without
dflet 0:1e7b5dd9edb4 8 * modification, are permitted provided that the following conditions
dflet 0:1e7b5dd9edb4 9 * are met:
dflet 0:1e7b5dd9edb4 10 *
dflet 0:1e7b5dd9edb4 11 * Redistributions of source code must retain the above copyright
dflet 0:1e7b5dd9edb4 12 * notice, this list of conditions and the following disclaimer.
dflet 0:1e7b5dd9edb4 13 *
dflet 0:1e7b5dd9edb4 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:1e7b5dd9edb4 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:1e7b5dd9edb4 16 * documentation and/or other materials provided with the
dflet 0:1e7b5dd9edb4 17 * distribution.
dflet 0:1e7b5dd9edb4 18 *
dflet 0:1e7b5dd9edb4 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:1e7b5dd9edb4 20 * its contributors may be used to endorse or promote products derived
dflet 0:1e7b5dd9edb4 21 * from this software without specific prior written permission.
dflet 0:1e7b5dd9edb4 22 *
dflet 0:1e7b5dd9edb4 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:1e7b5dd9edb4 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:1e7b5dd9edb4 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:1e7b5dd9edb4 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:1e7b5dd9edb4 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:1e7b5dd9edb4 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:1e7b5dd9edb4 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:1e7b5dd9edb4 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:1e7b5dd9edb4 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:1e7b5dd9edb4 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:1e7b5dd9edb4 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:1e7b5dd9edb4 34 *
dflet 0:1e7b5dd9edb4 35 */
dflet 0:1e7b5dd9edb4 36
dflet 0:1e7b5dd9edb4 37
dflet 0:1e7b5dd9edb4 38
dflet 0:1e7b5dd9edb4 39 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 40 /* Include files */
dflet 0:1e7b5dd9edb4 41 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 42 #include "cc3100_simplelink.h"
dflet 0:1e7b5dd9edb4 43 #include "cc3100_protocol.h"
dflet 0:1e7b5dd9edb4 44 #include "cc3100_sl_common.h"
dflet 0:1e7b5dd9edb4 45 #include "cc3100.h"
dflet 0:1e7b5dd9edb4 46
dflet 0:1e7b5dd9edb4 47 #include "fPtr_func.h"
dflet 0:1e7b5dd9edb4 48 #include "cli_uart.h"
dflet 0:1e7b5dd9edb4 49
dflet 0:1e7b5dd9edb4 50
dflet 0:1e7b5dd9edb4 51 namespace mbed_cc3100 {
dflet 0:1e7b5dd9edb4 52
dflet 0:1e7b5dd9edb4 53 uint32_t g_PingPacketsRecv;
dflet 0:1e7b5dd9edb4 54 uint32_t g_GatewayIP;
dflet 0:1e7b5dd9edb4 55 uint32_t g_StationIP;
dflet 0:1e7b5dd9edb4 56 uint32_t g_DestinationIP;
dflet 0:1e7b5dd9edb4 57 uint32_t g_BytesReceived; // variable to store the file size
dflet 0:1e7b5dd9edb4 58 uint32_t g_Status;
dflet 0:1e7b5dd9edb4 59 uint8_t g_buff[MAX_BUFF_SIZE+1];
dflet 0:1e7b5dd9edb4 60 int32_t g_SockID;
dflet 0:1e7b5dd9edb4 61
dflet 0:1e7b5dd9edb4 62 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 63 cc3100::cc3100(PinName button1_irq, PinName button2_irq, PinName cc3100_irq, PinName cc3100_nHIB, PinName cc3100_cs, SPI cc3100_spi)
dflet 0:1e7b5dd9edb4 64 : _spi(button1_irq, button2_irq, cc3100_irq, cc3100_nHIB, cc3100_cs, cc3100_spi, _driver),
dflet 0:1e7b5dd9edb4 65 _driver(_spi, _nonos, _netapp, _flowcont), _nonos(_driver), _wlan(_driver, _wlan_filters),
dflet 0:1e7b5dd9edb4 66 _wlan_filters(_driver), _netapp(_driver, _nonos), _fs(_driver), _netcfg(_driver),
dflet 0:1e7b5dd9edb4 67 _socket(_driver, _nonos), _flowcont(_driver, _nonos)
dflet 0:1e7b5dd9edb4 68 {
dflet 0:1e7b5dd9edb4 69
dflet 0:1e7b5dd9edb4 70 }
dflet 0:1e7b5dd9edb4 71 #else
dflet 0:1e7b5dd9edb4 72 cc3100::cc3100(PinName button1_irq, PinName button2_irq, PinName cc3100_irq, PinName cc3100_nHIB, PinName cc3100_cs, SPI cc3100_spi)
dflet 0:1e7b5dd9edb4 73 : _spi(button1_irq, button2_irq, cc3100_irq, cc3100_nHIB, cc3100_cs, cc3100_spi, _driver),
dflet 0:1e7b5dd9edb4 74 _driver(_spi, _netapp, _flowcont), _wlan(_driver, _wlan_filters),
dflet 0:1e7b5dd9edb4 75 _wlan_filters(_driver), _netapp(_driver), _fs(_driver), _netcfg(_driver),
dflet 0:1e7b5dd9edb4 76 _socket(_driver), _flowcont(_driver)
dflet 0:1e7b5dd9edb4 77 {
dflet 0:1e7b5dd9edb4 78
dflet 0:1e7b5dd9edb4 79 }
dflet 0:1e7b5dd9edb4 80 #endif
dflet 0:1e7b5dd9edb4 81
dflet 0:1e7b5dd9edb4 82 cc3100::~cc3100()
dflet 0:1e7b5dd9edb4 83 {
dflet 0:1e7b5dd9edb4 84
dflet 0:1e7b5dd9edb4 85 }
dflet 0:1e7b5dd9edb4 86
dflet 0:1e7b5dd9edb4 87 /*!
dflet 0:1e7b5dd9edb4 88 \brief This function initializes the application variables
dflet 0:1e7b5dd9edb4 89
dflet 0:1e7b5dd9edb4 90 \param[in] None
dflet 0:1e7b5dd9edb4 91
dflet 0:1e7b5dd9edb4 92 \return 0 on success, negative error-code on error
dflet 0:1e7b5dd9edb4 93 */
dflet 0:1e7b5dd9edb4 94 int32_t cc3100::initializeAppVariables()
dflet 0:1e7b5dd9edb4 95 {
dflet 0:1e7b5dd9edb4 96
dflet 0:1e7b5dd9edb4 97 g_Status = 0;
dflet 0:1e7b5dd9edb4 98 g_PingPacketsRecv = 0;
dflet 0:1e7b5dd9edb4 99 g_StationIP = 0;
dflet 0:1e7b5dd9edb4 100 g_GatewayIP = 0;
dflet 0:1e7b5dd9edb4 101 g_DestinationIP = 0;
dflet 0:1e7b5dd9edb4 102 g_BytesReceived = 0; /* variable to store the file size */
dflet 0:1e7b5dd9edb4 103 g_SockID = 0;
dflet 0:1e7b5dd9edb4 104 memset(g_buff, 0, sizeof(g_buff));
dflet 0:1e7b5dd9edb4 105
dflet 0:1e7b5dd9edb4 106 return SUCCESS;
dflet 0:1e7b5dd9edb4 107 }
dflet 0:1e7b5dd9edb4 108
dflet 0:1e7b5dd9edb4 109 /*!
dflet 0:1e7b5dd9edb4 110 \brief Disconnecting from a WLAN Access point
dflet 0:1e7b5dd9edb4 111
dflet 0:1e7b5dd9edb4 112 This function disconnects from the connected AP
dflet 0:1e7b5dd9edb4 113
dflet 0:1e7b5dd9edb4 114 \param[in] None
dflet 0:1e7b5dd9edb4 115
dflet 0:1e7b5dd9edb4 116 \return none
dflet 0:1e7b5dd9edb4 117
dflet 0:1e7b5dd9edb4 118 \note
dflet 0:1e7b5dd9edb4 119
dflet 0:1e7b5dd9edb4 120 \warning If the WLAN disconnection fails, we will be stuck in this function forever.
dflet 0:1e7b5dd9edb4 121 */
dflet 0:1e7b5dd9edb4 122 int32_t cc3100::disconnectFromAP()
dflet 0:1e7b5dd9edb4 123 {
dflet 0:1e7b5dd9edb4 124 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 125
dflet 0:1e7b5dd9edb4 126 /*
dflet 0:1e7b5dd9edb4 127 * The function returns 0 if 'Disconnected done', negative number if already disconnected
dflet 0:1e7b5dd9edb4 128 * Wait for 'disconnection' event if 0 is returned, Ignore other return-codes
dflet 0:1e7b5dd9edb4 129 */
dflet 0:1e7b5dd9edb4 130 retVal = _wlan.sl_WlanDisconnect();
dflet 0:1e7b5dd9edb4 131 if(0 == retVal)
dflet 0:1e7b5dd9edb4 132 {
dflet 0:1e7b5dd9edb4 133 /* Wait */
dflet 0:1e7b5dd9edb4 134 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 135 while(IS_CONNECTED(g_Status,STATUS_BIT_CONNECTION)) { _nonos._SlNonOsMainLoopTask(); }
dflet 0:1e7b5dd9edb4 136 #endif
dflet 0:1e7b5dd9edb4 137 }
dflet 0:1e7b5dd9edb4 138
dflet 0:1e7b5dd9edb4 139 return SUCCESS;
dflet 0:1e7b5dd9edb4 140 }
dflet 0:1e7b5dd9edb4 141
dflet 0:1e7b5dd9edb4 142 /*!
dflet 0:1e7b5dd9edb4 143 \brief This function configure the SimpleLink device in its default state. It:
dflet 0:1e7b5dd9edb4 144 - Sets the mode to STATION
dflet 0:1e7b5dd9edb4 145 - Configures connection policy to Auto and AutoSmartConfig
dflet 0:1e7b5dd9edb4 146 - Deletes all the stored profiles
dflet 0:1e7b5dd9edb4 147 - Enables DHCP
dflet 0:1e7b5dd9edb4 148 - Disables Scan policy
dflet 0:1e7b5dd9edb4 149 - Sets Tx power to maximum
dflet 0:1e7b5dd9edb4 150 - Sets power policy to normal
dflet 0:1e7b5dd9edb4 151 - Unregisters mDNS services
dflet 0:1e7b5dd9edb4 152 - Remove all filters
dflet 0:1e7b5dd9edb4 153
dflet 0:1e7b5dd9edb4 154 \param[in] none
dflet 0:1e7b5dd9edb4 155
dflet 0:1e7b5dd9edb4 156 \return On success, zero is returned. On error, negative is returned
dflet 0:1e7b5dd9edb4 157 */
dflet 0:1e7b5dd9edb4 158 int32_t cc3100::configureSimpleLinkToDefaultState()
dflet 0:1e7b5dd9edb4 159 {
dflet 0:1e7b5dd9edb4 160 SlVersionFull ver = {0};
dflet 0:1e7b5dd9edb4 161 _WlanRxFilterOperationCommandBuff_t RxFilterIdMask = {0};
dflet 0:1e7b5dd9edb4 162
dflet 0:1e7b5dd9edb4 163 uint8_t val = 1;
dflet 0:1e7b5dd9edb4 164 uint8_t configOpt = 0;
dflet 0:1e7b5dd9edb4 165 uint8_t configLen = 0;
dflet 0:1e7b5dd9edb4 166 uint8_t power = 0;
dflet 0:1e7b5dd9edb4 167
dflet 0:1e7b5dd9edb4 168 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 169 int32_t role = -1;
dflet 0:1e7b5dd9edb4 170
dflet 0:1e7b5dd9edb4 171 role = sl_Start(0, 0, 0);
dflet 0:1e7b5dd9edb4 172 ASSERT_ON_ERROR(role);
dflet 0:1e7b5dd9edb4 173
dflet 0:1e7b5dd9edb4 174 /* If the device is not in station-mode, try configuring it in station-mode */
dflet 0:1e7b5dd9edb4 175 if (ROLE_STA != role) {
dflet 0:1e7b5dd9edb4 176 if (ROLE_AP == role) {
dflet 0:1e7b5dd9edb4 177 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:1e7b5dd9edb4 178 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 179 while(!IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) {
dflet 0:1e7b5dd9edb4 180 _nonos._SlNonOsMainLoopTask();
dflet 0:1e7b5dd9edb4 181 }
dflet 0:1e7b5dd9edb4 182 #endif
dflet 0:1e7b5dd9edb4 183 }
dflet 0:1e7b5dd9edb4 184
dflet 0:1e7b5dd9edb4 185 /* Switch to STA role and restart */
dflet 0:1e7b5dd9edb4 186 retVal = _wlan.sl_WlanSetMode(ROLE_STA);
dflet 0:1e7b5dd9edb4 187 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 188
dflet 0:1e7b5dd9edb4 189 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:1e7b5dd9edb4 190 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 191
dflet 0:1e7b5dd9edb4 192 retVal = sl_Start(0, 0, 0);
dflet 0:1e7b5dd9edb4 193 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 194
dflet 0:1e7b5dd9edb4 195 /* Check if the device is in station again */
dflet 0:1e7b5dd9edb4 196 if (ROLE_STA != retVal) {
dflet 0:1e7b5dd9edb4 197 /* We don't want to proceed if the device is not coming up in station-mode */
dflet 0:1e7b5dd9edb4 198 ASSERT_ON_ERROR(DEVICE_NOT_IN_STATION_MODE);
dflet 0:1e7b5dd9edb4 199 }
dflet 0:1e7b5dd9edb4 200 }
dflet 0:1e7b5dd9edb4 201
dflet 0:1e7b5dd9edb4 202 /* Get the device's version-information */
dflet 0:1e7b5dd9edb4 203 configOpt = SL_DEVICE_GENERAL_VERSION;
dflet 0:1e7b5dd9edb4 204 configLen = sizeof(ver);
dflet 0:1e7b5dd9edb4 205 retVal = sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION, &configOpt, &configLen, (uint8_t *)(&ver));
dflet 0:1e7b5dd9edb4 206 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 207
dflet 0:1e7b5dd9edb4 208 /* Set connection policy to Auto + SmartConfig (Device's default connection policy) */
dflet 0:1e7b5dd9edb4 209 retVal = _wlan.sl_WlanPolicySet(SL_POLICY_CONNECTION, SL_CONNECTION_POLICY(1, 0, 0, 0, 1), NULL, 0);
dflet 0:1e7b5dd9edb4 210 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 211
dflet 0:1e7b5dd9edb4 212 /* Remove all profiles */
dflet 0:1e7b5dd9edb4 213 retVal = _wlan.sl_WlanProfileDel(0xFF);
dflet 0:1e7b5dd9edb4 214 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 215
dflet 0:1e7b5dd9edb4 216 /*
dflet 0:1e7b5dd9edb4 217 * Device in station-mode. Disconnect previous connection if any
dflet 0:1e7b5dd9edb4 218 * The function returns 0 if 'Disconnected done', negative number if already disconnected
dflet 0:1e7b5dd9edb4 219 * Wait for 'disconnection' event if 0 is returned, Ignore other return-codes
dflet 0:1e7b5dd9edb4 220 */
dflet 0:1e7b5dd9edb4 221 retVal = _wlan.sl_WlanDisconnect();
dflet 0:1e7b5dd9edb4 222 if(0 == retVal) {
dflet 0:1e7b5dd9edb4 223 /* Wait */
dflet 0:1e7b5dd9edb4 224 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 225 while(IS_CONNECTED(g_Status,STATUS_BIT_CONNECTION)) {
dflet 0:1e7b5dd9edb4 226 _nonos._SlNonOsMainLoopTask();
dflet 0:1e7b5dd9edb4 227 }
dflet 0:1e7b5dd9edb4 228 #endif
dflet 0:1e7b5dd9edb4 229 }
dflet 0:1e7b5dd9edb4 230
dflet 0:1e7b5dd9edb4 231 /* Enable DHCP client*/
dflet 0:1e7b5dd9edb4 232 retVal = _netcfg.sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE,1,1,&val);
dflet 0:1e7b5dd9edb4 233 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 234
dflet 0:1e7b5dd9edb4 235 /* Disable scan */
dflet 0:1e7b5dd9edb4 236 configOpt = SL_SCAN_POLICY(0);
dflet 0:1e7b5dd9edb4 237 retVal = _wlan.sl_WlanPolicySet(SL_POLICY_SCAN , configOpt, NULL, 0);
dflet 0:1e7b5dd9edb4 238 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 239
dflet 0:1e7b5dd9edb4 240 /* Set Tx power level for station mode
dflet 0:1e7b5dd9edb4 241 Number between 0-15, as dB offset from maximum power - 0 will set maximum power */
dflet 0:1e7b5dd9edb4 242 power = 0;
dflet 0:1e7b5dd9edb4 243 retVal = _wlan.sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER, 1, (uint8_t *)&power);
dflet 0:1e7b5dd9edb4 244 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 245
dflet 0:1e7b5dd9edb4 246 /* Set PM policy to normal */
dflet 0:1e7b5dd9edb4 247 retVal = _wlan.sl_WlanPolicySet(SL_POLICY_PM , SL_NORMAL_POLICY, NULL, 0);
dflet 0:1e7b5dd9edb4 248 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 249
dflet 0:1e7b5dd9edb4 250 /* Unregister mDNS services */
dflet 0:1e7b5dd9edb4 251 retVal = _netapp.sl_NetAppMDNSUnRegisterService(0, 0);
dflet 0:1e7b5dd9edb4 252 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 253
dflet 0:1e7b5dd9edb4 254 /* Remove all 64 filters (8*8) */
dflet 0:1e7b5dd9edb4 255 memset(RxFilterIdMask.FilterIdMask, 0xFF, 8);
dflet 0:1e7b5dd9edb4 256
dflet 0:1e7b5dd9edb4 257 retVal = _wlan_filters.sl_WlanRxFilterSet(SL_REMOVE_RX_FILTER, (uint8_t *)&RxFilterIdMask,
dflet 0:1e7b5dd9edb4 258 sizeof(_WlanRxFilterOperationCommandBuff_t));
dflet 0:1e7b5dd9edb4 259 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 260
dflet 0:1e7b5dd9edb4 261 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:1e7b5dd9edb4 262 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 263
dflet 0:1e7b5dd9edb4 264 retVal = initializeAppVariables();
dflet 0:1e7b5dd9edb4 265 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 266
dflet 0:1e7b5dd9edb4 267 return retVal; /* Success */
dflet 0:1e7b5dd9edb4 268 }
dflet 0:1e7b5dd9edb4 269
dflet 0:1e7b5dd9edb4 270 /*!
dflet 0:1e7b5dd9edb4 271 \brief Create UDP socket to communicate with server.
dflet 0:1e7b5dd9edb4 272
dflet 0:1e7b5dd9edb4 273 \param[in] none
dflet 0:1e7b5dd9edb4 274
dflet 0:1e7b5dd9edb4 275 \return Socket descriptor for success otherwise negative
dflet 0:1e7b5dd9edb4 276
dflet 0:1e7b5dd9edb4 277 \warning
dflet 0:1e7b5dd9edb4 278 */
dflet 0:1e7b5dd9edb4 279 int32_t cc3100::createUDPConnection()
dflet 0:1e7b5dd9edb4 280 {
dflet 0:1e7b5dd9edb4 281 int32_t sd = 0;
dflet 0:1e7b5dd9edb4 282
dflet 0:1e7b5dd9edb4 283 sd = _socket.sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, IPPROTO_UDP);
dflet 0:1e7b5dd9edb4 284 if( sd < 0 )
dflet 0:1e7b5dd9edb4 285 {
dflet 0:1e7b5dd9edb4 286 Uart_Write((uint8_t *)"Error creating socket\n\r\n\r");
dflet 0:1e7b5dd9edb4 287 }
dflet 0:1e7b5dd9edb4 288
dflet 0:1e7b5dd9edb4 289 return sd;
dflet 0:1e7b5dd9edb4 290 }
dflet 0:1e7b5dd9edb4 291
dflet 0:1e7b5dd9edb4 292 /*!
dflet 0:1e7b5dd9edb4 293 \brief Create connection with server.
dflet 0:1e7b5dd9edb4 294
dflet 0:1e7b5dd9edb4 295 This function opens a socket and create the endpoint communication with server
dflet 0:1e7b5dd9edb4 296
dflet 0:1e7b5dd9edb4 297 \param[in] DestinationIP - IP address of the server
dflet 0:1e7b5dd9edb4 298
dflet 0:1e7b5dd9edb4 299 \return socket id for success and negative for error
dflet 0:1e7b5dd9edb4 300 */
dflet 0:1e7b5dd9edb4 301 int32_t cc3100::createConnection(uint32_t DestinationIP)
dflet 0:1e7b5dd9edb4 302 {
dflet 0:1e7b5dd9edb4 303 SlSockAddrIn_t Addr = {0};
dflet 0:1e7b5dd9edb4 304 int32_t Status = 0;
dflet 0:1e7b5dd9edb4 305 int32_t AddrSize = 0;
dflet 0:1e7b5dd9edb4 306 int32_t SockID = 0;
dflet 0:1e7b5dd9edb4 307
dflet 0:1e7b5dd9edb4 308 Addr.sin_family = SL_AF_INET;
dflet 0:1e7b5dd9edb4 309 Addr.sin_port = _socket.sl_Htons(80);
dflet 0:1e7b5dd9edb4 310 Addr.sin_addr.s_addr = _socket.sl_Htonl(DestinationIP);
dflet 0:1e7b5dd9edb4 311
dflet 0:1e7b5dd9edb4 312 AddrSize = sizeof(SlSockAddrIn_t);
dflet 0:1e7b5dd9edb4 313
dflet 0:1e7b5dd9edb4 314 SockID = _socket.sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
dflet 0:1e7b5dd9edb4 315 ASSERT_ON_ERROR(SockID);
dflet 0:1e7b5dd9edb4 316
dflet 0:1e7b5dd9edb4 317 Status = _socket.sl_Connect(SockID, ( SlSockAddr_t *)&Addr, AddrSize);
dflet 0:1e7b5dd9edb4 318 if (Status < 0)
dflet 0:1e7b5dd9edb4 319 {
dflet 0:1e7b5dd9edb4 320 _socket.sl_Close(SockID);
dflet 0:1e7b5dd9edb4 321 ASSERT_ON_ERROR(Status);
dflet 0:1e7b5dd9edb4 322 }
dflet 0:1e7b5dd9edb4 323
dflet 0:1e7b5dd9edb4 324 return SockID;
dflet 0:1e7b5dd9edb4 325 }
dflet 0:1e7b5dd9edb4 326
dflet 0:1e7b5dd9edb4 327 /*!
dflet 0:1e7b5dd9edb4 328 \brief Convert hex to decimal base
dflet 0:1e7b5dd9edb4 329
dflet 0:1e7b5dd9edb4 330 \param[in] ptr - pointer to string containing number in hex
dflet 0:1e7b5dd9edb4 331
dflet 0:1e7b5dd9edb4 332 \return number in decimal base
dflet 0:1e7b5dd9edb4 333
dflet 0:1e7b5dd9edb4 334 */
dflet 0:1e7b5dd9edb4 335 int32_t cc3100::hexToi(unsigned char *ptr)
dflet 0:1e7b5dd9edb4 336 {
dflet 0:1e7b5dd9edb4 337 uint32_t result = 0;
dflet 0:1e7b5dd9edb4 338 uint32_t len = 0;
dflet 0:1e7b5dd9edb4 339
dflet 0:1e7b5dd9edb4 340 int32_t idx = -1;
dflet 0:1e7b5dd9edb4 341
dflet 0:1e7b5dd9edb4 342 len = strlen((const char*) ptr);
dflet 0:1e7b5dd9edb4 343
dflet 0:1e7b5dd9edb4 344 /* convert characters to upper case */
dflet 0:1e7b5dd9edb4 345 for(idx = 0; ptr[idx] != '\0'; ++idx)
dflet 0:1e7b5dd9edb4 346 {
dflet 0:1e7b5dd9edb4 347 if( (ptr[idx] >= 'a') &&
dflet 0:1e7b5dd9edb4 348 (ptr[idx] <= 'f') )
dflet 0:1e7b5dd9edb4 349 {
dflet 0:1e7b5dd9edb4 350 ptr[idx] -= 32; /* Change case - ASCII 'a' = 97, 'A' = 65 => 97-65 = 32 */
dflet 0:1e7b5dd9edb4 351 }
dflet 0:1e7b5dd9edb4 352 }
dflet 0:1e7b5dd9edb4 353
dflet 0:1e7b5dd9edb4 354 for(idx = 0; ptr[idx] != '\0'; ++idx)
dflet 0:1e7b5dd9edb4 355 {
dflet 0:1e7b5dd9edb4 356 if(ptr[idx] >= '0' && ptr[idx] <= '9')
dflet 0:1e7b5dd9edb4 357 {
dflet 0:1e7b5dd9edb4 358 /* Converting '0' to '9' to their decimal value */
dflet 0:1e7b5dd9edb4 359 result += (ptr[idx] - '0') * (1 << (4 * (len - 1 - idx)));
dflet 0:1e7b5dd9edb4 360 }
dflet 0:1e7b5dd9edb4 361 else if(ptr[idx] >= 'A' && ptr[idx] <= 'F')
dflet 0:1e7b5dd9edb4 362 {
dflet 0:1e7b5dd9edb4 363 /* Converting hex 'A' to 'F' to their decimal value */
dflet 0:1e7b5dd9edb4 364 result += (ptr[idx] - 55) * (1 << (4 * (len -1 - idx))); /* .i.e. 'A' - 55 = 10, 'F' - 55 = 15 */
dflet 0:1e7b5dd9edb4 365 }
dflet 0:1e7b5dd9edb4 366 else
dflet 0:1e7b5dd9edb4 367 {
dflet 0:1e7b5dd9edb4 368 ASSERT_ON_ERROR(INVALID_HEX_STRING);
dflet 0:1e7b5dd9edb4 369 }
dflet 0:1e7b5dd9edb4 370 }
dflet 0:1e7b5dd9edb4 371
dflet 0:1e7b5dd9edb4 372 return result;
dflet 0:1e7b5dd9edb4 373 }
dflet 0:1e7b5dd9edb4 374
dflet 0:1e7b5dd9edb4 375 /*!
dflet 0:1e7b5dd9edb4 376 \brief Calculate the file chunk size
dflet 0:1e7b5dd9edb4 377
dflet 0:1e7b5dd9edb4 378 \param[in] len - pointer to length of the data in the buffer
dflet 0:1e7b5dd9edb4 379 \param[in] p_Buff - pointer to pointer of buffer containing data
dflet 0:1e7b5dd9edb4 380 \param[out] chunk_size - pointer to variable containing chunk size
dflet 0:1e7b5dd9edb4 381
dflet 0:1e7b5dd9edb4 382 \return 0 for success, -ve for error
dflet 0:1e7b5dd9edb4 383
dflet 0:1e7b5dd9edb4 384 */
dflet 0:1e7b5dd9edb4 385 int32_t cc3100::getChunkSize(int32_t *len, uint8_t **p_Buff, uint32_t *chunk_size)
dflet 0:1e7b5dd9edb4 386 {
dflet 0:1e7b5dd9edb4 387 int32_t idx = -1;
dflet 0:1e7b5dd9edb4 388 unsigned char lenBuff[10];
dflet 0:1e7b5dd9edb4 389
dflet 0:1e7b5dd9edb4 390 idx = 0;
dflet 0:1e7b5dd9edb4 391 memset(lenBuff, 0, sizeof(lenBuff));
dflet 0:1e7b5dd9edb4 392 while(*len >= 0 && **p_Buff != 13) /* check for <CR> */
dflet 0:1e7b5dd9edb4 393 {
dflet 0:1e7b5dd9edb4 394 if(0 == *len)
dflet 0:1e7b5dd9edb4 395 {
dflet 0:1e7b5dd9edb4 396 memset(g_buff, 0, sizeof(g_buff));
dflet 0:1e7b5dd9edb4 397 *len = _socket.sl_Recv(g_SockID, &g_buff[0], MAX_BUFF_SIZE, 0);
dflet 0:1e7b5dd9edb4 398 if(*len <= 0)
dflet 0:1e7b5dd9edb4 399 ASSERT_ON_ERROR(TCP_RECV_ERROR);
dflet 0:1e7b5dd9edb4 400
dflet 0:1e7b5dd9edb4 401 *p_Buff = g_buff;
dflet 0:1e7b5dd9edb4 402 }
dflet 0:1e7b5dd9edb4 403
dflet 0:1e7b5dd9edb4 404 lenBuff[idx] = **p_Buff;
dflet 0:1e7b5dd9edb4 405 idx++;
dflet 0:1e7b5dd9edb4 406 (*p_Buff)++;
dflet 0:1e7b5dd9edb4 407 (*len)--;
dflet 0:1e7b5dd9edb4 408 }
dflet 0:1e7b5dd9edb4 409
dflet 0:1e7b5dd9edb4 410 (*p_Buff) += 2; /* skip <CR><LF> */
dflet 0:1e7b5dd9edb4 411 (*len) -= 2;
dflet 0:1e7b5dd9edb4 412 *chunk_size = hexToi(lenBuff);
dflet 0:1e7b5dd9edb4 413
dflet 0:1e7b5dd9edb4 414 return SUCCESS;
dflet 0:1e7b5dd9edb4 415 }
dflet 0:1e7b5dd9edb4 416
dflet 0:1e7b5dd9edb4 417 /*!
dflet 0:1e7b5dd9edb4 418 \brief Obtain the file from the server
dflet 0:1e7b5dd9edb4 419
dflet 0:1e7b5dd9edb4 420 This function requests the file from the server and save it on serial flash.
dflet 0:1e7b5dd9edb4 421 To request a different file for different user needs to modify the
dflet 0:1e7b5dd9edb4 422 PREFIX_BUFFER and POST_BUFFER macros.
dflet 0:1e7b5dd9edb4 423
dflet 0:1e7b5dd9edb4 424 \param[in] None
dflet 0:1e7b5dd9edb4 425
dflet 0:1e7b5dd9edb4 426 \return 0 for success and negative for error
dflet 0:1e7b5dd9edb4 427
dflet 0:1e7b5dd9edb4 428 */
dflet 0:1e7b5dd9edb4 429 /*
dflet 0:1e7b5dd9edb4 430 int32_t cc3100::getFile()
dflet 0:1e7b5dd9edb4 431 {
dflet 0:1e7b5dd9edb4 432 uint32_t Token = 0;
dflet 0:1e7b5dd9edb4 433 uint32_t recv_size = 0;
dflet 0:1e7b5dd9edb4 434 uint8_t *pBuff = 0;
dflet 0:1e7b5dd9edb4 435 uint8_t eof_detected = 0;
dflet 0:1e7b5dd9edb4 436 uint8_t isChunked = 0;
dflet 0:1e7b5dd9edb4 437
dflet 0:1e7b5dd9edb4 438 int32_t transfer_len = -1;
dflet 0:1e7b5dd9edb4 439 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 440 int32_t fileHandle = -1;
dflet 0:1e7b5dd9edb4 441
dflet 0:1e7b5dd9edb4 442 memset(g_buff, 0, sizeof(g_buff));
dflet 0:1e7b5dd9edb4 443
dflet 0:1e7b5dd9edb4 444 //Puts together the HTTP GET string.
dflet 0:1e7b5dd9edb4 445 strcpy((char*)g_buff, PREFIX_BUFFER);
dflet 0:1e7b5dd9edb4 446 strcat((char*)g_buff, POST_BUFFER);
dflet 0:1e7b5dd9edb4 447
dflet 0:1e7b5dd9edb4 448 //Send the HTTP GET string to the opened TCP/IP socket.
dflet 0:1e7b5dd9edb4 449 transfer_len = _socket.sl_Send(g_SockID, g_buff, strlen((const char*)g_buff), 0);
dflet 0:1e7b5dd9edb4 450
dflet 0:1e7b5dd9edb4 451 if (transfer_len < 0)
dflet 0:1e7b5dd9edb4 452 {
dflet 0:1e7b5dd9edb4 453 // error
dflet 0:1e7b5dd9edb4 454 printf(" Socket Send Error\r\n");
dflet 0:1e7b5dd9edb4 455 ASSERT_ON_ERROR(TCP_SEND_ERROR);
dflet 0:1e7b5dd9edb4 456 }
dflet 0:1e7b5dd9edb4 457
dflet 0:1e7b5dd9edb4 458 memset(g_buff, 0, sizeof(g_buff));
dflet 0:1e7b5dd9edb4 459
dflet 0:1e7b5dd9edb4 460 //get the reply from the server in buffer.
dflet 0:1e7b5dd9edb4 461 transfer_len = _socket.sl_Recv(g_SockID, &g_buff[0], MAX_BUFF_SIZE, 0);
dflet 0:1e7b5dd9edb4 462
dflet 0:1e7b5dd9edb4 463 if(transfer_len <= 0)
dflet 0:1e7b5dd9edb4 464 ASSERT_ON_ERROR(TCP_RECV_ERROR);
dflet 0:1e7b5dd9edb4 465
dflet 0:1e7b5dd9edb4 466 // Check for 404 return code
dflet 0:1e7b5dd9edb4 467 if(strstr((const char*)g_buff, HTTP_FILE_NOT_FOUND) != 0)
dflet 0:1e7b5dd9edb4 468 {
dflet 0:1e7b5dd9edb4 469 printf(" File not found, check the file and try again\r\n");
dflet 0:1e7b5dd9edb4 470 ASSERT_ON_ERROR(FILE_NOT_FOUND_ERROR);
dflet 0:1e7b5dd9edb4 471 }
dflet 0:1e7b5dd9edb4 472
dflet 0:1e7b5dd9edb4 473 // if not "200 OK" return error
dflet 0:1e7b5dd9edb4 474 if(strstr((const char*)g_buff, HTTP_STATUS_OK) == 0)
dflet 0:1e7b5dd9edb4 475 {
dflet 0:1e7b5dd9edb4 476 printf(" Error during downloading the file\r\n");
dflet 0:1e7b5dd9edb4 477 ASSERT_ON_ERROR(INVALID_SERVER_RESPONSE);
dflet 0:1e7b5dd9edb4 478 }
dflet 0:1e7b5dd9edb4 479
dflet 0:1e7b5dd9edb4 480 // check if content length is transferred with headers
dflet 0:1e7b5dd9edb4 481 pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_CONTENT_LENGTH);
dflet 0:1e7b5dd9edb4 482 if(pBuff != 0)
dflet 0:1e7b5dd9edb4 483 {
dflet 0:1e7b5dd9edb4 484 // not supported
dflet 0:1e7b5dd9edb4 485 printf(" Server response format is not supported\r\n");
dflet 0:1e7b5dd9edb4 486 ASSERT_ON_ERROR(FORMAT_NOT_SUPPORTED);
dflet 0:1e7b5dd9edb4 487 }
dflet 0:1e7b5dd9edb4 488
dflet 0:1e7b5dd9edb4 489 // Check if data is chunked
dflet 0:1e7b5dd9edb4 490 pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_TRANSFER_ENCODING);
dflet 0:1e7b5dd9edb4 491 if(pBuff != 0)
dflet 0:1e7b5dd9edb4 492 {
dflet 0:1e7b5dd9edb4 493 pBuff += strlen(HTTP_TRANSFER_ENCODING);
dflet 0:1e7b5dd9edb4 494 while(*pBuff == SPACE)
dflet 0:1e7b5dd9edb4 495 pBuff++;
dflet 0:1e7b5dd9edb4 496
dflet 0:1e7b5dd9edb4 497 if(memcmp(pBuff, HTTP_ENCODING_CHUNKED, strlen(HTTP_ENCODING_CHUNKED)) == 0)
dflet 0:1e7b5dd9edb4 498 {
dflet 0:1e7b5dd9edb4 499 recv_size = 0;
dflet 0:1e7b5dd9edb4 500 isChunked = 1;
dflet 0:1e7b5dd9edb4 501 }
dflet 0:1e7b5dd9edb4 502 }
dflet 0:1e7b5dd9edb4 503 else
dflet 0:1e7b5dd9edb4 504 {
dflet 0:1e7b5dd9edb4 505 // Check if connection will be closed by after sending data
dflet 0:1e7b5dd9edb4 506 // In this method the content length is not received and end of
dflet 0:1e7b5dd9edb4 507 // connection marks the end of data
dflet 0:1e7b5dd9edb4 508 pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_CONNECTION);
dflet 0:1e7b5dd9edb4 509 if(pBuff != 0)
dflet 0:1e7b5dd9edb4 510 {
dflet 0:1e7b5dd9edb4 511 pBuff += strlen(HTTP_CONNECTION);
dflet 0:1e7b5dd9edb4 512 while(*pBuff == SPACE)
dflet 0:1e7b5dd9edb4 513 pBuff++;
dflet 0:1e7b5dd9edb4 514
dflet 0:1e7b5dd9edb4 515 if(memcmp(pBuff, HTTP_ENCODING_CHUNKED, strlen(HTTP_CONNECTION_CLOSE)) == 0)
dflet 0:1e7b5dd9edb4 516 {
dflet 0:1e7b5dd9edb4 517 // not supported
dflet 0:1e7b5dd9edb4 518 printf(" Server response format is not supported\r\n");
dflet 0:1e7b5dd9edb4 519 ASSERT_ON_ERROR(FORMAT_NOT_SUPPORTED);
dflet 0:1e7b5dd9edb4 520 }
dflet 0:1e7b5dd9edb4 521 }
dflet 0:1e7b5dd9edb4 522 }
dflet 0:1e7b5dd9edb4 523
dflet 0:1e7b5dd9edb4 524 // "\r\n\r\n" marks the end of headers
dflet 0:1e7b5dd9edb4 525 pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_END_OF_HEADER);
dflet 0:1e7b5dd9edb4 526 if(pBuff == 0)
dflet 0:1e7b5dd9edb4 527 {
dflet 0:1e7b5dd9edb4 528 printf(" Invalid response\r\n");
dflet 0:1e7b5dd9edb4 529 ASSERT_ON_ERROR(INVALID_SERVER_RESPONSE);
dflet 0:1e7b5dd9edb4 530 }
dflet 0:1e7b5dd9edb4 531 // Increment by 4 to skip "\r\n\r\n"
dflet 0:1e7b5dd9edb4 532 pBuff += 4;
dflet 0:1e7b5dd9edb4 533
dflet 0:1e7b5dd9edb4 534 // Adjust buffer data length for header size
dflet 0:1e7b5dd9edb4 535 transfer_len -= (pBuff - g_buff);
dflet 0:1e7b5dd9edb4 536
dflet 0:1e7b5dd9edb4 537 // If data in chunked format, calculate the chunk size
dflet 0:1e7b5dd9edb4 538 if(isChunked == 1)
dflet 0:1e7b5dd9edb4 539 {
dflet 0:1e7b5dd9edb4 540 retVal = getChunkSize(&transfer_len, &pBuff, &recv_size);
dflet 0:1e7b5dd9edb4 541 if(retVal < 0)
dflet 0:1e7b5dd9edb4 542 {
dflet 0:1e7b5dd9edb4 543 // Error
dflet 0:1e7b5dd9edb4 544 printf(" Problem with connection to server\r\n");
dflet 0:1e7b5dd9edb4 545 return retVal;
dflet 0:1e7b5dd9edb4 546 }
dflet 0:1e7b5dd9edb4 547 }
dflet 0:1e7b5dd9edb4 548
dflet 0:1e7b5dd9edb4 549 // Open file to save the downloaded file
dflet 0:1e7b5dd9edb4 550 retVal = _fs.sl_FsOpen((uint8_t *)FILE_NAME,
dflet 0:1e7b5dd9edb4 551 FS_MODE_OPEN_WRITE, &Token, &fileHandle);
dflet 0:1e7b5dd9edb4 552 if(retVal < 0)
dflet 0:1e7b5dd9edb4 553 {
dflet 0:1e7b5dd9edb4 554 // File Doesn't exit create a new of 45 KB file
dflet 0:1e7b5dd9edb4 555 retVal = _fs.sl_FsOpen((uint8_t *)FILE_NAME,
dflet 0:1e7b5dd9edb4 556 _fs.FS_MODE_OPEN_CREATE(SIZE_45K,_FS_FILE_OPEN_FLAG_COMMIT|_FS_FILE_PUBLIC_WRITE),
dflet 0:1e7b5dd9edb4 557 &Token, &fileHandle);
dflet 0:1e7b5dd9edb4 558 if(retVal < 0)
dflet 0:1e7b5dd9edb4 559 {
dflet 0:1e7b5dd9edb4 560 printf(" Error during opening the file\r\n");
dflet 0:1e7b5dd9edb4 561 return retVal;
dflet 0:1e7b5dd9edb4 562 }
dflet 0:1e7b5dd9edb4 563 }
dflet 0:1e7b5dd9edb4 564
dflet 0:1e7b5dd9edb4 565 while (0 < transfer_len)
dflet 0:1e7b5dd9edb4 566 {
dflet 0:1e7b5dd9edb4 567 // For chunked data recv_size contains the chunk size to be received
dflet 0:1e7b5dd9edb4 568 // while the transfer_len contains the data in the buffer
dflet 0:1e7b5dd9edb4 569 if(recv_size <= transfer_len)
dflet 0:1e7b5dd9edb4 570 {
dflet 0:1e7b5dd9edb4 571 // write the recv_size
dflet 0:1e7b5dd9edb4 572 retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived,
dflet 0:1e7b5dd9edb4 573 (uint8_t *)pBuff, recv_size);
dflet 0:1e7b5dd9edb4 574 if(retVal < recv_size)
dflet 0:1e7b5dd9edb4 575 {
dflet 0:1e7b5dd9edb4 576 // Close file without saving
dflet 0:1e7b5dd9edb4 577 retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1);
dflet 0:1e7b5dd9edb4 578 printf(" Error during writing the file\r\n");
dflet 0:1e7b5dd9edb4 579 return FILE_WRITE_ERROR;
dflet 0:1e7b5dd9edb4 580 }
dflet 0:1e7b5dd9edb4 581 transfer_len -= recv_size;
dflet 0:1e7b5dd9edb4 582 g_BytesReceived +=recv_size;
dflet 0:1e7b5dd9edb4 583 pBuff += recv_size;
dflet 0:1e7b5dd9edb4 584 recv_size = 0;
dflet 0:1e7b5dd9edb4 585
dflet 0:1e7b5dd9edb4 586 if(isChunked == 1)
dflet 0:1e7b5dd9edb4 587 {
dflet 0:1e7b5dd9edb4 588 // if data in chunked format calculate next chunk size
dflet 0:1e7b5dd9edb4 589 pBuff += 2; // 2 bytes for <CR> <LF>
dflet 0:1e7b5dd9edb4 590 transfer_len -= 2;
dflet 0:1e7b5dd9edb4 591
dflet 0:1e7b5dd9edb4 592 if(getChunkSize(&transfer_len, &pBuff, &recv_size) < 0)
dflet 0:1e7b5dd9edb4 593 {
dflet 0:1e7b5dd9edb4 594 // Error
dflet 0:1e7b5dd9edb4 595 break;
dflet 0:1e7b5dd9edb4 596 }
dflet 0:1e7b5dd9edb4 597
dflet 0:1e7b5dd9edb4 598 // if next chunk size is zero we have received the complete file
dflet 0:1e7b5dd9edb4 599 if(recv_size == 0)
dflet 0:1e7b5dd9edb4 600 {
dflet 0:1e7b5dd9edb4 601 eof_detected = 1;
dflet 0:1e7b5dd9edb4 602 break;
dflet 0:1e7b5dd9edb4 603 }
dflet 0:1e7b5dd9edb4 604
dflet 0:1e7b5dd9edb4 605 if(recv_size < transfer_len)
dflet 0:1e7b5dd9edb4 606 {
dflet 0:1e7b5dd9edb4 607 // Code will enter this section if the new chunk size is less then
dflet 0:1e7b5dd9edb4 608 // then the transfer size. This will the last chunk of file received
dflet 0:1e7b5dd9edb4 609
dflet 0:1e7b5dd9edb4 610 retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived,
dflet 0:1e7b5dd9edb4 611 (uint8_t *)pBuff, recv_size);
dflet 0:1e7b5dd9edb4 612 if(retVal < recv_size)
dflet 0:1e7b5dd9edb4 613 {
dflet 0:1e7b5dd9edb4 614 // Close file without saving
dflet 0:1e7b5dd9edb4 615 retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1);
dflet 0:1e7b5dd9edb4 616 printf(" Error during writing the file\r\n");
dflet 0:1e7b5dd9edb4 617 return FILE_WRITE_ERROR;
dflet 0:1e7b5dd9edb4 618 }
dflet 0:1e7b5dd9edb4 619 transfer_len -= recv_size;
dflet 0:1e7b5dd9edb4 620 g_BytesReceived +=recv_size;
dflet 0:1e7b5dd9edb4 621 pBuff += recv_size;
dflet 0:1e7b5dd9edb4 622 recv_size = 0;
dflet 0:1e7b5dd9edb4 623
dflet 0:1e7b5dd9edb4 624 pBuff += 2; // 2bytes for <CR> <LF>
dflet 0:1e7b5dd9edb4 625 transfer_len -= 2;
dflet 0:1e7b5dd9edb4 626
dflet 0:1e7b5dd9edb4 627 // Calculate the next chunk size, should be zero
dflet 0:1e7b5dd9edb4 628 if(getChunkSize(&transfer_len, &pBuff, &recv_size) < 0)
dflet 0:1e7b5dd9edb4 629 {
dflet 0:1e7b5dd9edb4 630 // Error
dflet 0:1e7b5dd9edb4 631 break;
dflet 0:1e7b5dd9edb4 632 }
dflet 0:1e7b5dd9edb4 633
dflet 0:1e7b5dd9edb4 634 // if next chunk size is non zero error
dflet 0:1e7b5dd9edb4 635 if(recv_size != 0)
dflet 0:1e7b5dd9edb4 636 {
dflet 0:1e7b5dd9edb4 637 // Error
dflet 0:1e7b5dd9edb4 638 break;
dflet 0:1e7b5dd9edb4 639 }
dflet 0:1e7b5dd9edb4 640 eof_detected = 1;
dflet 0:1e7b5dd9edb4 641 break;
dflet 0:1e7b5dd9edb4 642 }
dflet 0:1e7b5dd9edb4 643 else
dflet 0:1e7b5dd9edb4 644 {
dflet 0:1e7b5dd9edb4 645 // write data on the file
dflet 0:1e7b5dd9edb4 646 retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived,
dflet 0:1e7b5dd9edb4 647 (uint8_t *)pBuff, transfer_len);
dflet 0:1e7b5dd9edb4 648 if(retVal < transfer_len)
dflet 0:1e7b5dd9edb4 649 {
dflet 0:1e7b5dd9edb4 650 // Close file without saving
dflet 0:1e7b5dd9edb4 651 retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1);
dflet 0:1e7b5dd9edb4 652 printf(" Error during writing the file\r\n");
dflet 0:1e7b5dd9edb4 653 ASSERT_ON_ERROR(FILE_WRITE_ERROR);
dflet 0:1e7b5dd9edb4 654 }
dflet 0:1e7b5dd9edb4 655 recv_size -= transfer_len;
dflet 0:1e7b5dd9edb4 656 g_BytesReceived +=transfer_len;
dflet 0:1e7b5dd9edb4 657 }
dflet 0:1e7b5dd9edb4 658 }
dflet 0:1e7b5dd9edb4 659 // complete file received exit
dflet 0:1e7b5dd9edb4 660 if(recv_size == 0)
dflet 0:1e7b5dd9edb4 661 {
dflet 0:1e7b5dd9edb4 662 eof_detected = 1;
dflet 0:1e7b5dd9edb4 663 break;
dflet 0:1e7b5dd9edb4 664 }
dflet 0:1e7b5dd9edb4 665 }
dflet 0:1e7b5dd9edb4 666 else
dflet 0:1e7b5dd9edb4 667 {
dflet 0:1e7b5dd9edb4 668 // write data on the file
dflet 0:1e7b5dd9edb4 669 retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived,
dflet 0:1e7b5dd9edb4 670 (uint8_t *)pBuff, transfer_len);
dflet 0:1e7b5dd9edb4 671 if (retVal < 0)
dflet 0:1e7b5dd9edb4 672 {
dflet 0:1e7b5dd9edb4 673 // Close file without saving
dflet 0:1e7b5dd9edb4 674 retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1);
dflet 0:1e7b5dd9edb4 675 printf(" Error during writing the file\r\n");
dflet 0:1e7b5dd9edb4 676 ASSERT_ON_ERROR(FILE_WRITE_ERROR);
dflet 0:1e7b5dd9edb4 677 }
dflet 0:1e7b5dd9edb4 678 g_BytesReceived +=transfer_len;
dflet 0:1e7b5dd9edb4 679 recv_size -= transfer_len;
dflet 0:1e7b5dd9edb4 680 }
dflet 0:1e7b5dd9edb4 681
dflet 0:1e7b5dd9edb4 682 memset(g_buff, 0, sizeof(g_buff));
dflet 0:1e7b5dd9edb4 683
dflet 0:1e7b5dd9edb4 684 transfer_len = _socket.sl_Recv(g_SockID, &g_buff[0], MAX_BUFF_SIZE, 0);
dflet 0:1e7b5dd9edb4 685 if(transfer_len <= 0)
dflet 0:1e7b5dd9edb4 686 ASSERT_ON_ERROR(TCP_RECV_ERROR);
dflet 0:1e7b5dd9edb4 687
dflet 0:1e7b5dd9edb4 688 pBuff = g_buff;
dflet 0:1e7b5dd9edb4 689 }
dflet 0:1e7b5dd9edb4 690
dflet 0:1e7b5dd9edb4 691 // If user file has checksum which can be used to verify the temporary
dflet 0:1e7b5dd9edb4 692 // file then file should be verified
dflet 0:1e7b5dd9edb4 693 // In case of invalid file (FILE_NAME) should be closed without saving to
dflet 0:1e7b5dd9edb4 694 // recover the previous version of file
dflet 0:1e7b5dd9edb4 695 if(0 > transfer_len || eof_detected == 0)
dflet 0:1e7b5dd9edb4 696 {
dflet 0:1e7b5dd9edb4 697 // Close file without saving
dflet 0:1e7b5dd9edb4 698 retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1);
dflet 0:1e7b5dd9edb4 699 printf(" Error While File Download\r\n");
dflet 0:1e7b5dd9edb4 700 ASSERT_ON_ERROR(INVALID_FILE);
dflet 0:1e7b5dd9edb4 701 }
dflet 0:1e7b5dd9edb4 702 else
dflet 0:1e7b5dd9edb4 703 {
dflet 0:1e7b5dd9edb4 704 // Save and close file
dflet 0:1e7b5dd9edb4 705 retVal = _fs.sl_FsClose(fileHandle, 0, 0, 0);
dflet 0:1e7b5dd9edb4 706 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 707 }
dflet 0:1e7b5dd9edb4 708
dflet 0:1e7b5dd9edb4 709 return SUCCESS;;
dflet 0:1e7b5dd9edb4 710 }
dflet 0:1e7b5dd9edb4 711 */
dflet 0:1e7b5dd9edb4 712
dflet 0:1e7b5dd9edb4 713 /*!
dflet 0:1e7b5dd9edb4 714 \brief Connecting to a WLAN Access point
dflet 0:1e7b5dd9edb4 715
dflet 0:1e7b5dd9edb4 716 This function connects to the required AP (SSID_NAME).
dflet 0:1e7b5dd9edb4 717 The function will return once we are connected and have acquired IP address
dflet 0:1e7b5dd9edb4 718
dflet 0:1e7b5dd9edb4 719 \param[in] None
dflet 0:1e7b5dd9edb4 720
dflet 0:1e7b5dd9edb4 721 \return 0 on success, negative error-code on error
dflet 0:1e7b5dd9edb4 722
dflet 0:1e7b5dd9edb4 723 \note
dflet 0:1e7b5dd9edb4 724
dflet 0:1e7b5dd9edb4 725 \warning If the WLAN connection fails or we don't acquire an IP address,
dflet 0:1e7b5dd9edb4 726 We will be stuck in this function forever.
dflet 0:1e7b5dd9edb4 727 */
dflet 0:1e7b5dd9edb4 728 int32_t cc3100::establishConnectionWithAP()
dflet 0:1e7b5dd9edb4 729 {
dflet 0:1e7b5dd9edb4 730
dflet 0:1e7b5dd9edb4 731 SlSecParams_t secParams = {0};
dflet 0:1e7b5dd9edb4 732 int32_t retVal = 0;
dflet 0:1e7b5dd9edb4 733
dflet 0:1e7b5dd9edb4 734 secParams.Key = (signed char *)PASSKEY;
dflet 0:1e7b5dd9edb4 735 secParams.KeyLen = strlen(PASSKEY);
dflet 0:1e7b5dd9edb4 736 secParams.Type = SEC_TYPE;
dflet 0:1e7b5dd9edb4 737
dflet 0:1e7b5dd9edb4 738 retVal = _wlan.sl_WlanConnect((signed char *)SSID_NAME, strlen(SSID_NAME), 0, &secParams, 0);
dflet 0:1e7b5dd9edb4 739 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 740
dflet 0:1e7b5dd9edb4 741 /* Wait */
dflet 0:1e7b5dd9edb4 742 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 743 while((!IS_CONNECTED(g_Status,STATUS_BIT_CONNECTION)) || (!IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED))) { _nonos._SlNonOsMainLoopTask(); }
dflet 0:1e7b5dd9edb4 744 #endif
dflet 0:1e7b5dd9edb4 745 return SUCCESS;
dflet 0:1e7b5dd9edb4 746 }
dflet 0:1e7b5dd9edb4 747
dflet 0:1e7b5dd9edb4 748 /*!
dflet 0:1e7b5dd9edb4 749 \brief This function checks the LAN connection by pinging the AP's gateway
dflet 0:1e7b5dd9edb4 750
dflet 0:1e7b5dd9edb4 751 \param[in] None
dflet 0:1e7b5dd9edb4 752
dflet 0:1e7b5dd9edb4 753 \return 0 on success, negative error-code on error
dflet 0:1e7b5dd9edb4 754 */
dflet 0:1e7b5dd9edb4 755 int32_t cc3100::checkLanConnection()
dflet 0:1e7b5dd9edb4 756 {
dflet 0:1e7b5dd9edb4 757 SlPingStartCommand_t pingParams = {0};
dflet 0:1e7b5dd9edb4 758 SlPingReport_t pingReport = {0};
dflet 0:1e7b5dd9edb4 759
dflet 0:1e7b5dd9edb4 760 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 761
dflet 0:1e7b5dd9edb4 762 CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:1e7b5dd9edb4 763 g_PingPacketsRecv = 0;
dflet 0:1e7b5dd9edb4 764
dflet 0:1e7b5dd9edb4 765 /* Set the ping parameters */
dflet 0:1e7b5dd9edb4 766 pingParams.PingIntervalTime = PING_INTERVAL;
dflet 0:1e7b5dd9edb4 767 pingParams.PingSize = PING_PKT_SIZE;
dflet 0:1e7b5dd9edb4 768 pingParams.PingRequestTimeout = PING_TIMEOUT;
dflet 0:1e7b5dd9edb4 769 pingParams.TotalNumberOfAttempts = PING_ATTEMPTS;
dflet 0:1e7b5dd9edb4 770 pingParams.Flags = 0;
dflet 0:1e7b5dd9edb4 771 pingParams.Ip = g_GatewayIP;
dflet 0:1e7b5dd9edb4 772
dflet 0:1e7b5dd9edb4 773 /* Check for LAN connection */
dflet 0:1e7b5dd9edb4 774 retVal = _netapp.sl_NetAppPingStart( (SlPingStartCommand_t*)&pingParams, SL_AF_INET,
dflet 0:1e7b5dd9edb4 775 (SlPingReport_t*)&pingReport, SimpleLinkPingReport);
dflet 0:1e7b5dd9edb4 776 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 777
dflet 0:1e7b5dd9edb4 778 /* Wait */
dflet 0:1e7b5dd9edb4 779 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 780 while(!IS_PING_DONE(g_Status,STATUS_BIT_PING_DONE)) { _nonos._SlNonOsMainLoopTask(); }
dflet 0:1e7b5dd9edb4 781 #endif
dflet 0:1e7b5dd9edb4 782
dflet 0:1e7b5dd9edb4 783 if(0 == g_PingPacketsRecv)
dflet 0:1e7b5dd9edb4 784 {
dflet 0:1e7b5dd9edb4 785 /* Problem with LAN connection */
dflet 0:1e7b5dd9edb4 786 ASSERT_ON_ERROR(LAN_CONNECTION_FAILED);
dflet 0:1e7b5dd9edb4 787 }
dflet 0:1e7b5dd9edb4 788
dflet 0:1e7b5dd9edb4 789 /* LAN connection is successful */
dflet 0:1e7b5dd9edb4 790 return SUCCESS;
dflet 0:1e7b5dd9edb4 791 }
dflet 0:1e7b5dd9edb4 792
dflet 0:1e7b5dd9edb4 793 /*!
dflet 0:1e7b5dd9edb4 794 \brief This function checks the internet connection by pinging
dflet 0:1e7b5dd9edb4 795 the external-host (HOST_NAME)
dflet 0:1e7b5dd9edb4 796
dflet 0:1e7b5dd9edb4 797 \param[in] None
dflet 0:1e7b5dd9edb4 798
dflet 0:1e7b5dd9edb4 799 \return 0 on success, negative error-code on error
dflet 0:1e7b5dd9edb4 800 */
dflet 0:1e7b5dd9edb4 801 int32_t cc3100::checkInternetConnection()
dflet 0:1e7b5dd9edb4 802 {
dflet 0:1e7b5dd9edb4 803 SlPingStartCommand_t pingParams = {0};
dflet 0:1e7b5dd9edb4 804 SlPingReport_t pingReport = {0};
dflet 0:1e7b5dd9edb4 805
dflet 0:1e7b5dd9edb4 806 uint32_t ipAddr = 0;
dflet 0:1e7b5dd9edb4 807
dflet 0:1e7b5dd9edb4 808 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 809
dflet 0:1e7b5dd9edb4 810 CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:1e7b5dd9edb4 811 g_PingPacketsRecv = 0;
dflet 0:1e7b5dd9edb4 812
dflet 0:1e7b5dd9edb4 813 /* Set the ping parameters */
dflet 0:1e7b5dd9edb4 814 pingParams.PingIntervalTime = PING_INTERVAL;
dflet 0:1e7b5dd9edb4 815 pingParams.PingSize = PING_PKT_SIZE;
dflet 0:1e7b5dd9edb4 816 pingParams.PingRequestTimeout = PING_TIMEOUT;
dflet 0:1e7b5dd9edb4 817 pingParams.TotalNumberOfAttempts = PING_ATTEMPTS;
dflet 0:1e7b5dd9edb4 818 pingParams.Flags = 0;
dflet 0:1e7b5dd9edb4 819 pingParams.Ip = g_GatewayIP;
dflet 0:1e7b5dd9edb4 820
dflet 0:1e7b5dd9edb4 821 /* Check for Internet connection */
dflet 0:1e7b5dd9edb4 822 retVal = _netapp.sl_NetAppDnsGetHostByName((unsigned char *)HOST_NAME, strlen(HOST_NAME), &ipAddr, SL_AF_INET);
dflet 0:1e7b5dd9edb4 823 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 824
dflet 0:1e7b5dd9edb4 825 /* Replace the ping address to match HOST_NAME's IP address */
dflet 0:1e7b5dd9edb4 826 pingParams.Ip = ipAddr;
dflet 0:1e7b5dd9edb4 827
dflet 0:1e7b5dd9edb4 828 /* Try to ping HOST_NAME */
dflet 0:1e7b5dd9edb4 829 retVal = _netapp.sl_NetAppPingStart( (SlPingStartCommand_t*)&pingParams, SL_AF_INET,
dflet 0:1e7b5dd9edb4 830 (SlPingReport_t*)&pingReport, SimpleLinkPingReport);
dflet 0:1e7b5dd9edb4 831 ASSERT_ON_ERROR(retVal);
dflet 0:1e7b5dd9edb4 832
dflet 0:1e7b5dd9edb4 833 /* Wait */
dflet 0:1e7b5dd9edb4 834 #ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:1e7b5dd9edb4 835 while(!IS_PING_DONE(g_Status,STATUS_BIT_PING_DONE)) { _nonos._SlNonOsMainLoopTask(); }
dflet 0:1e7b5dd9edb4 836 #endif
dflet 0:1e7b5dd9edb4 837
dflet 0:1e7b5dd9edb4 838 if (0 == g_PingPacketsRecv)
dflet 0:1e7b5dd9edb4 839 {
dflet 0:1e7b5dd9edb4 840 /* Problem with internet connection*/
dflet 0:1e7b5dd9edb4 841 ASSERT_ON_ERROR(INTERNET_CONNECTION_FAILED);
dflet 0:1e7b5dd9edb4 842 }
dflet 0:1e7b5dd9edb4 843
dflet 0:1e7b5dd9edb4 844 /* Internet connection is successful */
dflet 0:1e7b5dd9edb4 845 return SUCCESS;
dflet 0:1e7b5dd9edb4 846 }
dflet 0:1e7b5dd9edb4 847
dflet 0:1e7b5dd9edb4 848 const int8_t StartResponseLUT[8] =
dflet 0:1e7b5dd9edb4 849 {
dflet 0:1e7b5dd9edb4 850 ROLE_UNKNOWN_ERR,
dflet 0:1e7b5dd9edb4 851 ROLE_STA,
dflet 0:1e7b5dd9edb4 852 ROLE_STA_ERR,
dflet 0:1e7b5dd9edb4 853 ROLE_AP,
dflet 0:1e7b5dd9edb4 854 ROLE_AP_ERR,
dflet 0:1e7b5dd9edb4 855 ROLE_P2P,
dflet 0:1e7b5dd9edb4 856 ROLE_P2P_ERR,
dflet 0:1e7b5dd9edb4 857 ROLE_UNKNOWN_ERR
dflet 0:1e7b5dd9edb4 858 };
dflet 0:1e7b5dd9edb4 859
dflet 0:1e7b5dd9edb4 860 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 861 /* Internal functions */
dflet 0:1e7b5dd9edb4 862 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 863
dflet 0:1e7b5dd9edb4 864 int16_t cc3100::_sl_GetStartResponseConvert(uint32_t Status)
dflet 0:1e7b5dd9edb4 865 {
dflet 0:1e7b5dd9edb4 866 return (int16_t)StartResponseLUT[Status & 0x7];
dflet 0:1e7b5dd9edb4 867
dflet 0:1e7b5dd9edb4 868 }
dflet 0:1e7b5dd9edb4 869
dflet 0:1e7b5dd9edb4 870 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 871 /* API Functions */
dflet 0:1e7b5dd9edb4 872 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 873
dflet 0:1e7b5dd9edb4 874 bool cc3100::IS_PING_DONE(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 875
dflet 0:1e7b5dd9edb4 876 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 877
dflet 0:1e7b5dd9edb4 878 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 879 return TRUE;
dflet 0:1e7b5dd9edb4 880 }else{
dflet 0:1e7b5dd9edb4 881 return FALSE;
dflet 0:1e7b5dd9edb4 882 }
dflet 0:1e7b5dd9edb4 883 }
dflet 0:1e7b5dd9edb4 884
dflet 0:1e7b5dd9edb4 885 bool cc3100::IS_CONNECTED(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 886
dflet 0:1e7b5dd9edb4 887 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 888
dflet 0:1e7b5dd9edb4 889 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 890 return TRUE;
dflet 0:1e7b5dd9edb4 891 }else{
dflet 0:1e7b5dd9edb4 892 return FALSE;
dflet 0:1e7b5dd9edb4 893 }
dflet 0:1e7b5dd9edb4 894 }
dflet 0:1e7b5dd9edb4 895
dflet 0:1e7b5dd9edb4 896 bool cc3100::IS_STA_CONNECTED(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 897
dflet 0:1e7b5dd9edb4 898 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 899
dflet 0:1e7b5dd9edb4 900 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 901 return TRUE;
dflet 0:1e7b5dd9edb4 902 }else{
dflet 0:1e7b5dd9edb4 903 return FALSE;
dflet 0:1e7b5dd9edb4 904 }
dflet 0:1e7b5dd9edb4 905 }
dflet 0:1e7b5dd9edb4 906
dflet 0:1e7b5dd9edb4 907 bool cc3100::IS_IP_ACQUIRED(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 908
dflet 0:1e7b5dd9edb4 909 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 910
dflet 0:1e7b5dd9edb4 911 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 912 return TRUE;
dflet 0:1e7b5dd9edb4 913 }else{
dflet 0:1e7b5dd9edb4 914 return FALSE;
dflet 0:1e7b5dd9edb4 915 }
dflet 0:1e7b5dd9edb4 916 }
dflet 0:1e7b5dd9edb4 917
dflet 0:1e7b5dd9edb4 918 bool cc3100::IS_IP_LEASED(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 919
dflet 0:1e7b5dd9edb4 920 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 921
dflet 0:1e7b5dd9edb4 922 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 923 return TRUE;
dflet 0:1e7b5dd9edb4 924 }else{
dflet 0:1e7b5dd9edb4 925 return FALSE;
dflet 0:1e7b5dd9edb4 926 }
dflet 0:1e7b5dd9edb4 927 }
dflet 0:1e7b5dd9edb4 928
dflet 0:1e7b5dd9edb4 929 bool cc3100::IS_CONNECTION_FAILED(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 930
dflet 0:1e7b5dd9edb4 931 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 932
dflet 0:1e7b5dd9edb4 933 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 934 return TRUE;
dflet 0:1e7b5dd9edb4 935 }else{
dflet 0:1e7b5dd9edb4 936 return FALSE;
dflet 0:1e7b5dd9edb4 937 }
dflet 0:1e7b5dd9edb4 938 }
dflet 0:1e7b5dd9edb4 939
dflet 0:1e7b5dd9edb4 940 bool cc3100::IS_P2P_NEG_REQ_RECEIVED(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 941
dflet 0:1e7b5dd9edb4 942 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 943
dflet 0:1e7b5dd9edb4 944 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 945 return TRUE;
dflet 0:1e7b5dd9edb4 946 }else{
dflet 0:1e7b5dd9edb4 947 return FALSE;
dflet 0:1e7b5dd9edb4 948 }
dflet 0:1e7b5dd9edb4 949 }
dflet 0:1e7b5dd9edb4 950
dflet 0:1e7b5dd9edb4 951 bool cc3100::IS_SMARTCONFIG_DONE(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 952
dflet 0:1e7b5dd9edb4 953 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 954
dflet 0:1e7b5dd9edb4 955 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 956 return TRUE;
dflet 0:1e7b5dd9edb4 957 }else{
dflet 0:1e7b5dd9edb4 958 return FALSE;
dflet 0:1e7b5dd9edb4 959 }
dflet 0:1e7b5dd9edb4 960 }
dflet 0:1e7b5dd9edb4 961
dflet 0:1e7b5dd9edb4 962 bool cc3100::IS_SMARTCONFIG_STOPPED(uint32_t status_variable,const uint32_t bit){
dflet 0:1e7b5dd9edb4 963
dflet 0:1e7b5dd9edb4 964 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 965
dflet 0:1e7b5dd9edb4 966 if(0 != (g_Status & ((uint32_t)1L<<(bit)))){
dflet 0:1e7b5dd9edb4 967 return TRUE;
dflet 0:1e7b5dd9edb4 968 }else{
dflet 0:1e7b5dd9edb4 969 return FALSE;
dflet 0:1e7b5dd9edb4 970 }
dflet 0:1e7b5dd9edb4 971 }
dflet 0:1e7b5dd9edb4 972
dflet 0:1e7b5dd9edb4 973 void cc3100::CLR_STATUS_BIT(uint32_t status_variable, const uint32_t bit){
dflet 0:1e7b5dd9edb4 974
dflet 0:1e7b5dd9edb4 975 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 976 g_Status &= ~((uint32_t)1L<<(bit));
dflet 0:1e7b5dd9edb4 977
dflet 0:1e7b5dd9edb4 978 }
dflet 0:1e7b5dd9edb4 979
dflet 0:1e7b5dd9edb4 980 void cc3100::SET_STATUS_BIT(uint32_t status_variable, const uint32_t bit){
dflet 0:1e7b5dd9edb4 981
dflet 0:1e7b5dd9edb4 982 g_Status = status_variable;
dflet 0:1e7b5dd9edb4 983 g_Status |= ((uint32_t)1L<<(bit));
dflet 0:1e7b5dd9edb4 984
dflet 0:1e7b5dd9edb4 985 }
dflet 0:1e7b5dd9edb4 986
dflet 0:1e7b5dd9edb4 987 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 988 /* sl_Task */
dflet 0:1e7b5dd9edb4 989 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 990 #if _SL_INCLUDE_FUNC(sl_Task)
dflet 0:1e7b5dd9edb4 991 void cc3100::sl_Task(void)
dflet 0:1e7b5dd9edb4 992 {
dflet 0:1e7b5dd9edb4 993 #ifdef _SlTaskEntry
dflet 0:1e7b5dd9edb4 994 _SlTaskEntry();
dflet 0:1e7b5dd9edb4 995 #endif
dflet 0:1e7b5dd9edb4 996 }
dflet 0:1e7b5dd9edb4 997 #endif
dflet 0:1e7b5dd9edb4 998
dflet 0:1e7b5dd9edb4 999 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 1000 /* sl_Start */
dflet 0:1e7b5dd9edb4 1001 /*****************************************************************************/
dflet 0:1e7b5dd9edb4 1002 #if _SL_INCLUDE_FUNC(sl_Start)
dflet 0:1e7b5dd9edb4 1003 int16_t cc3100::sl_Start(const void* pIfHdl, int8_t* pDevName, const P_INIT_CALLBACK pInitCallBack)
dflet 0:1e7b5dd9edb4 1004 {
dflet 0:1e7b5dd9edb4 1005
dflet 0:1e7b5dd9edb4 1006
dflet 0:1e7b5dd9edb4 1007 int16_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:1e7b5dd9edb4 1008 InitComplete_t AsyncRsp;
dflet 0:1e7b5dd9edb4 1009
dflet 0:1e7b5dd9edb4 1010 /* Perform any preprocessing before enable networking services */
dflet 0:1e7b5dd9edb4 1011 sl_DeviceEnablePreamble();//stub only
dflet 0:1e7b5dd9edb4 1012
dflet 0:1e7b5dd9edb4 1013 /* ControlBlock init */
dflet 0:1e7b5dd9edb4 1014 _driver._SlDrvDriverCBInit();
dflet 0:1e7b5dd9edb4 1015
dflet 0:1e7b5dd9edb4 1016 /* open the interface: usually SPI or UART */
dflet 0:1e7b5dd9edb4 1017 if (NULL == pIfHdl)
dflet 0:1e7b5dd9edb4 1018 {
dflet 0:1e7b5dd9edb4 1019 g_pCB->FD = _spi.spi_Open((int8_t *)pDevName, 0);
dflet 0:1e7b5dd9edb4 1020 }
dflet 0:1e7b5dd9edb4 1021 else
dflet 0:1e7b5dd9edb4 1022 {
dflet 0:1e7b5dd9edb4 1023 g_pCB->FD = (_SlFd_t)pIfHdl;
dflet 0:1e7b5dd9edb4 1024 }
dflet 0:1e7b5dd9edb4 1025
dflet 0:1e7b5dd9edb4 1026 ObjIdx = _driver._SlDrvProtectAsyncRespSetting((uint8_t *)&AsyncRsp, START_STOP_ID, SL_MAX_SOCKETS);
dflet 0:1e7b5dd9edb4 1027
dflet 0:1e7b5dd9edb4 1028 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:1e7b5dd9edb4 1029 {
dflet 0:1e7b5dd9edb4 1030 Uart_Write((uint8_t *)"SL_POOL_IS_EMPTY\r\n");
dflet 0:1e7b5dd9edb4 1031 return SL_POOL_IS_EMPTY;
dflet 0:1e7b5dd9edb4 1032 }
dflet 0:1e7b5dd9edb4 1033
dflet 0:1e7b5dd9edb4 1034 if( g_pCB->FD >= (_SlFd_t)0) {
dflet 0:1e7b5dd9edb4 1035 _spi.CC3100_disable();
dflet 0:1e7b5dd9edb4 1036
dflet 0:1e7b5dd9edb4 1037 g_pCB->pInitCallback = pInitCallBack;
dflet 0:1e7b5dd9edb4 1038
dflet 0:1e7b5dd9edb4 1039 _spi.CC3100_enable();
dflet 0:1e7b5dd9edb4 1040
dflet 0:1e7b5dd9edb4 1041 if (NULL == pInitCallBack) {
dflet 0:1e7b5dd9edb4 1042 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:1e7b5dd9edb4 1043 /*release Pool Object*/
dflet 0:1e7b5dd9edb4 1044 _driver._SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex);
dflet 0:1e7b5dd9edb4 1045 return _sl_GetStartResponseConvert(AsyncRsp.Status);
dflet 0:1e7b5dd9edb4 1046 }
dflet 0:1e7b5dd9edb4 1047 else
dflet 0:1e7b5dd9edb4 1048 {
dflet 0:1e7b5dd9edb4 1049 return SL_RET_CODE_OK;
dflet 0:1e7b5dd9edb4 1050 }
dflet 0:1e7b5dd9edb4 1051 }
dflet 0:1e7b5dd9edb4 1052
dflet 0:1e7b5dd9edb4 1053 return SL_BAD_INTERFACE;
dflet 0:1e7b5dd9edb4 1054
dflet 0:1e7b5dd9edb4 1055
dflet 0:1e7b5dd9edb4 1056 }
dflet 0:1e7b5dd9edb4 1057 #endif
dflet 0:1e7b5dd9edb4 1058
dflet 0:1e7b5dd9edb4 1059 /***************************************************************************
dflet 0:1e7b5dd9edb4 1060 _sl_HandleAsync_InitComplete - handles init complete signalling to
dflet 0:1e7b5dd9edb4 1061 a waiting object
dflet 0:1e7b5dd9edb4 1062 ****************************************************************************/
dflet 0:1e7b5dd9edb4 1063 void cc3100::_sl_HandleAsync_InitComplete(void *pVoidBuf)
dflet 0:1e7b5dd9edb4 1064 {
dflet 0:1e7b5dd9edb4 1065
dflet 0:1e7b5dd9edb4 1066 InitComplete_t *pMsgArgs = (InitComplete_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:1e7b5dd9edb4 1067
dflet 0:1e7b5dd9edb4 1068 _driver._SlDrvProtectionObjLockWaitForever();
dflet 0:1e7b5dd9edb4 1069
dflet 0:1e7b5dd9edb4 1070 if(g_pCB->pInitCallback) {
dflet 0:1e7b5dd9edb4 1071 g_pCB->pInitCallback(_sl_GetStartResponseConvert(pMsgArgs->Status));
dflet 0:1e7b5dd9edb4 1072 } else {
dflet 0:1e7b5dd9edb4 1073 memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(InitComplete_t));
dflet 0:1e7b5dd9edb4 1074 _driver._SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:1e7b5dd9edb4 1075 }
dflet 0:1e7b5dd9edb4 1076 _driver._SlDrvProtectionObjUnLock();
dflet 0:1e7b5dd9edb4 1077
dflet 0:1e7b5dd9edb4 1078 if(g_pCB->pInitCallback) {
dflet 0:1e7b5dd9edb4 1079 _driver._SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex);
dflet 0:1e7b5dd9edb4 1080 }
dflet 0:1e7b5dd9edb4 1081
dflet 0:1e7b5dd9edb4 1082 }
dflet 0:1e7b5dd9edb4 1083
dflet 0:1e7b5dd9edb4 1084 /*****************************************************************************
dflet 0:1e7b5dd9edb4 1085 sl_stop
dflet 0:1e7b5dd9edb4 1086 ******************************************************************************/
dflet 0:1e7b5dd9edb4 1087 typedef union {
dflet 0:1e7b5dd9edb4 1088 _DevStopCommand_t Cmd;
dflet 0:1e7b5dd9edb4 1089 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 1090 } _SlStopMsg_u;
dflet 0:1e7b5dd9edb4 1091
dflet 0:1e7b5dd9edb4 1092 const _SlCmdCtrl_t _SlStopCmdCtrl = {
dflet 0:1e7b5dd9edb4 1093 SL_OPCODE_DEVICE_STOP_COMMAND,
dflet 0:1e7b5dd9edb4 1094 sizeof(_DevStopCommand_t),
dflet 0:1e7b5dd9edb4 1095 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 1096 };
dflet 0:1e7b5dd9edb4 1097
dflet 0:1e7b5dd9edb4 1098 #if _SL_INCLUDE_FUNC(sl_Stop)
dflet 0:1e7b5dd9edb4 1099 int16_t cc3100::sl_Stop(const uint16_t timeout)
dflet 0:1e7b5dd9edb4 1100 {
dflet 0:1e7b5dd9edb4 1101
dflet 0:1e7b5dd9edb4 1102 int16_t RetVal=0;
dflet 0:1e7b5dd9edb4 1103 _SlStopMsg_u Msg;
dflet 0:1e7b5dd9edb4 1104 _BasicResponse_t AsyncRsp;
dflet 0:1e7b5dd9edb4 1105 int8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:1e7b5dd9edb4 1106 /* if timeout is 0 the shutdown is forced immediately */
dflet 0:1e7b5dd9edb4 1107 if( 0 == timeout ) {
dflet 0:1e7b5dd9edb4 1108 _spi.registerInterruptHandler(NULL, NULL);
dflet 0:1e7b5dd9edb4 1109 _spi.CC3100_disable();
dflet 0:1e7b5dd9edb4 1110 RetVal = _spi.spi_Close(g_pCB->FD);
dflet 0:1e7b5dd9edb4 1111
dflet 0:1e7b5dd9edb4 1112 } else {
dflet 0:1e7b5dd9edb4 1113 /* let the device make the shutdown using the defined timeout */
dflet 0:1e7b5dd9edb4 1114 Msg.Cmd.Timeout = timeout;
dflet 0:1e7b5dd9edb4 1115 ObjIdx = _driver._SlDrvProtectAsyncRespSetting((uint8_t *)&AsyncRsp, START_STOP_ID, SL_MAX_SOCKETS);
dflet 0:1e7b5dd9edb4 1116
dflet 0:1e7b5dd9edb4 1117 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:1e7b5dd9edb4 1118 {
dflet 0:1e7b5dd9edb4 1119 return SL_POOL_IS_EMPTY;
dflet 0:1e7b5dd9edb4 1120 }
dflet 0:1e7b5dd9edb4 1121
dflet 0:1e7b5dd9edb4 1122 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlStopCmdCtrl, &Msg, NULL));
dflet 0:1e7b5dd9edb4 1123
dflet 0:1e7b5dd9edb4 1124 if(SL_OS_RET_CODE_OK == (int16_t)Msg.Rsp.status)
dflet 0:1e7b5dd9edb4 1125 {
dflet 0:1e7b5dd9edb4 1126 _driver._SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:1e7b5dd9edb4 1127 Msg.Rsp.status = AsyncRsp.status;
dflet 0:1e7b5dd9edb4 1128 RetVal = Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 1129 }
dflet 0:1e7b5dd9edb4 1130
dflet 0:1e7b5dd9edb4 1131 _driver._SlDrvReleasePoolObj((uint8_t)ObjIdx);
dflet 0:1e7b5dd9edb4 1132 _spi.registerInterruptHandler(NULL, NULL);
dflet 0:1e7b5dd9edb4 1133 _spi.CC3100_disable();
dflet 0:1e7b5dd9edb4 1134 _spi.spi_Close(g_pCB->FD);
dflet 0:1e7b5dd9edb4 1135
dflet 0:1e7b5dd9edb4 1136 }
dflet 0:1e7b5dd9edb4 1137
dflet 0:1e7b5dd9edb4 1138 _driver._SlDrvDriverCBDeinit();
dflet 0:1e7b5dd9edb4 1139
dflet 0:1e7b5dd9edb4 1140 return RetVal;
dflet 0:1e7b5dd9edb4 1141 }
dflet 0:1e7b5dd9edb4 1142 #endif
dflet 0:1e7b5dd9edb4 1143
dflet 0:1e7b5dd9edb4 1144
dflet 0:1e7b5dd9edb4 1145 /*****************************************************************************
dflet 0:1e7b5dd9edb4 1146 sl_EventMaskSet
dflet 0:1e7b5dd9edb4 1147 *****************************************************************************/
dflet 0:1e7b5dd9edb4 1148 typedef union {
dflet 0:1e7b5dd9edb4 1149 _DevMaskEventSetCommand_t Cmd;
dflet 0:1e7b5dd9edb4 1150 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 1151 } _SlEventMaskSetMsg_u;
dflet 0:1e7b5dd9edb4 1152
dflet 0:1e7b5dd9edb4 1153 #if _SL_INCLUDE_FUNC(sl_EventMaskSet)
dflet 0:1e7b5dd9edb4 1154 const _SlCmdCtrl_t _SlEventMaskSetCmdCtrl = {
dflet 0:1e7b5dd9edb4 1155 SL_OPCODE_DEVICE_EVENTMASKSET,
dflet 0:1e7b5dd9edb4 1156 sizeof(_DevMaskEventSetCommand_t),
dflet 0:1e7b5dd9edb4 1157 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 1158 };
dflet 0:1e7b5dd9edb4 1159
dflet 0:1e7b5dd9edb4 1160 int16_t cc3100::sl_EventMaskSet(uint8_t EventClass , uint32_t Mask)
dflet 0:1e7b5dd9edb4 1161 {
dflet 0:1e7b5dd9edb4 1162 _SlEventMaskSetMsg_u Msg;
dflet 0:1e7b5dd9edb4 1163 Msg.Cmd.group = EventClass;
dflet 0:1e7b5dd9edb4 1164 Msg.Cmd.mask = Mask;
dflet 0:1e7b5dd9edb4 1165
dflet 0:1e7b5dd9edb4 1166 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlEventMaskSetCmdCtrl, &Msg, NULL));
dflet 0:1e7b5dd9edb4 1167
dflet 0:1e7b5dd9edb4 1168 return (int16_t)Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 1169 }
dflet 0:1e7b5dd9edb4 1170 #endif
dflet 0:1e7b5dd9edb4 1171
dflet 0:1e7b5dd9edb4 1172 /******************************************************************************
dflet 0:1e7b5dd9edb4 1173 sl_EventMaskGet
dflet 0:1e7b5dd9edb4 1174 ******************************************************************************/
dflet 0:1e7b5dd9edb4 1175 typedef union {
dflet 0:1e7b5dd9edb4 1176 _DevMaskEventGetCommand_t Cmd;
dflet 0:1e7b5dd9edb4 1177 _DevMaskEventGetResponse_t Rsp;
dflet 0:1e7b5dd9edb4 1178 } _SlEventMaskGetMsg_u;
dflet 0:1e7b5dd9edb4 1179
dflet 0:1e7b5dd9edb4 1180 #if _SL_INCLUDE_FUNC(sl_EventMaskGet)
dflet 0:1e7b5dd9edb4 1181 const _SlCmdCtrl_t _SlEventMaskGetCmdCtrl = {
dflet 0:1e7b5dd9edb4 1182 SL_OPCODE_DEVICE_EVENTMASKGET,
dflet 0:1e7b5dd9edb4 1183 sizeof(_DevMaskEventGetCommand_t),
dflet 0:1e7b5dd9edb4 1184 sizeof(_DevMaskEventGetResponse_t)
dflet 0:1e7b5dd9edb4 1185 };
dflet 0:1e7b5dd9edb4 1186
dflet 0:1e7b5dd9edb4 1187 int16_t cc3100::sl_EventMaskGet(uint8_t EventClass, uint32_t *pMask)
dflet 0:1e7b5dd9edb4 1188 {
dflet 0:1e7b5dd9edb4 1189 _SlEventMaskGetMsg_u Msg;
dflet 0:1e7b5dd9edb4 1190
dflet 0:1e7b5dd9edb4 1191 Msg.Cmd.group = EventClass;
dflet 0:1e7b5dd9edb4 1192
dflet 0:1e7b5dd9edb4 1193 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlEventMaskGetCmdCtrl, &Msg, NULL));
dflet 0:1e7b5dd9edb4 1194
dflet 0:1e7b5dd9edb4 1195 *pMask = Msg.Rsp.mask;
dflet 0:1e7b5dd9edb4 1196 return SL_RET_CODE_OK;
dflet 0:1e7b5dd9edb4 1197 }
dflet 0:1e7b5dd9edb4 1198 #endif
dflet 0:1e7b5dd9edb4 1199
dflet 0:1e7b5dd9edb4 1200 /******************************************************************************
dflet 0:1e7b5dd9edb4 1201 sl_DevGet
dflet 0:1e7b5dd9edb4 1202 ******************************************************************************/
dflet 0:1e7b5dd9edb4 1203
dflet 0:1e7b5dd9edb4 1204 typedef union {
dflet 0:1e7b5dd9edb4 1205 _DeviceSetGet_t Cmd;
dflet 0:1e7b5dd9edb4 1206 _DeviceSetGet_t Rsp;
dflet 0:1e7b5dd9edb4 1207 } _SlDeviceMsgGet_u;
dflet 0:1e7b5dd9edb4 1208
dflet 0:1e7b5dd9edb4 1209 #if _SL_INCLUDE_FUNC(sl_DevGet)
dflet 0:1e7b5dd9edb4 1210 const _SlCmdCtrl_t _SlDeviceGetCmdCtrl = {
dflet 0:1e7b5dd9edb4 1211 SL_OPCODE_DEVICE_DEVICEGET,
dflet 0:1e7b5dd9edb4 1212 sizeof(_DeviceSetGet_t),
dflet 0:1e7b5dd9edb4 1213 sizeof(_DeviceSetGet_t)
dflet 0:1e7b5dd9edb4 1214 };
dflet 0:1e7b5dd9edb4 1215
dflet 0:1e7b5dd9edb4 1216 int32_t cc3100::sl_DevGet(uint8_t DeviceGetId, uint8_t *pOption,uint8_t *pConfigLen, uint8_t *pValues)
dflet 0:1e7b5dd9edb4 1217 {
dflet 0:1e7b5dd9edb4 1218 _SlDeviceMsgGet_u Msg;
dflet 0:1e7b5dd9edb4 1219 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 1220
dflet 0:1e7b5dd9edb4 1221 if (*pConfigLen == 0) {
dflet 0:1e7b5dd9edb4 1222 return SL_EZEROLEN;
dflet 0:1e7b5dd9edb4 1223 }
dflet 0:1e7b5dd9edb4 1224
dflet 0:1e7b5dd9edb4 1225 if( pOption ) {
dflet 0:1e7b5dd9edb4 1226 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:1e7b5dd9edb4 1227 CmdExt.RxPayloadLen = *pConfigLen;
dflet 0:1e7b5dd9edb4 1228
dflet 0:1e7b5dd9edb4 1229 CmdExt.pRxPayload = (uint8_t *)pValues;
dflet 0:1e7b5dd9edb4 1230
dflet 0:1e7b5dd9edb4 1231
dflet 0:1e7b5dd9edb4 1232 Msg.Cmd.DeviceSetId = DeviceGetId;
dflet 0:1e7b5dd9edb4 1233
dflet 0:1e7b5dd9edb4 1234 Msg.Cmd.Option = (uint16_t)*pOption;
dflet 0:1e7b5dd9edb4 1235
dflet 0:1e7b5dd9edb4 1236 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlDeviceGetCmdCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 1237
dflet 0:1e7b5dd9edb4 1238 if( pOption ) {
dflet 0:1e7b5dd9edb4 1239 *pOption = (uint8_t)Msg.Rsp.Option;
dflet 0:1e7b5dd9edb4 1240 }
dflet 0:1e7b5dd9edb4 1241
dflet 0:1e7b5dd9edb4 1242 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) {
dflet 0:1e7b5dd9edb4 1243 *pConfigLen = (uint8_t)CmdExt.RxPayloadLen;
dflet 0:1e7b5dd9edb4 1244 return SL_ESMALLBUF;
dflet 0:1e7b5dd9edb4 1245 } else {
dflet 0:1e7b5dd9edb4 1246 *pConfigLen = (uint8_t)CmdExt.ActualRxPayloadLen;
dflet 0:1e7b5dd9edb4 1247 }
dflet 0:1e7b5dd9edb4 1248
dflet 0:1e7b5dd9edb4 1249 return (int16_t)Msg.Rsp.Status;
dflet 0:1e7b5dd9edb4 1250 } else {
dflet 0:1e7b5dd9edb4 1251 return -1;
dflet 0:1e7b5dd9edb4 1252 }
dflet 0:1e7b5dd9edb4 1253 }
dflet 0:1e7b5dd9edb4 1254 #endif
dflet 0:1e7b5dd9edb4 1255
dflet 0:1e7b5dd9edb4 1256 /******************************************************************************
dflet 0:1e7b5dd9edb4 1257 sl_DevSet
dflet 0:1e7b5dd9edb4 1258 ******************************************************************************/
dflet 0:1e7b5dd9edb4 1259 typedef union {
dflet 0:1e7b5dd9edb4 1260 _DeviceSetGet_t Cmd;
dflet 0:1e7b5dd9edb4 1261 _BasicResponse_t Rsp;
dflet 0:1e7b5dd9edb4 1262 } _SlDeviceMsgSet_u;
dflet 0:1e7b5dd9edb4 1263
dflet 0:1e7b5dd9edb4 1264 #if _SL_INCLUDE_FUNC(sl_DevSet)
dflet 0:1e7b5dd9edb4 1265 const _SlCmdCtrl_t _SlDeviceSetCmdCtrl = {
dflet 0:1e7b5dd9edb4 1266 SL_OPCODE_DEVICE_DEVICESET,
dflet 0:1e7b5dd9edb4 1267 sizeof(_DeviceSetGet_t),
dflet 0:1e7b5dd9edb4 1268 sizeof(_BasicResponse_t)
dflet 0:1e7b5dd9edb4 1269 };
dflet 0:1e7b5dd9edb4 1270
dflet 0:1e7b5dd9edb4 1271 int32_t cc3100::sl_DevSet(const uint8_t DeviceSetId, const uint8_t Option, const uint8_t ConfigLen, const uint8_t *pValues)
dflet 0:1e7b5dd9edb4 1272 {
dflet 0:1e7b5dd9edb4 1273 _SlDeviceMsgSet_u Msg;
dflet 0:1e7b5dd9edb4 1274 _SlCmdExt_t CmdExt;
dflet 0:1e7b5dd9edb4 1275
dflet 0:1e7b5dd9edb4 1276 _driver._SlDrvResetCmdExt(&CmdExt);
dflet 0:1e7b5dd9edb4 1277 CmdExt.TxPayloadLen = (ConfigLen+3) & (~3);
dflet 0:1e7b5dd9edb4 1278
dflet 0:1e7b5dd9edb4 1279 CmdExt.pTxPayload = (uint8_t *)pValues;
dflet 0:1e7b5dd9edb4 1280
dflet 0:1e7b5dd9edb4 1281
dflet 0:1e7b5dd9edb4 1282
dflet 0:1e7b5dd9edb4 1283 Msg.Cmd.DeviceSetId = DeviceSetId;
dflet 0:1e7b5dd9edb4 1284 Msg.Cmd.ConfigLen = ConfigLen;
dflet 0:1e7b5dd9edb4 1285 Msg.Cmd.Option = Option;
dflet 0:1e7b5dd9edb4 1286
dflet 0:1e7b5dd9edb4 1287 VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlDeviceSetCmdCtrl, &Msg, &CmdExt));
dflet 0:1e7b5dd9edb4 1288
dflet 0:1e7b5dd9edb4 1289 return (int16_t)Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 1290 }
dflet 0:1e7b5dd9edb4 1291 #endif
dflet 0:1e7b5dd9edb4 1292
dflet 0:1e7b5dd9edb4 1293 /******************************************************************************
dflet 0:1e7b5dd9edb4 1294 sl_UartSetMode
dflet 0:1e7b5dd9edb4 1295 ******************************************************************************/
dflet 0:1e7b5dd9edb4 1296 #ifdef SL_IF_TYPE_UART
dflet 0:1e7b5dd9edb4 1297 typedef union {
dflet 0:1e7b5dd9edb4 1298 _DevUartSetModeCommand_t Cmd;
dflet 0:1e7b5dd9edb4 1299 _DevUartSetModeResponse_t Rsp;
dflet 0:1e7b5dd9edb4 1300 } _SlUartSetModeMsg_u;
dflet 0:1e7b5dd9edb4 1301
dflet 0:1e7b5dd9edb4 1302 #if _SL_INCLUDE_FUNC(sl_UartSetMode)
dflet 0:1e7b5dd9edb4 1303 const _SlCmdCtrl_t _SlUartSetModeCmdCtrl = {
dflet 0:1e7b5dd9edb4 1304 SL_OPCODE_DEVICE_SETUARTMODECOMMAND,
dflet 0:1e7b5dd9edb4 1305 sizeof(_DevUartSetModeCommand_t),
dflet 0:1e7b5dd9edb4 1306 sizeof(_DevUartSetModeResponse_t)
dflet 0:1e7b5dd9edb4 1307 };
dflet 0:1e7b5dd9edb4 1308
dflet 0:1e7b5dd9edb4 1309 int16_t cc3100::sl_UartSetMode(const SlUartIfParams_t* pUartParams)
dflet 0:1e7b5dd9edb4 1310 {
dflet 0:1e7b5dd9edb4 1311 _SlUartSetModeMsg_u Msg;
dflet 0:1e7b5dd9edb4 1312 uint32_t magicCode = 0xFFFFFFFF;
dflet 0:1e7b5dd9edb4 1313
dflet 0:1e7b5dd9edb4 1314 Msg.Cmd.BaudRate = pUartParams->BaudRate;
dflet 0:1e7b5dd9edb4 1315 Msg.Cmd.FlowControlEnable = pUartParams->FlowControlEnable;
dflet 0:1e7b5dd9edb4 1316
dflet 0:1e7b5dd9edb4 1317
dflet 0:1e7b5dd9edb4 1318 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlUartSetModeCmdCtrl, &Msg, NULL));
dflet 0:1e7b5dd9edb4 1319
dflet 0:1e7b5dd9edb4 1320 /* cmd response OK, we can continue with the handshake */
dflet 0:1e7b5dd9edb4 1321 if (SL_RET_CODE_OK == Msg.Rsp.status) {
dflet 0:1e7b5dd9edb4 1322 sl_IfMaskIntHdlr();
dflet 0:1e7b5dd9edb4 1323
dflet 0:1e7b5dd9edb4 1324 /* Close the comm port */
dflet 0:1e7b5dd9edb4 1325 sl_IfClose(g_pCB->FD);
dflet 0:1e7b5dd9edb4 1326
dflet 0:1e7b5dd9edb4 1327 /* Re-open the comm port */
dflet 0:1e7b5dd9edb4 1328 sl_IfOpen((void * )pUartParams, UART_IF_OPEN_FLAG_RE_OPEN);
dflet 0:1e7b5dd9edb4 1329 sl_IfUnMaskIntHdlr();
dflet 0:1e7b5dd9edb4 1330
dflet 0:1e7b5dd9edb4 1331 /* send the magic code and wait for the response */
dflet 0:1e7b5dd9edb4 1332 sl_IfWrite(g_pCB->FD, (uint8_t* )&magicCode, 4);
dflet 0:1e7b5dd9edb4 1333
dflet 0:1e7b5dd9edb4 1334 magicCode = UART_SET_MODE_MAGIC_CODE;
dflet 0:1e7b5dd9edb4 1335 sl_IfWrite(g_pCB->FD, (uint8_t* )&magicCode, 4);
dflet 0:1e7b5dd9edb4 1336
dflet 0:1e7b5dd9edb4 1337 /* clear magic code */
dflet 0:1e7b5dd9edb4 1338 magicCode = 0;
dflet 0:1e7b5dd9edb4 1339
dflet 0:1e7b5dd9edb4 1340 /* wait (blocking) till the magic code to be returned from device */
dflet 0:1e7b5dd9edb4 1341 sl_IfRead(g_pCB->FD, (uint8_t* )&magicCode, 4);
dflet 0:1e7b5dd9edb4 1342
dflet 0:1e7b5dd9edb4 1343 /* check for the received magic code matching */
dflet 0:1e7b5dd9edb4 1344 if (UART_SET_MODE_MAGIC_CODE != magicCode) {
dflet 0:1e7b5dd9edb4 1345 _SL_ASSERT(0);
dflet 0:1e7b5dd9edb4 1346 }
dflet 0:1e7b5dd9edb4 1347 }
dflet 0:1e7b5dd9edb4 1348
dflet 0:1e7b5dd9edb4 1349 return (int16_t)Msg.Rsp.status;
dflet 0:1e7b5dd9edb4 1350 }
dflet 0:1e7b5dd9edb4 1351 #endif
dflet 0:1e7b5dd9edb4 1352 #endif
dflet 0:1e7b5dd9edb4 1353
dflet 0:1e7b5dd9edb4 1354 }//namespace
dflet 0:1e7b5dd9edb4 1355
dflet 0:1e7b5dd9edb4 1356