CC3000 test App

Dependencies:   CC3000HostDriver mbed

Files at this revision

API Documentation at this revision

Comitter:
dflet
Date:
Fri Aug 02 15:14:41 2013 +0000
Child:
1:ee5703f58be3
Commit message:
Test program for CC3000 including TI CC3000HostDriver Lib

Changed in this revision

CC3000Core.cpp Show annotated file Show diff for this revision Revisions of this file
CC3000Core.h Show annotated file Show diff for this revision Revisions of this file
CC3000HostDriver.lib Show annotated file Show diff for this revision Revisions of this file
CC3000TestApp.cpp Show annotated file Show diff for this revision Revisions of this file
CC3000TestApp.h Show annotated file Show diff for this revision Revisions of this file
DigitalClass.cpp Show annotated file Show diff for this revision Revisions of this file
DigitalClass.h Show annotated file Show diff for this revision Revisions of this file
cc3000.cpp Show annotated file Show diff for this revision Revisions of this file
cc3000.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CC3000Core.cpp	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,174 @@
+
+
+
+#include "mbed.h"
+#include "wlan.h"
+#include "cc3000.h"
+#include "CC3000Core.h"
+#include "hci.h"
+#include "CC3000TestApp.h"
+#include "spi.h"
+#include "DigitalClass.h"
+
+extern volatile unsigned long ulSmartConfigFinished;
+volatile unsigned long //ulSmartConfigFinished,
+    ulCC3000Connected,
+    ulCC3000DHCP,
+    OkToDoShutDown,
+    ulCC3000DHCP_configured;
+
+volatile unsigned char ucStopSmartConfig;
+
+#define NETAPP_IPCONFIG_MAC_OFFSET     (20)
+#define CC3000_APP_BUFFER_SIZE         (5)
+#define CC3000_RX_BUFFER_OVERHEAD_SIZE (20)
+
+DigitalClass Dio(p9, p10);
+InterruptIn irq(p9);
+/*
+unsigned char pucCC3000_Rx_Buffer[CC3000_APP_BUFFER_SIZE + CC3000_RX_BUFFER_OVERHEAD_SIZE];
+*/
+
+/* The original version of the function below had Serial.prints()
+   to display an event, but since an async event can happen at any time,
+   even in the middle of another Serial.print(), sometimes the sketch
+   would lock up because we were trying to print in the middle of
+   a print.
+   
+   So now we just set a flag and write to a string, and the master
+   loop can deal with it when it wants.
+*/   
+int8_t asyncNotificationWaiting=false;
+long lastAsyncEvent;
+int8_t dhcpIPAddress[4];
+
+
+
+
+
+
+
+
+/*-------------------------------------------------------------------
+
+    The TI library calls this routine when asynchronous events happen.
+    
+    For example you tell the CC3000 to turn itself on and connect
+    to an access point then your code can go on to do its own thing.
+    When the CC3000 is done configuring itself (e.g. it gets an IP
+    address from the DHCP server) it will call this routine so you
+    can take appropriate action.    
+
+---------------------------------------------------------------------*/
+
+
+void CC3000_AsynchCallback(long lEventType, char * data, unsigned char length) {
+
+    switch (lEventType) {
+  
+        case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
+            ulSmartConfigFinished = 1;
+            ucStopSmartConfig     = 1;
+            printf("CC3000 Async event: Simple config done\r\n"); 
+            break;
+            
+        case HCI_EVNT_WLAN_UNSOL_CONNECT:
+            ulCC3000Connected = 1;
+            setCC3000MachineState(CC3000_INIT);
+            printf("CC3000 Async event: Unsolicited connect\r\n");
+            setCC3000MachineState(CC3000_ASSOC);
+            break;
+            
+        case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
+            ulCC3000Connected = 0;
+            ulCC3000DHCP      = 0;
+            ulCC3000DHCP_configured = 0;
+            unsetCC3000MachineState(CC3000_ASSOC);
+            printf("CC3000 Async event: Unsolicted disconnect\r\n");
+            break;
+            
+        case HCI_EVNT_WLAN_UNSOL_DHCP:
+            // Notes: 
+            // 1) IP config parameters are received swapped
+            // 2) IP config parameters are valid only if status is OK, i.e. ulCC3000DHCP becomes 1
+            // only if status is OK, the flag is set to 1 and the addresses are valid
+            if ( *(data + NETAPP_IPCONFIG_MAC_OFFSET) == 0) {
+                ulCC3000DHCP = 1;
+                setCC3000MachineState(CC3000_IP_ALLOC);   
+                printf("CC3000 Async event: Got IP address via DHCP: ");
+                printf("%i",data[3]); printf(".");
+                printf("%i",data[2]); printf(".");
+                printf("%i",data[1]); printf(".");
+               printf("%i",data[0]);
+                printf("\r\n");
+                }
+            else {
+                ulCC3000DHCP = 0;
+                printf("CC3000 Async event: Unsolicited DHCP, no IP address\r\n");
+                }
+            break;
+            
+        case HCI_EVENT_CC3000_CAN_SHUT_DOWN:
+            OkToDoShutDown = 1;
+            printf("CC3000 Async event: OK to shut down\r\n");
+            break;
+        
+        }
+    }
+
+
+
+long ReadWlanInterruptPin(void) {
+    int8_t val;
+    //printf("WLAN_IRQ %i \r\n",Dio.WLAN_IRQ.read());
+    val = Dio.WLAN_IRQ.read();
+    return (long)val;
+    }
+    
+    
+void WriteWlanPin( unsigned char val ) {
+
+    if (val) {
+        Dio.WLAN_EN = 1;
+        //printf("WLAN_EN %i \r\n",val);
+        }
+    else {
+        Dio.WLAN_EN = 0;
+        //printf("WLAN_EN %i \r\n",val);
+        }
+    }
+    
+void WlanInterruptEnable(void) {
+    irq.fall(&IntSpi);
+    //__enable_irq(); //Enable Interrupts
+    //SPIInterruptsEnabled = 1;
+    }
+
+
+void WlanInterruptDisable(void) {
+
+    irq.fall(NULL);
+
+    //__disable_irq(); //Disable Interrupts
+    //SPIInterruptsEnabled = 0;
+    }
+
+ char *SendFirmwarePatch(unsigned long *Length) {
+    *Length = 0;
+    return NULL;
+    }
+
+
+
+char *SendDriverPatch(unsigned long *Length) {
+    *Length = 0;
+    return NULL;
+    }
+
+
+char *SendBootloaderPatch(unsigned long *Length) {
+    *Length = 0;
+    return NULL;
+    }
+
+   
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CC3000Core.h	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,55 @@
+
+#ifndef CC3000CORE_H
+#define CC3000CORE_H
+
+#include "mbed.h"
+
+//*****************************************************************************
+//
+// If building with a C++ compiler, make all of the definitions in this header
+// have a C binding.
+//
+//*****************************************************************************
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+
+#define DISABLE (0)
+
+#define ENABLE  (1)
+
+
+extern int8_t asyncNotificationWaiting;
+extern long lastAsyncEvent;
+extern int8_t dhcpIPAddress[];
+
+
+extern void CC3000_Init(void);
+
+extern void CC3000_AsynchCallback(long lEventType, char * data, unsigned char length);
+
+extern volatile unsigned char ucStopSmartConfig;
+
+extern long ReadWlanInterruptPin(void);
+    
+    
+extern void WriteWlanPin( unsigned char val );
+    
+extern void WlanInterruptEnable(void);
+
+
+extern void WlanInterruptDisable(void);
+
+
+
+//*****************************************************************************
+//
+// Mark the end of the C bindings section for C++ compilers.
+//
+//*****************************************************************************
+#ifdef  __cplusplus
+}
+#endif // __cplusplus
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CC3000HostDriver.lib	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/dflet/code/CC3000HostDriver/#9cb694f00b7b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CC3000TestApp.cpp	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,793 @@
+/**************************************************************************
+*
+*  CC3000TestApp.cpp - Basic connection test between the TI CC3000
+*                          and an Mbed.
+*
+*  Mbed Version 1.0
+* 
+*  Copyright (C) 2013 
+*
+*  Note: Some or all of this software has been modified in some way to meet the 
+*  requirements of the mbed libs and/or compiler. If you need a fresh copy of the TI
+*  software please check TI's website.
+*  If you need help please take the time to read Chris's notes below. 
+* ( Yes I know they are for an Arduino, but some still do apply.) 
+*  Most important!
+*  The mbed will not supply the current that the CC3000 requires, if you try it will 
+*  show up as the mbed resetting as soon as spi runs.
+*
+*  To associate with your WIFI router you will first need to insert your ssid and key into
+*  functions, ManualConnect() and ManualAddProfile()
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  Don't sue me if this code blows up your board and burns down your house and incinerates 
+*  all life and property in this and any other universe!
+****************************************************************************\
+
+To connect an mbed to the CC3000 you'll need to make these 6 connections
+(in addition to the WiFi antenna, power etc).
+
+Name /          pin on CC3000EM board / purpose
+
+cs             /  J4-8    SPI Chip Select
+                          The Mbed will set this pin LOW when it wants to 
+                          exchange data with the CC3000. This is
+                          mbed pin 8, but any pin can be used. In this
+                          program it will be called cs.
+                          This is the mbed's pin 8.
+
+MISO           /  J4-9    Data from the module to the mbed
+                          This is mbed's MISO pin, and is how the CC3000
+                          will get bytes to the mbed.
+                          This is the mbed's pin 6. 
+
+WLAN_IRQ       /  J4-10   CC3000 host notify
+                          The CC3000 will drive this pin LOW to let the mbed
+                          know it's ready to send data. In
+                          this program it will be called WLAN_IRQ
+                          This is the mbed's pin 9.
+                          
+MOSI           /  J4-11   Data from the Arduino to the CC3000
+                          This is the Arduino's MOSI pin, and is how the Arduino
+                          will get bytes to the CC3000. 
+                          This is the mbed's pin 5.
+                          
+SCK            /  J4-12   SPI clock
+                          This is the mbed's SCK pin 7. 
+
+WLAN_EN        /  J5-5    Module enable
+                          The Arduino will set this pin HIGH to turn the CC3000
+                          on. Any pin can be used. In this program it will be
+                          called WLAN_EN
+                          This is the mbed's pin 10.
+***************************************************************************/    
+
+/**************************************************************************
+*
+*  ArduinoCC3000Test.ino - Basic connection test between the TI CC3000
+*                          and an Arduino.
+*
+*  Version 1.0
+* 
+*  Copyright (C) 2013 Chris Magagna - cmagagna@yahoo.com
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  Don't sue me if my code blows up your board and burns down your house
+*
+****************************************************************************
+
+
+
+To connect an Arduino to the CC3000 you'll need to make these 6 connections
+(in addition to the WiFi antenna, power etc).
+
+Name / pin on CC3000 module / pin on CC3000EM board / purpose
+
+SPI_CS     / 12 / J4-8 /  SPI Chip Select
+                          The Arduino will set this pin LOW when it wants to 
+                          exchange data with the CC3000. By convention this is
+                          Arduino pin 10, but any pin can be used. In this
+                          program it will be called WLAN_CS
+
+SPI_DOUT   / 13 / J4-9 /  Data from the module to the Arduino
+                          This is Arduino's MISO pin, and is how the CC3000
+                          will get bytes to the Arduino. For most Arduinos
+                          MISO is pin 12
+
+SPI_IRQ    / 14 / J4-10 / CC3000 host notify
+                          The CC3000 will drive this pin LOW to let the Arduino
+                          know it's ready to send data. For a regular Arduino
+                          (Uno, Nano, Leonardo) this will have to be connected
+                          to pin 2 or 3 so you can use attachInterrupt(). In
+                          this program it will be called WLAN_IRQ
+
+SPI_DIN    / 15 / J4-11   Data from the Arduino to the CC3000
+                          This is the Arduino's MOSI pin, and is how the Arduino
+                          will get bytes to the CC3000. For most Arduinos
+                          MOSI is pin 11
+
+SPI_CLK    / 17 / J4-12   SPI clock
+                          This is the Arduino's SCK pin. For most Arduinos
+                          SCK is pin 13
+
+VBAT_SW_EN / 26 / J5-5    Module enable
+                          The Arduino will set this pin HIGH to turn the CC3000
+                          on. Any pin can be used. In this program it will be
+                          called WLAN_EN
+                          
+                          
+WARNING #1: The CC3000 runs at 3.6V maximum so you can't run it from your
+regular 5V Arduino power pin. Run it from 3.3V!
+
+
+WARNING #2: When transmitting the CC3000 will use up to 275mA current. Most
+Arduinos' 3.3V pins can only supply up to 50mA current, so you'll need a 
+separate power supply for it (or a voltage regulator like the LD1117V33
+connected to your Arduino's 5V power pin).
+
+
+WARNING #3: The CC3000's IO pins are not 5V tolerant. If you're using a 5V
+Arduino you will need a level shifter to convert these signals to 3.3V
+so you don't blow up the module. 
+
+You'll need to shift the pins for WLAN_CS, MOSI, SCK, and WLAN_EN. The other
+2 pins (WLAN_IRQ and MISO) can be connected directly because they're input
+pins for the Arduino, and the Arduino can read 3.3V signals directly.
+
+You can use a level shifter chip like the 74LVC245 or TXB0104 or you can use
+a pair of resistors to make a voltage divider like this:
+
+Arduino pin -----> 560 Ohm -----> 1K Ohm -----> GND
+                             |
+                             |
+                             +---> CC3000 pin
+
+
+****************************************************************************/
+
+
+
+#include "wlan.h" 
+#include "evnt_handler.h"    // callback function declaration
+#include "nvmem.h"
+#include "socket.h"
+#include "netapp.h"
+#include "host_driver_version.h"
+#include "cc3000.h"
+//#include "common.h"
+//#include "demo_config.h"
+//#include "HttpString.h"
+#include "spi.h"
+#include "CC3000TestApp.h"
+#include "CC3000Core.h"
+//#include <msp430.h>
+#include "mbed.h"
+//#include "Board.h"
+//#include "HttpCore.h"
+//#include "Wheel.h"
+//#include "dispatcher.h"
+#include "DigitalClass.h"
+
+#define FALSE 0
+int8_t isInitialized = false;
+InterruptIn intr(p9);
+
+DigitalOut ind1(LED1);
+DigitalOut ind2(LED2);
+DigitalOut ind3(LED3);
+DigitalOut ind4(LED4);
+
+Serial usb(USBTX, USBRX);
+
+void IntSpi()
+{
+    
+    IntSpiGPIOHandler();// spi.cpp
+    
+}
+
+int main()
+{
+
+intr.fall(&IntSpi);
+usb.baud(115200);
+
+// Start CC3000 State Machine
+    resetCC3000StateMachine();
+    
+    
+char cmd;
+
+
+while (1) {
+    printf("\r\n");
+    printf("+-------------------------------------------+\r\n");
+    printf("|      Mbed CC3000 Demo Program             |\r\n");
+    printf("+-------------------------------------------+\r\n");
+    printf("\r\n");
+    printf("  1 - Initialize the CC3000\r\n");
+    printf("  2 - Show RX & TX buffer sizes, & free RAM\r\n");
+    printf("  3 - Start Smart Config\r\n");
+    printf("  4 - Manually connect to AP\r\n");
+    printf("  5 - Manually add connection profile\r\n");
+    printf("  6 - List access points\r\n");
+    printf("  7 - Show CC3000 information\r\n");
+    printf("\r\n");
+
+    //for (;;) {
+        while (1) {
+            if (asyncNotificationWaiting) {
+                asyncNotificationWaiting = false;
+                AsyncEventPrint();
+                }
+     //       }
+        cmd = usb.getc();
+        if (cmd!='\n' && cmd!='\r') {
+            break;
+            }
+        }
+
+
+    switch(cmd) {
+        case '1':       
+            IntSpi();
+            initDriver();
+            isInitialized = true;
+            break;
+        case '2':
+            //ShowBufferSize();
+
+            break;
+        case '3':
+            StartSmartConfig();
+            break;
+        case '4':
+            ManualConnect();
+            break;
+        case '5':
+            ManualAddProfile();
+            break;
+        case '6':
+            ListAccessPoints();
+            break;
+        case '7':
+            ShowInformation();
+            break;
+        default:
+            printf("**Unknown command ");
+            printf("%d",cmd);
+            printf("**\r\n");
+            break;
+        }
+  
+    };
+    return 0;
+}
+
+
+void AsyncEventPrint()
+{
+    switch(lastAsyncEvent) {
+            printf("CC3000 Async event: Simple config done\r\n");
+            break;
+
+        case HCI_EVNT_WLAN_UNSOL_CONNECT:
+            printf("CC3000 Async event: Unsolicited connect\r\n");
+            break;
+
+        case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
+            printf("CC3000 Async event: Unsolicted disconnect\r\n");
+            break;
+
+        case HCI_EVNT_WLAN_UNSOL_DHCP:
+            printf("CC3000 Async event: Got IP address via DHCP: ");
+            printf("%d",dhcpIPAddress[0]);
+            printf(".");
+            printf("%d",dhcpIPAddress[1]);
+            printf(".");
+            printf("%d",dhcpIPAddress[2]);
+            printf(".");
+            printf("%d\r\n",dhcpIPAddress[3]);
+            break;
+
+        case HCI_EVENT_CC3000_CAN_SHUT_DOWN:
+            printf("CC3000 Async event: OK to shut down\r\n");
+            break;
+
+        case HCI_EVNT_WLAN_KEEPALIVE:
+            // Once initialized, the CC3000 will send these keepalive events
+            // every 20 seconds.
+            //printf(F("CC3000 Async event: Keepalive"));
+            //return;
+            break;
+
+        default:
+            printf("AsyncCallback called with unhandled event! ");
+            printf("%x",lastAsyncEvent);
+            printf("\r\n");
+            break;
+        }
+        
+    printf("\r\n");
+    }
+/*
+    This is an example of how you'd connect the CC3000 to an AP without using
+    Smart Config or a stored profile.
+    
+    All the code above wlan_connect() is just for this demo program; if you're
+    always going to connect to your network this way you wouldn't need it.
+*/
+
+void ManualConnect() {
+
+    char ssidName[] = "***********";
+    char AP_KEY[] = "************";
+    int8_t rval;
+
+    if (!isInitialized) {
+        printf("CC3000 not initialized; can't run manual connect.\r\n");
+        return;
+        }
+
+    printf("Starting manual connect...\r\n");
+    
+    printf(("  Disabling auto-connect policy...\r\n"));
+    rval = wlan_ioctl_set_connection_policy(DISABLE, DISABLE, DISABLE);
+
+    printf("  Deleting all existing profiles...\r\n");
+    rval = wlan_ioctl_del_profile(255);
+
+    printf("  Waiting until disconnected...\r\n");
+    while (ulCC3000Connected == 1) {
+        wait_ms(100);
+        }
+    
+    printf("  Manually connecting...\r\n");
+
+    // Parameter 1 is the security type: WLAN_SEC_UNSEC, WLAN_SEC_WEP,
+    //              WLAN_SEC_WPA or WLAN_SEC_WPA2
+    // Parameter 3 is the MAC adddress of the AP. All the TI examples
+    //              use NULL. I suppose you would want to specify this
+    //              if you were security paranoid.
+    rval = wlan_connect(WLAN_SEC_WPA2,
+                ssidName,
+                strlen(ssidName),
+                NULL,
+                (unsigned char *)AP_KEY,
+                strlen(AP_KEY));
+
+    if (rval==0) {
+        printf("  Manual connect success.\r\n");
+        }
+    else {
+        printf("  Unusual return value: ");
+        printf("%d\r\n",rval);
+        }
+        return;
+    }
+/*
+    This is an example of manually adding a WLAN profile to the CC3000. See
+    wlan_ioctl_set_connection_policy() for more details of how profiles are
+    used but basically there's 7 slots where you can store AP info and if
+    the connection policy is set to auto_start then the CC3000 will go
+    through its profile table and try to auto-connect to something it knows
+    about after it boots up.
+    
+    Note the API documentation for wlan_add_profile is wrong. It says it
+    returns 0 on success and -1 on failure. What it really returns is
+    the stored profile number (0-6, since the CC3000 can store 7) or
+    255 on failure.
+    
+    Unfortunately the API doesn't give you any way to see how many profiles
+    are in use or which profile is stored in which slot, so if you want to
+    manage multiple profiles you'll need to do that yourself.
+*/
+
+void ManualAddProfile() {
+    char ssidName[] = "*****************";
+    char AP_KEY[] = "***********";
+
+    if (!isInitialized) {
+        printf("CC3000 not initialized; can't run manual add profile.\r\n");
+        return;
+        }
+
+    printf("Starting manual add profile...\r\n");
+
+    printf("  Disabling auto connection...\r\n");
+    wlan_ioctl_set_connection_policy(DISABLE, DISABLE, DISABLE);
+
+    printf("  Adding profile...\r\n");
+    int8_t rval = wlan_add_profile  (
+                    WLAN_SEC_WPA2,      // WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
+                    (unsigned char *)ssidName,
+                    strlen(ssidName),
+                    NULL,               // BSSID, TI always uses NULL
+                    0,                  // profile priority
+                    0x18,               // key length for WEP security, undocumented why this needs to be 0x18
+                    0x1e,               // key index, undocumented why this needs to be 0x1e
+                    0x2,                // key management, undocumented why this needs to be 2
+                    (unsigned char *)AP_KEY,    // WPA security key
+                    strlen(AP_KEY)      // WPA security key length
+                    );
+
+    if (rval!=255) {
+
+        // This code is lifted from http://e2e.ti.com/support/low_power_rf/f/851/p/180859/672551.aspx;
+        // the actual API documentation on wlan_add_profile doesn't specify any of this....
+
+        printf("  Manual add profile success, stored in profile: ");
+        printf("%d\r\n",rval);
+
+        printf("  Enabling auto connection...\r\n");
+        wlan_ioctl_set_connection_policy(DISABLE, DISABLE, ENABLE);
+
+        printf("  Stopping CC3000...\r\n");
+        wlan_stop();
+
+        printf("  Stopping for 5 seconds...\r\n");
+        wait_ms(5000);
+
+        printf("  Restarting CC3000...\r\n");
+        wlan_start(0);
+        
+        printf("  Manual add profile done!\r\n");
+
+        }
+    else {
+        printf("  Manual add profile failured (all profiles full?).\r\n");
+        }
+        return; 
+    }
+    
+
+    
+/*
+    All the data in all the fields from netapp_ipconfig() are reversed,
+    e.g. an IP address is read via bytes 3,2,1,0 instead of bytes
+    0,1,2,3 and the MAC address is read via bytes 5,4,3,2,1,0 instead
+    of 0,1,2,3,4,5.
+    
+    N.B. TI is inconsistent here; nvmem_get_mac_address() returns them in
+    the right order etc.
+*/
+
+void ShowInformation() {
+
+    tNetappIpconfigRetArgs inf;
+    char localB[33];
+
+    if (!isInitialized) {
+        printf("CC3000 not initialized; can't get information.\r\n");
+        return;
+        }
+        
+    printf("CC3000 information:");
+    
+    netapp_ipconfig(&inf);
+    
+    printf("  IP address: ");
+    PrintIPBytes(inf.aucIP);
+    
+    printf("  Subnet mask: ");
+    PrintIPBytes(inf.aucSubnetMask);
+    
+    printf("  Gateway: ");
+    PrintIPBytes(inf.aucDefaultGateway);
+    
+    printf("  DHCP server: ");
+    PrintIPBytes(inf.aucDHCPServer);
+    
+    printf("  DNS server: ");
+    PrintIPBytes(inf.aucDNSServer);
+    
+    printf("  MAC address: ");
+    for (int i=(MAC_ADDR_LEN-1); i>=0; i--) {
+        if (i!=(MAC_ADDR_LEN-1)) {
+            printf(":");
+            }
+        printf("%x",inf.uaMacAddr[i]);
+        }
+    printf("\r\n");
+    
+    memset(localB, 0, 32);
+    memcpy(localB, inf.uaSSID, 32);
+
+    printf("  Connected to SSID: ");
+    printf("%s",localB);
+
+    } 
+    
+void PrintIPBytes(unsigned char *ipBytes) {
+
+    printf("%d",ipBytes[3]);
+    printf(".");
+    printf("%d",ipBytes[2]);
+    printf(".");
+    printf("%d",ipBytes[1]);
+    printf(".");
+    printf("%d\r\n",ipBytes[0]);
+    }  
+    
+/*
+    The call wlan_ioctl_get_scan_results returns this structure. I couldn't
+    find it in the TI library so it's defined here. It's 50 bytes with
+    a semi weird arrangement but fortunately it's not as bad as it looks.
+    
+    numNetworksFound - 4 bytes - On the first call to wlan_ioctl_get_scan_results
+                    this will be set to how many APs the CC3000 sees. Although
+                    with 4 bytes the CC3000 could see 4 billion APs in my testing
+                    this number was always 20 or less so there's probably an
+                    internal memory limit.
+    
+    results - 4 bytes - 0=aged results, 1=results valid, 2=no results. Why TI
+                    used 32 bits to store something that could be done in 2,
+                    and how this field is different than isValid below, is
+                    a mystery to me so I just igore this field completely.
+                    
+    isValid & rssi - 1 byte - a packed structure. The top bit (isValid)
+                    indicates whether or not this structure has valid data,
+                    the bottom 7 bits (rssi) are the signal strength of this AP.
+                    
+    securityMode & ssidLength - 1 byte - another packed structure. The top 2
+                    bits (securityMode) show how the AP is configured:
+                        0 - open / no security
+                        1 - WEP
+                        2 - WPA
+                        3 - WPA2
+                    ssidLength is the lower 6 bytes and shows how many characters
+                    (up to 32) of the ssid_name field are valid
+                    
+    frameTime - 2 bytes - how long, in seconds, since the CC3000 saw this AP
+                    beacon
+                    
+    ssid_name - 32 bytes - The ssid name for this AP. Note that this isn't a
+                    regular null-terminated C string so you can't use it
+                    directly with a strcpy() or printf() etc. and you'll
+                    need a 33-byte string to store it (32 valid characters +
+                    null terminator)
+                    
+    bssid - 6 bytes - the MAC address of this AP
+*/
+    
+typedef struct scanResults {
+    unsigned long numNetworksFound;
+    unsigned long results;
+    unsigned isValid:1;
+    unsigned rssi:7;
+    unsigned securityMode:2;
+    unsigned ssidLength:6;
+    unsigned short frameTime;
+    unsigned char ssid_name[32];
+    unsigned char bssid[6];
+    } scanResults;
+
+#define NUM_CHANNELS    16
+
+void ListAccessPoints() {
+    unsigned long aiIntervalList[NUM_CHANNELS];
+    int8_t rval;
+    scanResults sr;
+    int apCounter;
+    char localB[33];
+    
+    if (!isInitialized) {
+        printf(("CC3000 not initialized; can't list access points.\r\n"));
+        return;
+        }
+        
+    printf(("List visible access points\r\n"));
+    
+    printf(("  Setting scan paramters...\r\n"));
+    
+    for (int i=0; i<NUM_CHANNELS; i++) {
+        aiIntervalList[i] = 2000;
+        }
+    
+    rval = wlan_ioctl_set_scan_params(
+            1000,   // enable start application scan
+            100,    // minimum dwell time on each channel
+            100,    // maximum dwell time on each channel
+            5,      // number of probe requests
+            0x7ff,  // channel mask
+            -80,    // RSSI threshold
+            0,      // SNR threshold
+            205,    // probe TX power
+            aiIntervalList  // table of scan intervals per channel
+            );
+    if (rval!=0) {
+        printf("  Got back unusual result from wlan_ioctl_set_scan_params, can't continue: ");
+        printf("%d\r\n",rval);
+        return;
+        }
+        
+    printf("  Sleeping 5 seconds to let the CC3000 discover APs...");
+    wait_ms(5000);
+    
+    printf("  Getting AP count...\r\n");
+    
+    // On the first call to get_scan_results, sr.numNetworksFound will return the
+    // actual # of APs currently seen. Get that # then loop through and print
+    // out what's found.
+    
+    if ((rval=wlan_ioctl_get_scan_results(2000, (unsigned char *)&sr))!=0) {
+        printf("  Got back unusual result from wlan_ioctl_get scan results, can't continue: ");
+        printf("%d\r\n",rval);
+        return;
+        }
+        
+    apCounter = sr.numNetworksFound;
+    printf(("  Number of APs found: "));
+    printf("%d\r\n",apCounter);
+    
+    do {
+        if (sr.isValid) {
+            printf(("    "));
+            switch(sr.securityMode) {
+                case WLAN_SEC_UNSEC:    // 0
+                    printf(("OPEN "));
+                    break;
+                case WLAN_SEC_WEP:      // 1
+                    printf(("WEP  "));
+                    break;
+                case WLAN_SEC_WPA:      // 2
+                    printf(("WPA  "));
+                    break;
+                case WLAN_SEC_WPA2:     // 3
+                    printf(("WPA2 "));
+                    break;
+                    }
+            sprintf(localB, "%3d  ", sr.rssi);
+            printf(localB);
+            memset(localB, 0, 33);
+            memcpy(localB, sr.ssid_name, sr.ssidLength);
+            printf(localB);
+            }
+            
+        if (--apCounter>0) {
+            if ((rval=wlan_ioctl_get_scan_results(2000, (unsigned char *)&sr))!=0) {
+                printf(("  Got back unusual result from wlan_ioctl_get scan results, can't continue: "));
+                printf("%d\r\n",rval);
+                return;
+                }
+            }
+        } while (apCounter>0);
+        
+    printf(("  Access Point list finished."));
+    }  
+    
+
+//*****************************************************************************
+//
+//!  turnLedOn
+//!
+//! @param  ledNum is the LED Number
+//!
+//! @return none
+//!
+//! @brief  Turns a specific LED on
+//
+//*****************************************************************************
+void turnLedOn(char ledNum)
+{
+    switch(ledNum)
+        {
+          case 1:
+              ind1 = 1;
+            break;
+          case 2:
+              ind2 = 1;
+            break;
+          case 3:
+              ind3 = 1;
+            break;
+          case 4:
+              ind4 = 1;
+            break;
+          case 5:
+              ind1 = 1;
+            break;
+          case 6:
+              ind4 = 1;
+            break;
+          case 7:
+              
+            break;
+          case 8:
+              
+            break;
+        }
+
+}
+
+//*****************************************************************************
+//
+//! turnLedOff
+//!
+//! @param  ledNum is the LED Number
+//!
+//! @return none
+//!
+//! @brief  Turns a specific LED Off
+//
+//*****************************************************************************    
+void turnLedOff(char ledNum)
+{              
+    switch(ledNum)
+        {
+          case 1:
+             ind1 = 0; 
+            break;
+          case 2:
+              ind2 = 0; 
+            break;
+          case 3:
+              ind3 = 0; 
+            break;
+          case 4:
+              ind4 = 0; 
+            break;
+          case 5:
+              ind1 = 0; 
+            break;
+          case 6:
+              ind4 = 0; 
+            break;
+          case 7:
+              
+            break;
+          case 8:
+              
+            break;
+        }  
+}
+
+//*****************************************************************************
+//
+//! toggleLed
+//!
+//! @param  ledNum is the LED Number
+//!
+//! @return none
+//!
+//! @brief  Toggles a board LED
+//
+//*****************************************************************************    
+
+void toggleLed(char ledNum)
+{
+    switch(ledNum)
+        {
+          case 1:
+              ind1 = 0;
+            break;
+          case 2:
+              ind2 = 0;
+            break;
+          case 3:
+              ind3 = 0;
+            break;
+          case 4:
+              ind4 = 0;
+            break;
+          case 5:
+              ind1 = 0;
+            break;
+          case 6:
+              ind4 = 0;
+            break;
+          case 7:
+              
+            break;
+          case 8:
+              
+            break;
+        }
+
+}       
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CC3000TestApp.h	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,47 @@
+#ifndef CC3000TestApp_H
+#define CC3000TestApp_H
+
+//*****************************************************************************
+//
+// If building with a C++ compiler, make all of the definitions in this header
+// have a C binding.
+//
+//*****************************************************************************
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+extern void AsyncEventPrint(void);
+extern void IntSpi(void);
+extern void ManualConnect(void);
+extern void ManualAddProfile(void);
+extern void PrintIPBytes(unsigned char *ipBytes);
+extern void ShowInformation(void);
+extern void ListAccessPoints(void);
+extern void turnLedOn(char ledNum);
+extern void turnLedOff(char ledNum);
+extern void toggleLed(char ledNum);
+
+typedef enum
+{
+    //NO_LED_IND = NO_LED,
+    CC3000_ON_IND = 1,
+    CC3000_ASSOCIATED_IND = 2,
+    CC3000_IP_ALLOC_IND = 3,
+    CC3000_SERVER_INIT_IND = 4,
+    CC3000_CLIENT_CONNECTED_IND = 1,
+    CC3000_SENDING_DATA_IND = 4,
+    CC3000_UNUSED1_IND = 7,
+    CC3000_FTC_IND = 8
+} ledNames;
+
+//*****************************************************************************
+//
+// Mark the end of the C bindings section for C++ compilers.
+//
+//*****************************************************************************
+#ifdef  __cplusplus
+}
+#endif // __cplusplus
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DigitalClass.cpp	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,16 @@
+
+
+#include "DigitalClass.h"
+
+//int WLAN_EN, WLAN_IRQ;
+
+DigitalClass::DigitalClass(PinName Pin_IRQ, PinName Pin_EN) : WLAN_IRQ(Pin_IRQ), WLAN_EN(Pin_EN)
+{
+WLAN_EN = 0;
+
+
+
+//WLAN_IRQ(p9) interrupt pin CC3000 j5 pin 8
+//WLAN_EN(p10) power enable CC3000 j4 pin 8
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DigitalClass.h	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,31 @@
+
+#ifndef DigitalClass_H
+#define DigitalClass_H
+
+
+#include "mbed.h"
+
+class DigitalClass 
+{
+
+public:
+
+/**
+     * Constructor.
+     *
+     * @param pin_IRQ CC3000 irq pin.
+     * @param pin pin_EN power enable for CC3000.
+     */
+
+DigitalClass(PinName Pin_IRQ, PinName Pin_EN);
+
+
+//int WLAN_IRQ, WLAN_EN;
+
+DigitalOut WLAN_EN;
+DigitalIn WLAN_IRQ;
+
+
+};
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cc3000.cpp	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,583 @@
+/*****************************************************************************
+*
+*  cc3000.c - CC3000 Functions Implementation
+*  Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*    Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+*    Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the   
+*    distribution.
+*
+*    Neither the name of Texas Instruments Incorporated nor the names of
+*    its contributors may be used to endorse or promote products derived
+*    from this software without specific prior written permission.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*****************************************************************************/
+
+#include "mbed.h"
+#include "cc3000.h"
+//#include <msp430.h>
+#include "wlan.h" 
+#include "evnt_handler.h"    // callback function declaration
+#include "nvmem.h"
+#include "socket.h"
+//#include "common.h"
+#include "netapp.h"
+//#include "common.h"
+
+//#include "demo_config.h"
+#include "spi.h"
+//#include "board.h"
+//#include "dispatcher.h"
+#include "spi_version.h"
+//#include "application_version.h"
+//#include "host_driver_version.h"
+#include "security.h"
+#include "CC3000TestApp.h"
+#include "CC3000Core.h"
+#include "DigitalClass.h"
+
+
+char CheckSocket = 0;
+// Smart Config Prefix - Texas Instruments
+char aucCC3000_prefix[3] = {'T', 'T', 'T'};
+
+signed char sd[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+const unsigned char smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
+
+//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', ' ' };
+unsigned char pucIP_Addr[4];
+unsigned char pucIP_DefaultGWAddr[4];
+unsigned char pucSubnetMask[4];
+unsigned char pucDNS[4];
+char digits[100];
+char cc3000state = CC3000_UNINIT;
+
+tNetappIpconfigRetArgs ipinfo;
+
+// Variable to indicate whether the Smart Config Process has finished
+volatile unsigned long ulSmartConfigFinished = 0;
+
+//*****************************************************************************
+//
+//! ConnectUsingSSID
+//!
+//! \param  ssidName is a string of the AP's SSID
+//!
+//! \return none
+//!
+//! \brief  Connect to an Access Point using the specified SSID
+//
+//*****************************************************************************
+int ConnectUsingSSID(char * ssidName)
+{
+                    
+    unsetCC3000MachineState(CC3000_ASSOC);
+    
+    // Disable Profiles and Fast Connect
+    wlan_ioctl_set_connection_policy(0, 0, 0);
+    
+    wlan_disconnect();
+    
+    //__delay_cycles(10000);
+    wait_us(500);
+    
+    // This triggers the CC3000 to connect to specific AP with certain parameters
+    //sends a request to connect (does not necessarily connect - callback checks that for me)
+#ifndef CC3000_TINY_DRIVER
+    wlan_connect(0, ssidName, strlen(ssidName), NULL, NULL, 0);   
+#else
+    wlan_connect(ssidName, strlen(ssidName));
+#endif
+    // We don't wait for connection. This is handled somewhere else (in the main
+    // loop for example).
+    
+    return 0;      
+}
+
+
+//*****************************************************************************
+//
+//! itoa
+//!
+//! @param[in]  integer number to convert
+//!
+//! @param[in/out]  output string
+//!
+//! @return number of ASCII parameters
+//!
+//! @brief  Convert integer to ASCII in decimal base
+//
+//*****************************************************************************
+unsigned short itoa(char cNum, char *cString)
+{
+    char* ptr;
+    char uTemp = cNum;
+    unsigned short length;
+    
+    
+    // value 0 is a special case
+    if (cNum == 0)
+    {
+        length = 1;
+        *cString = '0';
+        
+        return length;
+    }
+    
+    // Find out the length of the number, in decimal base
+    length = 0;
+    while (uTemp > 0)
+    {
+        uTemp /= 10;
+        length++;
+    }
+    
+    // Do the actual formatting, right to left
+    uTemp = cNum;
+    ptr = cString + length;
+    while (uTemp > 0)
+    {
+        --ptr;
+        *ptr = digits[uTemp % 10];
+        uTemp /= 10;
+    }
+    
+    return length;
+}
+
+
+//*****************************************************************************
+//
+//! sendDriverPatch
+//!
+//! \param  pointer to the length
+//!
+//! \return none
+//!
+//! \brief  The function returns a pointer to the driver patch: since there is no patch yet - 
+//!                it returns 0
+//
+//*****************************************************************************
+char *sendDriverPatch(unsigned long *Length)
+{
+    *Length = 0;
+    return NULL;
+}
+
+
+//*****************************************************************************
+//
+//! sendBootLoaderPatch
+//!
+//! \param  pointer to the length
+//!
+//! \return none
+//!
+//! \brief  The function returns a pointer to the boot loader patch: since there is no patch yet -
+//!                it returns 0
+//
+//*****************************************************************************
+char *sendBootLoaderPatch(unsigned long *Length)
+{
+    *Length = 0;
+    return NULL;
+}
+
+//*****************************************************************************
+//
+//! sendWLFWPatch
+//!
+//! \param  pointer to the length
+//!
+//! \return none
+//!
+//! \brief  The function returns a pointer to the FW patch: since there is no patch yet - it returns 0
+//
+//*****************************************************************************
+
+char *sendWLFWPatch(unsigned long *Length)
+{
+    *Length = 0;
+    return NULL;
+}
+
+
+//*****************************************************************************
+//
+//! CC3000_UsynchCallback
+//!
+//! \param  Event type
+//!
+//! \return none
+//!
+//! \brief  The function handles asynchronous events that come from CC3000 device 
+//!          and operates a LED4 to have an on-board indication
+//
+//*****************************************************************************
+
+void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length)
+{
+    if (lEventType == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE)
+    {
+        ulSmartConfigFinished = 1;      
+    }
+    
+    if (lEventType == HCI_EVNT_WLAN_UNSOL_INIT)
+    {
+        setCC3000MachineState(CC3000_INIT);
+    }
+    if (lEventType == HCI_EVNT_WLAN_UNSOL_CONNECT)
+    {
+              ulCC3000Connected = 1;
+        setCC3000MachineState(CC3000_ASSOC);
+        
+    }
+    
+    if (lEventType == HCI_EVNT_WLAN_UNSOL_DISCONNECT)
+    {
+        ulCC3000Connected = 0;
+        //restartMSP430();
+        unsetCC3000MachineState(CC3000_ASSOC);
+        
+    }
+    if (lEventType == HCI_EVNT_WLAN_UNSOL_DHCP)
+    {
+        setCC3000MachineState(CC3000_IP_ALLOC);        
+    }
+    
+    // This Event is gengerated when the TCP connection is Half closed
+    if (lEventType == HCI_EVNT_BSD_TCP_CLOSE_WAIT)
+    {
+      sd[data[0]] = 1;
+      CheckSocket = 1;
+    }
+}
+
+//*****************************************************************************
+//
+//! initDriver
+//!
+//!  \param  None
+//!
+//!  \return none
+//!
+//!  \brief  The function initializes a CC3000 device and triggers it to start operation
+//
+//*****************************************************************************
+int
+  initDriver(void)
+{
+        // Init GPIO's
+    //pio_init();
+    DigitalClass pio(p9, p10);
+    // Init SPI
+    init_spi();
+    
+    //DispatcherUARTConfigure();
+    
+    // Globally enable interrupts
+    //__enable_interrupt();
+    //  __enable_irq();  
+    //
+    // WLAN On API Implementation
+    //
+    wlan_init( CC3000_AsynchCallback, sendWLFWPatch, sendDriverPatch, sendBootLoaderPatch, ReadWlanInterruptPin, WlanInterruptEnable, WlanInterruptDisable, WriteWlanPin);
+    
+    //
+    // Trigger a WLAN device
+    //
+    wlan_start(0);
+    
+    //
+    // Mask out all non-required events from CC3000
+    //
+
+    wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_ASYNC_PING_REPORT|HCI_EVNT_WLAN_UNSOL_INIT);
+
+    // Generate event to CLI: send a version string
+    char cc3000IP[50];
+    char *ccPtr;
+    unsigned short ccLen;
+        
+    //DispatcherUartSendPacket((const char*)pucUARTExampleAppString, sizeof(pucUARTExampleAppString));
+        
+    ccPtr = &cc3000IP[0];
+    ccLen = itoa(PALTFORM_VERSION, ccPtr);
+    ccPtr += ccLen;
+    *ccPtr++ = '.';
+    //ccLen = itoa(APPLICATION_VERSION, ccPtr);
+    ccPtr += ccLen;
+    *ccPtr++ = '.';
+    ccLen = itoa(SPI_VERSION_NUMBER, ccPtr);
+    ccPtr += ccLen;
+    *ccPtr++ = '.';
+    //ccLen = itoa(DRIVER_VERSION_NUMBER, ccPtr);
+    ccPtr += ccLen;
+    *ccPtr++ = '\r';
+        *ccPtr++ = '\n';
+    *ccPtr++ = '\0';
+        ccLen = strlen(cc3000IP);
+        
+    //DispatcherUartSendPacket((const char*)cc3000IP, strlen(cc3000IP));
+    
+    // CC3000 has been initialized
+    setCC3000MachineState(CC3000_INIT);
+    
+    unsigned long aucDHCP, aucARP, aucKeepalive, aucInactivity;
+    
+    aucDHCP = 14400;
+    aucARP = 3600;      
+    aucKeepalive = 10;
+    aucInactivity = 50;
+    
+    if(netapp_timeout_values(&(aucDHCP), &(aucARP), &(aucKeepalive), &(aucInactivity)) != 0)
+    {
+      while(1);
+    }
+    
+    return(0);
+}
+
+
+//*****************************************************************************
+//
+//!  \brief  Return the highest state which we're in
+//!
+//!  \param  None
+//!
+//!  \return none
+//!
+//
+//*****************************************************************************
+char highestCC3000State()
+{
+    // We start at the highest state and go down, checking if the state
+    // is set.
+    char mask = 0x80;
+    while(!(cc3000state & mask))
+    {
+        mask = mask >> 1;
+    }
+        
+    return mask;
+}
+
+//*****************************************************************************
+//
+//!  \brief  Return the current state bits
+//!
+//!  \param  None
+//!
+//!  \return none
+//!
+//
+//*****************************************************************************
+char currentCC3000State()
+{
+    return cc3000state;
+}
+
+void setCC3000MachineState(char stat)
+{        
+    char bitmask = stat;
+    cc3000state |= bitmask;
+    
+    int i = FIRST_STATE_LED_NUM;
+    
+    // Find LED number which needs to be set
+    while(bitmask < 0x80)
+    {      
+        bitmask  = bitmask << 1;
+        i++;
+    }    
+    turnLedOn(NUM_STATES-i+2);
+
+}
+
+
+//*****************************************************************************
+//
+//!  \brief  Unsets a state from the state machine
+//!  Also handles LEDs
+//!  
+//!  \param  None
+//!
+//!  \return none
+//!  
+//
+//*****************************************************************************
+void unsetCC3000MachineState(char stat)
+{
+    char bitmask = stat;
+    cc3000state &= ~bitmask;
+    
+    int i = FIRST_STATE_LED_NUM;
+    int k = NUM_STATES; // Set to last element in state list
+    
+    // Set all upper bits to 0 as well since state machine cannot have
+    // those states.
+    while(bitmask < 0x80)
+    {
+        cc3000state &= ~bitmask;
+        bitmask = bitmask << 1;
+        i++;
+    }
+    
+    // Turn off all upper state LEDs
+    for(; i > FIRST_STATE_LED_NUM; i--)
+    {
+        turnLedOff(k);
+        k--;
+    }    
+}
+
+//*****************************************************************************
+//
+//!  \brief  Resets the State Machine
+//!  
+//!  \param  None
+//!
+//!  \return none
+//!  
+//
+//*****************************************************************************
+void resetCC3000StateMachine()
+{
+    cc3000state = CC3000_UNINIT;
+
+    // Turn off all Board LEDs
+
+    turnLedOff(CC3000_ON_IND);
+    turnLedOff(CC3000_ASSOCIATED_IND);
+    turnLedOff(CC3000_IP_ALLOC_IND);
+    turnLedOff(CC3000_SERVER_INIT_IND);
+    turnLedOff(CC3000_CLIENT_CONNECTED_IND);
+    turnLedOff(CC3000_SENDING_DATA_IND);
+    turnLedOff(CC3000_UNUSED1_IND);
+    turnLedOff(CC3000_FTC_IND);
+}
+
+//*****************************************************************************
+//
+//!  \brief  Obtains the CC3000 Connection Information from the CC3000
+//!  
+//!  \param  None
+//!
+//!  \return none
+//!  
+//
+//*****************************************************************************
+#ifndef CC3000_TINY_DRIVER
+tNetappIpconfigRetArgs * getCC3000Info()
+{
+    netapp_ipconfig(&ipinfo);
+    return (&ipinfo);
+}
+#endif
+
+//*****************************************************************************
+//
+//! StartSmartConfig
+//!
+//!  \param  None
+//!
+//!  \return none
+//!
+//!  \brief  The function triggers a smart configuration process on CC3000.
+//!            it exists upon completion of the process
+//
+//*****************************************************************************
+
+void StartSmartConfig(void)
+{
+
+    // Reset all the previous configuration
+    //
+    wlan_ioctl_set_connection_policy(0, 0, 0);    
+        wlan_ioctl_del_profile(255);
+    
+    //Wait until CC3000 is dissconected
+    while (ulCC3000Connected == 1)
+    {
+      //__delay_cycles(100);
+      wait_us(5);
+    }
+
+    // Start blinking LED6 during Smart Configuration process
+    turnLedOn(6);
+    wlan_smart_config_set_prefix(aucCC3000_prefix);
+    //wlan_first_time_config_set_prefix(aucCC3000_prefix);
+    turnLedOff(6);
+    
+    // Start the SmartConfig start process
+    wlan_smart_config_start(1);
+    turnLedOn(6);
+    
+    //
+    // Wait for Smart config finished
+    // 
+    while (ulSmartConfigFinished == 0)
+    {
+        //__delay_cycles(6000000);
+        wait_ms(250);                                                                     
+        turnLedOn(6);
+
+        //__delay_cycles(6000000);
+        wait_ms(250);        
+        turnLedOff(6);
+    }
+
+    turnLedOff(6);
+
+    // create new entry for AES encryption key
+    nvmem_create_entry(NVMEM_AES128_KEY_FILEID,16);
+    
+    // write AES key to NVMEM
+    aes_write_key((unsigned char *)(&smartconfigkey[0]));
+    
+    // Decrypt configuration information and add profile
+    wlan_smart_config_process();
+        
+    //
+    // Configure to connect automatically to the AP retrieved in the 
+    // Smart config process
+    //
+    wlan_ioctl_set_connection_policy(0, 0, 1);
+    
+    //
+    // reset the CC3000
+    // 
+    wlan_stop();
+    //__delay_cycles(600000);
+    wait_ms(25);
+    wlan_start(0);
+
+    unsigned char ConnectUsingSmartConfig  = 1; 
+        ulSmartConfigFinished = 0;
+    //
+    // Mask out all non-required events
+    //
+    wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_UNSOL_INIT|HCI_EVNT_WLAN_ASYNC_PING_REPORT);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cc3000.h	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,107 @@
+/*****************************************************************************
+*
+*  cc3000.h - CC3000 Function Definitions
+*  Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*    Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+*    Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the   
+*    distribution.
+*
+*    Neither the name of Texas Instruments Incorporated nor the names of
+*    its contributors may be used to endorse or promote products derived
+*    from this software without specific prior written permission.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*****************************************************************************/
+
+#ifndef CC3000_H
+#define CC3000_H
+
+#include "netapp.h"
+//*****************************************************************************
+//
+// If building with a C++ compiler, make all of the definitions in this header
+// have a C binding.
+//
+//*****************************************************************************
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#define NUM_STATES 6
+#define FIRST_STATE_LED_NUM 1
+#define MAX_SSID_LEN        32
+#define PALTFORM_VERSION                        (6)
+
+//extern char digits[100];
+extern unsigned char ConnectUsingSmartConfig; 
+extern volatile unsigned long ulCC3000Connected;
+
+
+
+// CC3000 State Machine Definitions
+enum cc3000StateEnum
+{
+    CC3000_UNINIT           = 0x01, // CC3000 Driver Uninitialized
+    CC3000_INIT             = 0x02, // CC3000 Driver Initialized
+    CC3000_ASSOC            = 0x04, // CC3000 Associated to AP
+    CC3000_IP_ALLOC         = 0x08, // CC3000 has IP Address
+    CC3000_SERVER_INIT      = 0x10, // CC3000 Server Initialized
+};
+
+int ConnectUsingSSID(char * ssidName);
+void setupLocalSocket(void);
+void ConnectToServer(void);
+void ConnectToServer(void);
+
+
+char *sendDriverPatch(unsigned long *Length);
+char *sendBootLoaderPatch(unsigned long *Length);
+char *sendWLFWPatch(unsigned long *Length);
+
+void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length);
+
+int initDriver(void);
+void StartSmartConfig(void);
+void closeLocalSocket(void);
+void disconnectAll();
+
+char isFTCSet();
+void setFTCFlag();
+
+
+// Machine State
+char currentCC3000State();
+void setCC3000MachineState(char stat);
+void unsetCC3000MachineState(char stat);
+void resetCC3000StateMachine();
+char highestCC3000State();
+//static void StartUnsolicitedEventTimer(void);
+static void DemoInitSpi(void);
+
+tNetappIpconfigRetArgs * getCC3000Info();
+
+#ifdef  __cplusplus
+}
+#endif // __cplusplus
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Aug 02 15:14:41 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/b3110cd2dd17
\ No newline at end of file