Demo apps : receive a string from a client and respond with a different string, TCP/IP client

Dependencies:   CC3000_Hostdriver mbed

Note

Avnet Wi-Go board

For those using Avnet's Wi-Go board, there also is a full IOT demo available at
http://mbed.org/users/frankvnk/code/Wi-Go_IOT_Demo/

New cc3000 HostDriver release

For new projects, use cc3000 mbed socket compatible API driver and examples

Info

Demo application for testing the wireless CC3000 module on the Wi-Go board.

Warning

The on-board Firmware must be updated to mbed enable a Wi-Go system.
Goto the Component page to get the FirmwareUpdate tool (scroll down to the FirmwareUpdate topic).

Setup

Note

It is recommended to run initial tests WITHOUT security settings.

  • Setup a wireless router with a non-secured wireless connection using the wireless settings stored in doTCPIP.h.
  • Alternatively, these settings can be altered to match the wireless router settings (SSID, security and static IP parameters).
    When the unsecure test works, AP_KEY and AP_SECURITY can be enabled and set to your preferred values.
    Valid values for AP_SECURITY are : NONE, WEP, WPA and WPA2
// Modify the following settings as necessary for your Wi-Fi Network setup:
#define IP_ALLOC_METHOD USE_DHCP        // for DHCP assigned IP address   
//#define IP_ALLOC_METHOD USE_STATIC_IP // for static IP address

// Default SSID Settings
//#define AP_KEY         "thisthis" 
//#define AP_SECURITY    WPA2          // WPA2 must be enabled for use with iPhone or Android phone hotspot!

#define SSID           "iot"
#define STATIC_IP_OCT1 192
#define STATIC_IP_OCT2 168
#define STATIC_IP_OCT3 0
#define STATIC_IP_OCT4 10

#define STATIC_GW_OCT4 1       // Static Gateway address  = STATIC_IP_OCT1.STATIC_IP_OCT2.STATIC_IP_OCT3.STATIC_GW_OCT4


  • Download Python 2.7 from http://www.python.org/download/
    Install it on a computer able to make a wireless connection to the router we previously set up.
  • Make a wireless connection between your computer and the router.
  • Download this Python script to the Python2.7 folder (credit : Jim Carver from Avnet).
  • Import the CC3000_Simple_Socket code into your compiler and save it to the Wi-Go board.

