TI's CC3100 host driver and demo. Experimental and a work in progress.

Dependencies:   mbed

Committer:
dflet
Date:
Wed Nov 19 23:04:04 2014 +0000
Revision:
2:a3e52cf86086
Parent:
1:da33a9116bda
Added more boards!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:bbe98578d4c0 1 /*
dflet 0:bbe98578d4c0 2 * main.c - sample application to switch to AP mode and ping client
dflet 0:bbe98578d4c0 3 *
dflet 0:bbe98578d4c0 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:bbe98578d4c0 5 *
dflet 0:bbe98578d4c0 6 *
dflet 0:bbe98578d4c0 7 * Redistribution and use in source and binary forms, with or without
dflet 0:bbe98578d4c0 8 * modification, are permitted provided that the following conditions
dflet 0:bbe98578d4c0 9 * are met:
dflet 0:bbe98578d4c0 10 *
dflet 0:bbe98578d4c0 11 * Redistributions of source code must retain the above copyright
dflet 0:bbe98578d4c0 12 * notice, this list of conditions and the following disclaimer.
dflet 0:bbe98578d4c0 13 *
dflet 0:bbe98578d4c0 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:bbe98578d4c0 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:bbe98578d4c0 16 * documentation and/or other materials provided with the
dflet 0:bbe98578d4c0 17 * distribution.
dflet 0:bbe98578d4c0 18 *
dflet 0:bbe98578d4c0 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:bbe98578d4c0 20 * its contributors may be used to endorse or promote products derived
dflet 0:bbe98578d4c0 21 * from this software without specific prior written permission.
dflet 0:bbe98578d4c0 22 *
dflet 0:bbe98578d4c0 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:bbe98578d4c0 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:bbe98578d4c0 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:bbe98578d4c0 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:bbe98578d4c0 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:bbe98578d4c0 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:bbe98578d4c0 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:bbe98578d4c0 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:bbe98578d4c0 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:bbe98578d4c0 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:bbe98578d4c0 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:bbe98578d4c0 34 *
dflet 0:bbe98578d4c0 35 */
dflet 0:bbe98578d4c0 36
dflet 0:bbe98578d4c0 37 /*
dflet 0:bbe98578d4c0 38 * Application Name - Getting started with Wi-Fi Access-Point mode
dflet 0:bbe98578d4c0 39 * Application Overview - This sample application demonstrates how
dflet 0:bbe98578d4c0 40 * to configure CC3100 in Access-Point mode. Any
dflet 0:bbe98578d4c0 41 * WLAN station in its range can connect/communicate
dflet 0:bbe98578d4c0 42 * to/with it as per the standard networking protocols.
dflet 0:bbe98578d4c0 43 * On a successful connection, the device ping's the
dflet 0:bbe98578d4c0 44 * connected station.
dflet 0:bbe98578d4c0 45 * Application Details - http://processors.wiki.ti.com/index.php/CC31xx_Getting_Started_with_WLAN_AP
dflet 0:bbe98578d4c0 46 * doc\examples\getting_started_with_wlan_ap.pdf
dflet 0:bbe98578d4c0 47 */
dflet 0:bbe98578d4c0 48
dflet 1:da33a9116bda 49 #include "mbed.h"
dflet 0:bbe98578d4c0 50 #include "cc3100_simplelink.h"
dflet 0:bbe98578d4c0 51 #include "cc3100_sl_common.h"
dflet 1:da33a9116bda 52 #include "BoardInit.h"
dflet 1:da33a9116bda 53
dflet 1:da33a9116bda 54 #if (THIS_BOARD == MBED_BOARD_LPC1768)
dflet 1:da33a9116bda 55 Serial pc(USBTX, USBRX);//lpc1768
dflet 1:da33a9116bda 56 #elif (THIS_BOARD == ST_MBED_NUCLEOF411)
dflet 1:da33a9116bda 57 Serial pc(SERIAL_TX, SERIAL_RX);//nucleoF411
dflet 2:a3e52cf86086 58 #elif (THIS_BOARD == EA_MBED_LPC4088)
dflet 2:a3e52cf86086 59 Serial pc(USBTX, USBRX);
dflet 2:a3e52cf86086 60 #elif (THIS_BOARD == ST_MBED_NUCLEOF103)
dflet 2:a3e52cf86086 61 Serial pc(SERIAL_TX, SERIAL_RX);
dflet 1:da33a9116bda 62 #else
dflet 1:da33a9116bda 63
dflet 1:da33a9116bda 64 #endif
dflet 0:bbe98578d4c0 65
dflet 0:bbe98578d4c0 66 //using namespace mbed_cc3100;
dflet 0:bbe98578d4c0 67
dflet 0:bbe98578d4c0 68 #define APPLICATION_VERSION "1.1.0"
dflet 0:bbe98578d4c0 69
dflet 0:bbe98578d4c0 70 #define SL_STOP_TIMEOUT 0xFF
dflet 0:bbe98578d4c0 71
dflet 0:bbe98578d4c0 72 /* Use bit 32: Lower bits of status variable are used for NWP events
dflet 0:bbe98578d4c0 73 * 1 in a 'status_variable', the device has completed the ping operation
dflet 0:bbe98578d4c0 74 * 0 in a 'status_variable', the device has not completed the ping operation
dflet 0:bbe98578d4c0 75 */
dflet 0:bbe98578d4c0 76 //#define STATUS_BIT_PING_DONE 31
dflet 0:bbe98578d4c0 77
dflet 0:bbe98578d4c0 78 #define CONFIG_IP SL_IPV4_VAL(192,168,0,1) /* Static IP to be configured */
dflet 0:bbe98578d4c0 79 #define CONFIG_MASK SL_IPV4_VAL(255,255,255,0) /* Subnet Mask for the station */
dflet 0:bbe98578d4c0 80 #define CONFIG_GATEWAY SL_IPV4_VAL(192,168,0,1) /* Default Gateway address */
dflet 0:bbe98578d4c0 81 #define CONFIG_DNS SL_IPV4_VAL(192,168,0,1) /* DNS Server Address */
dflet 0:bbe98578d4c0 82
dflet 0:bbe98578d4c0 83 #define DHCP_START_IP SL_IPV4_VAL(192,168,0,100) /* DHCP start IP address */
dflet 0:bbe98578d4c0 84 #define DHCP_END_IP SL_IPV4_VAL(192,168,0,200) /* DHCP End IP address */
dflet 0:bbe98578d4c0 85
dflet 0:bbe98578d4c0 86 #define IP_LEASE_TIME 3600
dflet 0:bbe98578d4c0 87
dflet 0:bbe98578d4c0 88 #define PING_INTERVAL 1000
dflet 0:bbe98578d4c0 89 #define PING_SIZE 20
dflet 0:bbe98578d4c0 90 #define PING_REQUEST_TIMEOUT 3000
dflet 0:bbe98578d4c0 91 #define PING_ATTEMPT 3
dflet 0:bbe98578d4c0 92
dflet 0:bbe98578d4c0 93 /* Application specific status/error codes */
dflet 0:bbe98578d4c0 94 typedef enum{
dflet 0:bbe98578d4c0 95 LAN_CONNECTION_FAILED = -0x7D0, /* Choosing this number to avoid overlap with host-driver's error codes */
dflet 0:bbe98578d4c0 96 INTERNET_CONNECTION_FAILED = LAN_CONNECTION_FAILED - 1,
dflet 0:bbe98578d4c0 97 DEVICE_NOT_IN_STATION_MODE = INTERNET_CONNECTION_FAILED - 1,
dflet 0:bbe98578d4c0 98
dflet 0:bbe98578d4c0 99 STATUS_CODE_MAX = -0xBB8
dflet 0:bbe98578d4c0 100 }e_AppStatusCodes;
dflet 0:bbe98578d4c0 101 /*
dflet 0:bbe98578d4c0 102 #define IS_PING_DONE(status_variable) GET_STATUS_BIT(status_variable, \
dflet 0:bbe98578d4c0 103 STATUS_BIT_PING_DONE)
dflet 0:bbe98578d4c0 104 */
dflet 0:bbe98578d4c0 105 /*
dflet 0:bbe98578d4c0 106 * GLOBAL VARIABLES -- Start
dflet 0:bbe98578d4c0 107 */
dflet 0:bbe98578d4c0 108
dflet 0:bbe98578d4c0 109 //extern unsigned int g_GatewayIP = 0;
dflet 0:bbe98578d4c0 110 //extern unsigned int g_StationIP = 0;
dflet 0:bbe98578d4c0 111 unsigned int g_PingPacketsRecv = 0;
dflet 0:bbe98578d4c0 112
dflet 0:bbe98578d4c0 113 /*
dflet 0:bbe98578d4c0 114 * GLOBAL VARIABLES -- End
dflet 0:bbe98578d4c0 115 */
dflet 0:bbe98578d4c0 116
dflet 0:bbe98578d4c0 117
dflet 0:bbe98578d4c0 118 /*
dflet 0:bbe98578d4c0 119 * STATIC FUNCTION DEFINITIONS -- Start
dflet 0:bbe98578d4c0 120 */
dflet 0:bbe98578d4c0 121 static signed int configureSimpleLinkToDefaultState();
dflet 0:bbe98578d4c0 122 static signed int initializeAppVariables();
dflet 0:bbe98578d4c0 123 static void displayBanner();
dflet 0:bbe98578d4c0 124
dflet 0:bbe98578d4c0 125 /*
dflet 0:bbe98578d4c0 126 * STATIC FUNCTION DEFINITIONS -- End
dflet 0:bbe98578d4c0 127 */
dflet 0:bbe98578d4c0 128
dflet 0:bbe98578d4c0 129 /*
dflet 0:bbe98578d4c0 130 * ASYNCHRONOUS EVENT HANDLERS -- Start
dflet 0:bbe98578d4c0 131 */
dflet 0:bbe98578d4c0 132
dflet 0:bbe98578d4c0 133 /*!
dflet 0:bbe98578d4c0 134 \brief This function handles ping report events
dflet 0:bbe98578d4c0 135
dflet 0:bbe98578d4c0 136 \param[in] pPingReport holds the ping report statistics
dflet 0:bbe98578d4c0 137
dflet 0:bbe98578d4c0 138 \return None
dflet 0:bbe98578d4c0 139
dflet 0:bbe98578d4c0 140 \note
dflet 0:bbe98578d4c0 141
dflet 0:bbe98578d4c0 142 \warning
dflet 0:bbe98578d4c0 143 */
dflet 0:bbe98578d4c0 144
dflet 0:bbe98578d4c0 145 static void SimpleLinkPingReport(SlPingReport_t *pPingReport)
dflet 0:bbe98578d4c0 146 {
dflet 0:bbe98578d4c0 147 SET_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:bbe98578d4c0 148
dflet 0:bbe98578d4c0 149 if(pPingReport == NULL)
dflet 0:bbe98578d4c0 150
dflet 0:bbe98578d4c0 151 printf(" [PING REPORT] NULL Pointer Error\r\n");
dflet 0:bbe98578d4c0 152
dflet 0:bbe98578d4c0 153 g_PingPacketsRecv = pPingReport->PacketsReceived;
dflet 0:bbe98578d4c0 154 }
dflet 0:bbe98578d4c0 155
dflet 0:bbe98578d4c0 156 /*
dflet 0:bbe98578d4c0 157 * ASYNCHRONOUS EVENT HANDLERS -- End
dflet 0:bbe98578d4c0 158 */
dflet 0:bbe98578d4c0 159
dflet 0:bbe98578d4c0 160
dflet 0:bbe98578d4c0 161 /*
dflet 0:bbe98578d4c0 162 * Application's entry point
dflet 0:bbe98578d4c0 163 */
dflet 0:bbe98578d4c0 164 int main()
dflet 0:bbe98578d4c0 165 {
dflet 0:bbe98578d4c0 166 pc.baud(115200);
dflet 0:bbe98578d4c0 167
dflet 0:bbe98578d4c0 168 SlPingStartCommand_t PingParams = {0};
dflet 0:bbe98578d4c0 169 SlPingReport_t Report = {0};
dflet 0:bbe98578d4c0 170 SlNetCfgIpV4Args_t ipV4 = {0};
dflet 0:bbe98578d4c0 171 SlNetAppDhcpServerBasicOpt_t dhcpParams = {0};
dflet 0:bbe98578d4c0 172
dflet 0:bbe98578d4c0 173 unsigned char SecType = 0;
dflet 0:bbe98578d4c0 174 signed int mode = ROLE_STA;
dflet 0:bbe98578d4c0 175 signed int retVal = -1;
dflet 0:bbe98578d4c0 176
dflet 0:bbe98578d4c0 177 retVal = initializeAppVariables();
dflet 0:bbe98578d4c0 178 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 179
dflet 0:bbe98578d4c0 180 displayBanner();
dflet 0:bbe98578d4c0 181
dflet 0:bbe98578d4c0 182 CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:bbe98578d4c0 183 g_PingPacketsRecv = 0;
dflet 0:bbe98578d4c0 184
dflet 0:bbe98578d4c0 185 /*
dflet 0:bbe98578d4c0 186 * Following function configures the device to default state by cleaning
dflet 0:bbe98578d4c0 187 * the persistent settings stored in NVMEM (viz. connection profiles &
dflet 0:bbe98578d4c0 188 * policies, power policy etc)
dflet 0:bbe98578d4c0 189 *
dflet 0:bbe98578d4c0 190 * Applications may choose to skip this step if the developer is sure
dflet 0:bbe98578d4c0 191 * that the device is in its default state at start of application
dflet 0:bbe98578d4c0 192 *
dflet 0:bbe98578d4c0 193 * Note that all profiles and persistent settings that were done on the
dflet 0:bbe98578d4c0 194 * device will be lost
dflet 0:bbe98578d4c0 195 */
dflet 0:bbe98578d4c0 196 retVal = configureSimpleLinkToDefaultState();
dflet 0:bbe98578d4c0 197
dflet 0:bbe98578d4c0 198 if(retVal < 0)
dflet 0:bbe98578d4c0 199 {
dflet 0:bbe98578d4c0 200 if (DEVICE_NOT_IN_STATION_MODE == retVal)
dflet 0:bbe98578d4c0 201 printf(" Failed to configure the device in its default state \n\r");
dflet 0:bbe98578d4c0 202
dflet 0:bbe98578d4c0 203 LOOP_FOREVER();
dflet 0:bbe98578d4c0 204 }
dflet 0:bbe98578d4c0 205
dflet 0:bbe98578d4c0 206 printf(" Device is configured in default state \n\r");
dflet 0:bbe98578d4c0 207
dflet 0:bbe98578d4c0 208 /*
dflet 0:bbe98578d4c0 209 * Assumption is that the device is configured in station mode already
dflet 0:bbe98578d4c0 210 * and it is in its default state
dflet 0:bbe98578d4c0 211 */
dflet 0:bbe98578d4c0 212 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 213 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 214 {
dflet 0:bbe98578d4c0 215 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 216 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 217 }
dflet 0:bbe98578d4c0 218 else
dflet 0:bbe98578d4c0 219 {
dflet 0:bbe98578d4c0 220 /* Configure CC3100 to start in AP mode */
dflet 0:bbe98578d4c0 221 retVal = sl_WlanSetMode(ROLE_AP);
dflet 0:bbe98578d4c0 222 if(retVal < 0)
dflet 0:bbe98578d4c0 223 LOOP_FOREVER();
dflet 0:bbe98578d4c0 224
dflet 0:bbe98578d4c0 225 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 226 if(retVal < 0)
dflet 0:bbe98578d4c0 227 LOOP_FOREVER();
dflet 0:bbe98578d4c0 228
dflet 0:bbe98578d4c0 229 CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED);
dflet 0:bbe98578d4c0 230
dflet 0:bbe98578d4c0 231 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 232 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 233 {
dflet 0:bbe98578d4c0 234 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 235 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 236 }
dflet 0:bbe98578d4c0 237 else
dflet 0:bbe98578d4c0 238 {
dflet 0:bbe98578d4c0 239 printf(" Device couldn't be configured in AP mode \n\r");
dflet 0:bbe98578d4c0 240 LOOP_FOREVER();
dflet 0:bbe98578d4c0 241 }
dflet 0:bbe98578d4c0 242 }
dflet 0:bbe98578d4c0 243
dflet 0:bbe98578d4c0 244 printf(" Ready to configue SSID\r\n");
dflet 0:bbe98578d4c0 245
dflet 0:bbe98578d4c0 246 /* Configure the SSID of the CC3100 */
dflet 0:bbe98578d4c0 247 retVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID,
dflet 0:bbe98578d4c0 248 pal_Strlen(SSID_AP_MODE), (unsigned char *)SSID_AP_MODE);
dflet 0:bbe98578d4c0 249 if(retVal < 0)
dflet 0:bbe98578d4c0 250 LOOP_FOREVER();
dflet 0:bbe98578d4c0 251
dflet 0:bbe98578d4c0 252 SecType = SEC_TYPE_AP_MODE;
dflet 0:bbe98578d4c0 253 /* Configure the Security parameter the AP mode */
dflet 0:bbe98578d4c0 254 retVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1,
dflet 0:bbe98578d4c0 255 (unsigned char *)&SecType);
dflet 0:bbe98578d4c0 256 if(retVal < 0)
dflet 0:bbe98578d4c0 257 LOOP_FOREVER();
dflet 0:bbe98578d4c0 258
dflet 0:bbe98578d4c0 259 retVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, pal_Strlen(PASSWORD_AP_MODE),
dflet 0:bbe98578d4c0 260 (unsigned char *)PASSWORD_AP_MODE);
dflet 0:bbe98578d4c0 261 if(retVal < 0)
dflet 0:bbe98578d4c0 262 LOOP_FOREVER();
dflet 0:bbe98578d4c0 263
dflet 0:bbe98578d4c0 264 ipV4.ipV4 = CONFIG_IP;
dflet 0:bbe98578d4c0 265 ipV4.ipV4Mask = CONFIG_MASK;
dflet 0:bbe98578d4c0 266 ipV4.ipV4Gateway = CONFIG_GATEWAY;
dflet 0:bbe98578d4c0 267 ipV4.ipV4DnsServer = CONFIG_DNS;
dflet 0:bbe98578d4c0 268
dflet 0:bbe98578d4c0 269 /* Configure the Static IP */
dflet 0:bbe98578d4c0 270 retVal = sl_NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE,1,sizeof(SlNetCfgIpV4Args_t),
dflet 0:bbe98578d4c0 271 (unsigned char *)&ipV4);
dflet 0:bbe98578d4c0 272 if(retVal < 0)
dflet 0:bbe98578d4c0 273 LOOP_FOREVER();
dflet 0:bbe98578d4c0 274
dflet 0:bbe98578d4c0 275 dhcpParams.lease_time = IP_LEASE_TIME;
dflet 0:bbe98578d4c0 276 dhcpParams.ipv4_addr_start = DHCP_START_IP;
dflet 0:bbe98578d4c0 277 dhcpParams.ipv4_addr_last = DHCP_END_IP;
dflet 0:bbe98578d4c0 278
dflet 0:bbe98578d4c0 279 retVal = sl_NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT,
dflet 0:bbe98578d4c0 280 sizeof(SlNetAppDhcpServerBasicOpt_t), (unsigned char*)&dhcpParams);
dflet 0:bbe98578d4c0 281 if(retVal < 0)
dflet 0:bbe98578d4c0 282 LOOP_FOREVER();
dflet 0:bbe98578d4c0 283
dflet 0:bbe98578d4c0 284 /* Restart the CC3100 */
dflet 0:bbe98578d4c0 285 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 286 if(retVal < 0)
dflet 0:bbe98578d4c0 287 LOOP_FOREVER();
dflet 0:bbe98578d4c0 288
dflet 0:bbe98578d4c0 289 g_Status = 0;
dflet 0:bbe98578d4c0 290
dflet 0:bbe98578d4c0 291 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 292 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 293 {
dflet 0:bbe98578d4c0 294 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 295 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 296 }
dflet 0:bbe98578d4c0 297 else
dflet 0:bbe98578d4c0 298 {
dflet 0:bbe98578d4c0 299 printf(" Device couldn't come in AP mode \n\r");
dflet 0:bbe98578d4c0 300 LOOP_FOREVER();
dflet 0:bbe98578d4c0 301 }
dflet 0:bbe98578d4c0 302
dflet 0:bbe98578d4c0 303 printf(" Device started as Access Point\n\r");
dflet 0:bbe98578d4c0 304
dflet 0:bbe98578d4c0 305 /* Wait */
dflet 0:bbe98578d4c0 306 printf(" Waiting for clients to connect...!\n\r");
dflet 0:bbe98578d4c0 307 while((!IS_IP_LEASED(g_Status)) || (!IS_STA_CONNECTED(g_Status))) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 308 printf(" Client connected to the device \n\r");
dflet 0:bbe98578d4c0 309 printf(" Pinging...! \n\r");
dflet 0:bbe98578d4c0 310
dflet 0:bbe98578d4c0 311 /* Set the ping parameters */
dflet 0:bbe98578d4c0 312 PingParams.PingIntervalTime = PING_INTERVAL;
dflet 0:bbe98578d4c0 313 PingParams.PingSize = PING_SIZE;
dflet 0:bbe98578d4c0 314 PingParams.PingRequestTimeout = PING_REQUEST_TIMEOUT;
dflet 0:bbe98578d4c0 315 PingParams.TotalNumberOfAttempts = PING_ATTEMPT;
dflet 0:bbe98578d4c0 316 PingParams.Flags = 0;
dflet 0:bbe98578d4c0 317 PingParams.Ip = g_StationIP; /* Fill the station IP address connected to CC3100 */
dflet 0:bbe98578d4c0 318
dflet 0:bbe98578d4c0 319 /* Ping client connected to CC3100 */
dflet 0:bbe98578d4c0 320 retVal = sl_NetAppPingStart((SlPingStartCommand_t*)&PingParams, SL_AF_INET,
dflet 0:bbe98578d4c0 321 (SlPingReport_t*)&Report, SimpleLinkPingReport);
dflet 0:bbe98578d4c0 322 if(retVal < 0)
dflet 0:bbe98578d4c0 323 LOOP_FOREVER();
dflet 0:bbe98578d4c0 324
dflet 0:bbe98578d4c0 325 /* Wait */
dflet 0:bbe98578d4c0 326 while(!IS_PING_DONE(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 327
dflet 0:bbe98578d4c0 328 if (0 == g_PingPacketsRecv)
dflet 0:bbe98578d4c0 329 {
dflet 0:bbe98578d4c0 330 printf(" A STATION couldn't connect to the device \n\r");
dflet 0:bbe98578d4c0 331 ASSERT_ON_ERROR(LAN_CONNECTION_FAILED);
dflet 0:bbe98578d4c0 332 }
dflet 0:bbe98578d4c0 333
dflet 0:bbe98578d4c0 334 printf(" Device and the station are successfully connected \n\r");
dflet 0:bbe98578d4c0 335 return SUCCESS;
dflet 0:bbe98578d4c0 336 }
dflet 0:bbe98578d4c0 337
dflet 0:bbe98578d4c0 338
dflet 0:bbe98578d4c0 339 /*!
dflet 0:bbe98578d4c0 340 \brief This function configure the SimpleLink device in its default state. It:
dflet 0:bbe98578d4c0 341 - Sets the mode to STATION
dflet 0:bbe98578d4c0 342 - Configures connection policy to Auto and AutoSmartConfig
dflet 0:bbe98578d4c0 343 - Deletes all the stored profiles
dflet 0:bbe98578d4c0 344 - Enables DHCP
dflet 0:bbe98578d4c0 345 - Disables Scan policy
dflet 0:bbe98578d4c0 346 - Sets Tx power to maximum
dflet 0:bbe98578d4c0 347 - Sets power policy to normal
dflet 0:bbe98578d4c0 348 - Unregisters mDNS services
dflet 0:bbe98578d4c0 349 - Remove all filters
dflet 0:bbe98578d4c0 350
dflet 0:bbe98578d4c0 351 \param[in] none
dflet 0:bbe98578d4c0 352
dflet 0:bbe98578d4c0 353 \return On success, zero is returned. On error, negative is returned
dflet 0:bbe98578d4c0 354 */
dflet 0:bbe98578d4c0 355 static signed int configureSimpleLinkToDefaultState()
dflet 0:bbe98578d4c0 356 {
dflet 0:bbe98578d4c0 357 SlVersionFull ver = {0};
dflet 0:bbe98578d4c0 358 _WlanRxFilterOperationCommandBuff_t RxFilterIdMask = {0};
dflet 0:bbe98578d4c0 359 unsigned char val = 1;
dflet 0:bbe98578d4c0 360 unsigned char configOpt = 0;
dflet 0:bbe98578d4c0 361 unsigned char configLen = 0;
dflet 0:bbe98578d4c0 362 unsigned char power = 0;
dflet 0:bbe98578d4c0 363
dflet 0:bbe98578d4c0 364 signed int retVal = -1;
dflet 0:bbe98578d4c0 365 signed int mode = -1;
dflet 0:bbe98578d4c0 366
dflet 0:bbe98578d4c0 367 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 368 ASSERT_ON_ERROR(mode);
dflet 0:bbe98578d4c0 369
dflet 0:bbe98578d4c0 370 /* If the device is not in station-mode, try configuring it in station-mode */
dflet 0:bbe98578d4c0 371 if (ROLE_STA != mode)
dflet 0:bbe98578d4c0 372 {
dflet 0:bbe98578d4c0 373 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 374 {
dflet 0:bbe98578d4c0 375 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 376 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 377 }
dflet 0:bbe98578d4c0 378
dflet 0:bbe98578d4c0 379 /* Switch to STA role and restart */
dflet 0:bbe98578d4c0 380 retVal = sl_WlanSetMode(ROLE_STA);
dflet 0:bbe98578d4c0 381 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 382
dflet 0:bbe98578d4c0 383 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 384 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 385
dflet 0:bbe98578d4c0 386 retVal = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 387 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 388
dflet 0:bbe98578d4c0 389 /* Check if the device is in station again */
dflet 0:bbe98578d4c0 390 if (ROLE_STA != retVal)
dflet 0:bbe98578d4c0 391 {
dflet 0:bbe98578d4c0 392 /* We don't want to proceed if the device is not coming up in station-mode */
dflet 0:bbe98578d4c0 393 ASSERT_ON_ERROR(DEVICE_NOT_IN_STATION_MODE);
dflet 0:bbe98578d4c0 394 }
dflet 0:bbe98578d4c0 395 }
dflet 0:bbe98578d4c0 396
dflet 0:bbe98578d4c0 397 /* Get the device's version-information */
dflet 0:bbe98578d4c0 398 configOpt = SL_DEVICE_GENERAL_VERSION;
dflet 0:bbe98578d4c0 399 configLen = sizeof(ver);
dflet 0:bbe98578d4c0 400 retVal = sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION, &configOpt, &configLen, (unsigned char *)(&ver));
dflet 0:bbe98578d4c0 401 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 402
dflet 0:bbe98578d4c0 403 /* Set connection policy to Auto + SmartConfig (Device's default connection policy) */
dflet 0:bbe98578d4c0 404 retVal = sl_WlanPolicySet(SL_POLICY_CONNECTION, SL_CONNECTION_POLICY(1, 0, 0, 0, 1), NULL, 0);
dflet 0:bbe98578d4c0 405 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 406
dflet 0:bbe98578d4c0 407 /* Remove all profiles */
dflet 0:bbe98578d4c0 408 retVal = sl_WlanProfileDel(0xFF);
dflet 0:bbe98578d4c0 409 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 410
dflet 0:bbe98578d4c0 411 /*
dflet 0:bbe98578d4c0 412 * Device in station-mode. Disconnect previous connection if any
dflet 0:bbe98578d4c0 413 * The function returns 0 if 'Disconnected done', negative number if already disconnected
dflet 0:bbe98578d4c0 414 * Wait for 'disconnection' event if 0 is returned, Ignore other return-codes
dflet 0:bbe98578d4c0 415 */
dflet 0:bbe98578d4c0 416 retVal = sl_WlanDisconnect();
dflet 0:bbe98578d4c0 417 if(0 == retVal)
dflet 0:bbe98578d4c0 418 {
dflet 0:bbe98578d4c0 419 /* Wait */
dflet 0:bbe98578d4c0 420 while(IS_CONNECTED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 421 }
dflet 0:bbe98578d4c0 422
dflet 0:bbe98578d4c0 423 /* Enable DHCP client*/
dflet 0:bbe98578d4c0 424 retVal = sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE,1,1,&val);
dflet 0:bbe98578d4c0 425 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 426
dflet 0:bbe98578d4c0 427 /* Disable scan */
dflet 0:bbe98578d4c0 428 configOpt = SL_SCAN_POLICY(0);
dflet 0:bbe98578d4c0 429 retVal = sl_WlanPolicySet(SL_POLICY_SCAN , configOpt, NULL, 0);
dflet 0:bbe98578d4c0 430 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 431
dflet 0:bbe98578d4c0 432 /* Set Tx power level for station mode
dflet 0:bbe98578d4c0 433 Number between 0-15, as dB offset from maximum power - 0 will set maximum power */
dflet 0:bbe98578d4c0 434 power = 0;
dflet 0:bbe98578d4c0 435 retVal = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER, 1, (unsigned char *)&power);
dflet 0:bbe98578d4c0 436 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 437
dflet 0:bbe98578d4c0 438 /* Set PM policy to normal */
dflet 0:bbe98578d4c0 439 retVal = sl_WlanPolicySet(SL_POLICY_PM , SL_NORMAL_POLICY, NULL, 0);
dflet 0:bbe98578d4c0 440 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 441
dflet 0:bbe98578d4c0 442 /* Unregister mDNS services */
dflet 0:bbe98578d4c0 443 retVal = sl_NetAppMDNSUnRegisterService(0, 0);
dflet 0:bbe98578d4c0 444 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 445
dflet 0:bbe98578d4c0 446 /* Remove all 64 filters (8*8) */
dflet 0:bbe98578d4c0 447 pal_Memset(RxFilterIdMask.FilterIdMask, 0xFF, 8);
dflet 0:bbe98578d4c0 448 retVal = sl_WlanRxFilterSet(SL_REMOVE_RX_FILTER, (unsigned char *)&RxFilterIdMask,
dflet 0:bbe98578d4c0 449 sizeof(_WlanRxFilterOperationCommandBuff_t));
dflet 0:bbe98578d4c0 450 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 451
dflet 0:bbe98578d4c0 452 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 453 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 454
dflet 0:bbe98578d4c0 455 retVal = initializeAppVariables();
dflet 0:bbe98578d4c0 456 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 457
dflet 0:bbe98578d4c0 458 return retVal; /* Success */
dflet 0:bbe98578d4c0 459 }
dflet 0:bbe98578d4c0 460
dflet 0:bbe98578d4c0 461 /*!
dflet 0:bbe98578d4c0 462 \brief This function initializes the application variables
dflet 0:bbe98578d4c0 463
dflet 0:bbe98578d4c0 464 \param[in] None
dflet 0:bbe98578d4c0 465
dflet 0:bbe98578d4c0 466 \return 0 on success, negative error-code on error
dflet 0:bbe98578d4c0 467 */
dflet 0:bbe98578d4c0 468 static signed int initializeAppVariables()
dflet 0:bbe98578d4c0 469 {
dflet 0:bbe98578d4c0 470 //g_Status = 0;
dflet 0:bbe98578d4c0 471 //g_PingPacketsRecv = 0;
dflet 0:bbe98578d4c0 472 //g_StationIP = 0;
dflet 0:bbe98578d4c0 473
dflet 0:bbe98578d4c0 474 return SUCCESS;
dflet 0:bbe98578d4c0 475 }
dflet 0:bbe98578d4c0 476
dflet 0:bbe98578d4c0 477 /*!
dflet 0:bbe98578d4c0 478 \brief This function displays the application's banner
dflet 0:bbe98578d4c0 479
dflet 0:bbe98578d4c0 480 \param None
dflet 0:bbe98578d4c0 481
dflet 0:bbe98578d4c0 482 \return None
dflet 0:bbe98578d4c0 483 */
dflet 0:bbe98578d4c0 484 static void displayBanner()
dflet 0:bbe98578d4c0 485 {
dflet 0:bbe98578d4c0 486 printf("\n\r\n\r");
dflet 0:bbe98578d4c0 487 printf(" Getting started with WLAN access-point application - Version ");
dflet 0:bbe98578d4c0 488 printf("%s",APPLICATION_VERSION);
dflet 0:bbe98578d4c0 489 printf("\n\r*******************************************************************\n\r");
dflet 0:bbe98578d4c0 490 }
dflet 0:bbe98578d4c0 491