CC3000 test App
Dependencies: CC3000HostDriver mbed
cc3000.cpp@2:17c37c0b0534, 2013-09-14 (annotated)
- Committer:
- dflet
- Date:
- Sat Sep 14 18:02:36 2013 +0000
- Revision:
- 2:17c37c0b0534
- Parent:
- 0:305844973572
Removed last change as its not required, problems I encountered were due to too many debug printouts.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dflet | 0:305844973572 | 1 | /***************************************************************************** |
dflet | 0:305844973572 | 2 | * |
dflet | 0:305844973572 | 3 | * cc3000.c - CC3000 Functions Implementation |
dflet | 0:305844973572 | 4 | * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ |
dflet | 0:305844973572 | 5 | * |
dflet | 0:305844973572 | 6 | * Redistribution and use in source and binary forms, with or without |
dflet | 0:305844973572 | 7 | * modification, are permitted provided that the following conditions |
dflet | 0:305844973572 | 8 | * are met: |
dflet | 0:305844973572 | 9 | * |
dflet | 0:305844973572 | 10 | * Redistributions of source code must retain the above copyright |
dflet | 0:305844973572 | 11 | * notice, this list of conditions and the following disclaimer. |
dflet | 0:305844973572 | 12 | * |
dflet | 0:305844973572 | 13 | * Redistributions in binary form must reproduce the above copyright |
dflet | 0:305844973572 | 14 | * notice, this list of conditions and the following disclaimer in the |
dflet | 0:305844973572 | 15 | * documentation and/or other materials provided with the |
dflet | 0:305844973572 | 16 | * distribution. |
dflet | 0:305844973572 | 17 | * |
dflet | 0:305844973572 | 18 | * Neither the name of Texas Instruments Incorporated nor the names of |
dflet | 0:305844973572 | 19 | * its contributors may be used to endorse or promote products derived |
dflet | 0:305844973572 | 20 | * from this software without specific prior written permission. |
dflet | 0:305844973572 | 21 | * |
dflet | 0:305844973572 | 22 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
dflet | 0:305844973572 | 23 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
dflet | 0:305844973572 | 24 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
dflet | 0:305844973572 | 25 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
dflet | 0:305844973572 | 26 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
dflet | 0:305844973572 | 27 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
dflet | 0:305844973572 | 28 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
dflet | 0:305844973572 | 29 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
dflet | 0:305844973572 | 30 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
dflet | 0:305844973572 | 31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
dflet | 0:305844973572 | 32 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
dflet | 0:305844973572 | 33 | * |
dflet | 0:305844973572 | 34 | *****************************************************************************/ |
dflet | 0:305844973572 | 35 | |
dflet | 0:305844973572 | 36 | #include "mbed.h" |
dflet | 0:305844973572 | 37 | #include "cc3000.h" |
dflet | 0:305844973572 | 38 | //#include <msp430.h> |
dflet | 0:305844973572 | 39 | #include "wlan.h" |
dflet | 0:305844973572 | 40 | #include "evnt_handler.h" // callback function declaration |
dflet | 0:305844973572 | 41 | #include "nvmem.h" |
dflet | 0:305844973572 | 42 | #include "socket.h" |
dflet | 0:305844973572 | 43 | //#include "common.h" |
dflet | 0:305844973572 | 44 | #include "netapp.h" |
dflet | 0:305844973572 | 45 | //#include "common.h" |
dflet | 0:305844973572 | 46 | |
dflet | 0:305844973572 | 47 | //#include "demo_config.h" |
dflet | 0:305844973572 | 48 | #include "spi.h" |
dflet | 0:305844973572 | 49 | //#include "board.h" |
dflet | 0:305844973572 | 50 | //#include "dispatcher.h" |
dflet | 0:305844973572 | 51 | #include "spi_version.h" |
dflet | 0:305844973572 | 52 | //#include "application_version.h" |
dflet | 0:305844973572 | 53 | //#include "host_driver_version.h" |
dflet | 0:305844973572 | 54 | #include "security.h" |
dflet | 0:305844973572 | 55 | #include "CC3000TestApp.h" |
dflet | 0:305844973572 | 56 | #include "CC3000Core.h" |
dflet | 0:305844973572 | 57 | #include "DigitalClass.h" |
dflet | 0:305844973572 | 58 | |
dflet | 0:305844973572 | 59 | |
dflet | 0:305844973572 | 60 | char CheckSocket = 0; |
dflet | 0:305844973572 | 61 | // Smart Config Prefix - Texas Instruments |
dflet | 0:305844973572 | 62 | char aucCC3000_prefix[3] = {'T', 'T', 'T'}; |
dflet | 0:305844973572 | 63 | |
dflet | 0:305844973572 | 64 | signed char sd[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
dflet | 0:305844973572 | 65 | |
dflet | 0:305844973572 | 66 | const unsigned char smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36}; |
dflet | 0:305844973572 | 67 | |
dflet | 0:305844973572 | 68 | //const unsigned char pucUARTExampleAppString[] = {'\f', '\r','E', 'x', 'a', 'm', 'p', 'l', 'e', ' ', 'A', 'p', 'p', ':', 'd', 'r', 'i', 'v', 'e', 'r', ' ', 'v', 'e', 'r', 's', 'i', 'o', 'n', ' ' }; |
dflet | 0:305844973572 | 69 | unsigned char pucIP_Addr[4]; |
dflet | 0:305844973572 | 70 | unsigned char pucIP_DefaultGWAddr[4]; |
dflet | 0:305844973572 | 71 | unsigned char pucSubnetMask[4]; |
dflet | 0:305844973572 | 72 | unsigned char pucDNS[4]; |
dflet | 0:305844973572 | 73 | char digits[100]; |
dflet | 0:305844973572 | 74 | char cc3000state = CC3000_UNINIT; |
dflet | 0:305844973572 | 75 | |
dflet | 0:305844973572 | 76 | tNetappIpconfigRetArgs ipinfo; |
dflet | 0:305844973572 | 77 | |
dflet | 0:305844973572 | 78 | // Variable to indicate whether the Smart Config Process has finished |
dflet | 0:305844973572 | 79 | volatile unsigned long ulSmartConfigFinished = 0; |
dflet | 0:305844973572 | 80 | |
dflet | 0:305844973572 | 81 | //***************************************************************************** |
dflet | 0:305844973572 | 82 | // |
dflet | 0:305844973572 | 83 | //! ConnectUsingSSID |
dflet | 0:305844973572 | 84 | //! |
dflet | 0:305844973572 | 85 | //! \param ssidName is a string of the AP's SSID |
dflet | 0:305844973572 | 86 | //! |
dflet | 0:305844973572 | 87 | //! \return none |
dflet | 0:305844973572 | 88 | //! |
dflet | 0:305844973572 | 89 | //! \brief Connect to an Access Point using the specified SSID |
dflet | 0:305844973572 | 90 | // |
dflet | 0:305844973572 | 91 | //***************************************************************************** |
dflet | 0:305844973572 | 92 | int ConnectUsingSSID(char * ssidName) |
dflet | 0:305844973572 | 93 | { |
dflet | 0:305844973572 | 94 | |
dflet | 0:305844973572 | 95 | unsetCC3000MachineState(CC3000_ASSOC); |
dflet | 0:305844973572 | 96 | |
dflet | 0:305844973572 | 97 | // Disable Profiles and Fast Connect |
dflet | 0:305844973572 | 98 | wlan_ioctl_set_connection_policy(0, 0, 0); |
dflet | 0:305844973572 | 99 | |
dflet | 0:305844973572 | 100 | wlan_disconnect(); |
dflet | 0:305844973572 | 101 | |
dflet | 0:305844973572 | 102 | //__delay_cycles(10000); |
dflet | 0:305844973572 | 103 | wait_us(500); |
dflet | 0:305844973572 | 104 | |
dflet | 0:305844973572 | 105 | // This triggers the CC3000 to connect to specific AP with certain parameters |
dflet | 0:305844973572 | 106 | //sends a request to connect (does not necessarily connect - callback checks that for me) |
dflet | 0:305844973572 | 107 | #ifndef CC3000_TINY_DRIVER |
dflet | 0:305844973572 | 108 | wlan_connect(0, ssidName, strlen(ssidName), NULL, NULL, 0); |
dflet | 0:305844973572 | 109 | #else |
dflet | 0:305844973572 | 110 | wlan_connect(ssidName, strlen(ssidName)); |
dflet | 0:305844973572 | 111 | #endif |
dflet | 0:305844973572 | 112 | // We don't wait for connection. This is handled somewhere else (in the main |
dflet | 0:305844973572 | 113 | // loop for example). |
dflet | 0:305844973572 | 114 | |
dflet | 0:305844973572 | 115 | return 0; |
dflet | 0:305844973572 | 116 | } |
dflet | 0:305844973572 | 117 | |
dflet | 0:305844973572 | 118 | |
dflet | 0:305844973572 | 119 | //***************************************************************************** |
dflet | 0:305844973572 | 120 | // |
dflet | 0:305844973572 | 121 | //! itoa |
dflet | 0:305844973572 | 122 | //! |
dflet | 0:305844973572 | 123 | //! @param[in] integer number to convert |
dflet | 0:305844973572 | 124 | //! |
dflet | 0:305844973572 | 125 | //! @param[in/out] output string |
dflet | 0:305844973572 | 126 | //! |
dflet | 0:305844973572 | 127 | //! @return number of ASCII parameters |
dflet | 0:305844973572 | 128 | //! |
dflet | 0:305844973572 | 129 | //! @brief Convert integer to ASCII in decimal base |
dflet | 0:305844973572 | 130 | // |
dflet | 0:305844973572 | 131 | //***************************************************************************** |
dflet | 0:305844973572 | 132 | unsigned short itoa(char cNum, char *cString) |
dflet | 0:305844973572 | 133 | { |
dflet | 0:305844973572 | 134 | char* ptr; |
dflet | 0:305844973572 | 135 | char uTemp = cNum; |
dflet | 0:305844973572 | 136 | unsigned short length; |
dflet | 0:305844973572 | 137 | |
dflet | 0:305844973572 | 138 | |
dflet | 0:305844973572 | 139 | // value 0 is a special case |
dflet | 0:305844973572 | 140 | if (cNum == 0) |
dflet | 0:305844973572 | 141 | { |
dflet | 0:305844973572 | 142 | length = 1; |
dflet | 0:305844973572 | 143 | *cString = '0'; |
dflet | 0:305844973572 | 144 | |
dflet | 0:305844973572 | 145 | return length; |
dflet | 0:305844973572 | 146 | } |
dflet | 0:305844973572 | 147 | |
dflet | 0:305844973572 | 148 | // Find out the length of the number, in decimal base |
dflet | 0:305844973572 | 149 | length = 0; |
dflet | 0:305844973572 | 150 | while (uTemp > 0) |
dflet | 0:305844973572 | 151 | { |
dflet | 0:305844973572 | 152 | uTemp /= 10; |
dflet | 0:305844973572 | 153 | length++; |
dflet | 0:305844973572 | 154 | } |
dflet | 0:305844973572 | 155 | |
dflet | 0:305844973572 | 156 | // Do the actual formatting, right to left |
dflet | 0:305844973572 | 157 | uTemp = cNum; |
dflet | 0:305844973572 | 158 | ptr = cString + length; |
dflet | 0:305844973572 | 159 | while (uTemp > 0) |
dflet | 0:305844973572 | 160 | { |
dflet | 0:305844973572 | 161 | --ptr; |
dflet | 0:305844973572 | 162 | *ptr = digits[uTemp % 10]; |
dflet | 0:305844973572 | 163 | uTemp /= 10; |
dflet | 0:305844973572 | 164 | } |
dflet | 0:305844973572 | 165 | |
dflet | 0:305844973572 | 166 | return length; |
dflet | 0:305844973572 | 167 | } |
dflet | 0:305844973572 | 168 | |
dflet | 0:305844973572 | 169 | |
dflet | 0:305844973572 | 170 | //***************************************************************************** |
dflet | 0:305844973572 | 171 | // |
dflet | 0:305844973572 | 172 | //! sendDriverPatch |
dflet | 0:305844973572 | 173 | //! |
dflet | 0:305844973572 | 174 | //! \param pointer to the length |
dflet | 0:305844973572 | 175 | //! |
dflet | 0:305844973572 | 176 | //! \return none |
dflet | 0:305844973572 | 177 | //! |
dflet | 0:305844973572 | 178 | //! \brief The function returns a pointer to the driver patch: since there is no patch yet - |
dflet | 0:305844973572 | 179 | //! it returns 0 |
dflet | 0:305844973572 | 180 | // |
dflet | 0:305844973572 | 181 | //***************************************************************************** |
dflet | 0:305844973572 | 182 | char *sendDriverPatch(unsigned long *Length) |
dflet | 0:305844973572 | 183 | { |
dflet | 0:305844973572 | 184 | *Length = 0; |
dflet | 0:305844973572 | 185 | return NULL; |
dflet | 0:305844973572 | 186 | } |
dflet | 0:305844973572 | 187 | |
dflet | 0:305844973572 | 188 | |
dflet | 0:305844973572 | 189 | //***************************************************************************** |
dflet | 0:305844973572 | 190 | // |
dflet | 0:305844973572 | 191 | //! sendBootLoaderPatch |
dflet | 0:305844973572 | 192 | //! |
dflet | 0:305844973572 | 193 | //! \param pointer to the length |
dflet | 0:305844973572 | 194 | //! |
dflet | 0:305844973572 | 195 | //! \return none |
dflet | 0:305844973572 | 196 | //! |
dflet | 0:305844973572 | 197 | //! \brief The function returns a pointer to the boot loader patch: since there is no patch yet - |
dflet | 0:305844973572 | 198 | //! it returns 0 |
dflet | 0:305844973572 | 199 | // |
dflet | 0:305844973572 | 200 | //***************************************************************************** |
dflet | 0:305844973572 | 201 | char *sendBootLoaderPatch(unsigned long *Length) |
dflet | 0:305844973572 | 202 | { |
dflet | 0:305844973572 | 203 | *Length = 0; |
dflet | 0:305844973572 | 204 | return NULL; |
dflet | 0:305844973572 | 205 | } |
dflet | 0:305844973572 | 206 | |
dflet | 0:305844973572 | 207 | //***************************************************************************** |
dflet | 0:305844973572 | 208 | // |
dflet | 0:305844973572 | 209 | //! sendWLFWPatch |
dflet | 0:305844973572 | 210 | //! |
dflet | 0:305844973572 | 211 | //! \param pointer to the length |
dflet | 0:305844973572 | 212 | //! |
dflet | 0:305844973572 | 213 | //! \return none |
dflet | 0:305844973572 | 214 | //! |
dflet | 0:305844973572 | 215 | //! \brief The function returns a pointer to the FW patch: since there is no patch yet - it returns 0 |
dflet | 0:305844973572 | 216 | // |
dflet | 0:305844973572 | 217 | //***************************************************************************** |
dflet | 0:305844973572 | 218 | |
dflet | 0:305844973572 | 219 | char *sendWLFWPatch(unsigned long *Length) |
dflet | 0:305844973572 | 220 | { |
dflet | 0:305844973572 | 221 | *Length = 0; |
dflet | 0:305844973572 | 222 | return NULL; |
dflet | 0:305844973572 | 223 | } |
dflet | 0:305844973572 | 224 | |
dflet | 0:305844973572 | 225 | |
dflet | 0:305844973572 | 226 | //***************************************************************************** |
dflet | 0:305844973572 | 227 | // |
dflet | 0:305844973572 | 228 | //! CC3000_UsynchCallback |
dflet | 0:305844973572 | 229 | //! |
dflet | 0:305844973572 | 230 | //! \param Event type |
dflet | 0:305844973572 | 231 | //! |
dflet | 0:305844973572 | 232 | //! \return none |
dflet | 0:305844973572 | 233 | //! |
dflet | 0:305844973572 | 234 | //! \brief The function handles asynchronous events that come from CC3000 device |
dflet | 0:305844973572 | 235 | //! and operates a LED4 to have an on-board indication |
dflet | 0:305844973572 | 236 | // |
dflet | 0:305844973572 | 237 | //***************************************************************************** |
dflet | 0:305844973572 | 238 | |
dflet | 0:305844973572 | 239 | void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length) |
dflet | 0:305844973572 | 240 | { |
dflet | 0:305844973572 | 241 | if (lEventType == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE) |
dflet | 0:305844973572 | 242 | { |
dflet | 0:305844973572 | 243 | ulSmartConfigFinished = 1; |
dflet | 0:305844973572 | 244 | } |
dflet | 0:305844973572 | 245 | |
dflet | 0:305844973572 | 246 | if (lEventType == HCI_EVNT_WLAN_UNSOL_INIT) |
dflet | 0:305844973572 | 247 | { |
dflet | 0:305844973572 | 248 | setCC3000MachineState(CC3000_INIT); |
dflet | 0:305844973572 | 249 | } |
dflet | 0:305844973572 | 250 | if (lEventType == HCI_EVNT_WLAN_UNSOL_CONNECT) |
dflet | 0:305844973572 | 251 | { |
dflet | 0:305844973572 | 252 | ulCC3000Connected = 1; |
dflet | 0:305844973572 | 253 | setCC3000MachineState(CC3000_ASSOC); |
dflet | 0:305844973572 | 254 | |
dflet | 0:305844973572 | 255 | } |
dflet | 0:305844973572 | 256 | |
dflet | 0:305844973572 | 257 | if (lEventType == HCI_EVNT_WLAN_UNSOL_DISCONNECT) |
dflet | 0:305844973572 | 258 | { |
dflet | 0:305844973572 | 259 | ulCC3000Connected = 0; |
dflet | 0:305844973572 | 260 | //restartMSP430(); |
dflet | 0:305844973572 | 261 | unsetCC3000MachineState(CC3000_ASSOC); |
dflet | 0:305844973572 | 262 | |
dflet | 0:305844973572 | 263 | } |
dflet | 0:305844973572 | 264 | if (lEventType == HCI_EVNT_WLAN_UNSOL_DHCP) |
dflet | 0:305844973572 | 265 | { |
dflet | 0:305844973572 | 266 | setCC3000MachineState(CC3000_IP_ALLOC); |
dflet | 0:305844973572 | 267 | } |
dflet | 0:305844973572 | 268 | |
dflet | 0:305844973572 | 269 | // This Event is gengerated when the TCP connection is Half closed |
dflet | 0:305844973572 | 270 | if (lEventType == HCI_EVNT_BSD_TCP_CLOSE_WAIT) |
dflet | 0:305844973572 | 271 | { |
dflet | 0:305844973572 | 272 | sd[data[0]] = 1; |
dflet | 0:305844973572 | 273 | CheckSocket = 1; |
dflet | 0:305844973572 | 274 | } |
dflet | 0:305844973572 | 275 | } |
dflet | 0:305844973572 | 276 | |
dflet | 0:305844973572 | 277 | //***************************************************************************** |
dflet | 0:305844973572 | 278 | // |
dflet | 0:305844973572 | 279 | //! initDriver |
dflet | 0:305844973572 | 280 | //! |
dflet | 0:305844973572 | 281 | //! \param None |
dflet | 0:305844973572 | 282 | //! |
dflet | 0:305844973572 | 283 | //! \return none |
dflet | 0:305844973572 | 284 | //! |
dflet | 0:305844973572 | 285 | //! \brief The function initializes a CC3000 device and triggers it to start operation |
dflet | 0:305844973572 | 286 | // |
dflet | 0:305844973572 | 287 | //***************************************************************************** |
dflet | 0:305844973572 | 288 | int |
dflet | 0:305844973572 | 289 | initDriver(void) |
dflet | 0:305844973572 | 290 | { |
dflet | 0:305844973572 | 291 | // Init GPIO's |
dflet | 0:305844973572 | 292 | //pio_init(); |
dflet | 0:305844973572 | 293 | DigitalClass pio(p9, p10); |
dflet | 0:305844973572 | 294 | // Init SPI |
dflet | 0:305844973572 | 295 | init_spi(); |
dflet | 0:305844973572 | 296 | |
dflet | 0:305844973572 | 297 | //DispatcherUARTConfigure(); |
dflet | 0:305844973572 | 298 | |
dflet | 0:305844973572 | 299 | // Globally enable interrupts |
dflet | 0:305844973572 | 300 | //__enable_interrupt(); |
dflet | 0:305844973572 | 301 | // __enable_irq(); |
dflet | 0:305844973572 | 302 | // |
dflet | 0:305844973572 | 303 | // WLAN On API Implementation |
dflet | 0:305844973572 | 304 | // |
dflet | 0:305844973572 | 305 | wlan_init( CC3000_AsynchCallback, sendWLFWPatch, sendDriverPatch, sendBootLoaderPatch, ReadWlanInterruptPin, WlanInterruptEnable, WlanInterruptDisable, WriteWlanPin); |
dflet | 0:305844973572 | 306 | |
dflet | 0:305844973572 | 307 | // |
dflet | 0:305844973572 | 308 | // Trigger a WLAN device |
dflet | 0:305844973572 | 309 | // |
dflet | 0:305844973572 | 310 | wlan_start(0); |
dflet | 0:305844973572 | 311 | |
dflet | 0:305844973572 | 312 | // |
dflet | 0:305844973572 | 313 | // Mask out all non-required events from CC3000 |
dflet | 0:305844973572 | 314 | // |
dflet | 0:305844973572 | 315 | |
dflet | 0:305844973572 | 316 | wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_ASYNC_PING_REPORT|HCI_EVNT_WLAN_UNSOL_INIT); |
dflet | 0:305844973572 | 317 | |
dflet | 0:305844973572 | 318 | // Generate event to CLI: send a version string |
dflet | 0:305844973572 | 319 | char cc3000IP[50]; |
dflet | 0:305844973572 | 320 | char *ccPtr; |
dflet | 0:305844973572 | 321 | unsigned short ccLen; |
dflet | 0:305844973572 | 322 | |
dflet | 0:305844973572 | 323 | //DispatcherUartSendPacket((const char*)pucUARTExampleAppString, sizeof(pucUARTExampleAppString)); |
dflet | 0:305844973572 | 324 | |
dflet | 0:305844973572 | 325 | ccPtr = &cc3000IP[0]; |
dflet | 0:305844973572 | 326 | ccLen = itoa(PALTFORM_VERSION, ccPtr); |
dflet | 0:305844973572 | 327 | ccPtr += ccLen; |
dflet | 0:305844973572 | 328 | *ccPtr++ = '.'; |
dflet | 0:305844973572 | 329 | //ccLen = itoa(APPLICATION_VERSION, ccPtr); |
dflet | 0:305844973572 | 330 | ccPtr += ccLen; |
dflet | 0:305844973572 | 331 | *ccPtr++ = '.'; |
dflet | 0:305844973572 | 332 | ccLen = itoa(SPI_VERSION_NUMBER, ccPtr); |
dflet | 0:305844973572 | 333 | ccPtr += ccLen; |
dflet | 0:305844973572 | 334 | *ccPtr++ = '.'; |
dflet | 0:305844973572 | 335 | //ccLen = itoa(DRIVER_VERSION_NUMBER, ccPtr); |
dflet | 0:305844973572 | 336 | ccPtr += ccLen; |
dflet | 0:305844973572 | 337 | *ccPtr++ = '\r'; |
dflet | 0:305844973572 | 338 | *ccPtr++ = '\n'; |
dflet | 0:305844973572 | 339 | *ccPtr++ = '\0'; |
dflet | 0:305844973572 | 340 | ccLen = strlen(cc3000IP); |
dflet | 0:305844973572 | 341 | |
dflet | 0:305844973572 | 342 | //DispatcherUartSendPacket((const char*)cc3000IP, strlen(cc3000IP)); |
dflet | 0:305844973572 | 343 | |
dflet | 0:305844973572 | 344 | // CC3000 has been initialized |
dflet | 0:305844973572 | 345 | setCC3000MachineState(CC3000_INIT); |
dflet | 0:305844973572 | 346 | |
dflet | 0:305844973572 | 347 | unsigned long aucDHCP, aucARP, aucKeepalive, aucInactivity; |
dflet | 0:305844973572 | 348 | |
dflet | 0:305844973572 | 349 | aucDHCP = 14400; |
dflet | 0:305844973572 | 350 | aucARP = 3600; |
dflet | 0:305844973572 | 351 | aucKeepalive = 10; |
dflet | 0:305844973572 | 352 | aucInactivity = 50; |
dflet | 0:305844973572 | 353 | |
dflet | 0:305844973572 | 354 | if(netapp_timeout_values(&(aucDHCP), &(aucARP), &(aucKeepalive), &(aucInactivity)) != 0) |
dflet | 0:305844973572 | 355 | { |
dflet | 0:305844973572 | 356 | while(1); |
dflet | 0:305844973572 | 357 | } |
dflet | 0:305844973572 | 358 | |
dflet | 0:305844973572 | 359 | return(0); |
dflet | 0:305844973572 | 360 | } |
dflet | 0:305844973572 | 361 | |
dflet | 0:305844973572 | 362 | |
dflet | 0:305844973572 | 363 | //***************************************************************************** |
dflet | 0:305844973572 | 364 | // |
dflet | 0:305844973572 | 365 | //! \brief Return the highest state which we're in |
dflet | 0:305844973572 | 366 | //! |
dflet | 0:305844973572 | 367 | //! \param None |
dflet | 0:305844973572 | 368 | //! |
dflet | 0:305844973572 | 369 | //! \return none |
dflet | 0:305844973572 | 370 | //! |
dflet | 0:305844973572 | 371 | // |
dflet | 0:305844973572 | 372 | //***************************************************************************** |
dflet | 0:305844973572 | 373 | char highestCC3000State() |
dflet | 0:305844973572 | 374 | { |
dflet | 0:305844973572 | 375 | // We start at the highest state and go down, checking if the state |
dflet | 0:305844973572 | 376 | // is set. |
dflet | 0:305844973572 | 377 | char mask = 0x80; |
dflet | 0:305844973572 | 378 | while(!(cc3000state & mask)) |
dflet | 0:305844973572 | 379 | { |
dflet | 0:305844973572 | 380 | mask = mask >> 1; |
dflet | 0:305844973572 | 381 | } |
dflet | 0:305844973572 | 382 | |
dflet | 0:305844973572 | 383 | return mask; |
dflet | 0:305844973572 | 384 | } |
dflet | 0:305844973572 | 385 | |
dflet | 0:305844973572 | 386 | //***************************************************************************** |
dflet | 0:305844973572 | 387 | // |
dflet | 0:305844973572 | 388 | //! \brief Return the current state bits |
dflet | 0:305844973572 | 389 | //! |
dflet | 0:305844973572 | 390 | //! \param None |
dflet | 0:305844973572 | 391 | //! |
dflet | 0:305844973572 | 392 | //! \return none |
dflet | 0:305844973572 | 393 | //! |
dflet | 0:305844973572 | 394 | // |
dflet | 0:305844973572 | 395 | //***************************************************************************** |
dflet | 0:305844973572 | 396 | char currentCC3000State() |
dflet | 0:305844973572 | 397 | { |
dflet | 0:305844973572 | 398 | return cc3000state; |
dflet | 0:305844973572 | 399 | } |
dflet | 0:305844973572 | 400 | |
dflet | 0:305844973572 | 401 | void setCC3000MachineState(char stat) |
dflet | 0:305844973572 | 402 | { |
dflet | 0:305844973572 | 403 | char bitmask = stat; |
dflet | 0:305844973572 | 404 | cc3000state |= bitmask; |
dflet | 0:305844973572 | 405 | |
dflet | 0:305844973572 | 406 | int i = FIRST_STATE_LED_NUM; |
dflet | 0:305844973572 | 407 | |
dflet | 0:305844973572 | 408 | // Find LED number which needs to be set |
dflet | 0:305844973572 | 409 | while(bitmask < 0x80) |
dflet | 0:305844973572 | 410 | { |
dflet | 0:305844973572 | 411 | bitmask = bitmask << 1; |
dflet | 0:305844973572 | 412 | i++; |
dflet | 0:305844973572 | 413 | } |
dflet | 0:305844973572 | 414 | turnLedOn(NUM_STATES-i+2); |
dflet | 0:305844973572 | 415 | |
dflet | 0:305844973572 | 416 | } |
dflet | 0:305844973572 | 417 | |
dflet | 0:305844973572 | 418 | |
dflet | 0:305844973572 | 419 | //***************************************************************************** |
dflet | 0:305844973572 | 420 | // |
dflet | 0:305844973572 | 421 | //! \brief Unsets a state from the state machine |
dflet | 0:305844973572 | 422 | //! Also handles LEDs |
dflet | 0:305844973572 | 423 | //! |
dflet | 0:305844973572 | 424 | //! \param None |
dflet | 0:305844973572 | 425 | //! |
dflet | 0:305844973572 | 426 | //! \return none |
dflet | 0:305844973572 | 427 | //! |
dflet | 0:305844973572 | 428 | // |
dflet | 0:305844973572 | 429 | //***************************************************************************** |
dflet | 0:305844973572 | 430 | void unsetCC3000MachineState(char stat) |
dflet | 0:305844973572 | 431 | { |
dflet | 0:305844973572 | 432 | char bitmask = stat; |
dflet | 0:305844973572 | 433 | cc3000state &= ~bitmask; |
dflet | 0:305844973572 | 434 | |
dflet | 0:305844973572 | 435 | int i = FIRST_STATE_LED_NUM; |
dflet | 0:305844973572 | 436 | int k = NUM_STATES; // Set to last element in state list |
dflet | 0:305844973572 | 437 | |
dflet | 0:305844973572 | 438 | // Set all upper bits to 0 as well since state machine cannot have |
dflet | 0:305844973572 | 439 | // those states. |
dflet | 0:305844973572 | 440 | while(bitmask < 0x80) |
dflet | 0:305844973572 | 441 | { |
dflet | 0:305844973572 | 442 | cc3000state &= ~bitmask; |
dflet | 0:305844973572 | 443 | bitmask = bitmask << 1; |
dflet | 0:305844973572 | 444 | i++; |
dflet | 0:305844973572 | 445 | } |
dflet | 0:305844973572 | 446 | |
dflet | 0:305844973572 | 447 | // Turn off all upper state LEDs |
dflet | 0:305844973572 | 448 | for(; i > FIRST_STATE_LED_NUM; i--) |
dflet | 0:305844973572 | 449 | { |
dflet | 0:305844973572 | 450 | turnLedOff(k); |
dflet | 0:305844973572 | 451 | k--; |
dflet | 0:305844973572 | 452 | } |
dflet | 0:305844973572 | 453 | } |
dflet | 0:305844973572 | 454 | |
dflet | 0:305844973572 | 455 | //***************************************************************************** |
dflet | 0:305844973572 | 456 | // |
dflet | 0:305844973572 | 457 | //! \brief Resets the State Machine |
dflet | 0:305844973572 | 458 | //! |
dflet | 0:305844973572 | 459 | //! \param None |
dflet | 0:305844973572 | 460 | //! |
dflet | 0:305844973572 | 461 | //! \return none |
dflet | 0:305844973572 | 462 | //! |
dflet | 0:305844973572 | 463 | // |
dflet | 0:305844973572 | 464 | //***************************************************************************** |
dflet | 0:305844973572 | 465 | void resetCC3000StateMachine() |
dflet | 0:305844973572 | 466 | { |
dflet | 0:305844973572 | 467 | cc3000state = CC3000_UNINIT; |
dflet | 0:305844973572 | 468 | |
dflet | 0:305844973572 | 469 | // Turn off all Board LEDs |
dflet | 0:305844973572 | 470 | |
dflet | 0:305844973572 | 471 | turnLedOff(CC3000_ON_IND); |
dflet | 0:305844973572 | 472 | turnLedOff(CC3000_ASSOCIATED_IND); |
dflet | 0:305844973572 | 473 | turnLedOff(CC3000_IP_ALLOC_IND); |
dflet | 0:305844973572 | 474 | turnLedOff(CC3000_SERVER_INIT_IND); |
dflet | 0:305844973572 | 475 | turnLedOff(CC3000_CLIENT_CONNECTED_IND); |
dflet | 0:305844973572 | 476 | turnLedOff(CC3000_SENDING_DATA_IND); |
dflet | 0:305844973572 | 477 | turnLedOff(CC3000_UNUSED1_IND); |
dflet | 0:305844973572 | 478 | turnLedOff(CC3000_FTC_IND); |
dflet | 0:305844973572 | 479 | } |
dflet | 0:305844973572 | 480 | |
dflet | 0:305844973572 | 481 | //***************************************************************************** |
dflet | 0:305844973572 | 482 | // |
dflet | 0:305844973572 | 483 | //! \brief Obtains the CC3000 Connection Information from the CC3000 |
dflet | 0:305844973572 | 484 | //! |
dflet | 0:305844973572 | 485 | //! \param None |
dflet | 0:305844973572 | 486 | //! |
dflet | 0:305844973572 | 487 | //! \return none |
dflet | 0:305844973572 | 488 | //! |
dflet | 0:305844973572 | 489 | // |
dflet | 0:305844973572 | 490 | //***************************************************************************** |
dflet | 0:305844973572 | 491 | #ifndef CC3000_TINY_DRIVER |
dflet | 0:305844973572 | 492 | tNetappIpconfigRetArgs * getCC3000Info() |
dflet | 0:305844973572 | 493 | { |
dflet | 0:305844973572 | 494 | netapp_ipconfig(&ipinfo); |
dflet | 0:305844973572 | 495 | return (&ipinfo); |
dflet | 0:305844973572 | 496 | } |
dflet | 0:305844973572 | 497 | #endif |
dflet | 0:305844973572 | 498 | |
dflet | 0:305844973572 | 499 | //***************************************************************************** |
dflet | 0:305844973572 | 500 | // |
dflet | 0:305844973572 | 501 | //! StartSmartConfig |
dflet | 0:305844973572 | 502 | //! |
dflet | 0:305844973572 | 503 | //! \param None |
dflet | 0:305844973572 | 504 | //! |
dflet | 0:305844973572 | 505 | //! \return none |
dflet | 0:305844973572 | 506 | //! |
dflet | 0:305844973572 | 507 | //! \brief The function triggers a smart configuration process on CC3000. |
dflet | 0:305844973572 | 508 | //! it exists upon completion of the process |
dflet | 0:305844973572 | 509 | // |
dflet | 0:305844973572 | 510 | //***************************************************************************** |
dflet | 0:305844973572 | 511 | |
dflet | 0:305844973572 | 512 | void StartSmartConfig(void) |
dflet | 0:305844973572 | 513 | { |
dflet | 0:305844973572 | 514 | |
dflet | 0:305844973572 | 515 | // Reset all the previous configuration |
dflet | 0:305844973572 | 516 | // |
dflet | 0:305844973572 | 517 | wlan_ioctl_set_connection_policy(0, 0, 0); |
dflet | 0:305844973572 | 518 | wlan_ioctl_del_profile(255); |
dflet | 0:305844973572 | 519 | |
dflet | 0:305844973572 | 520 | //Wait until CC3000 is dissconected |
dflet | 0:305844973572 | 521 | while (ulCC3000Connected == 1) |
dflet | 0:305844973572 | 522 | { |
dflet | 0:305844973572 | 523 | //__delay_cycles(100); |
dflet | 0:305844973572 | 524 | wait_us(5); |
dflet | 0:305844973572 | 525 | } |
dflet | 0:305844973572 | 526 | |
dflet | 0:305844973572 | 527 | // Start blinking LED6 during Smart Configuration process |
dflet | 0:305844973572 | 528 | turnLedOn(6); |
dflet | 0:305844973572 | 529 | wlan_smart_config_set_prefix(aucCC3000_prefix); |
dflet | 0:305844973572 | 530 | //wlan_first_time_config_set_prefix(aucCC3000_prefix); |
dflet | 0:305844973572 | 531 | turnLedOff(6); |
dflet | 0:305844973572 | 532 | |
dflet | 0:305844973572 | 533 | // Start the SmartConfig start process |
dflet | 0:305844973572 | 534 | wlan_smart_config_start(1); |
dflet | 0:305844973572 | 535 | turnLedOn(6); |
dflet | 0:305844973572 | 536 | |
dflet | 0:305844973572 | 537 | // |
dflet | 0:305844973572 | 538 | // Wait for Smart config finished |
dflet | 0:305844973572 | 539 | // |
dflet | 0:305844973572 | 540 | while (ulSmartConfigFinished == 0) |
dflet | 0:305844973572 | 541 | { |
dflet | 0:305844973572 | 542 | //__delay_cycles(6000000); |
dflet | 0:305844973572 | 543 | wait_ms(250); |
dflet | 0:305844973572 | 544 | turnLedOn(6); |
dflet | 0:305844973572 | 545 | |
dflet | 0:305844973572 | 546 | //__delay_cycles(6000000); |
dflet | 0:305844973572 | 547 | wait_ms(250); |
dflet | 0:305844973572 | 548 | turnLedOff(6); |
dflet | 0:305844973572 | 549 | } |
dflet | 0:305844973572 | 550 | |
dflet | 0:305844973572 | 551 | turnLedOff(6); |
dflet | 0:305844973572 | 552 | |
dflet | 0:305844973572 | 553 | // create new entry for AES encryption key |
dflet | 0:305844973572 | 554 | nvmem_create_entry(NVMEM_AES128_KEY_FILEID,16); |
dflet | 0:305844973572 | 555 | |
dflet | 0:305844973572 | 556 | // write AES key to NVMEM |
dflet | 0:305844973572 | 557 | aes_write_key((unsigned char *)(&smartconfigkey[0])); |
dflet | 0:305844973572 | 558 | |
dflet | 0:305844973572 | 559 | // Decrypt configuration information and add profile |
dflet | 0:305844973572 | 560 | wlan_smart_config_process(); |
dflet | 0:305844973572 | 561 | |
dflet | 0:305844973572 | 562 | // |
dflet | 0:305844973572 | 563 | // Configure to connect automatically to the AP retrieved in the |
dflet | 0:305844973572 | 564 | // Smart config process |
dflet | 0:305844973572 | 565 | // |
dflet | 0:305844973572 | 566 | wlan_ioctl_set_connection_policy(0, 0, 1); |
dflet | 0:305844973572 | 567 | |
dflet | 0:305844973572 | 568 | // |
dflet | 0:305844973572 | 569 | // reset the CC3000 |
dflet | 0:305844973572 | 570 | // |
dflet | 0:305844973572 | 571 | wlan_stop(); |
dflet | 0:305844973572 | 572 | //__delay_cycles(600000); |
dflet | 0:305844973572 | 573 | wait_ms(25); |
dflet | 0:305844973572 | 574 | wlan_start(0); |
dflet | 0:305844973572 | 575 | |
dflet | 0:305844973572 | 576 | unsigned char ConnectUsingSmartConfig = 1; |
dflet | 0:305844973572 | 577 | ulSmartConfigFinished = 0; |
dflet | 0:305844973572 | 578 | // |
dflet | 0:305844973572 | 579 | // Mask out all non-required events |
dflet | 0:305844973572 | 580 | // |
dflet | 0:305844973572 | 581 | wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_UNSOL_INIT|HCI_EVNT_WLAN_ASYNC_PING_REPORT); |
dflet | 0:305844973572 | 582 | } |
dflet | 0:305844973572 | 583 |