Running the application for the first time

  • Open a terminal program (eg: TeraTerm) and connect to the Wi-Go module (serial speed : 115200 baud).
  • Press the reset button on the Wi-Go module.
  • Following startup screen will appear (the dots in the MAC address will show your CC3000's real MAC address):
CC3000 Python demo.


Wi-Go MAC address ..:..:..:..:..:..

FTC        1
PP_version 3.3
SERV_PACK  1.11
DRV_VER    7.13.19
FW_VER     7.12.14

<0> Normal run. SmartConfig will
    start if no valid connection exists.
<1> Connect using fixed SSID : iot
<2> TCP/IP client:
    Discover public IP address.
    Get time and date from a daytime server in Italy.
<9> SmartConfig.


  • For the initial test, select option <1> (Connect using fixed SSID : ...).
  • If all goes well, the following screen is shown (the IP address and mDNS status can be different):
Starting TCP/IP Server
RunSmartConfig= 0
Attempting SSID Connection
waiting
waiting
waiting
mDNS Status= 31be
Connected

*** Wi-Go board DHCP assigned IP Address = 192.168.0.101
mDNS Status= 3dbe
Server waiting for connection to Python


  • On the computer where you installed Python2.7:
    • Make sure the wireless connection between your computer and the router is active.
    • Open a DOS prompt and go to the folder where Python2.7 is installed.
    • Type following command :
python wigo_test.py -a 192.168.0.101 -p 15000


Note

Don't forget to replace the IP address with the real IP address assigned by DHCP to the CC3000 module.

If a connection is established, the DOS window will show

-----------------
run tcp client
-----------------
connected to  remote ip=192.168.0.101 remote port=15000
Press ENTER ....


In return the Wi-Go board will send following info to the serial port:

Connected


When we press Enter in the DOS window, the Wi-Go board will send following info to the serial port:

Input = Hello Wi-Go
status= 13
Done, press any key to repeat


And the DOS window will show:

recv from :  data:  Hello Python


Application option <2> : TCP/IP client

This is a simple demo to discover a public IP address and get the date and time from a daytime server (port 13).

Using the application's options <0> or <9>

Options <0> (Normal run) and <9> (SmartConfig) are very similar.
They both allow us to connect the CC3000 to another wireless network, without changing the pre-configured settings stored in doTCPIP.h.

As mentioned before, option <0> will automatically start SmartConfig if no valid connection exists (First Time Config),
but if the CC3000 was previously configured using SmartConfig, it will automatically connect to the wireless network.

Option <9> can be used to switch to another wireless connection.


See TI's pages on how to use the SmartConfig tool:

The Prefix can be set in cc3000.cpp. Do not change the default value for the prefix (TTT) when you want to use TI's Smartconfig application.

char aucCC3000_prefix[] = {'T', 'T', 'T'};      // Smart Config Prefix

The Device Name mentioned on the SmartConfig page is declared in doTCPIP.cpp

char DevServname[] = "CC3000";

Files at this revision

API Documentation at this revision

Comitter:
frankvnk
Date:
Sun Aug 11 09:46:26 2013 +0000
Child:
1:32d1ef95eceb
Commit message:
First release

Changed in this revision

CC3000_Hostdriver.lib 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
doTCPIP.cpp Show annotated file Show diff for this revision Revisions of this file
doTCPIP.h Show annotated file Show diff for this revision Revisions of this file
main.cpp 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/CC3000_Hostdriver.lib	Sun Aug 11 09:46:26 2013 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/frankvnk/code/CC3000_Hostdriver/#b48bb4df9319
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cc3000.cpp	Sun Aug 11 09:46:26 2013 +0000
@@ -0,0 +1,446 @@
+/*****************************************************************************
+*
+*  cc3000 - 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 "cc3000.h"
+
+
+WLAN_IRQ_PIN_CREATE;
+WLAN_EN_PIN_CREATE;
+WLAN_CS_PIN_CREATE;
+WLAN_SPI_PORT_CREATE;
+
+DigitalOut ledr (LED_RED);
+DigitalOut ledg (LED_GREEN);
+DigitalOut ledb (LED_BLUE);
+DigitalOut led1 (PTB8);
+DigitalOut led2 (PTB9);
+DigitalOut led3 (PTB10);
+
+long ulSocket;
+
+unsigned char pucIP_Addr[4];
+unsigned char pucIP_DefaultGWAddr[4];
+unsigned char pucSubnetMask[4];
+unsigned char pucDNS[4];
+
+sockaddr tSocketAddr;
+
+unsigned char prefixChangeFlag = 0;
+unsigned char prefixFromUser[3] = {0};
+char * ftcPrefixptr;
+
+char aucCC3000_prefix[] = {'T', 'T', 'T'};      // Smart Config Prefix
+
+tNetappIpconfigRetArgs ipinfo;
+
+char cc3000state = CC3000_UNINIT;
+extern unsigned char ConnectUsingSmartConfig; 
+extern volatile unsigned long ulCC3000Connected;
+extern volatile unsigned long SendmDNSAdvertisment;
+extern int server_running;
+extern unsigned char *DevServname;
+volatile unsigned long ulSmartConfigFinished, ulCC3000DHCP, OkToDoShutDown, ulCC3000DHCP_configured;
+volatile unsigned char ucStopSmartConfig;
+unsigned char pucCC3000_Rx_Buffer[CC3000_APP_BUFFER_SIZE + CC3000_RX_BUFFER_OVERHEAD_SIZE];
+
+#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
+const unsigned char smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
+#endif
+
+void Init_HostDriver(void)
+{
+    // Clear pending interrupt
+    WLAN_ISF_PCR  |= PORT_PCR_ISF_MASK;
+    WLAN_ISF_ISFR |= WLAN_ISF_MASK;
+    //Initial state for wlan module : EN = 0 (disabled) and CS = 1 (not selected).
+    WLAN_DEASSERT_EN;
+    WLAN_DEASSERT_CS;
+
+    WLAN_SPI_PORT_INIT;
+    WLAN_SPI_SET_FREQ;
+    WLAN_SPI_SET_IRQ_HANDLER;
+}
+
+void initLEDs(void)
+{
+    RED_OFF;
+    GREEN_OFF;
+    BLUE_OFF;
+    LED_D1_OFF;
+    LED_D2_OFF;
+    LED_D3_OFF;
+}
+
+char *sendDriverPatch(unsigned long *Length)
+{
+    *Length = 0;
+    return NULL;
+}
+
+
+char *sendBootLoaderPatch(unsigned long *Length)
+{
+    *Length = 0;
+    return NULL;
+}
+
+
+char *sendWLFWPatch(unsigned long *Length)
+{
+    *Length = 0;
+    return NULL;
+}
+
+
+long ReadWlanInterruptPin(void)
+{
+    return (WLAN_READ_IRQ);
+}
+
+
+void WlanInterruptEnable()
+{
+    WLAN_ENABLE_IRQ;
+}
+
+
+void WlanInterruptDisable()
+{
+    WLAN_DISABLE_IRQ;
+}
+
+
+void WriteWlanPin( unsigned char val )
+{
+    if (val)
+    {
+            WLAN_ASSERT_EN;
+    }
+    else
+    {
+            WLAN_DEASSERT_EN;
+    }
+}
+
+
+int ConnectUsingSSID(char * ssidName)
+{
+    unsetCC3000MachineState(CC3000_ASSOC);
+    // Disable Profiles and Fast Connect
+    wlan_ioctl_set_connection_policy(0, 0, 0);
+    wlan_disconnect();
+    wait_ms(3);
+    // 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)
+    // wlan_connect(SECURITY, SSID, strlen(SSID), NULL, PASSPHRASE, strlen(PASSPHRASE));
+#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;      
+}
+
+
+void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length)
+{
+    if (lEventType == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE)
+    {
+        ulSmartConfigFinished = 1;
+        ucStopSmartConfig     = 1;  
+    }
+    if (lEventType == HCI_EVNT_WLAN_UNSOL_CONNECT)
+    {
+        ulCC3000Connected = 1;
+        // Turn on LED2
+    }
+    if (lEventType == HCI_EVNT_WLAN_UNSOL_DISCONNECT)
+    {       
+        ulCC3000Connected = 0;
+        ulCC3000DHCP      = 0;
+        ulCC3000DHCP_configured = 0;
+    }
+    if (lEventType == 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)
+        {
+            sprintf( (char*)pucCC3000_Rx_Buffer,"IP:%d.%d.%d.%d\f\r", data[3],data[2], data[1], data[0] );
+            ulCC3000DHCP = 1;
+        }
+        else
+        {
+            ulCC3000DHCP = 0;
+        }
+    }
+    if (lEventType == HCI_EVENT_CC3000_CAN_SHUT_DOWN)
+    {
+        OkToDoShutDown = 1;
+    }
+}
+
+
+int initDriver(void)
+{
+    // WLAN On API Implementation
+/*    wlan_init( CC3000_UsynchCallback,
+               sendWLFWPatch,
+               sendDriverPatch,
+               sendBootLoaderPatch,
+               ReadWlanInterruptPin,
+               WlanInterruptEnable,
+               WlanInterruptDisable,
+               WriteWlanPin);*/
+    
+  wlan_start(0);
+#if IP_ALLOC_METHOD == USE_DHCP
+    
+    // DHCP is used by default
+    // Subnet mask is assumed to be 255.255.255.0
+    pucSubnetMask[0] = 0;
+    pucSubnetMask[1] = 0;
+    pucSubnetMask[2] = 0;
+    pucSubnetMask[3] = 0;
+    
+    // CC3000's IP
+    pucIP_Addr[0] = 0;
+    pucIP_Addr[1] = 0;
+    pucIP_Addr[2] = 0;
+    pucIP_Addr[3] = 0;
+    
+    // Default Gateway/Router IP
+    // 192.168.1.1
+    pucIP_DefaultGWAddr[0] = 0;
+    pucIP_DefaultGWAddr[1] = 0;
+    pucIP_DefaultGWAddr[2] = 0;
+    pucIP_DefaultGWAddr[3] = 0;
+    
+    // We assume the router is also a DNS server
+    pucDNS[0] = 0;
+    pucDNS[1] = 0;
+    pucDNS[2] = 0;
+    pucDNS[3] = 0;
+    
+    // Force DHCP
+    netapp_dhcp((unsigned long *)pucIP_Addr,
+                (unsigned long *)pucSubnetMask, 
+                (unsigned long *)pucIP_DefaultGWAddr,
+                (unsigned long *)pucDNS);
+
+    // reset the CC3000
+    wlan_stop();
+    wait(1);
+    wlan_start(0);
+    
+#elif IP_ALLOC_METHOD == USE_STATIC_IP
+
+    // Subnet mask is assumed to be 255.255.255.0
+    pucSubnetMask[0] = 0xFF;
+    pucSubnetMask[1] = 0xFF;
+    pucSubnetMask[2] = 0xFF;
+    pucSubnetMask[3] = 0x0;
+    
+    // CC3000's IP
+    pucIP_Addr[0] = STATIC_IP_OCT1;
+    pucIP_Addr[1] = STATIC_IP_OCT2;
+    pucIP_Addr[2] = STATIC_IP_OCT3;
+    pucIP_Addr[3] = STATIC_IP_OCT4;
+    
+    // Default Gateway/Router IP
+    // 192.168.1.1
+    pucIP_DefaultGWAddr[0] = STATIC_IP_OCT1;
+    pucIP_DefaultGWAddr[1] = STATIC_IP_OCT2;
+    pucIP_DefaultGWAddr[2] = STATIC_IP_OCT3;
+    pucIP_DefaultGWAddr[3] = 1;
+    
+    // We assume the router is also a DNS server
+    pucDNS[0] = STATIC_IP_OCT1;
+    pucDNS[1] = STATIC_IP_OCT2;
+    pucDNS[2] = STATIC_IP_OCT3;
+    pucDNS[3] = 1;
+    
+    netapp_dhcp((unsigned long *)pucIP_Addr,
+                (unsigned long *)pucSubnetMask, 
+                (unsigned long *)pucIP_DefaultGWAddr,
+                (unsigned long *)pucDNS);    
+
+    // reset the CC3000 to apply Static Setting
+    wlan_stop();
+    wait(1);
+    wlan_start(0);
+    
+#else 
+#error No IP Configuration Method Selected. One must be configured.
+#endif
+
+    // Mask out all non-required events from CC3000
+    wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|
+                        HCI_EVNT_WLAN_UNSOL_INIT|
+                        HCI_EVNT_WLAN_ASYNC_PING_REPORT);
+       
+    // CC3000 has been initialized
+    setCC3000MachineState(CC3000_INIT);
+    return(0);
+}
+
+
+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;
+}
+
+
+char currentCC3000State(void)
+{
+    return cc3000state;
+}
+
+
+void setCC3000MachineState(char stat)
+{       
+    cc3000state |= stat;
+}
+
+
+void unsetCC3000MachineState(char stat)
+{
+    char bitmask = stat;
+    cc3000state &= ~bitmask;
+
+    // Set all upper bits to 0 as well since state machine cannot have
+    // those states.
+    while(bitmask < 0x80)
+    {
+        cc3000state &= ~bitmask;
+        bitmask = bitmask << 1;
+    }
+}
+
+
+void resetCC3000StateMachine()
+{
+    cc3000state = CC3000_UNINIT;
+}
+
+
+#ifndef CC3000_TINY_DRIVER
+tNetappIpconfigRetArgs * getCC3000Info()
+{
+    if(!(currentCC3000State() & CC3000_SERVER_INIT))
+    {
+        // If we're not blocked by accept or others, obtain the latest
+        netapp_ipconfig(&ipinfo);
+    }    
+    return (&ipinfo);
+}
+#endif
+
+
+void StartSmartConfig(void)
+{
+    server_running = 1;
+    RED_OFF;
+    GREEN_OFF;
+    BLUE_ON;
+
+    // Reset all the previous configuration
+    wlan_ioctl_set_connection_policy(0, 0, 0);  
+    wlan_ioctl_del_profile(255);
+
+    //Wait until CC3000 is disconected
+    while (ulCC3000Connected == 1)
+    {
+        wait_us(5);
+        hci_unsolicited_event_handler();
+    }
+
+    // Trigger the Smart Config process
+    // Start blinking RED/GREEN during Smart Configuration process
+    wlan_smart_config_set_prefix(aucCC3000_prefix);
+    // Start the Smart Config process with AES disabled
+    wlan_smart_config_start(0);
+    BLUE_OFF;
+    RED_ON;
+    // Wait for Smart config finished
+    while (ulSmartConfigFinished == 0)
+    {
+        wait_ms(250);
+        RED_ON;
+        GREEN_OFF;
+        wait_ms(250);
+        GREEN_ON;     
+        RED_OFF;                 
+    }
+    BLUE_ON;
+#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
+    // 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();
+#endif
+//    wlan_smart_config_process();
+
+    // Configure to connect automatically to the AP retrieved in the 
+    // Smart config process
+    wlan_ioctl_set_connection_policy(0, 1, 1);
+    
+    // reset the CC3000
+    wlan_stop();
+    wait(2);
+    wlan_start(0);
+    wait(2);
+    ConnectUsingSmartConfig = 1; 
+
+    // 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);
+    RED_OFF;
+    BLUE_OFF;
+    GREEN_OFF;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cc3000.h	Sun Aug 11 09:46:26 2013 +0000
@@ -0,0 +1,240 @@
+/*****************************************************************************
+*
+*  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 "wlan.h"
+
+//*****************************************************************************
+//
+//! \addtogroup cc3000
+//! @{
+//
+//*****************************************************************************
+
+/** CC3000 Functions
+*
+*/
+#ifdef    __cplusplus
+extern "C" {
+#endif
+
+extern DigitalOut ledr;
+extern DigitalOut ledg;
+extern DigitalOut ledb;
+extern DigitalOut led1;
+extern DigitalOut led2;
+extern DigitalOut led3;
+
+#define RED_OFF        ledr = 1;
+#define RED_ON         ledr = 0;
+#define RED_TOGGLE     ledr = !ledr;
+#define GREEN_OFF      ledg = 1;
+#define GREEN_ON       ledg = 0;
+#define GREEN_TOGGLE   ledg = !ledg;
+#define BLUE_OFF       ledb = 1;
+#define BLUE_ON        ledb = 0;
+#define BLUE_TOGGLE    ledb = !ledb;
+#define LED_D1_OFF     led1 = 1;
+#define LED_D1_ON      led1 = 0;
+#define LED_D1_TOGGLE  led1 = !led1;
+#define LED_D2_OFF     led2 = 1;
+#define LED_D2_ON      led2 = 0;
+#define LED_D2_TOGGLE  led2 = !led2;
+#define LED_D3_OFF     led3 = 1;
+#define LED_D3_ON      led3 = 0;
+#define LED_D3_TOGGLE  led3 = !led3;
+
+#define SOCKET_INACTIVE_ERR             -57
+#define NUM_STATES                      6
+#define MAX_SSID_LEN                    32
+#define FIRST_TIME_CONFIG_SET           0xAA
+#define NETAPP_IPCONFIG_MAC_OFFSET      (20)
+#define CC3000_APP_BUFFER_SIZE          (5)
+#define CC3000_RX_BUFFER_OVERHEAD_SIZE  (20)
+
+// 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
+    CC3000_CLIENT_CONNECTED = 0x20  // CC3000 Client Connected to Server
+};
+
+
+/** Set basic controls and parameters for the HostDriver.
+* @param  none
+* @return none
+*/
+extern void Init_HostDriver(void);
+
+/**
+* Turn all LEDs Off
+* @param  none
+* @return none
+*/
+void initLEDs(void);
+
+/** Return a pointer to the driver patch.
+* Since there is no patch, 0 is returned\n
+* (the patches are taken from the EEPROM and not from the host)\n
+* @param  pointer to the length
+* @return NULL
+*/ 
+char *sendDriverPatch(unsigned long *Length);
+
+/** Return a pointer to the bootloader patch.
+* Since there is no patch, 0 is returned \n
+* (the patches are taken from the EEPROM and not from the host)\n
+* @param  pointer to the length
+* @return NULL
+*/
+char *sendBootLoaderPatch(unsigned long *Length);
+
+/** Return a pointer to the firmware patch.
+* Since there is no patch, 0 is returned\n
+* (the patches are taken from the EEPROM and not from the host)\n
+* @param  pointer to the length
+* @return NULL
+*/
+char *sendWLFWPatch(unsigned long *Length);
+
+/** Read Wlan Interrupt pin.
+* @param  none
+* @return wlan interrup pin level
+*/
+long ReadWlanInterruptPin(void);
+
+/** Enable waln IrQ pin.
+* @param  none
+* @return none
+*/
+void WlanInterruptEnable(void);
+
+/** Disable waln IrQ pin.
+* @param  none
+* @return none
+*/
+void WlanInterruptDisable(void);
+
+/** WriteWlanPin.
+* @param  val (1: enable - 0: disable)
+* @return none
+*/
+void WriteWlanPin( unsigned char val );
+
+/** Connect to an Access Point using the specified SSID.
+* @param  ssidName is a string of the AP's SSID
+* @return none
+*/
+int ConnectUsingSSID(char * ssidName);
+
+/** Handle asynchronous events from CC3000 device.
+* @param  lEventType  Event type
+* @param  data
+* @param  length
+* @return none
+*/
+void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length);
+
+/** Initialize a CC3000 device and triggers it to start operation.
+* @param  none
+* @return none
+*/
+int initDriver(void);
+
+/** Return the highest state which we're in.
+* @param  None
+* @return none
+*/
+char highestCC3000State(void);
+
+/** Return the current state bits.
+* @param  None
+* @return none
+*/
+char currentCC3000State(void);
+
+/** Sets a state from the state machine.
+* @param  None
+* @return none
+*/
+void setCC3000MachineState(char stat);
+
+/** Unsets a state from the state machine.
+* Also handles LEDs.\n
+* @param  None
+* @return none
+*/
+void unsetCC3000MachineState(char stat);
+
+/** Resets the State Machine.
+* @param  None
+* @return none
+*/
+void resetCC3000StateMachine(void);
+
+/** Obtains the CC3000 Connection Information from the CC3000.
+* @param  None
+* @return none
+*/
+#ifndef CC3000_TINY_DRIVER
+tNetappIpconfigRetArgs * getCC3000Info(void);
+#endif
+
+/** Trigger a smart configuration process on CC3000.
+* It exits upon completion of the process.\n
+* @param  None
+* @return none
+*/
+void StartSmartConfig(void);
+
+#ifdef    __cplusplus
+}
+#endif // __cplusplus
+
+//*****************************************************************************
+//
+// Close the Doxygen group.
+//! @}
+//
+//*****************************************************************************
+
+#endif // CC3000_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doTCPIP.cpp	Sun Aug 11 09:46:26 2013 +0000
@@ -0,0 +1,259 @@
+/****************************************************************************
+*
+*  doTCPIP.cpp - CC3000 TCP/IP
+*  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 "wlan.h"
+#include "evnt_handler.h"    // callback function declaration
+#include "nvmem.h"
+#include "socket.h"
+#include "common.h"
+#include "netapp.h"
+#include "cc3000.h"
+#include "board.h"
+#include "demo_config.h"
+#include "httpserver.h"
+#include "sensors.h"
+#include "strlib.h"
+#include "Avnet_Wi-Go_board.h"
+#include "adc_test.h"
+
+#include "wlan.h"
+#include "demo_config.h"
+#include "httpserver.h"
+#include "sensors.h"
+*/
+#include "doTCPIP.h"
+
+volatile unsigned char newData;
+int server_running;
+unsigned char ForceFixedSSID;
+char runSmartConfig;            // Flag indicating whether user requested to perform Smart Config
+volatile unsigned long ulCC3000Connected;
+unsigned char ConnectUsingSmartConfig;
+unsigned char myMAC[8];
+userFS_t userFS;
+
+// Setup the functions to handle our CGI parameters
+tNetappIpconfigRetArgs ipinfo2;
+char requestBuffer[REQ_BUFFER_SIZE];
+int LAN_Connected = 0;
+
+/** \brief Flag indicating whether user requested to perform FTC */
+char runFirstTimeConfig = 0;
+unsigned char SmartConfigProfilestored = 0xff;
+
+  
+/** \brief Flag indicating whether to print CC3000 Connection info */
+static unsigned char obtainIpInfoFlag = FALSE;
+//Device name - used for Smart config in order to stop the Smart phone configuration process
+char DevServname[] = "CC3000";
+volatile unsigned long SendmDNSAdvertisment;
+
+
+
+void sendPython(int port)
+{
+    char python_msg[] = "Hello Python\n";
+    int stat;
+    long sock;
+    //new TCP socket descriptor
+    long newsock;
+    //destination address
+    sockaddr destAddr;
+    //local address
+    sockaddr LocalAddr;
+    socklen_t addrlen;
+    memset(&LocalAddr, 0, 8);
+    LocalAddr.sa_family = AF_INET;
+    LocalAddr.sa_data[0] = (port >> 8) & 0xff;
+    LocalAddr.sa_data[1] = port & 0xff;  
+    memset (&LocalAddr.sa_data[2], 0, 4);
+    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    while(sock == -1) sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP);
+    bind(sock,&LocalAddr,sizeof(sockaddr));
+    listen(sock, 1);
+    addrlen = sizeof(destAddr);
+    while(1)
+    {
+        newsock = -2;
+        printf("Server waiting for connection to Python\n");
+        LED_D2_ON;
+        while((newsock == -1) || (newsock == -2))
+        {
+            newsock = accept(sock,&destAddr, &addrlen);
+        }
+        printf("Connected\n");
+        //receive TCP data
+        if(newsock >= 0)
+        {
+            recv(newsock, requestBuffer,20,0);
+            printf("Input = %s\n", requestBuffer);
+            stat = -2;
+            stat = send(newsock, python_msg, strlen(python_msg), 0);
+            printf("status= %d\n", stat);
+            LED_D2_OFF; 
+        } else printf("bad socket= %d\n", newsock);
+        closesocket(newsock);
+        printf("Done, press any key to repeat\n");
+        getchar();
+        printf("\x1B[2J");    //VT100 erase screen
+        printf("\x1B[H");     //VT100 home
+    }
+} 
+
+void initTCPIP(void)
+{
+    int t;  
+    LAN_Connected = 0;
+    // Start CC3000 State Machine
+    resetCC3000StateMachine();
+    ulCC3000DHCP = 0;
+    ulCC3000Connected = 0;
+    // Initialize Board and CC3000
+    initDriver();
+    printf("RunSmartConfig= %d\n", runSmartConfig);
+    if(runSmartConfig == 1 )
+    {
+        // Clear flag
+        //ClearFTCflag();
+        unsetCC3000MachineState(CC3000_ASSOC);
+        // Start the Smart Config Process
+        StartSmartConfig();
+        runSmartConfig = 0;
+    }
+    // If connectivity is good, run the primary functionality
+    while(1)
+    {
+        if(checkWiFiConnected()) break;
+        wait(1);
+    }
+    printf("Connected\n");
+    if(!(currentCC3000State() & CC3000_SERVER_INIT))
+    {
+        // If we're not blocked by accept or others, obtain the latest status 
+        netapp_ipconfig(&ipinfo2);                  // data is returned in the ipinfo2 structure
+    }   
+    printf("\n*** Wi-Go board DHCP assigned IP Address = %d.%d.%d.%d\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]);       
+    LED_D3_ON;
+    LAN_Connected = 1;
+    t = mdnsAdvertiser(1, DevServname, sizeof(DevServname));
+    printf("mDNS Status= %x\n", t);
+}
+    
+void runTCPIPserver(void)
+{
+    while(1)
+    {
+        LED_D3_OFF;
+        LAN_Connected = 0;
+        LED_D2_OFF;
+        printf("\n\nStarting TCP/IP Server\n");
+        initTCPIP();
+        sendPython(TCPIP_PORT);
+    }   
+}
+    
+unsigned char checkWiFiConnected(void)
+{
+    int t;
+    if(!(currentCC3000State() & CC3000_ASSOC)) //try to associate with an Access Point
+    {
+        // Check whether Smart Config was run previously. If it was, we
+        // use it to connect to an access point. Otherwise, we connect to the
+        // default.
+        if(((ConnectUsingSmartConfig==0)&&(SmartConfigProfilestored != SMART_CONFIG_SET)) || ForceFixedSSID)
+        {
+            // Smart Config not set, check whether we have an SSID
+            // from the assoc terminal command. If not, use fixed SSID.
+            printf("Attempting SSID Connection\n");  
+            ConnectUsingSSID(SSID);
+        }
+        //unsolicicted_events_timer_init();
+        // Wait until connection is finished 
+        while ((ulCC3000DHCP == 0) || (ulCC3000Connected == 0))
+        {
+            wait_ms(500);
+            printf("waiting\n");
+        }
+    }
+    // Check if we are in a connected state.  If so, set flags and LED
+    if(ulCC3000Connected == 1)
+    {
+        if (obtainIpInfoFlag == FALSE)
+        {
+            obtainIpInfoFlag = TRUE;             // Set flag so we don't constantly turn the LED on
+            LED_D3_ON;
+        }
+        if (obtainIpInfoFlag == TRUE)
+        {
+            //If Smart Config was performed, we need to send complete notification to the configure (Smart Phone App)
+            if (ConnectUsingSmartConfig==1)
+            {
+                ConnectUsingSmartConfig = 0;
+                SmartConfigProfilestored = SMART_CONFIG_SET;
+            }
+
+        }
+        t = mdnsAdvertiser(1, DevServname, sizeof(DevServname));
+        printf("mDNS Status= %x\n", t);
+        return TRUE;
+    }
+    return FALSE;
+}
+
+void print_mac(void)
+{
+    printf("\n\nWi-Go MAC address %02x:%02x:%02x:%02x:%02x:%02x\n\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]);
+}
+
+void do_FTC(void)
+{
+    printf("Running First Time Configuration\n");
+    server_running = 1;
+    runFirstTimeConfig = 1;
+    runSmartConfig = 1;
+    initTCPIP();
+    RED_OFF;
+    GREEN_OFF;
+    BLUE_OFF;
+    userFS.FTC = 1;
+    nvmem_write( NVMEM_USER_FILE_1_FILEID, sizeof(userFS), 0, (unsigned char *) &userFS);
+    runFirstTimeConfig = 0;
+    runSmartConfig = 0;
+    SmartConfigProfilestored = SMART_CONFIG_SET;
+    wlan_stop();
+    printf("FTC finished\n");
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doTCPIP.h	Sun Aug 11 09:46:26 2013 +0000
@@ -0,0 +1,141 @@
+/****************************************************************************
+*
+*  doTCPIP.h - CC3000 TCP/IP
+*  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 DOTCPIP_H
+#define DOTCPIP_H
+
+#include "cc3000.h"
+/*#include "demo_config.h"
+#include "httpserver.h"
+#include "sensors.h"*/
+
+
+/** TCP/IP Functions
+*
+*/
+#ifdef    __cplusplus
+extern "C" {
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#define SMART_CONFIG_SET 0x55
+#define TCPIP_PORT 15000
+
+#define USE_DHCP      1
+#define USE_STATIC_IP 2
+
+#define NONE 0
+#define WEP  1
+#define WPA  2
+#define WPA2 3
+
+// Modify the following settings as necessary for your Wi-Fi Network setup:
+#define IP_ALLOC_METHOD USE_DHCP        // for DHCP assigned IP address   
+//#define IP_ALLOC_METHOD USE_STATIC_IP // for static IP address
+
+// Default SSID Settings
+//#define SSID           "HP2_Network"       // or custom SSID eg. "XYZ iPhone" 
+//#define WPA2_KEY       "fof0-gqi3-zn4i"
+//#define AP_SECURITY     WPA2            // WPA2 must be enabled for use with iPhone or Android phone hotspot!
+#define SSID           "iot"
+#define AP_SECURITY    NONE          // no security but will connect quicker!  
+#define STATIC_IP_OCT1 192
+#define STATIC_IP_OCT2 168
+#define STATIC_IP_OCT3 0
+#define STATIC_IP_OCT4 10
+
+#define REQ_BUFFER_SIZE 400
+
+typedef struct {
+    unsigned char FTC;           // First time config performed
+    unsigned char PP_version[2]; // Patch Programmer version
+    unsigned char SERV_PACK[2];  // Service Pack Version
+    unsigned char DRV_VER[3];    // Driver Version
+    unsigned char FW_VER[3];     // Firmware Version
+    unsigned char validCIK;      // CIK[] is valid (Client Interface Key)
+    unsigned char CIK[40];
+} userFS_t;
+
+extern userFS_t userFS;
+
+extern unsigned long ulSmartConfigFinished,ulCC3000DHCP, OkToDoShutDown, ulCC3000DHCP_configured;
+extern int server_running;
+extern volatile unsigned char newData;
+extern unsigned char ForceFixedSSID;
+extern char runSmartConfig;
+extern char requestBuffer[];
+extern char runFirstTimeConfig;
+extern unsigned char myMAC[8];
+extern unsigned char SmartConfigProfilestored;
+
+extern void StartSmartConfig(void);
+
+
+
+void sendPython(int port);
+void initTCPIP(void);
+void runTCPIPserver(void);
+
+/** Checks if WiFi is still connected.
+* @param  None
+* @return TRUE if connected, FALSE if not
+* @note   If not associated with an AP for 5 consecutive retries, it will reset the board.
+*/
+unsigned char checkWiFiConnected(void);
+
+/** Print MAC address.
+* @param  None
+* @return none
+*/
+void print_mac(void);
+
+/** First time configuration.
+* @param  None
+* @return none
+*/
+void do_FTC(void);
+
+#ifdef    __cplusplus
+}
+#endif // __cplusplus
+
+#endif // DOTCPIP_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Aug 11 09:46:26 2013 +0000
@@ -0,0 +1,101 @@
+#include "mbed.h"
+#include "doTCPIP.h"
+
+// Serial USB port
+Serial pc(USBTX, USBRX);
+
+//Wi-Go battery charger control
+DigitalOut PWR_EN1(PTB2);
+DigitalOut PWR_EN2(PTB3);
+
+int main()
+{
+    char c;
+    
+    // set current to 500mA since we're turning on the Wi-Fi
+    PWR_EN1 = 0;
+    PWR_EN2 = 1; 
+
+    //Set baudrate to 115200 instead of the default 9600
+    pc.baud (115200);
+    
+    initLEDs();
+    Init_HostDriver();
+    runSmartConfig = 0;
+    ulSmartConfigFinished = 0;
+    server_running = 1;
+    newData = 0;    
+    socket_active_status = 0xFFFF;
+    ForceFixedSSID = 0;
+    
+    GREEN_ON;
+    // WLAN On API Implementation
+    wlan_init( CC3000_UsynchCallback,
+               sendWLFWPatch,
+               sendDriverPatch,
+               sendBootLoaderPatch,
+               ReadWlanInterruptPin,
+               WlanInterruptEnable,
+               WlanInterruptDisable,
+               WriteWlanPin);
+    // Trigger a WLAN device
+    wlan_start(0);
+    nvmem_read( NVMEM_USER_FILE_1_FILEID, sizeof(userFS), 0, (unsigned char *) &userFS);
+    nvmem_get_mac_address(myMAC);
+    printf("\x1B[2J");    //VT100 erase screen
+    printf("\x1B[H");     //VT100 home
+    printf("CC3000 Python demo.\n");
+    print_mac();
+    wlan_stop();
+    printf("FTC        %i\n",userFS.FTC);
+    printf("PP_version %i.%i\n",userFS.PP_version[0], userFS.PP_version[1]);
+    printf("SERV_PACK  %i.%i\n",userFS.SERV_PACK[0], userFS.SERV_PACK[1]);
+    printf("DRV_VER    %i.%i.%i\n",userFS.DRV_VER[0], userFS.DRV_VER[1], userFS.DRV_VER[2]);
+    printf("FW_VER     %i.%i.%i\n",userFS.FW_VER[0], userFS.FW_VER[1], userFS.FW_VER[2]);
+
+    printf("\n<0> Normal run. SmartConfig will\n    start if no valid connection exists.\n");
+    printf("<1> Connect using fixed SSID : %s\n", SSID);
+    printf("<2> SmartConfig.\n");
+    c = getchar();
+    switch (c)
+    {
+        case '0':
+            ForceFixedSSID = 0;
+            if(!userFS.FTC)
+            {
+                do_FTC();
+                wlan_stop();
+            }
+            break;
+        case '1':
+            ForceFixedSSID = 1;
+            break;
+        case '2':
+            ForceFixedSSID = 0;
+            server_running = 1;
+            runFirstTimeConfig = 1;
+            runSmartConfig = 1;
+            initTCPIP();
+            server_running = 1;
+            RED_OFF;
+            GREEN_OFF;
+            BLUE_OFF;
+            while(1)
+            {
+                printf("Press the reset button on your board........\n");
+                GREEN_ON;
+                wait_ms(500);
+                GREEN_OFF;
+                wait_ms(500);
+            }
+        default:
+            printf("Wrong selection.\n");
+            printf("Reset the board and try again.\n");
+    }
+    server_running = 0;
+    SmartConfigProfilestored = SMART_CONFIG_SET;
+    RED_OFF;
+    GREEN_OFF;
+    BLUE_OFF; 
+    runTCPIPserver();    // Run TCP/IP Connection to host
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Aug 11 09:46:26 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/b3110cd2dd17
\ No newline at end of file