Kojto CC3000 Hostdriver With Mbed Socket interface

Dependents:   WiFiDip-KitchenSink WiFiDip-UsbKitchenSink WiFiDipCortexSensor WifiDipCortex-UDPDemo

Fork of cc3000_hostdriver_mbedsocket by Martin Kojtal

Committer:
SolderSplashLabs
Date:
Sat Oct 12 21:53:28 2013 +0000
Revision:
42:bd2c631a031a
Parent:
41:eb1999bd50fb
Child:
44:960b73df5981
Added David's IRQ checking before re-enabling the IRQ.; Modified the is_connected function, connect + dhcp are needed ; Moved inet_ntoa_r to the socket class, not sure this is the best place, but other conversion functions live here.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 21:30b6ed7bf8fd 1 /*****************************************************************************
Kojto 21:30b6ed7bf8fd 2 *
Kojto 21:30b6ed7bf8fd 3 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
Kojto 21:30b6ed7bf8fd 4 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
Kojto 21:30b6ed7bf8fd 5 * provided help.
Kojto 21:30b6ed7bf8fd 6 *
Kojto 21:30b6ed7bf8fd 7 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus
Kojto 21:30b6ed7bf8fd 8 * read the following copyright:
Kojto 21:30b6ed7bf8fd 9 *
Kojto 21:30b6ed7bf8fd 10 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
Kojto 21:30b6ed7bf8fd 11 *
Kojto 21:30b6ed7bf8fd 12 * Redistribution and use in source and binary forms, with or without
Kojto 21:30b6ed7bf8fd 13 * modification, are permitted provided that the following conditions
Kojto 21:30b6ed7bf8fd 14 * are met:
Kojto 21:30b6ed7bf8fd 15 *
Kojto 21:30b6ed7bf8fd 16 * Redistributions of source code must retain the above copyright
Kojto 21:30b6ed7bf8fd 17 * notice, this list of conditions and the following disclaimer.
Kojto 21:30b6ed7bf8fd 18 *
Kojto 21:30b6ed7bf8fd 19 * Redistributions in binary form must reproduce the above copyright
Kojto 21:30b6ed7bf8fd 20 * notice, this list of conditions and the following disclaimer in the
Kojto 21:30b6ed7bf8fd 21 * documentation and/or other materials provided with the
Kojto 21:30b6ed7bf8fd 22 * distribution.
Kojto 21:30b6ed7bf8fd 23 *
Kojto 21:30b6ed7bf8fd 24 * Neither the name of Texas Instruments Incorporated nor the names of
Kojto 21:30b6ed7bf8fd 25 * its contributors may be used to endorse or promote products derived
Kojto 21:30b6ed7bf8fd 26 * from this software without specific prior written permission.
Kojto 21:30b6ed7bf8fd 27 *
Kojto 21:30b6ed7bf8fd 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Kojto 21:30b6ed7bf8fd 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Kojto 21:30b6ed7bf8fd 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Kojto 21:30b6ed7bf8fd 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Kojto 21:30b6ed7bf8fd 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Kojto 21:30b6ed7bf8fd 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Kojto 21:30b6ed7bf8fd 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Kojto 21:30b6ed7bf8fd 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Kojto 21:30b6ed7bf8fd 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Kojto 21:30b6ed7bf8fd 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Kojto 21:30b6ed7bf8fd 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Kojto 21:30b6ed7bf8fd 39 *
Kojto 21:30b6ed7bf8fd 40 *****************************************************************************/
Kojto 21:30b6ed7bf8fd 41 #include "cc3000.h"
Kojto 21:30b6ed7bf8fd 42 #include "cc3000_event.h"
Kojto 21:30b6ed7bf8fd 43
Kojto 21:30b6ed7bf8fd 44 namespace mbed_cc3000 {
Kojto 21:30b6ed7bf8fd 45
Kojto 21:30b6ed7bf8fd 46 /* TODO this prefix remove? verify */
Kojto 21:30b6ed7bf8fd 47 static uint8_t cc3000_prefix[] = {'T', 'T', 'T'};
Kojto 21:30b6ed7bf8fd 48 cc3000 *cc3000::_inst;
Kojto 21:30b6ed7bf8fd 49
Kojto 21:30b6ed7bf8fd 50 cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, IRQn_Type irq_port)
Kojto 21:30b6ed7bf8fd 51 : _event(_simple_link, _hci, _spi, *this), _socket(_simple_link, _hci, _event), _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, irq_port, _event, _simple_link), _hci(_spi),
Kojto 21:30b6ed7bf8fd 52 _nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event), _wlan(_simple_link, _event, _spi, _hci) {
Kojto 21:30b6ed7bf8fd 53 /* TODO - pIRQ riorities ?? */
Kojto 21:30b6ed7bf8fd 54
Kojto 21:30b6ed7bf8fd 55 _simple_link.set_tx_complete_signal(1);
Kojto 21:30b6ed7bf8fd 56 _status.dhcp = 0;
Kojto 21:30b6ed7bf8fd 57 _status.connected = 0;
Kojto 21:30b6ed7bf8fd 58 _status.socket = 0;
Kojto 21:30b6ed7bf8fd 59 _status.dhcp_configured = 0;
Kojto 21:30b6ed7bf8fd 60 _status.smart_config_complete = 0;
Kojto 21:30b6ed7bf8fd 61 _status.stop_smart_config = 0;
Kojto 21:30b6ed7bf8fd 62 _status.ok_to_shut_down = 0;
SolderSplashLabs 37:03ac37ab34eb 63 _status.enabled = 0;
Kojto 21:30b6ed7bf8fd 64
Kojto 21:30b6ed7bf8fd 65 _inst = this;
Kojto 21:30b6ed7bf8fd 66 }
Kojto 21:30b6ed7bf8fd 67
Kojto 21:30b6ed7bf8fd 68 cc3000::~cc3000() {
Kojto 21:30b6ed7bf8fd 69
Kojto 21:30b6ed7bf8fd 70 }
Kojto 21:30b6ed7bf8fd 71
SolderSplashLabs 37:03ac37ab34eb 72 #ifdef CC3000_ETH_COMPAT
SolderSplashLabs 37:03ac37ab34eb 73 // Ethernet library compatible, functions return strings
SolderSplashLabs 37:03ac37ab34eb 74 // Caches the ipconfig from the usync callback
SolderSplashLabs 37:03ac37ab34eb 75 static char mac_addr[19];
SolderSplashLabs 37:03ac37ab34eb 76 static char ip_addr[17] = "\0";
SolderSplashLabs 37:03ac37ab34eb 77 static char gateway[17] = "\0";
SolderSplashLabs 37:03ac37ab34eb 78 static char networkmask[17] = "\0";
SolderSplashLabs 37:03ac37ab34eb 79
SolderSplashLabs 37:03ac37ab34eb 80 char* cc3000::getMACAddress() {
SolderSplashLabs 37:03ac37ab34eb 81 return mac_addr;
SolderSplashLabs 37:03ac37ab34eb 82 }
SolderSplashLabs 37:03ac37ab34eb 83
SolderSplashLabs 37:03ac37ab34eb 84 char* cc3000::getIPAddress() {
SolderSplashLabs 37:03ac37ab34eb 85 return ip_addr;
SolderSplashLabs 37:03ac37ab34eb 86 }
SolderSplashLabs 37:03ac37ab34eb 87
SolderSplashLabs 37:03ac37ab34eb 88 char* cc3000::getGateway() {
SolderSplashLabs 37:03ac37ab34eb 89 return gateway;
SolderSplashLabs 37:03ac37ab34eb 90 }
SolderSplashLabs 37:03ac37ab34eb 91
SolderSplashLabs 37:03ac37ab34eb 92 char* cc3000::getNetworkMask() {
SolderSplashLabs 37:03ac37ab34eb 93 return networkmask;
SolderSplashLabs 37:03ac37ab34eb 94 }
SolderSplashLabs 37:03ac37ab34eb 95
SolderSplashLabs 37:03ac37ab34eb 96 #endif
SolderSplashLabs 37:03ac37ab34eb 97
Kojto 21:30b6ed7bf8fd 98 void cc3000::usync_callback(int32_t event_type, uint8_t * data, uint8_t length) {
Kojto 21:30b6ed7bf8fd 99 if (event_type == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE)
Kojto 21:30b6ed7bf8fd 100 {
SolderSplashLabs 41:eb1999bd50fb 101 DBG_CC("Callback : HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE");
Kojto 21:30b6ed7bf8fd 102 _status.smart_config_complete = 1;
Kojto 21:30b6ed7bf8fd 103 _status.stop_smart_config = 1;
Kojto 21:30b6ed7bf8fd 104 }
Kojto 21:30b6ed7bf8fd 105
Kojto 21:30b6ed7bf8fd 106 if (event_type == HCI_EVNT_WLAN_UNSOL_CONNECT)
Kojto 21:30b6ed7bf8fd 107 {
SolderSplashLabs 41:eb1999bd50fb 108 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_CONNECT");
Kojto 21:30b6ed7bf8fd 109 _status.connected = 1;
SolderSplashLabs 37:03ac37ab34eb 110 // Connect message is always followed by a DHCP message, connection is not useable until then
SolderSplashLabs 37:03ac37ab34eb 111 _status.dhcp = 0;
Kojto 21:30b6ed7bf8fd 112 }
Kojto 21:30b6ed7bf8fd 113
Kojto 21:30b6ed7bf8fd 114 if (event_type == HCI_EVNT_WLAN_UNSOL_DISCONNECT)
Kojto 21:30b6ed7bf8fd 115 {
SolderSplashLabs 41:eb1999bd50fb 116 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_DISCONNECT");
Kojto 21:30b6ed7bf8fd 117 _status.connected = 0;
Kojto 21:30b6ed7bf8fd 118 _status.dhcp = 0;
Kojto 21:30b6ed7bf8fd 119 _status.dhcp_configured = 0;
Kojto 21:30b6ed7bf8fd 120 }
Kojto 21:30b6ed7bf8fd 121
Kojto 21:30b6ed7bf8fd 122 if (event_type == HCI_EVNT_WLAN_UNSOL_DHCP)
Kojto 21:30b6ed7bf8fd 123 {
SolderSplashLabs 41:eb1999bd50fb 124 #ifdef CC3000_ETH_COMPAT
SolderSplashLabs 41:eb1999bd50fb 125
SolderSplashLabs 42:bd2c631a031a 126 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_IP_OFFSET]))), ip_addr, 17);
SolderSplashLabs 42:bd2c631a031a 127 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_GW_OFFSET]))), gateway, 17);
SolderSplashLabs 42:bd2c631a031a 128 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_SUBNET_OFFSET]))), networkmask, 17);
SolderSplashLabs 42:bd2c631a031a 129 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_MAC_OFFSET]))), mac_addr, 19);
SolderSplashLabs 41:eb1999bd50fb 130
SolderSplashLabs 41:eb1999bd50fb 131 #endif
SolderSplashLabs 41:eb1999bd50fb 132
SolderSplashLabs 41:eb1999bd50fb 133 if ( *(data + NETAPP_IPCONFIG_MAC_OFFSET) == 0) {
SolderSplashLabs 41:eb1999bd50fb 134 _status.dhcp = 1;
SolderSplashLabs 41:eb1999bd50fb 135 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_DHCP %i.%i.%i.%i", data[3], data[2], data[1], data[0]);
SolderSplashLabs 41:eb1999bd50fb 136 } else {
SolderSplashLabs 42:bd2c631a031a 137 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_DHCP - Disconnecting");
SolderSplashLabs 41:eb1999bd50fb 138 _status.dhcp = 0;
SolderSplashLabs 41:eb1999bd50fb 139 }
Kojto 21:30b6ed7bf8fd 140 }
Kojto 21:30b6ed7bf8fd 141
Kojto 21:30b6ed7bf8fd 142 if (event_type == HCI_EVENT_CC3000_CAN_SHUT_DOWN)
Kojto 21:30b6ed7bf8fd 143 {
SolderSplashLabs 41:eb1999bd50fb 144 // Note this means the moudles is idle, so it could be shutdown..
SolderSplashLabs 41:eb1999bd50fb 145 //DBG_CC("Callback : HCI_EVENT_CC3000_CAN_SHUT_DOWN");
Kojto 21:30b6ed7bf8fd 146 _status.ok_to_shut_down = 1;
Kojto 21:30b6ed7bf8fd 147 }
Kojto 21:30b6ed7bf8fd 148
Kojto 21:30b6ed7bf8fd 149 if (event_type == HCI_EVNT_WLAN_ASYNC_PING_REPORT)
Kojto 21:30b6ed7bf8fd 150 {
SolderSplashLabs 41:eb1999bd50fb 151 DBG_CC("Callback : HCI_EVNT_WLAN_ASYNC_PING_REPORT");
Kojto 21:30b6ed7bf8fd 152 memcpy(&_ping_report, data, length);
Kojto 21:30b6ed7bf8fd 153 }
Kojto 21:30b6ed7bf8fd 154
Kojto 21:30b6ed7bf8fd 155 if (event_type == HCI_EVNT_BSD_TCP_CLOSE_WAIT) {
Kojto 21:30b6ed7bf8fd 156 uint8_t socketnum;
Kojto 21:30b6ed7bf8fd 157 socketnum = data[0];
SolderSplashLabs 41:eb1999bd50fb 158 DBG_CC("Callback : HCI_EVNT_BSD_TCP_CLOSE_WAIT - Socket : %d", socketnum);
Kojto 21:30b6ed7bf8fd 159 if (socketnum < MAX_SOCKETS) {
Kojto 21:30b6ed7bf8fd 160 _closed_sockets[socketnum] = true; /* clients socket is closed */
Kojto 21:30b6ed7bf8fd 161 }
Kojto 21:30b6ed7bf8fd 162 }
Kojto 21:30b6ed7bf8fd 163 }
Kojto 21:30b6ed7bf8fd 164
Kojto 21:30b6ed7bf8fd 165 void cc3000::start_smart_config(const uint8_t *smart_config_key) {
SolderSplashLabs 37:03ac37ab34eb 166
SolderSplashLabs 37:03ac37ab34eb 167 _status.smart_config_complete = 0;
Kojto 21:30b6ed7bf8fd 168 _wlan.ioctl_set_connection_policy(0, 0, 0);
SolderSplashLabs 42:bd2c631a031a 169
SolderSplashLabs 42:bd2c631a031a 170 if (_status.connected == 1)
SolderSplashLabs 42:bd2c631a031a 171 {
SolderSplashLabs 42:bd2c631a031a 172 disconnect();
SolderSplashLabs 42:bd2c631a031a 173 }
Kojto 21:30b6ed7bf8fd 174
Kojto 21:30b6ed7bf8fd 175 //Wait until CC3000 is disconected
Kojto 21:30b6ed7bf8fd 176 while (_status.connected == 1)
Kojto 21:30b6ed7bf8fd 177 {
Kojto 21:30b6ed7bf8fd 178 wait_us(5);
Kojto 21:30b6ed7bf8fd 179 _event.hci_unsolicited_event_handler();
Kojto 21:30b6ed7bf8fd 180 }
Kojto 21:30b6ed7bf8fd 181
Kojto 21:30b6ed7bf8fd 182 // Trigger the Smart Config process
Kojto 21:30b6ed7bf8fd 183 _wlan.smart_config_set_prefix(cc3000_prefix);
Kojto 21:30b6ed7bf8fd 184 // Start the Smart Config process with AES disabled
Kojto 21:30b6ed7bf8fd 185 _wlan.smart_config_start(0);
Kojto 21:30b6ed7bf8fd 186
Kojto 21:30b6ed7bf8fd 187 DBG_CC("Waiting for smartconfig to be completed");
Kojto 21:30b6ed7bf8fd 188
Kojto 21:30b6ed7bf8fd 189 // Wait for Smart config finished
Kojto 21:30b6ed7bf8fd 190 while (_status.smart_config_complete == 0)
Kojto 21:30b6ed7bf8fd 191 {
Kojto 21:30b6ed7bf8fd 192 wait_ms(100);
Kojto 21:30b6ed7bf8fd 193 }
Kojto 21:30b6ed7bf8fd 194
Kojto 21:30b6ed7bf8fd 195 DBG_CC("Smartconfig finished");
Kojto 21:30b6ed7bf8fd 196
Kojto 21:30b6ed7bf8fd 197 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
Kojto 21:30b6ed7bf8fd 198 // create new entry for AES encryption key
Kojto 21:30b6ed7bf8fd 199 _nvmem.create_entry(NVMEM_AES128_KEY_FILEID, 16);
Kojto 21:30b6ed7bf8fd 200 // write AES key to NVMEM
Kojto 21:30b6ed7bf8fd 201 _security.aes_write_key((uint8_t *)(&smart_config_key[0]));
Kojto 21:30b6ed7bf8fd 202 // Decrypt configuration information and add profile
Kojto 21:30b6ed7bf8fd 203 _wlan.smart_config_process();
Kojto 21:30b6ed7bf8fd 204 #endif
Kojto 21:30b6ed7bf8fd 205
Kojto 21:30b6ed7bf8fd 206 // Configure to connect automatically to the AP retrieved in the
Kojto 21:30b6ed7bf8fd 207 // Smart config process
SolderSplashLabs 37:03ac37ab34eb 208 _wlan.ioctl_set_connection_policy(0, 0, 1);
Kojto 21:30b6ed7bf8fd 209
Kojto 21:30b6ed7bf8fd 210 // reset the CC3000
Kojto 21:30b6ed7bf8fd 211 _wlan.stop();
SolderSplashLabs 37:03ac37ab34eb 212 _status.enabled = 0;
SolderSplashLabs 37:03ac37ab34eb 213 wait(5);
Kojto 21:30b6ed7bf8fd 214 _wlan.start(0);
SolderSplashLabs 37:03ac37ab34eb 215 _status.enabled = 1;
Kojto 21:30b6ed7bf8fd 216
Kojto 21:30b6ed7bf8fd 217 // Mask out all non-required events
Kojto 38:1f70a62a160e 218 _wlan.set_event_mask(HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
Kojto 21:30b6ed7bf8fd 219 }
Kojto 21:30b6ed7bf8fd 220
Kojto 21:30b6ed7bf8fd 221 bool cc3000::connect_secure(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) {
Kojto 21:30b6ed7bf8fd 222 uint32_t ret;
Kojto 21:30b6ed7bf8fd 223
SolderSplashLabs 42:bd2c631a031a 224 //_wlan.disconnect();
Kojto 21:30b6ed7bf8fd 225 wait_ms(3);
Kojto 21:30b6ed7bf8fd 226 ret = _wlan.connect(security_mode, ssid, strlen((const char *)ssid), 0, (uint8_t *)key, strlen((const char *)key));
Kojto 21:30b6ed7bf8fd 227 if (ret == 0) { /* TODO static internal cc3000 state 0 to TRUE */
Kojto 21:30b6ed7bf8fd 228 ret = true;
Kojto 21:30b6ed7bf8fd 229 } else {
Kojto 21:30b6ed7bf8fd 230 ret = false;
Kojto 21:30b6ed7bf8fd 231 }
Kojto 21:30b6ed7bf8fd 232 return ret;
Kojto 21:30b6ed7bf8fd 233 }
Kojto 21:30b6ed7bf8fd 234
SolderSplashLabs 37:03ac37ab34eb 235 bool cc3000::connect_non_blocking(const uint8_t *ssid, const uint8_t *key, int32_t security_mode)
SolderSplashLabs 37:03ac37ab34eb 236 {
SolderSplashLabs 37:03ac37ab34eb 237 bool ret = false;
SolderSplashLabs 37:03ac37ab34eb 238
SolderSplashLabs 37:03ac37ab34eb 239 if (key == 0)
SolderSplashLabs 37:03ac37ab34eb 240 {
SolderSplashLabs 37:03ac37ab34eb 241 if (connect_open(ssid))
SolderSplashLabs 37:03ac37ab34eb 242 {
SolderSplashLabs 37:03ac37ab34eb 243 ret = true;
SolderSplashLabs 37:03ac37ab34eb 244 }
SolderSplashLabs 37:03ac37ab34eb 245 }
SolderSplashLabs 37:03ac37ab34eb 246 else
SolderSplashLabs 37:03ac37ab34eb 247 {
SolderSplashLabs 37:03ac37ab34eb 248 #ifndef CC3000_TINY_DRIVER
SolderSplashLabs 37:03ac37ab34eb 249 if (connect_secure(ssid,key,security_mode))
SolderSplashLabs 37:03ac37ab34eb 250 {
SolderSplashLabs 37:03ac37ab34eb 251 ret = true;
SolderSplashLabs 37:03ac37ab34eb 252 }
SolderSplashLabs 37:03ac37ab34eb 253 #else
SolderSplashLabs 37:03ac37ab34eb 254 /* secure connection not supported with TINY_DRIVER */
SolderSplashLabs 37:03ac37ab34eb 255 #endif
SolderSplashLabs 37:03ac37ab34eb 256 }
SolderSplashLabs 37:03ac37ab34eb 257
SolderSplashLabs 37:03ac37ab34eb 258 return ret;
SolderSplashLabs 37:03ac37ab34eb 259 }
SolderSplashLabs 37:03ac37ab34eb 260
Kojto 21:30b6ed7bf8fd 261 bool cc3000::connect_to_AP(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) {
Kojto 21:30b6ed7bf8fd 262 Timer t; /* TODO static? */
Kojto 21:30b6ed7bf8fd 263 bool ret = true;
Kojto 21:30b6ed7bf8fd 264
Kojto 21:30b6ed7bf8fd 265 t.start();
Kojto 21:30b6ed7bf8fd 266 while (is_connected() == false) {
Kojto 21:30b6ed7bf8fd 267 if (key == 0) {
Kojto 21:30b6ed7bf8fd 268 if (connect_open(ssid)) {
Kojto 21:30b6ed7bf8fd 269 break;
Kojto 21:30b6ed7bf8fd 270 }
Kojto 21:30b6ed7bf8fd 271 } else {
Kojto 21:30b6ed7bf8fd 272 #ifndef CC3000_TINY_DRIVER
Kojto 21:30b6ed7bf8fd 273 if (connect_secure(ssid,key,security_mode)) {
Kojto 21:30b6ed7bf8fd 274 break;
Kojto 21:30b6ed7bf8fd 275 }
Kojto 21:30b6ed7bf8fd 276 #else
Kojto 21:30b6ed7bf8fd 277 return false; /* secure connection not supported with TINY_DRIVER */
Kojto 21:30b6ed7bf8fd 278 #endif
Kojto 21:30b6ed7bf8fd 279 }
Kojto 21:30b6ed7bf8fd 280
Kojto 21:30b6ed7bf8fd 281 /* timeout 10 seconds */
Kojto 21:30b6ed7bf8fd 282 if (t.read_ms() > 10000){
Kojto 21:30b6ed7bf8fd 283 ret = false;
Kojto 21:30b6ed7bf8fd 284
Kojto 21:30b6ed7bf8fd 285 DBG_CC("Connection to AP failed");
Kojto 21:30b6ed7bf8fd 286
Kojto 21:30b6ed7bf8fd 287 break;
Kojto 21:30b6ed7bf8fd 288 }
Kojto 21:30b6ed7bf8fd 289 }
Kojto 21:30b6ed7bf8fd 290
Kojto 21:30b6ed7bf8fd 291 return ret;
Kojto 21:30b6ed7bf8fd 292 }
Kojto 21:30b6ed7bf8fd 293
Kojto 21:30b6ed7bf8fd 294 void cc3000::start(uint8_t patch) {
Kojto 21:30b6ed7bf8fd 295 _wlan.start(patch);
SolderSplashLabs 37:03ac37ab34eb 296 _status.enabled = 1;
Kojto 21:30b6ed7bf8fd 297 _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE);
Kojto 21:30b6ed7bf8fd 298 }
Kojto 21:30b6ed7bf8fd 299
Kojto 21:30b6ed7bf8fd 300 void cc3000::stop(void) {
Kojto 21:30b6ed7bf8fd 301 _wlan.stop();
SolderSplashLabs 37:03ac37ab34eb 302 _status.enabled = 0;
Kojto 21:30b6ed7bf8fd 303 }
Kojto 21:30b6ed7bf8fd 304
Kojto 21:30b6ed7bf8fd 305 void cc3000::restart(uint8_t patch) {
Kojto 21:30b6ed7bf8fd 306 _wlan.stop();
SolderSplashLabs 37:03ac37ab34eb 307 _status.enabled = 0;
Kojto 21:30b6ed7bf8fd 308 wait_ms(500);
Kojto 21:30b6ed7bf8fd 309 _wlan.start(patch);
SolderSplashLabs 37:03ac37ab34eb 310 _status.enabled = 1;
Kojto 21:30b6ed7bf8fd 311 }
Kojto 21:30b6ed7bf8fd 312
Kojto 21:30b6ed7bf8fd 313 bool cc3000::connect_open(const uint8_t *ssid) {
Kojto 21:30b6ed7bf8fd 314 uint32_t ret;
Kojto 21:30b6ed7bf8fd 315
Kojto 21:30b6ed7bf8fd 316 _wlan.disconnect();
Kojto 21:30b6ed7bf8fd 317 wait_ms(3);
Kojto 21:30b6ed7bf8fd 318 #ifndef CC3000_TINY_DRIVER
Kojto 21:30b6ed7bf8fd 319 ret = _wlan.connect(0,ssid, strlen((const char *)ssid), 0, 0, 0);
Kojto 21:30b6ed7bf8fd 320 #else
Kojto 21:30b6ed7bf8fd 321 ret = _wlan.connect(ssid, strlen((const char *)ssid));
Kojto 21:30b6ed7bf8fd 322 #endif
Kojto 21:30b6ed7bf8fd 323 if (ret == 0) {
Kojto 21:30b6ed7bf8fd 324 ret = true;
Kojto 21:30b6ed7bf8fd 325 } else {
Kojto 21:30b6ed7bf8fd 326 ret = false;
Kojto 21:30b6ed7bf8fd 327 }
Kojto 21:30b6ed7bf8fd 328 return ret;
Kojto 21:30b6ed7bf8fd 329 }
Kojto 21:30b6ed7bf8fd 330
SolderSplashLabs 37:03ac37ab34eb 331 bool cc3000::is_enabled()
SolderSplashLabs 37:03ac37ab34eb 332 {
SolderSplashLabs 37:03ac37ab34eb 333 return _status.enabled;
SolderSplashLabs 37:03ac37ab34eb 334 }
SolderSplashLabs 37:03ac37ab34eb 335
Kojto 21:30b6ed7bf8fd 336 bool cc3000::is_connected() {
SolderSplashLabs 42:bd2c631a031a 337 if (( _status.connected ) && ( _status.dhcp ))
SolderSplashLabs 42:bd2c631a031a 338 {
SolderSplashLabs 42:bd2c631a031a 339 return( 1 );
SolderSplashLabs 42:bd2c631a031a 340 }
SolderSplashLabs 42:bd2c631a031a 341 else
SolderSplashLabs 42:bd2c631a031a 342 {
SolderSplashLabs 42:bd2c631a031a 343 return( 0 );
SolderSplashLabs 42:bd2c631a031a 344 }
Kojto 21:30b6ed7bf8fd 345 }
Kojto 21:30b6ed7bf8fd 346
Kojto 21:30b6ed7bf8fd 347 bool cc3000::is_dhcp_configured() {
Kojto 21:30b6ed7bf8fd 348 return _status.dhcp;
Kojto 21:30b6ed7bf8fd 349 }
Kojto 21:30b6ed7bf8fd 350
Kojto 21:30b6ed7bf8fd 351 bool cc3000::is_smart_confing_completed() {
Kojto 21:30b6ed7bf8fd 352 return _status.smart_config_complete;
Kojto 21:30b6ed7bf8fd 353 }
Kojto 21:30b6ed7bf8fd 354
Kojto 21:30b6ed7bf8fd 355 uint8_t cc3000::get_mac_address(uint8_t address[6]) {
Kojto 21:30b6ed7bf8fd 356 return _nvmem.get_mac_address(address);
Kojto 21:30b6ed7bf8fd 357 }
Kojto 21:30b6ed7bf8fd 358
Kojto 21:30b6ed7bf8fd 359 uint8_t cc3000::set_mac_address(uint8_t address[6]) {
Kojto 21:30b6ed7bf8fd 360 return _nvmem.set_mac_address(address);
Kojto 21:30b6ed7bf8fd 361 }
Kojto 21:30b6ed7bf8fd 362
Kojto 21:30b6ed7bf8fd 363 void cc3000::get_user_file_info(uint8_t *info_file, size_t size) {
Kojto 21:30b6ed7bf8fd 364 _nvmem.read( NVMEM_USER_FILE_1_FILEID, size, 0, info_file);
Kojto 21:30b6ed7bf8fd 365 }
Kojto 21:30b6ed7bf8fd 366
Kojto 21:30b6ed7bf8fd 367 #ifndef CC3000_TINY_DRIVER
Kojto 21:30b6ed7bf8fd 368 bool cc3000::get_ip_config(tNetappIpconfigRetArgs *ip_config) {
Kojto 21:30b6ed7bf8fd 369 if ((_status.dhcp == false) || (_status.connected == false)) {
Kojto 21:30b6ed7bf8fd 370 return false;
Kojto 21:30b6ed7bf8fd 371 }
Kojto 21:30b6ed7bf8fd 372
Kojto 21:30b6ed7bf8fd 373 _netapp.ipconfig(ip_config);
Kojto 21:30b6ed7bf8fd 374 return true;
Kojto 21:30b6ed7bf8fd 375 }
Kojto 21:30b6ed7bf8fd 376 #endif
Kojto 21:30b6ed7bf8fd 377
Kojto 21:30b6ed7bf8fd 378 void cc3000::delete_profiles(void) {
Kojto 21:30b6ed7bf8fd 379 tUserFS user_info;
Kojto 21:30b6ed7bf8fd 380
Kojto 21:30b6ed7bf8fd 381 _wlan.ioctl_set_connection_policy(0, 0, 0);
Kojto 21:30b6ed7bf8fd 382 _wlan.ioctl_del_profile(255);
Kojto 21:30b6ed7bf8fd 383
Kojto 21:30b6ed7bf8fd 384 get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
Kojto 21:30b6ed7bf8fd 385 user_info.FTC = 0;
Kojto 21:30b6ed7bf8fd 386 set_user_file_info((uint8_t *)&user_info, sizeof(user_info));
Kojto 21:30b6ed7bf8fd 387 }
Kojto 21:30b6ed7bf8fd 388
Kojto 21:30b6ed7bf8fd 389 void cc3000::set_user_file_info(uint8_t *info_file, size_t size) {
Kojto 21:30b6ed7bf8fd 390 _nvmem.write( NVMEM_USER_FILE_1_FILEID, size, 0, info_file);
Kojto 21:30b6ed7bf8fd 391 }
Kojto 21:30b6ed7bf8fd 392
Kojto 21:30b6ed7bf8fd 393 bool cc3000::disconnect(void){
Kojto 21:30b6ed7bf8fd 394 if (_wlan.disconnect()) {
Kojto 21:30b6ed7bf8fd 395 return false;
Kojto 21:30b6ed7bf8fd 396 } else {
Kojto 21:30b6ed7bf8fd 397 return true;
Kojto 21:30b6ed7bf8fd 398 }
Kojto 21:30b6ed7bf8fd 399 }
Kojto 21:30b6ed7bf8fd 400
Kojto 21:30b6ed7bf8fd 401 uint32_t cc3000::ping(uint32_t ip, uint8_t attempts, uint16_t timeout, uint8_t size) {
Kojto 39:3332f57b7f1e 402 uint32_t reversed_ip = (ip >> 24) | ((ip >> 8) & 0xFF00) | ((ip << 8) & 0xFF0000) | (ip << 24);
Kojto 21:30b6ed7bf8fd 403
Kojto 21:30b6ed7bf8fd 404 _ping_report.packets_received = 0;
Kojto 21:30b6ed7bf8fd 405 if (_netapp.ping_send(&reversed_ip, attempts, size, timeout) == -1) {
Kojto 21:30b6ed7bf8fd 406 DBG_CC("Failed to send ping");
Kojto 21:30b6ed7bf8fd 407 return 0;
Kojto 21:30b6ed7bf8fd 408 }
Kojto 21:30b6ed7bf8fd 409 wait_ms(timeout*attempts*2);
Kojto 21:30b6ed7bf8fd 410
Kojto 21:30b6ed7bf8fd 411 /* known issue of cc3000 - sent number is send + received */
Kojto 21:30b6ed7bf8fd 412 // TODO : Remove the Sent/recv'd counts until ti fix the firmware issue?
Kojto 21:30b6ed7bf8fd 413 DBG_CC("Sent: %d",_ping_report.packets_sent);
Kojto 21:30b6ed7bf8fd 414 DBG_CC("Received: %d",_ping_report.packets_received);
Kojto 21:30b6ed7bf8fd 415 DBG_CC("Min time: %d",_ping_report.min_round_time);
Kojto 21:30b6ed7bf8fd 416 DBG_CC("Max time: %d",_ping_report.max_round_time);
Kojto 21:30b6ed7bf8fd 417 DBG_CC("Avg time: %d",_ping_report.avg_round_time);
Kojto 21:30b6ed7bf8fd 418
Kojto 21:30b6ed7bf8fd 419 return _ping_report.packets_received;
Kojto 21:30b6ed7bf8fd 420 }
Kojto 21:30b6ed7bf8fd 421
Kojto 21:30b6ed7bf8fd 422 /* Conversion between uint types and C strings */
Kojto 21:30b6ed7bf8fd 423 uint8_t* UINT32_TO_STREAM_f (uint8_t *p, uint32_t u32)
Kojto 21:30b6ed7bf8fd 424 {
Kojto 21:30b6ed7bf8fd 425 *(p)++ = (uint8_t)(u32);
Kojto 21:30b6ed7bf8fd 426 *(p)++ = (uint8_t)((u32) >> 8);
Kojto 21:30b6ed7bf8fd 427 *(p)++ = (uint8_t)((u32) >> 16);
Kojto 21:30b6ed7bf8fd 428 *(p)++ = (uint8_t)((u32) >> 24);
Kojto 21:30b6ed7bf8fd 429 return p;
Kojto 21:30b6ed7bf8fd 430 }
Kojto 21:30b6ed7bf8fd 431
Kojto 21:30b6ed7bf8fd 432
Kojto 21:30b6ed7bf8fd 433 uint8_t* UINT16_TO_STREAM_f (uint8_t *p, uint16_t u16)
Kojto 21:30b6ed7bf8fd 434 {
Kojto 21:30b6ed7bf8fd 435 *(p)++ = (uint8_t)(u16);
Kojto 21:30b6ed7bf8fd 436 *(p)++ = (uint8_t)((u16) >> 8);
Kojto 21:30b6ed7bf8fd 437 return p;
Kojto 21:30b6ed7bf8fd 438 }
Kojto 21:30b6ed7bf8fd 439
Kojto 21:30b6ed7bf8fd 440
Kojto 21:30b6ed7bf8fd 441 uint16_t STREAM_TO_UINT16_f(uint8_t *p, uint16_t offset)
Kojto 21:30b6ed7bf8fd 442 {
Kojto 21:30b6ed7bf8fd 443 return (uint16_t)((uint16_t)((uint16_t)
Kojto 21:30b6ed7bf8fd 444 (*(p + offset + 1)) << 8) + (uint16_t)(*(p + offset)));
Kojto 21:30b6ed7bf8fd 445 }
Kojto 21:30b6ed7bf8fd 446
Kojto 21:30b6ed7bf8fd 447
Kojto 21:30b6ed7bf8fd 448 uint32_t STREAM_TO_UINT32_f(uint8_t *p, uint16_t offset)
Kojto 21:30b6ed7bf8fd 449 {
Kojto 21:30b6ed7bf8fd 450 return (uint32_t)((uint32_t)((uint32_t)
Kojto 21:30b6ed7bf8fd 451 (*(p + offset + 3)) << 24) + (uint32_t)((uint32_t)
Kojto 21:30b6ed7bf8fd 452 (*(p + offset + 2)) << 16) + (uint32_t)((uint32_t)
Kojto 21:30b6ed7bf8fd 453 (*(p + offset + 1)) << 8) + (uint32_t)(*(p + offset)));
Kojto 21:30b6ed7bf8fd 454 }
Kojto 21:30b6ed7bf8fd 455
Kojto 21:30b6ed7bf8fd 456 } /* end of mbed_cc3000 namespace */
Kojto 21:30b6ed7bf8fd 457