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

Dependencies:   mbed

Committer:
dflet
Date:
Tue Sep 15 16:45:04 2015 +0000
Revision:
22:f9b5e0b80bf2
Parent:
19:3dd3e7f30f8b
Removed some debug.

Who changed what in which revision?

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