CC3000 test App

Dependencies:   CC3000HostDriver mbed

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?

UserRevisionLine numberNew 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