cc3000 hostdriver with the mbed socket interface

Dependents:   cc3000_hello_world_demo cc3000_simple_socket_demo cc3000_ntp_demo cc3000_ping_demo ... more

Files at this revision

API Documentation at this revision

Comitter:
SolderSplashLabs
Date:
Sat Oct 12 20:51:05 2013 +0000
Parent:
37:3332f57b7f1e
Parent:
39:03ac37ab34eb
Child:
41:eb1999bd50fb
Commit message:
Merged with Martin's

Changed in this revision

cc3000.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/cc3000.cpp	Sat Oct 12 14:27:46 2013 +0200
+++ b/cc3000.cpp	Sat Oct 12 20:51:05 2013 +0000
@@ -60,6 +60,7 @@
     _status.smart_config_complete = 0;
     _status.stop_smart_config = 0;
     _status.ok_to_shut_down = 0;
+    _status.enabled = 0;
 
     _inst = this;
 }
@@ -68,6 +69,67 @@
 
 }
 
+#ifdef CC3000_ETH_COMPAT
+// Ethernet library compatible, functions return strings
+// Caches the ipconfig from the usync callback
+static char mac_addr[19];
+static char ip_addr[17] = "\0";
+static char gateway[17] = "\0";
+static char networkmask[17] = "\0";
+
+char* cc3000::getMACAddress() {
+    return mac_addr;
+}
+
+char* cc3000::getIPAddress() {
+    return ip_addr;
+}
+
+char* cc3000::getGateway() {
+    return gateway;
+}
+
+char* cc3000::getNetworkMask() {
+    return networkmask;
+}
+
+/* Copied from lwip , modified to accept an uint32*/
+static char *inet_ntoa_r(uint32_t s_addr, char *buf, int buflen)
+{
+  char inv[3];
+  char *rp;
+  uint8_t *ap;
+  uint8_t rem;
+  uint8_t n;
+  uint8_t i;
+  int len = 0;
+
+  rp = buf;
+  ap = (uint8_t *)&s_addr;
+  for(n = 0; n < 4; n++) {
+    i = 0;
+    do {
+      rem = *ap % (uint8_t)10;
+      *ap /= (uint8_t)10;
+      inv[i++] = '0' + rem;
+    } while(*ap);
+    while(i--) {
+      if (len++ >= buflen) {
+        return NULL;
+      }
+      *rp++ = inv[i];
+    }
+    if (len++ >= buflen) {
+      return NULL;
+    }
+    *rp++ = '.';
+    ap++;
+  }
+  *--rp = 0;
+  return buf;
+}
+#endif
+
 void cc3000::usync_callback(int32_t event_type, uint8_t * data, uint8_t length) {
     if (event_type == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE)
     {
@@ -78,6 +140,8 @@
     if (event_type == HCI_EVNT_WLAN_UNSOL_CONNECT)
     {
         _status.connected = 1;
+        // Connect message is always followed by a DHCP message, connection is not useable until then
+        _status.dhcp      = 0;
     }
 
     if (event_type == HCI_EVNT_WLAN_UNSOL_DISCONNECT)
@@ -89,6 +153,15 @@
 
     if (event_type == HCI_EVNT_WLAN_UNSOL_DHCP)
     {
+      #ifdef CC3000_ETH_COMPAT
+    
+      inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_IP_OFFSET]))), ip_addr, 17);
+      inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_GW_OFFSET]))), gateway, 17);
+      inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_SUBNET_OFFSET]))), networkmask, 17);
+      inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_MAC_OFFSET]))), mac_addr, 19);
+    
+      #endif
+      
       if ( *(data + NETAPP_IPCONFIG_MAC_OFFSET) == 0) {
           _status.dhcp = 1;
       } else {
@@ -116,6 +189,8 @@
 }
 
 void cc3000::start_smart_config(const uint8_t *smart_config_key) {
+
+    _status.smart_config_complete = 0;
     _wlan.ioctl_set_connection_policy(0, 0, 0);
 
     //Wait until CC3000 is disconected
@@ -151,13 +226,14 @@
 
     // Configure to connect automatically to the AP retrieved in the
     // Smart config process
-    _wlan.ioctl_set_connection_policy(0, 1, 1);
+    _wlan.ioctl_set_connection_policy(0, 0, 1);
 
     // reset the CC3000
     _wlan.stop();
-    wait(2);
+    _status.enabled = 0;
+    wait(5);
     _wlan.start(0);
-    wait(2);
+    _status.enabled = 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);
@@ -177,6 +253,32 @@
     return ret;
 }
 
+bool cc3000::connect_non_blocking(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) 
+{
+bool ret = false;
+
+    if (key == 0) 
+    {
+        if (connect_open(ssid)) 
+        {
+            ret = true;
+        }
+    }
+    else 
+    {
+    #ifndef CC3000_TINY_DRIVER
+        if (connect_secure(ssid,key,security_mode)) 
+        {
+            ret = true;
+        }
+    #else
+        /* secure connection not supported with TINY_DRIVER */
+    #endif
+    }
+    
+    return ret;
+}
+
 bool cc3000::connect_to_AP(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) {
     Timer t;  /* TODO static? */
     bool ret = true;
@@ -212,17 +314,21 @@
 
 void cc3000::start(uint8_t patch) {
     _wlan.start(patch);
+    _status.enabled = 1;
     _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE);
 }
 
 void cc3000::stop(void) {
     _wlan.stop();
+    _status.enabled = 0;
 }
 
 void cc3000::restart(uint8_t patch) {
     _wlan.stop();
+    _status.enabled = 0;
     wait_ms(500);
     _wlan.start(patch);
+    _status.enabled = 1;
 }
 
 bool cc3000::connect_open(const uint8_t *ssid) {
@@ -243,6 +349,11 @@
     return ret;
 }
 
