WiFi DipCortex USB CDC

Dependencies:   HTTPClient NTPClient USBDevice WebSocketClient cc3000_hostdriver_mbedsocket mbed

Fork of WiFiDip-UsbKitchenSink by Carl - SolderSplash Labs

http://www.soldersplash.co.uk/products/wifi-dipcortex/

Demo shows you how to implement the CC3000 library with the WiFi DipCortex.

The demo shows :

  • USB CDC ( Serial ) Menu system allow control of the module and starting each example
  • Smart Connect
  • Manual connect
  • Connection status
  • Ping
  • TCP Client
  • TCP Server
  • Web Socket read/write to sockets.mbed.org
  • HTTP Client test Post, Put, Delete
  • Posting ADC data to Xively every 1 second
  • UDP Client
  • UDP Server
  • NTP Example, contacts time server to get the current time

You will need a Driver for the USB CDC port which can be found here : http://www.soldersplash.co.uk/docs/DipCortex-USB-CDC.zip

Please refer to : http://mbed.org/users/SolderSplashLabs/notebook/dipcortex---getting-started-with-mbed/ as well as the SolderSplash Forum for support http://forum.soldersplash.co.uk/viewforum.php?f=15

Files at this revision

API Documentation at this revision

Comitter:
SolderSplashLabs
Date:
Mon Nov 04 19:55:00 2013 +0000
Child:
1:6f4eaec531c4
Commit message:
Test Project, USB CDC and CC3000 Library

Changed in this revision

