David Fletcher
/
cc3100_test
TI's CC3100 host driver and demo. Experimental and a work in progress.
main.cpp@2:a3e52cf86086, 2014-11-19 (annotated)
- 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?
User | Revision | Line number | New 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 |