+bool cc3000::is_enabled()
+{
+    return _status.enabled;
+}
+
 bool cc3000::is_connected() {
     return _status.connected;
 }
--- a/cc3000.h	Sat Oct 12 14:27:46 2013 +0200
+++ b/cc3000.h	Sat Oct 12 20:51:05 2013 +0000
@@ -50,24 +50,25 @@
 #include "cc3000_socket.h"
 
 #define MAX_SOCKETS 4
+#define CC3000_ETH_COMPAT
 
 /** Enable debug messages, remove comment from the ones you want or all.
  */
 
 // Debug - Socket interface messages
-//#define CC3000_DEBUG_SOCKET
+#define CC3000_DEBUG_SOCKET
 
 // Debug - HCI TX messages
-//#define CC3000_DEBUG_HCI_TX
+#define CC3000_DEBUG_HCI_TX
 
 // Debug - HCI Rx messages
-//#define CC3000_DEBUG_HCI_RX
+#define CC3000_DEBUG_HCI_RX
 
 // Debug - General Debug
-//#define CC3000_DEBUG
+#define CC3000_DEBUG
 
 // Add colour to the debug messages, requires a VT100 terminal like putty, comment out to remove
-//#define VT100_COLOUR
+#define VT100_COLOUR
 
 #ifdef CC3000_DEBUG_SOCKET
 
@@ -1543,6 +1544,7 @@
         bool    stop_smart_config;
         bool    dhcp_configured;
         bool    ok_to_shut_down;
+        bool    enabled;
     } tStatus;
     /**
      *  \brief Ctor.
@@ -1584,7 +1586,15 @@
      */
     void usync_callback(int32_t event_type, uint8_t *data, uint8_t length);
     /**
-     *  \brief Connect to SSID (open/secured) with timeout (10ms).
+     *  \brief Start connection to SSID (open/secured) non-blocking
+     *  \param ssid          SSID name
+     *  \param key           Security key (if key = 0, open connection)
+     *  \param security_mode Security mode
+     *  \return true if connection was established, false otherwise.
+     */
+    bool connect_non_blocking(const uint8_t *ssid, const uint8_t *key, int32_t security_mode);
+    /**
+     *  \brief Connect to SSID (open/secured) with timeout (10s).
      *  \param ssid          SSID name
      *  \param key           Security key (if key = 0, open connection)
      *  \param security_mode Security mode
@@ -1606,6 +1616,11 @@
      */
     bool connect_open(const uint8_t *ssid);
     /**
+     *  \brief Status of the cc3000 module.
+     *  \return true if it's enabled, false otherwise.
+     */
+    bool is_enabled();
+    /**
      *  \brief Status of the cc3000 connection.
      *  \return true if it's connected, false otherwise.
      */
@@ -1683,6 +1698,35 @@
     static cc3000 *get_instance() {
         return _inst;
     }
+#ifdef CC3000_ETH_COMPAT
+    /**
+     *  \brief 
+     *  \param 
+     *  \return 
+     */
+    char* getMACAddress();
+
+     /**
+     *  \brief 
+     *  \param 
+     *  \return 
+     */
+    char* getIPAddress();
+
+     /**
+     *  \brief 
+     *  \param
+     *  \return 
+     */
+    char* getGateway();
+
+     /**
+     *  \brief 
+     *  \param 
+     *  \return 
+     */
+    char* getNetworkMask();
+#endif
 public:
     cc3000_simple_link  _simple_link;
     cc3000_event        _event;
--- a/cc3000_event.cpp	Sat Oct 12 14:27:46 2013 +0200
+++ b/cc3000_event.cpp	Sat Oct 12 20:51:05 2013 +0000
@@ -198,6 +198,7 @@
 #endif
 }
 
+Timer timer;
 uint8_t *cc3000_event::hci_event_handler(void *ret_param, uint8_t *from, uint8_t *fromlen) {
     uint8_t *received_data, argument_size;
     uint16_t length;
@@ -206,7 +207,11 @@
     uint32_t return_value;
     uint8_t * RecvParams;
     uint8_t *RetParams;
-
+    
+    
+    timer.reset();
+    timer.start();
+    
     while (1)
     {
         if (_simple_link.get_data_received_flag() != 0)
@@ -396,8 +401,13 @@
 
                         //Read SSID
                         STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH);
-
+                        break;
+                        
+                    default :
+                        DBG_HCI("UNKNOWN Event Received : 0x%04X ", received_op_code);
+                        break;
                     }
+ 
                 }
                 if (received_op_code == _simple_link.get_op_code())
                 {
@@ -440,6 +450,12 @@
                 return NULL;
             }
         }
+        
+        if ( timer.read_ms() > 10000)
+        {
+            DBG_HCI("TIMEOUT Waiting for CC3000 Event - BAD");
+            break;
+        }
     }
 }