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

Dependencies:   mbed

Committer:
dflet
Date:
Mon Nov 17 19:38:34 2014 +0000
Revision:
0:bbe98578d4c0
Child:
1:da33a9116bda
Experimental and a work in progress. Mostly left as TI C code. Does compile and run, but I have seen a few glitches. cc3100_sl_common.h will need your ssid and pass key at line 82.....

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 0:bbe98578d4c0 49 #include "cc3100_simplelink.h"
dflet 0:bbe98578d4c0 50 #include "cc3100_sl_common.h"
dflet 0:bbe98578d4c0 51 #
dflet 0:bbe98578d4c0 52 #include "mbed.h"
dflet 0:bbe98578d4c0 53
dflet 0:bbe98578d4c0 54 //using namespace mbed_cc3100;
dflet 0:bbe98578d4c0 55
dflet 0:bbe98578d4c0 56 //cc3100_spi spi_con(p9, p10, p8, SPI(p5, p6, p7));
dflet 0:bbe98578d4c0 57 Serial pc(SERIAL_TX, SERIAL_RX);//nucleoF411
dflet 0:bbe98578d4c0 58 //Serial pc(USBTX, USBRX);//lpc1768
dflet 0:bbe98578d4c0 59
dflet 0:bbe98578d4c0 60 //namespace mbed_cc3100 {
dflet 0:bbe98578d4c0 61
dflet 0:bbe98578d4c0 62 #define APPLICATION_VERSION "1.1.0"
dflet 0:bbe98578d4c0 63
dflet 0:bbe98578d4c0 64 #define SL_STOP_TIMEOUT 0xFF
dflet 0:bbe98578d4c0 65
dflet 0:bbe98578d4c0 66 /* Use bit 32: Lower bits of status variable are used for NWP events
dflet 0:bbe98578d4c0 67 * 1 in a 'status_variable', the device has completed the ping operation
dflet 0:bbe98578d4c0 68 * 0 in a 'status_variable', the device has not completed the ping operation
dflet 0:bbe98578d4c0 69 */
dflet 0:bbe98578d4c0 70 //#define STATUS_BIT_PING_DONE 31
dflet 0:bbe98578d4c0 71
dflet 0:bbe98578d4c0 72 #define CONFIG_IP SL_IPV4_VAL(192,168,0,1) /* Static IP to be configured */
dflet 0:bbe98578d4c0 73 #define CONFIG_MASK SL_IPV4_VAL(255,255,255,0) /* Subnet Mask for the station */
dflet 0:bbe98578d4c0 74 #define CONFIG_GATEWAY SL_IPV4_VAL(192,168,0,1) /* Default Gateway address */
dflet 0:bbe98578d4c0 75 #define CONFIG_DNS SL_IPV4_VAL(192,168,0,1) /* DNS Server Address */
dflet 0:bbe98578d4c0 76
dflet 0:bbe98578d4c0 77 #define DHCP_START_IP SL_IPV4_VAL(192,168,0,100) /* DHCP start IP address */
dflet 0:bbe98578d4c0 78 #define DHCP_END_IP SL_IPV4_VAL(192,168,0,200) /* DHCP End IP address */
dflet 0:bbe98578d4c0 79
dflet 0:bbe98578d4c0 80 #define IP_LEASE_TIME 3600
dflet 0:bbe98578d4c0 81
dflet 0:bbe98578d4c0 82 #define PING_INTERVAL 1000
dflet 0:bbe98578d4c0 83 #define PING_SIZE 20
dflet 0:bbe98578d4c0 84 #define PING_REQUEST_TIMEOUT 3000
dflet 0:bbe98578d4c0 85 #define PING_ATTEMPT 3
dflet 0:bbe98578d4c0 86
dflet 0:bbe98578d4c0 87 /* Application specific status/error codes */
dflet 0:bbe98578d4c0 88 typedef enum{
dflet 0:bbe98578d4c0 89 LAN_CONNECTION_FAILED = -0x7D0, /* Choosing this number to avoid overlap with host-driver's error codes */
dflet 0:bbe98578d4c0 90 INTERNET_CONNECTION_FAILED = LAN_CONNECTION_FAILED - 1,
dflet 0:bbe98578d4c0 91 DEVICE_NOT_IN_STATION_MODE = INTERNET_CONNECTION_FAILED - 1,
dflet 0:bbe98578d4c0 92
dflet 0:bbe98578d4c0 93 STATUS_CODE_MAX = -0xBB8
dflet 0:bbe98578d4c0 94 }e_AppStatusCodes;
dflet 0:bbe98578d4c0 95 /*
dflet 0:bbe98578d4c0 96 #define IS_PING_DONE(status_variable) GET_STATUS_BIT(status_variable, \
dflet 0:bbe98578d4c0 97 STATUS_BIT_PING_DONE)
dflet 0:bbe98578d4c0 98 */
dflet 0:bbe98578d4c0 99 /*
dflet 0:bbe98578d4c0 100 * GLOBAL VARIABLES -- Start
dflet 0:bbe98578d4c0 101 */
dflet 0:bbe98578d4c0 102
dflet 0:bbe98578d4c0 103 //extern unsigned int g_GatewayIP = 0;
dflet 0:bbe98578d4c0 104 //extern unsigned int g_StationIP = 0;
dflet 0:bbe98578d4c0 105 unsigned int g_PingPacketsRecv = 0;
dflet 0:bbe98578d4c0 106
dflet 0:bbe98578d4c0 107 /*
dflet 0:bbe98578d4c0 108 * GLOBAL VARIABLES -- End
dflet 0:bbe98578d4c0 109 */
dflet 0:bbe98578d4c0 110
dflet 0:bbe98578d4c0 111
dflet 0:bbe98578d4c0 112 /*
dflet 0:bbe98578d4c0 113 * STATIC FUNCTION DEFINITIONS -- Start
dflet 0:bbe98578d4c0 114 */
dflet 0:bbe98578d4c0 115 static signed int configureSimpleLinkToDefaultState();
dflet 0:bbe98578d4c0 116 static signed int initializeAppVariables();
dflet 0:bbe98578d4c0 117 static void displayBanner();
dflet 0:bbe98578d4c0 118
dflet 0:bbe98578d4c0 119 /*
dflet 0:bbe98578d4c0 120 * STATIC FUNCTION DEFINITIONS -- End
dflet 0:bbe98578d4c0 121 */
dflet 0:bbe98578d4c0 122
dflet 0:bbe98578d4c0 123 /*
dflet 0:bbe98578d4c0 124 * ASYNCHRONOUS EVENT HANDLERS -- Start
dflet 0:bbe98578d4c0 125 */
dflet 0:bbe98578d4c0 126
dflet 0:bbe98578d4c0 127 /*!
dflet 0:bbe98578d4c0 128 \brief This function handles ping report events
dflet 0:bbe98578d4c0 129
dflet 0:bbe98578d4c0 130 \param[in] pPingReport holds the ping report statistics
dflet 0:bbe98578d4c0 131
dflet 0:bbe98578d4c0 132 \return None
dflet 0:bbe98578d4c0 133
dflet 0:bbe98578d4c0 134 \note
dflet 0:bbe98578d4c0 135
dflet 0:bbe98578d4c0 136 \warning
dflet 0:bbe98578d4c0 137 */
dflet 0:bbe98578d4c0 138
dflet 0:bbe98578d4c0 139 static void SimpleLinkPingReport(SlPingReport_t *pPingReport)
dflet 0:bbe98578d4c0 140 {
dflet 0:bbe98578d4c0 141 SET_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:bbe98578d4c0 142
dflet 0:bbe98578d4c0 143 if(pPingReport == NULL)
dflet 0:bbe98578d4c0 144
dflet 0:bbe98578d4c0 145 printf(" [PING REPORT] NULL Pointer Error\r\n");
dflet 0:bbe98578d4c0 146
dflet 0:bbe98578d4c0 147 g_PingPacketsRecv = pPingReport->PacketsReceived;
dflet 0:bbe98578d4c0 148 }
dflet 0:bbe98578d4c0 149
dflet 0:bbe98578d4c0 150 /*
dflet 0:bbe98578d4c0 151 * ASYNCHRONOUS EVENT HANDLERS -- End
dflet 0:bbe98578d4c0 152 */
dflet 0:bbe98578d4c0 153
dflet 0:bbe98578d4c0 154
dflet 0:bbe98578d4c0 155 /*
dflet 0:bbe98578d4c0 156 * Application's entry point
dflet 0:bbe98578d4c0 157 */
dflet 0:bbe98578d4c0 158 int main()
dflet 0:bbe98578d4c0 159 {
dflet 0:bbe98578d4c0 160 pc.baud(115200);
dflet 0:bbe98578d4c0 161
dflet 0:bbe98578d4c0 162 SlPingStartCommand_t PingParams = {0};
dflet 0:bbe98578d4c0 163 SlPingReport_t Report = {0};
dflet 0:bbe98578d4c0 164 SlNetCfgIpV4Args_t ipV4 = {0};
dflet 0:bbe98578d4c0 165 SlNetAppDhcpServerBasicOpt_t dhcpParams = {0};
dflet 0:bbe98578d4c0 166
dflet 0:bbe98578d4c0 167 unsigned char SecType = 0;
dflet 0:bbe98578d4c0 168 signed int mode = ROLE_STA;
dflet 0:bbe98578d4c0 169 signed int retVal = -1;
dflet 0:bbe98578d4c0 170
dflet 0:bbe98578d4c0 171 retVal = initializeAppVariables();
dflet 0:bbe98578d4c0 172 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 173
dflet 0:bbe98578d4c0 174 displayBanner();
dflet 0:bbe98578d4c0 175
dflet 0:bbe98578d4c0 176 CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:bbe98578d4c0 177 g_PingPacketsRecv = 0;
dflet 0:bbe98578d4c0 178
dflet 0:bbe98578d4c0 179 /*
dflet 0:bbe98578d4c0 180 * Following function configures the device to default state by cleaning
dflet 0:bbe98578d4c0 181 * the persistent settings stored in NVMEM (viz. connection profiles &
dflet 0:bbe98578d4c0 182 * policies, power policy etc)
dflet 0:bbe98578d4c0 183 *
dflet 0:bbe98578d4c0 184 * Applications may choose to skip this step if the developer is sure
dflet 0:bbe98578d4c0 185 * that the device is in its default state at start of application
dflet 0:bbe98578d4c0 186 *
dflet 0:bbe98578d4c0 187 * Note that all profiles and persistent settings that were done on the
dflet 0:bbe98578d4c0 188 * device will be lost
dflet 0:bbe98578d4c0 189 */
dflet 0:bbe98578d4c0 190 retVal = configureSimpleLinkToDefaultState();
dflet 0:bbe98578d4c0 191
dflet 0:bbe98578d4c0 192 if(retVal < 0)
dflet 0:bbe98578d4c0 193 {
dflet 0:bbe98578d4c0 194 if (DEVICE_NOT_IN_STATION_MODE == retVal)
dflet 0:bbe98578d4c0 195 printf(" Failed to configure the device in its default state \n\r");
dflet 0:bbe98578d4c0 196
dflet 0:bbe98578d4c0 197 LOOP_FOREVER();
dflet 0:bbe98578d4c0 198 }
dflet 0:bbe98578d4c0 199
dflet 0:bbe98578d4c0 200 printf(" Device is configured in default state \n\r");
dflet 0:bbe98578d4c0 201
dflet 0:bbe98578d4c0 202 /*
dflet 0:bbe98578d4c0 203 * Assumption is that the device is configured in station mode already
dflet 0:bbe98578d4c0 204 * and it is in its default state
dflet 0:bbe98578d4c0 205 */
dflet 0:bbe98578d4c0 206 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 207 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 208 {
dflet 0:bbe98578d4c0 209 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 210 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 211 }
dflet 0:bbe98578d4c0 212 else
dflet 0:bbe98578d4c0 213 {
dflet 0:bbe98578d4c0 214 /* Configure CC3100 to start in AP mode */
dflet 0:bbe98578d4c0 215 retVal = sl_WlanSetMode(ROLE_AP);
dflet 0:bbe98578d4c0 216 if(retVal < 0)
dflet 0:bbe98578d4c0 217 LOOP_FOREVER();
dflet 0:bbe98578d4c0 218
dflet 0:bbe98578d4c0 219 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 220 if(retVal < 0)
dflet 0:bbe98578d4c0 221 LOOP_FOREVER();
dflet 0:bbe98578d4c0 222
dflet 0:bbe98578d4c0 223 CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED);
dflet 0:bbe98578d4c0 224
dflet 0:bbe98578d4c0 225 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 226 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 227 {
dflet 0:bbe98578d4c0 228 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 229 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 230 }
dflet 0:bbe98578d4c0 231 else
dflet 0:bbe98578d4c0 232 {
dflet 0:bbe98578d4c0 233 printf(" Device couldn't be configured in AP mode \n\r");
dflet 0:bbe98578d4c0 234 LOOP_FOREVER();
dflet 0:bbe98578d4c0 235 }
dflet 0:bbe98578d4c0 236 }
dflet 0:bbe98578d4c0 237
dflet 0:bbe98578d4c0 238 printf(" Ready to configue SSID\r\n");
dflet 0:bbe98578d4c0 239
dflet 0:bbe98578d4c0 240 /* Configure the SSID of the CC3100 */
dflet 0:bbe98578d4c0 241 retVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID,
dflet 0:bbe98578d4c0 242 pal_Strlen(SSID_AP_MODE), (unsigned char *)SSID_AP_MODE);
dflet 0:bbe98578d4c0 243 if(retVal < 0)
dflet 0:bbe98578d4c0 244 LOOP_FOREVER();
dflet 0:bbe98578d4c0 245
dflet 0:bbe98578d4c0 246 SecType = SEC_TYPE_AP_MODE;
dflet 0:bbe98578d4c0 247 /* Configure the Security parameter the AP mode */
dflet 0:bbe98578d4c0 248 retVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1,
dflet 0:bbe98578d4c0 249 (unsigned char *)&SecType);
dflet 0:bbe98578d4c0 250 if(retVal < 0)
dflet 0:bbe98578d4c0 251 LOOP_FOREVER();
dflet 0:bbe98578d4c0 252
dflet 0:bbe98578d4c0 253 retVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, pal_Strlen(PASSWORD_AP_MODE),
dflet 0:bbe98578d4c0 254 (unsigned char *)PASSWORD_AP_MODE);
dflet 0:bbe98578d4c0 255 if(retVal < 0)
dflet 0:bbe98578d4c0 256 LOOP_FOREVER();
dflet 0:bbe98578d4c0 257
dflet 0:bbe98578d4c0 258 ipV4.ipV4 = CONFIG_IP;
dflet 0:bbe98578d4c0 259 ipV4.ipV4Mask = CONFIG_MASK;
dflet 0:bbe98578d4c0 260 ipV4.ipV4Gateway = CONFIG_GATEWAY;
dflet 0:bbe98578d4c0 261 ipV4.ipV4DnsServer = CONFIG_DNS;
dflet 0:bbe98578d4c0 262
dflet 0:bbe98578d4c0 263 /* Configure the Static IP */
dflet 0:bbe98578d4c0 264 retVal = sl_NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE,1,sizeof(SlNetCfgIpV4Args_t),
dflet 0:bbe98578d4c0 265 (unsigned char *)&ipV4);
dflet 0:bbe98578d4c0 266 if(retVal < 0)
dflet 0:bbe98578d4c0 267 LOOP_FOREVER();
dflet 0:bbe98578d4c0 268
dflet 0:bbe98578d4c0 269 dhcpParams.lease_time = IP_LEASE_TIME;
dflet 0:bbe98578d4c0 270 dhcpParams.ipv4_addr_start = DHCP_START_IP;
dflet 0:bbe98578d4c0 271 dhcpParams.ipv4_addr_last = DHCP_END_IP;
dflet 0:bbe98578d4c0 272
dflet 0:bbe98578d4c0 273 retVal = sl_NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT,
dflet 0:bbe98578d4c0 274 sizeof(SlNetAppDhcpServerBasicOpt_t), (unsigned char*)&dhcpParams);
dflet 0:bbe98578d4c0 275 if(retVal < 0)
dflet 0:bbe98578d4c0 276 LOOP_FOREVER();
dflet 0:bbe98578d4c0 277
dflet 0:bbe98578d4c0 278 /* Restart the CC3100 */
dflet 0:bbe98578d4c0 279 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 280 if(retVal < 0)
dflet 0:bbe98578d4c0 281 LOOP_FOREVER();
dflet 0:bbe98578d4c0 282
dflet 0:bbe98578d4c0 283 g_Status = 0;
dflet 0:bbe98578d4c0 284
dflet 0:bbe98578d4c0 285 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 286 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 287 {
dflet 0:bbe98578d4c0 288 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 289 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 290 }
dflet 0:bbe98578d4c0 291 else
dflet 0:bbe98578d4c0 292 {
dflet 0:bbe98578d4c0 293 printf(" Device couldn't come in AP mode \n\r");
dflet 0:bbe98578d4c0 294 LOOP_FOREVER();
dflet 0:bbe98578d4c0 295 }
dflet 0:bbe98578d4c0 296
dflet 0:bbe98578d4c0 297 printf(" Device started as Access Point\n\r");
dflet 0:bbe98578d4c0 298
dflet 0:bbe98578d4c0 299 /* Wait */
dflet 0:bbe98578d4c0 300 printf(" Waiting for clients to connect...!\n\r");
dflet 0:bbe98578d4c0 301 while((!IS_IP_LEASED(g_Status)) || (!IS_STA_CONNECTED(g_Status))) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 302 printf(" Client connected to the device \n\r");
dflet 0:bbe98578d4c0 303 printf(" Pinging...! \n\r");
dflet 0:bbe98578d4c0 304
dflet 0:bbe98578d4c0 305 /* Set the ping parameters */
dflet 0:bbe98578d4c0 306 PingParams.PingIntervalTime = PING_INTERVAL;
dflet 0:bbe98578d4c0 307 PingParams.PingSize = PING_SIZE;
dflet 0:bbe98578d4c0 308 PingParams.PingRequestTimeout = PING_REQUEST_TIMEOUT;
dflet 0:bbe98578d4c0 309 PingParams.TotalNumberOfAttempts = PING_ATTEMPT;
dflet 0:bbe98578d4c0 310 PingParams.Flags = 0;
dflet 0:bbe98578d4c0 311 PingParams.Ip = g_StationIP; /* Fill the station IP address connected to CC3100 */
dflet 0:bbe98578d4c0 312
dflet 0:bbe98578d4c0 313 /* Ping client connected to CC3100 */
dflet 0:bbe98578d4c0 314 retVal = sl_NetAppPingStart((SlPingStartCommand_t*)&PingParams, SL_AF_INET,
dflet 0:bbe98578d4c0 315 (SlPingReport_t*)&Report, SimpleLinkPingReport);
dflet 0:bbe98578d4c0 316 if(retVal < 0)
dflet 0:bbe98578d4c0 317 LOOP_FOREVER();
dflet 0:bbe98578d4c0 318
dflet 0:bbe98578d4c0 319 /* Wait */
dflet 0:bbe98578d4c0 320 while(!IS_PING_DONE(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 321
dflet 0:bbe98578d4c0 322 if (0 == g_PingPacketsRecv)
dflet 0:bbe98578d4c0 323 {
dflet 0:bbe98578d4c0 324 printf(" A STATION couldn't connect to the device \n\r");
dflet 0:bbe98578d4c0 325 ASSERT_ON_ERROR(LAN_CONNECTION_FAILED);
dflet 0:bbe98578d4c0 326 }
dflet 0:bbe98578d4c0 327
dflet 0:bbe98578d4c0 328 printf(" Device and the station are successfully connected \n\r");
dflet 0:bbe98578d4c0 329 return SUCCESS;
dflet 0:bbe98578d4c0 330 }
dflet 0:bbe98578d4c0 331
dflet 0:bbe98578d4c0 332
dflet 0:bbe98578d4c0 333 /*!
dflet 0:bbe98578d4c0 334 \brief This function configure the SimpleLink device in its default state. It:
dflet 0:bbe98578d4c0 335 - Sets the mode to STATION
dflet 0:bbe98578d4c0 336 - Configures connection policy to Auto and AutoSmartConfig
dflet 0:bbe98578d4c0 337 - Deletes all the stored profiles
dflet 0:bbe98578d4c0 338 - Enables DHCP
dflet 0:bbe98578d4c0 339 - Disables Scan policy
dflet 0:bbe98578d4c0 340 - Sets Tx power to maximum
dflet 0:bbe98578d4c0 341 - Sets power policy to normal
dflet 0:bbe98578d4c0 342 - Unregisters mDNS services
dflet 0:bbe98578d4c0 343 - Remove all filters
dflet 0:bbe98578d4c0 344
dflet 0:bbe98578d4c0 345 \param[in] none
dflet 0:bbe98578d4c0 346
dflet 0:bbe98578d4c0 347 \return On success, zero is returned. On error, negative is returned
dflet 0:bbe98578d4c0 348 */
dflet 0:bbe98578d4c0 349 static signed int configureSimpleLinkToDefaultState()
dflet 0:bbe98578d4c0 350 {
dflet 0:bbe98578d4c0 351 SlVersionFull ver = {0};
dflet 0:bbe98578d4c0 352 _WlanRxFilterOperationCommandBuff_t RxFilterIdMask = {0};
dflet 0:bbe98578d4c0 353 unsigned char val = 1;
dflet 0:bbe98578d4c0 354 unsigned char configOpt = 0;
dflet 0:bbe98578d4c0 355 unsigned char configLen = 0;
dflet 0:bbe98578d4c0 356 unsigned char power = 0;
dflet 0:bbe98578d4c0 357
dflet 0:bbe98578d4c0 358 signed int retVal = -1;
dflet 0:bbe98578d4c0 359 signed int mode = -1;
dflet 0:bbe98578d4c0 360
dflet 0:bbe98578d4c0 361 mode = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 362 ASSERT_ON_ERROR(mode);
dflet 0:bbe98578d4c0 363
dflet 0:bbe98578d4c0 364 /* If the device is not in station-mode, try configuring it in station-mode */
dflet 0:bbe98578d4c0 365 if (ROLE_STA != mode)
dflet 0:bbe98578d4c0 366 {
dflet 0:bbe98578d4c0 367 if (ROLE_AP == mode)
dflet 0:bbe98578d4c0 368 {
dflet 0:bbe98578d4c0 369 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:bbe98578d4c0 370 while(!IS_IP_ACQUIRED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 371 }
dflet 0:bbe98578d4c0 372
dflet 0:bbe98578d4c0 373 /* Switch to STA role and restart */
dflet 0:bbe98578d4c0 374 retVal = sl_WlanSetMode(ROLE_STA);
dflet 0:bbe98578d4c0 375 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 376
dflet 0:bbe98578d4c0 377 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 378 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 379
dflet 0:bbe98578d4c0 380 retVal = sl_Start(0, 0, 0);
dflet 0:bbe98578d4c0 381 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 382
dflet 0:bbe98578d4c0 383 /* Check if the device is in station again */
dflet 0:bbe98578d4c0 384 if (ROLE_STA != retVal)
dflet 0:bbe98578d4c0 385 {
dflet 0:bbe98578d4c0 386 /* We don't want to proceed if the device is not coming up in station-mode */
dflet 0:bbe98578d4c0 387 ASSERT_ON_ERROR(DEVICE_NOT_IN_STATION_MODE);
dflet 0:bbe98578d4c0 388 }
dflet 0:bbe98578d4c0 389 }
dflet 0:bbe98578d4c0 390
dflet 0:bbe98578d4c0 391 /* Get the device's version-information */
dflet 0:bbe98578d4c0 392 configOpt = SL_DEVICE_GENERAL_VERSION;
dflet 0:bbe98578d4c0 393 configLen = sizeof(ver);
dflet 0:bbe98578d4c0 394 retVal = sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION, &configOpt, &configLen, (unsigned char *)(&ver));
dflet 0:bbe98578d4c0 395 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 396
dflet 0:bbe98578d4c0 397 /* Set connection policy to Auto + SmartConfig (Device's default connection policy) */
dflet 0:bbe98578d4c0 398 retVal = sl_WlanPolicySet(SL_POLICY_CONNECTION, SL_CONNECTION_POLICY(1, 0, 0, 0, 1), NULL, 0);
dflet 0:bbe98578d4c0 399 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 400
dflet 0:bbe98578d4c0 401 /* Remove all profiles */
dflet 0:bbe98578d4c0 402 retVal = sl_WlanProfileDel(0xFF);
dflet 0:bbe98578d4c0 403 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 404
dflet 0:bbe98578d4c0 405 /*
dflet 0:bbe98578d4c0 406 * Device in station-mode. Disconnect previous connection if any
dflet 0:bbe98578d4c0 407 * The function returns 0 if 'Disconnected done', negative number if already disconnected
dflet 0:bbe98578d4c0 408 * Wait for 'disconnection' event if 0 is returned, Ignore other return-codes
dflet 0:bbe98578d4c0 409 */
dflet 0:bbe98578d4c0 410 retVal = sl_WlanDisconnect();
dflet 0:bbe98578d4c0 411 if(0 == retVal)
dflet 0:bbe98578d4c0 412 {
dflet 0:bbe98578d4c0 413 /* Wait */
dflet 0:bbe98578d4c0 414 while(IS_CONNECTED(g_Status)) { _SlNonOsMainLoopTask(); }
dflet 0:bbe98578d4c0 415 }
dflet 0:bbe98578d4c0 416
dflet 0:bbe98578d4c0 417 /* Enable DHCP client*/
dflet 0:bbe98578d4c0 418 retVal = sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE,1,1,&val);
dflet 0:bbe98578d4c0 419 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 420
dflet 0:bbe98578d4c0 421 /* Disable scan */
dflet 0:bbe98578d4c0 422 configOpt = SL_SCAN_POLICY(0);
dflet 0:bbe98578d4c0 423 retVal = sl_WlanPolicySet(SL_POLICY_SCAN , configOpt, NULL, 0);
dflet 0:bbe98578d4c0 424 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 425
dflet 0:bbe98578d4c0 426 /* Set Tx power level for station mode
dflet 0:bbe98578d4c0 427 Number between 0-15, as dB offset from maximum power - 0 will set maximum power */
dflet 0:bbe98578d4c0 428 power = 0;
dflet 0:bbe98578d4c0 429 retVal = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER, 1, (unsigned char *)&power);
dflet 0:bbe98578d4c0 430 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 431
dflet 0:bbe98578d4c0 432 /* Set PM policy to normal */
dflet 0:bbe98578d4c0 433 retVal = sl_WlanPolicySet(SL_POLICY_PM , SL_NORMAL_POLICY, NULL, 0);
dflet 0:bbe98578d4c0 434 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 435
dflet 0:bbe98578d4c0 436 /* Unregister mDNS services */
dflet 0:bbe98578d4c0 437 retVal = sl_NetAppMDNSUnRegisterService(0, 0);
dflet 0:bbe98578d4c0 438 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 439
dflet 0:bbe98578d4c0 440 /* Remove all 64 filters (8*8) */
dflet 0:bbe98578d4c0 441 pal_Memset(RxFilterIdMask.FilterIdMask, 0xFF, 8);
dflet 0:bbe98578d4c0 442 retVal = sl_WlanRxFilterSet(SL_REMOVE_RX_FILTER, (unsigned char *)&RxFilterIdMask,
dflet 0:bbe98578d4c0 443 sizeof(_WlanRxFilterOperationCommandBuff_t));
dflet 0:bbe98578d4c0 444 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 445
dflet 0:bbe98578d4c0 446 retVal = sl_Stop(SL_STOP_TIMEOUT);
dflet 0:bbe98578d4c0 447 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 448
dflet 0:bbe98578d4c0 449 retVal = initializeAppVariables();
dflet 0:bbe98578d4c0 450 ASSERT_ON_ERROR(retVal);
dflet 0:bbe98578d4c0 451
dflet 0:bbe98578d4c0 452 return retVal; /* Success */
dflet 0:bbe98578d4c0 453 }
dflet 0:bbe98578d4c0 454
dflet 0:bbe98578d4c0 455 /*!
dflet 0:bbe98578d4c0 456 \brief This function initializes the application variables
dflet 0:bbe98578d4c0 457
dflet 0:bbe98578d4c0 458 \param[in] None
dflet 0:bbe98578d4c0 459
dflet 0:bbe98578d4c0 460 \return 0 on success, negative error-code on error
dflet 0:bbe98578d4c0 461 */
dflet 0:bbe98578d4c0 462 static signed int initializeAppVariables()
dflet 0:bbe98578d4c0 463 {
dflet 0:bbe98578d4c0 464 //g_Status = 0;
dflet 0:bbe98578d4c0 465 //g_PingPacketsRecv = 0;
dflet 0:bbe98578d4c0 466 //g_StationIP = 0;
dflet 0:bbe98578d4c0 467
dflet 0:bbe98578d4c0 468 return SUCCESS;
dflet 0:bbe98578d4c0 469 }
dflet 0:bbe98578d4c0 470
dflet 0:bbe98578d4c0 471 /*!
dflet 0:bbe98578d4c0 472 \brief This function displays the application's banner
dflet 0:bbe98578d4c0 473
dflet 0:bbe98578d4c0 474 \param None
dflet 0:bbe98578d4c0 475
dflet 0:bbe98578d4c0 476 \return None
dflet 0:bbe98578d4c0 477 */
dflet 0:bbe98578d4c0 478 static void displayBanner()
dflet 0:bbe98578d4c0 479 {
dflet 0:bbe98578d4c0 480 printf("\n\r\n\r");
dflet 0:bbe98578d4c0 481 printf(" Getting started with WLAN access-point application - Version ");
dflet 0:bbe98578d4c0 482 printf("%s",APPLICATION_VERSION);
dflet 0:bbe98578d4c0 483 printf("\n\r*******************************************************************\n\r");
dflet 0:bbe98578d4c0 484 }
dflet 0:bbe98578d4c0 485