version_2.0

Dependents:   cc3000_ping_demo_try_2

Fork of cc3000_hostdriver_mbedsocket by Martin Kojtal

Committer:
Kojto
Date:
Sun Oct 13 11:46:21 2013 +0200
Revision:
44:960b73df5981
Parent:
42:bd2c631a031a
Child:
45:50ab13d8f2dc
all _DEBUG_ are set to 0, toggle to enable/disable, doxygen doc for new ethernet interface functions

Who changed what in which revision?

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