HTTPClient.lib Show annotated file Show diff for this revision Revisions of this file
NTPClient.lib Show annotated file Show diff for this revision Revisions of this file
USBDevice.lib Show annotated file Show diff for this revision Revisions of this file
WebSocketClient.lib Show annotated file Show diff for this revision Revisions of this file
cc3000_hostdriver_mbedsocket.lib 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
main.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
tcpTests.cpp Show annotated file Show diff for this revision Revisions of this file
tcpTests.h Show annotated file Show diff for this revision Revisions of this file
wifi.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HTTPClient.lib	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/donatien/code/HTTPClient/#1f743885e7de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NTPClient.lib	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/SolderSplashLabs/code/NTPClient/#240ec02c4bc3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice.lib	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/SolderSplashLabs/code/USBDevice/#01e56c952fe0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebSocketClient.lib	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/samux/code/WebSocketClient/#4567996414a5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cc3000_hostdriver_mbedsocket.lib	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/SolderSplashLabs/code/cc3000_hostdriver_mbedsocket/#960b73df5981
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,617 @@
+ 
+#include "mbed.h"
+#include "cc3000.h"
+#include "wifi.h"
+#include "UDPSocket.h"
+#include "tcpTests.h"
+#include "main.h"
+#include "USBSerial.h"
+#include "NTPClient.h"
+#include <time.h>
+
+using namespace mbed_cc3000;
+
+/* cc3000 module declaration specific for user's board. Check also init() */
+#if (MY_BOARD == WIGO)
+cc3000 wifi(PTA16, PTA13, PTD0, SPI(PTD2, PTD3, PTC5), PORTA_IRQn);
+#elif (MY_BOARD == WIFI_DIPCORTEX)
+cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37), PIN_INT0_IRQn);
+Serial uart(p19, p20);
+USBSerial pc;               // USB CDC serial port
+#else
+
+#endif
+
+#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
+  const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
+#else
+  const uint8_t smartconfigkey = 0;
+#endif
+
+const int ECHO_SERVER_PORT_UDP = 81;
+uint8_t *HostToPing = (uint8_t *)"google.com";
+tNetappIpconfigRetArgs ipinfo;
+extern char tmpBuffer[512];
+
+MENU_LEVEL currentMenu = MENU_TOP;
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Resolve a hostname and ping it
+*/
+// ------------------------------------------------------------------------------------------------------------
+void PingTest ( void )
+{
+uint32_t ip;
+int32_t resolveRetCode = 0;
+    
+    pc.printf("Get an IP address for %s\r\n",HostToPing);
+    resolveRetCode = wifi._socket.gethostbyname(HostToPing,strlen((const char *)HostToPing), &ip);
+    pc.printf("gethostbyname Returned code : %i \r\n", resolveRetCode);
+    
+    if (resolveRetCode > -1) 
+    {
+        uint8_t add0 = (ip >> 24);
+        uint8_t add1 = (ip >> 16);
+        uint8_t add2 = (ip >> 8);
+        uint8_t add3 = (ip >> 0);
+        pc.printf("IP address of %s: %d.%d.%d.%d \r\n", HostToPing, add0, add1, add2, add3);
+        
+        pc.printf("Sending ping\r\n");
+        uint32_t reply_count = wifi.ping(ip, 5, 500, 32);
+        pc.printf("Received %d replies\r\n", reply_count);
+        pc.printf("Ping complete.\r\n");
+    } 
+    else 
+    {
+        pc.printf("Failed to resolve\r\n");
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Test the NTP library
+*/
+// ------------------------------------------------------------------------------------------------------------
+void NtpTest ( void )
+{
+NTPClient ntp;
+struct tm *currentTime;
+    if (ntp.setTime("0.pool.ntp.org",123,10000) == 0)
+    {
+        pc.printf("\r\nGot the time successfully\r\n");
+        currentTime = localtime(&ntp.NTPLastResult);
+        pc.printf("NTP Response : %s\r\n", asctime(currentTime));
+    }
+    else
+    {
+        pc.printf("NTP Update Failed\r\n");
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Send a UDP Packet, wait for response
+*/
+// ------------------------------------------------------------------------------------------------------------
+void UdpClientTest ( void )
+{
+UDPSocket socket;
+int n = 0;
+Endpoint outEndpoint;
+Endpoint inEndpoint;
+
+    if (0 == socket.bind(ECHO_SERVER_PORT_UDP) )
+    {
+        
+        // 2 second timeout
+        socket.set_blocking(false, 2000);
+        
+        pc.printf("\r\n!! Press any key to stop !!\r\n\r\n");
+    
+        while (1)
+        {
+            if( outEndpoint.set_address(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_UDP) < 0 )
+            {
+                pc.printf("Failed to set endpoint address.\r\n");
+                break;
+            }
+            else 
+            {
+                if ( socket.sendTo( outEndpoint, hello, sizeof(hello) ) < 0 )
+                {
+                    pc.printf("Failed to send the packet.\r\n");
+                }
+                else
+                {
+                    // Message sent, recv reply
+                    pc.printf("UDP Socket Sent : %s \r\n", hello);   
+                    n = socket.receiveFrom( inEndpoint, tmpBuffer, sizeof(tmpBuffer) );
+                    if ( n < 0 )
+                    {
+                        pc.printf("Failed to recv the UDP packet.\r\n");
+                    }
+                    else
+                    {
+                        tmpBuffer[n] = '\0';
+                        pc.printf("UDP Socket Recv'd : %s \r\n", tmpBuffer);    
+                    }
+                }
+            }
+    
+            // Should we stop?
+            if ( pc.readable() )
+            {
+                pc.getc();
+                break;
+            }
+        }
+
+        if ( wifi.is_connected() )
+        {        
+            socket.close();
+        }
+    }
+    else
+    {
+        // Failed to bind to the socket
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Listen on a UDP port for messages
+*/
+// ------------------------------------------------------------------------------------------------------------
+void UdpServerTest ( void )
+{
+UDPSocket socket;
+Endpoint client;
+int n = 0;
+
+    if (0 == socket.bind(ECHO_SERVER_PORT_UDP) )
+    {   
+        pc.printf("\r\n!! Press any key to stop listening !!\r\n\r\n");
+        
+        while (true) 
+        {
+            pc.printf("Waiting for packet...\r\n");
+            n = socket.receiveFrom(client, tmpBuffer, sizeof(tmpBuffer));
+        
+            pc.printf("Received packet from: %s\n", client.get_address());
+            socket.sendTo(client, tmpBuffer, n);
+        
+            // Should we stop?
+            if ( pc.readable() )
+            {
+                pc.getc();
+                break;
+            }
+        }
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Print menu header
+*/
+// ------------------------------------------------------------------------------------------------------------
+void Menu_PrintHeader ( void )
+{
+    if (( wifi.is_enabled() ) && ( wifi.is_dhcp_configured() ))
+    {
+        wifi.get_ip_config(&ipinfo);
+    }
+    
+    pc.printf("\r\n");
+    pc.printf("+-------------------------------------------+\r\n");
+    pc.printf("|   WiFi DipCortex / CC3000 Kitchen Sink    |\r\n");
+    pc.printf("+-------------------------------------------+\r\n");
+    if (! wifi.is_enabled() )
+    {
+        pc.printf("|   CC3000 Disabled                         |\r\n"); 
+    }
+    else if ( wifi.is_dhcp_configured() ) 
+    {
+        pc.printf("|   SSID : %-33s|\r\n", ipinfo.uaSSID);
+        pc.printf("|   IP : %-35s|\r\n", wifi.getIPAddress());   
+    }
+    else if ( wifi.is_connected() )
+    {
+        pc.printf("|   Connecting, waiting for DHCP            |\r\n"); 
+    }
+    else
+    {
+        pc.printf("|   Not Connected                           |\r\n");   
+    }
+    pc.printf("+-------------------------------------------+\r\n");
+    pc.printf("\r\n");
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Control the wifi connection
+*/
+// ------------------------------------------------------------------------------------------------------------
+char WaitForSerialCommand ( void )
+{
+char charIn = 0;
+char prevCharIn;
+
+    pc.printf("Enter command character : ");
+  
+    while (1)
+    {
+        prevCharIn = charIn;
+        charIn = pc.getc();
+        
+        pc.printf("%c", charIn);
+        if ((charIn == '\n') || (charIn == '\r'))
+        {
+            break;
+        }
+    }
+    
+    return ( prevCharIn );
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Configure the module for smart connect mode allow configuration over the air
+*/
+// ------------------------------------------------------------------------------------------------------------
+void SmartConfig ( void )
+{
+    // We dont want to auto reconnect to an access point
+    wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
+    
+    // start smart config will disconnect, set the prefix
+    // wait for a message via a SmartConfig app, store it to the profile list
+    // finally it will reenable auto connection, triggering the module to connect to the new access point
+    wifi.start_smart_config(0);
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Print cc3000 information
+*/
+// ------------------------------------------------------------------------------------------------------------
+void print_cc3000_info() {
+uint8_t myMAC[8];
+uint8_t buffer[2];
+int32_t status = 0;
+tNetappIpconfigRetArgs ipinfo2;
+tUserFS cc_user_info;
+const char * WIFI_STATUS[] = {"Disconnected", "Scanning", "Connecting", "Connected"};
+
+    wifi.get_user_file_info((uint8_t *)&cc_user_info, sizeof(cc_user_info));
+    wifi.get_mac_address(myMAC);
+    pc.printf(" MAC address : %02x:%02x:%02x:%02x:%02x:%02x\r\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]);
+    
+    if (! wifi._nvmem.read_sp_version( (unsigned char*)&buffer ) )
+    {
+        pc.printf(" CC3000 Firmware Version : %u.%u \r\n", buffer[0], buffer[1]);
+    }
+    else
+    {
+        pc.printf(" CC3000 Read nvmem failed!");
+    }
+    
+    status = wifi._wlan.ioctl_statusget();
+    if (( status > -1 ) && ( status < 4 ))
+    {
+        pc.printf(" Wifi Status    : %s\r\n", WIFI_STATUS[status]);
+    }
+    else
+    {
+        pc.printf(" Wifi Status    : %d\r\n", status);
+    }
+    
+    if ( wifi.is_dhcp_configured() ) 
+    {
+        wifi.get_ip_config(&ipinfo2);
+        pc.printf(" Connected to   : %s \r\n", ipinfo2.uaSSID);
+        pc.printf(" IP             : %d.%d.%d.%d \r\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]);   
+        pc.printf(" Gateway        : %d.%d.%d.%d \r\n", ipinfo2.aucDefaultGateway[3], ipinfo2.aucDefaultGateway[2], ipinfo2.aucDefaultGateway[1], ipinfo2.aucDefaultGateway[0]);  
+        pc.printf(" Subnet         : %d.%d.%d.%d \r\n", ipinfo2.aucSubnetMask[3], ipinfo2.aucSubnetMask[2], ipinfo2.aucSubnetMask[1], ipinfo2.aucSubnetMask[0]);  
+        pc.printf(" DNS            : %d.%d.%d.%d \r\n", ipinfo2.aucDNSServer[3], ipinfo2.aucDNSServer[2], ipinfo2.aucDNSServer[1], ipinfo2.aucDNSServer[0]);  
+        
+        pc.printf(" Cached IP      : %s \r\n", wifi.getIPAddress());   
+        pc.printf(" Cached Gateway : %s \r\n", wifi.getGateway());   
+        pc.printf(" Cached Subnet  : %s \r\n", wifi.getNetworkMask());   
+
+    }
+    else
+    {
+         pc.printf(" Not connected \r\n");
+    }
+}
+
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Control the wifi connection
+*/
+// ------------------------------------------------------------------------------------------------------------
+void Menu_ConnectionControl ( void )
+{
+uint32_t ip = 0;
+    Menu_PrintHeader();
+    pc.printf(" 1 - Enable auto connect to any previous access point\r\n");
+    pc.printf(" 2 - Disable auto connect \r\n");
+    pc.printf(" 3 - Connect to %s \r\n", SSID);
+    pc.printf(" 4 - Disconnect \r\n");
+    pc.printf(" 5 - Start SmartConfig \r\n");  
+    pc.printf(" 6 - Erase profiles \r\n");  
+    pc.printf(" 7 - Get Status \r\n");
+    pc.printf(" x - Top Menu \r\n");
+    
+    pc.printf("\r\n");
+        
+    switch(WaitForSerialCommand()) 
+    {
+        case '1':      
+            wifi._wlan.ioctl_set_connection_policy(0, 0, 1);
+        break;
+        
+        case '2':      
+            wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
+        break;
+        
+        case '3':     
+        
+            //wifi.start(0);
+            
+            // Enable DHCP
+            wifi._netapp.dhcp(&ip, &ip, &ip, &ip);
+            
+            if ( AP_SECURITY == NONE )
+            {
+                wifi.connect_non_blocking((uint8_t *)SSID, 0, AP_SECURITY);
+            }
+            else
+            {
+                pc.printf("\r\n Connecting to : %s key : %s", SSID, AP_KEY );
+                wifi.connect_non_blocking((uint8_t *)SSID, (uint8_t *)AP_KEY, AP_SECURITY);
+                
+            }      
+        break;
+        
+        case '4' :
+            // Stop the module re-connecting
+            wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
+            // Then disconnect
+            wifi.disconnect();
+        break;
+        
+        case '5' :
+            SmartConfig();
+        break;
+        
+        case '6' :
+            wifi._wlan.ioctl_del_profile(255);
+        break;
+        
+        case '7' :
+            print_cc3000_info();
+        break;
+        
+        case '8':
+            //wifi._spi.manualIrqCheck();
+        break;
+        
+        case 'x':      
+            currentMenu = MENU_TOP;
+        break;
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief 
+*/
+// ------------------------------------------------------------------------------------------------------------
+void Menu_UdpControl ( void )
+{
+    Menu_PrintHeader();
+
+    pc.printf(" 1 - UDP Client, Connect to %s:%d\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_UDP);
+    pc.printf(" 2 - UDP Server \r\n");
+    pc.printf(" 3 - NTP Client \r\n");
+    pc.printf(" x - Exit to top menu \r\n");
+    
+    pc.printf("\r\n");
+    
+    switch(WaitForSerialCommand())  
+    {
+        case '1':      
+            UdpClientTest();
+        break;
+        case '2':      
+            UdpServerTest();
+        break;
+        case '3':      
+            NtpTest();
+        break;
+        case '0': 
+        case 'x':      
+            currentMenu = MENU_TOP;
+        break;
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief 
+*/
+// ------------------------------------------------------------------------------------------------------------
+void Menu_TcpControl ( void )
+{
+    Menu_PrintHeader();
+
+    pc.printf(" 1 - TCP Client, Connect to %s:%d\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP);
+    pc.printf(" 2 - TCP Server, listen on %d.%d.%d.%d:%d\r\n", ipinfo.aucIP[3], ipinfo.aucIP[2], ipinfo.aucIP[1], ipinfo.aucIP[0], ECHO_SERVER_PORT_TCP);
+    pc.printf(" 3 - Web Socket Write \r\n");
+    pc.printf(" 4 - Web Socket Read \r\n");
+    pc.printf(" 5 - HTTP Client \r\n");
+    pc.printf(" 6 - Xively Post ADC's \r\n");
+    pc.printf(" x - Exit to top menu ");
+    pc.printf("\r\n");
+    
+    switch(WaitForSerialCommand()) 
+    {
+        case '1':      
+            TcpClientTest();
+        break;
+        case '2':      
+            TcpServerTest();
+        break;
+        case '3':      
+            WebSocketTest();
+        break;
+        case '4':
+        
+        break;
+        case '5':
+            HttpClientTest();
+        break;
+        case '6':
+            XivelySimpleTest();
+        break;
+        case '0':   
+        case 'x':      
+            currentMenu = MENU_TOP;
+        break;
+    }
+}
+
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Display a menu to the user
+*/
+// ------------------------------------------------------------------------------------------------------------
+void Menu_Top ( void )
+{
+    Menu_PrintHeader();
+    
+    pc.printf(" 1 - Connection control menu \r\n" );
+    pc.printf(" 2 - TCP test menu \r\n" );
+    pc.printf(" 3 - UDP test menu \r\n" );
+    pc.printf(" 4 - Connection status \r\n");
+    pc.printf(" 5 - Ping - %s \r\n", HostToPing);
+    pc.printf(" x - Top Menu \r\n");
+    
+    pc.printf("\r\n");
+ 
+    switch(WaitForSerialCommand()) 
+    {
+        case '1':      
+            currentMenu = MENU_CONNECTION;
+        break;
+        case '2':      
+            currentMenu = MENU_TCP;
+        break;
+        case '3':      
+            currentMenu = MENU_UDP;
+        break;
+        case '4':      
+            print_cc3000_info();
+        break;
+        case '5':      
+            PingTest();
+        break;
+        case 'x':      
+            currentMenu = MENU_TOP;
+        break;
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Pick which menu to display
+*/
+// ------------------------------------------------------------------------------------------------------------
+void MenuSwitch ( void )
+{
+bool connected = false;
+
+    if ( wifi.is_dhcp_configured() )
+    {
+        connected = true;
+    }
+    
+    switch ( currentMenu )
+    {
+        case MENU_TOP :
+            Menu_Top();
+        break;
+        
+        case MENU_CONNECTION :
+            Menu_ConnectionControl();
+        break;
+        
+        case MENU_TCP :
+            if (connected) 
+            {
+                Menu_TcpControl();
+            }
+            else
+            {
+                currentMenu = MENU_TOP;
+            }
+        break;
+        
+        case MENU_UDP :
+            if (connected) 
+            {
+                Menu_UdpControl();
+            }
+            else
+            {
+                currentMenu = MENU_TOP;
+            }
+        break;
+        
+        default :
+            pc.printf("Unknown command\r\n");
+        break;
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Init
+*/
+// ------------------------------------------------------------------------------------------------------------
+void init() 
+{
+    NVIC_SetPriority(SSP1_IRQn, 0x0); 
+    NVIC_SetPriority(PIN_INT0_IRQn, 0x1);
+    
+    // SysTick set to lower priority than Wi-Fi SPI bus interrupt
+    NVIC_SetPriority(SysTick_IRQn, 0x2); 
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief main loop
+*/
+// ------------------------------------------------------------------------------------------------------------
+int main( void ) 
+{   
+    // Initalise the WiFi Module
+    init(); 
+    
+    uart.baud(SERIAL_BAUD_RATE);
+    
+    wait(1);
+    wifi.start(0);
+    
+    wait_ms(750);
+
+    while (1)
+    {
+        MenuSwitch();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,17 @@
+
+#ifndef MAIN_H
+#define MAIN_H
+
+#define SERIAL_BAUD_RATE    115200
+
+typedef enum MENU_LEVEL
+{
+    MENU_TOP = 0,
+    MENU_CONNECTION,
+    MENU_TCP,
+    MENU_UDP    
+} MENU_LEVEL;
+
+extern cc3000 wifi;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcpTests.cpp	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,374 @@
+#include "mbed.h"
+#include "cc3000.h"
+#include "USBSerial.h"
+
+#include "TCPSocketConnection.h"
+#include "TCPSocketServer.h"
+#include "HTTPClient.h"
+#include "Websocket.h"
+
+using namespace mbed_cc3000;
+
+
+extern cc3000 wifi;
+extern USBSerial pc;
+
+HTTPClient http;
+
+// Goto the viewier page here : http://sockets.mbed.org/SolderSplashLabs/viewer to see the websocket writes
+const char WEB_SOCKET_URL[] = {"ws://sockets.mbed.org/ws/SolderSplashLabs/wo"};
+const char* ECHO_SERVER_ADDRESS = "192.168.0.10";
+const int ECHO_SERVER_PORT_TCP = 80;
+char hello[] = "Hello World\r\n";
+char tmpBuffer[512];
+
+
+//char XivelyUrl[] = "http://api.xively.com/v2/feeds/1197891669";
+char XivelyHostname[] = "api.xively.com";
+char XivelyPath[] = "/v2/feeds/1197891669";
+char XivelyApiKey[] = "jUoEs8IbcqKyREzrjCM84H6CehLRMuiG06jjJ15hG0diR2yk";
+
+AnalogIn adc0(P0_11); //P2
+AnalogIn adc1(P0_12); //P3
+AnalogIn adc2(P0_13); //P4
+AnalogIn adc3(P0_14); //P5
+AnalogIn adc5(P0_16); //P8
+AnalogIn adc6(P0_22); //P9
+AnalogIn adc7(P0_23); //P10
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Post all analog inputs to xively
+*/
+// ------------------------------------------------------------------------------------------------------------
+void XivelySimpleTest ( void )
+{
+TCPSocketConnection socket;
+int res = 0;
+uint16_t counter = 0;
+int httpCmdLen = 0;
+    
+    //if ( wifi.is_connected() )
+        
+    while (1)
+    {   
+        if (socket.connect(XivelyHostname, 80) < 0) 
+        {
+            pc.printf("\r\nUnable to connect to (%s) on port (%d)\r\n", XivelyHostname, 80);
+            socket.close();
+        }
+        else
+        {
+            // Block for 1 second
+            socket.set_blocking( true, 1000 );
+            counter ++;
+
+            // Build the header
+            httpCmdLen = sprintf(&tmpBuffer[0], "PUT %s.csv HTTP/1.1\r\n", XivelyPath );
+            httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "Host: %s\r\nUser-Agent: WiFi-DipCortex\r\n", XivelyHostname);
+            httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "X-ApiKey: %s\r\n", XivelyApiKey);
+            httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "Content-Type: text/csv\r\nContent-Length: 91\r\n");
+            httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "Connection: close\r\n\r\n");
+            
+            // add the data
+            httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "ADC0, %05d\r\nADC1, %05d\r\nADC2, %05d\r\nADC3, %05d\r\nADC5, %05d\r\nADC6, %05d\r\nADC7, %05d\r\n\0", 
+                adc0.read_u16(), adc1.read_u16(), adc2.read_u16(), adc3.read_u16(), adc5.read_u16(), adc6.read_u16(), adc7.read_u16());
+                
+            pc.printf("Data to be sent : \r\n %s", tmpBuffer);
+    
+            pc.printf("Posting ADC's to Xively \r\n");
+            res = socket.send_all(tmpBuffer, httpCmdLen);
+            
+            if ( res > 0 )
+            {
+                pc.printf("%05d : Data Sent \r\n", counter);
+            }
+            else
+            {
+                pc.printf("Failed to send\r\n");
+                break;
+            }
+            
+            res = socket.receive(tmpBuffer, 512);
+            
+            if ( res > 0 )
+            {
+                pc.printf("TCP Socket Recv'd : \r\n %s", tmpBuffer);
+                tmpBuffer[res] = '\0';
+            }
+            else
+            {
+                tmpBuffer[0] = '\0';
+                pc.printf("TCP : Failed to Recv\r\n");
+                break;
+            }
+            
+            socket.close();
+        }
+        
+        wait_ms(1000);
+
+        if ( pc.readable() )
+        {
+            pc.printf("Ending Xively Post \r\n");
+            pc.getc();
+            break;
+        }
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Exercise the HTTP Client library
+*/
+// ------------------------------------------------------------------------------------------------------------
+void HttpClientTest ( void )
+{
+
+    //GET data
+    pc.printf("\r\nTrying to fetch page... \r\n");
+    int ret = http.get("http://mbed.org/media/uploads/donatien/hello.txt", tmpBuffer, 128);
+    if (!ret)
+    {
+      pc.printf("Page fetched successfully - read %d characters \r\n", strlen(tmpBuffer));
+      pc.printf("Result: %s \r\n", tmpBuffer);
+    }
+    else
+    {
+      pc.printf("Error - ret = %d - HTTP return code = %d \r\n", tmpBuffer, http.getHTTPResponseCode());
+    }
+ 
+    //POST data
+    HTTPMap map;
+    HTTPText inText(tmpBuffer, 512);
+    map.put("Hello", "World");
+    map.put("test", "1234");
+    pc.printf(" \r\nTrying to post data... \r\n");
+    ret = http.post("http://httpbin.org/post", map, &inText);
+    if (!ret)
+    {
+      pc.printf("Executed POST successfully - read %d characters \r\n", strlen(tmpBuffer));
+      pc.printf("Result: %s \r\n", tmpBuffer);
+    }
+    else
+    {
+      pc.printf("Error - ret = %d - HTTP return code = %d \r\n", ret, http.getHTTPResponseCode());
+    }
+ 
+    //PUT data
+    strcpy(tmpBuffer, "This is a PUT test!");
+    HTTPText outText(tmpBuffer);
+    //HTTPText inText(tmpBuffer, 512);
+    pc.printf(" \r\nTrying to put resource... \r\n");
+    ret = http.put("http://httpbin.org/put", outText, &inText);
+    if (!ret)
+    {
+      pc.printf("Executed PUT successfully - read %d characters \r\n", strlen(tmpBuffer));
+      pc.printf("Result: %s \r\n", tmpBuffer);
+    }
+    else
+    {
+      pc.printf("Error - ret = %d - HTTP return code = %d \r\n", ret, http.getHTTPResponseCode());
+    }
+ 
+    //DELETE data
+    //HTTPText inText(tmpBuffer, 512);
+    pc.printf(" \r\nTrying to delete resource... \r\n");
+    ret = http.del("http://httpbin.org/delete", &inText);
+    if (!ret)
+    {
+      pc.printf("Executed DELETE successfully - read %d characters \r\n", strlen(tmpBuffer));
+      pc.printf("Result: %s \r\n", tmpBuffer);
+    }
+    else
+    {
+      pc.printf("Error - ret = %d - HTTP return code = %d \r\n", ret, http.getHTTPResponseCode());
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Open a WebSocket, send a string
+*/
+// ------------------------------------------------------------------------------------------------------------
+void WebSocketTest ( void )
+{
+
+int res = 0;
+uint16_t counter = 0;
+uint16_t reconnects = 0;
+uint8_t myMAC[8];
+
+    wifi.get_mac_address(myMAC);
+    
+    Websocket ws((char *)WEB_SOCKET_URL);
+    if ( ws.connect() )
+    {
+        pc.printf("Connected to websocket server.\r\n");
+        
+        pc.printf("\r\n!! Press any key to stop sending !!\r\n\r\n");
+        while (1)
+        {   
+            counter ++;
+            sprintf(tmpBuffer, "WiFi DipCortex / CC3000 - %05d - %02x:%02x:%02x:%02x:%02x:%02x\r\n", counter, myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]);
+            
+            if ( wifi.is_connected() )
+            {
+                res = ws.send(tmpBuffer);
+                pc.printf("Reconnects : %05d, Messages Sent : %05d, Websocket send returned : %d.\r\n", reconnects, counter, res);
+            
+                if ( -1 == res ) 
+                {
+                    pc.printf("Websocket Failure, reconnecting .... \r\n");
+                    ws.close();
+                    if ( ws.connect() )
+                    {
+                        // Reconnected
+                        reconnects ++;
+                    }
+                    else
+                    {
+                        // Failure!
+                        break;
+                    }
+                }
+                
+                wait_ms(1000);
+            }
+            else
+            {
+                pc.printf("WiFi Connection Lost .... \r\n");
+            }
+            
+            if ( pc.readable() )
+            {
+                pc.printf("Closing Socket \r\n");
+                pc.getc();
+                break;
+            }
+        }
+        
+        ws.close();
+        pc.printf("Websocket Closed \r\n");
+    }
+}
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Open a TCP port send a string and wait for a reply
+*/
+// ------------------------------------------------------------------------------------------------------------
+void TcpClientTest ( void )
+{
+uint16_t counter = 0;
+TCPSocketConnection socket;
+int n = 0;
+        
+    if (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP) < 0) 
+    {
+        pc.printf("\r\nUnable to connect to (%s) on port (%d)\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP);
+    }
+    else
+    {
+        // Block for 1 second
+        socket.set_blocking( true, 1000 );
+        
+        pc.printf("\r\n!! Press any key to stop sending !!\r\n\r\n");
+        while (1)
+        {   
+            counter ++;
+        
+            n = socket.send_all(hello, sizeof(hello) - 1);
+            
+            if ( n > 0 )
+            {
+                pc.printf("%05d : TCP Socket Sent : Hello World\r\n", counter);
+            }
+            else
+            {
+                pc.printf("Failed to send\r\n");
+                break;
+            }
+     
+            n = socket.receive(tmpBuffer, 256);
+            
+            if ( n > 0 )
+            {
+                pc.printf("TCP Socket Recv'd : %s \r\n", tmpBuffer);
+                tmpBuffer[n] = '\0';
+            }
+            else
+            {
+                tmpBuffer[0] = '\0';
+                pc.printf("TCP : Failed to Recv\r\n");
+                break;
+            }
+            
+            wait_ms(50);
+            
+            // Should we stop?
+            if ( pc.readable() )
+            {
+                pc.printf("Closing Socket \r\n");
+                pc.getc();
+                break;
+            }
+        }
+        if ( wifi.is_connected() )
+        {
+            socket.close();
+        }
+        pc.printf("Completed.\r\n");
+    }
+}
+
+
+// ------------------------------------------------------------------------------------------------------------
+/*!
+    @brief Opens a sockets to listen for connections, upon connection a message is sent and the 
+           client disconnected
+*/
+// ------------------------------------------------------------------------------------------------------------
+void TcpServerTest ( void )
+{
+int32_t status;
+TCPSocketServer server;
+TCPSocketConnection client;
+    
+    server.bind(80);
+    server.listen();
+    pc.printf("\r\n!! Press any key to stop listening !!\r\n\r\n");
+    while (1) 
+    {
+        status = server.accept(client);
+        if (status >= 0) 
+        {
+            client.set_blocking(false, 1500); // Timeout after (1.5)s
+            pc.printf("Connection from: %s \r\n", client.get_address());
+            //client.receive(buffer, sizeof(buffer));
+            //pc.printf("Received: %s \r\n",buffer);
+            pc.printf("Sending the message to the server. \r\n");
+            client.send_all(hello, sizeof(hello));
+            client.close();
+        }
+        
+        // Should we stop?
+        if ( pc.readable() )
+        {
+            pc.printf("Closing Socket \r\n");
+            pc.getc();
+            break;
+        }
+        
+        if (! wifi.is_connected() )
+        {
+            pc.printf("WiFi Connection lost \r\n");
+            break;
+        }
+    }
+    
+    if ( wifi.is_connected() )
+    {
+        server.close();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcpTests.h	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,14 @@
+#ifndef TCPTESTS_H
+#define TCPTESTS_H
+
+void HttpClientTest ( void );
+void WebSocketTest ( void );
+void TcpClientTest ( void );
+void TcpServerTest ( void );
+void XivelySimpleTest ( void );
+
+extern const char *ECHO_SERVER_ADDRESS;
+extern const int ECHO_SERVER_PORT_TCP = 80;
+extern char *hello;
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wifi.h	Mon Nov 04 19:55:00 2013 +0000
@@ -0,0 +1,46 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef WIFI_H
+#define WIFI_H
+
+#include "cc3000.h"
+
+#define WIGO           1
+#define WIFI_DIPCORTEX 2
+#define UNDEFINED      3
+
+#define MY_BOARD WIFI_DIPCORTEX
+
+// use this defines in AP_SECURITY 
+#define NONE 0
+#define WEP  1
+#define WPA  2
+#define WPA2 3
+
+// use smart config
+#define USE_SMART_CONFIG    0
+
+ // Default SSID Settings
+#define SSID            "soldersplash"
+#define AP_KEY          "wifidipcortex"
+#define AP_SECURITY     WPA2 
+
+void init();
+void connect_to_ssid(uint8_t *ssid);
+void connect_to_ssid(char *ssid, char *key, unsigned char sec_mode);
+void print_cc3000_info();
+
+#endif