TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.

Dependencies:   mbed

Committer:
dflet
Date:
Fri Sep 11 15:38:33 2015 +0000
Revision:
1:e448e81c416f
Parent:
0:400d8e75a8d0
Removed some debud.

Who changed what in which revision?

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