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.
simplelink/cc3100.cpp@22:f9b5e0b80bf2, 2015-09-15 (annotated)
- 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?
User | Revision | Line number | New 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 |