ESP8266 Socket Library. AT Thinker firmware.

Dependents:   ESP8266_MQTT_HelloWorld ESP8266_IFTTT_Test ECE_4180_Lab_4 websocketmbed ... more

Fork of ESP8266Interface by ESP8266

This repository has been superceded

This project has moved to https://developer.mbed.org/teams/ESP8266/code/esp8266-driver/

This library works with the AT Thinker firmware.

Note

This library is currently in Beta. It is not feature complete and has some bugs, proceed with caution! Fixes and patches are welcome and appreciated!

Currently the ESP8266Interface Library has the following Abilities:

Working

  • TCP Client
  • UDP Client
  • Transparent mode (single connection of 1 type at a time)
  • Station Mode (connects to AP)

To be implemented

  • TCP Server
  • UDP Server
  • Multi Connection Mode (able to have up to 5 sockets at a time)
  • AP Mode (Make ESP Chip act like access point)
  • DNS Support (currently websites must be looked up by IP)
  • Error Recovery

Nice but not necessary

  • colorized text for ESP AT Commands in Command line (easier to differentiate from other text)
Committer:
screamer
Date:
Tue Jun 03 18:43:14 2014 +0000
Revision:
11:fc3d86645d23
Parent:
10:131675c17372
Parent:
8:04afe20d7927
Child:
12:c5f0eac67a8a
More merges

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 1:fb4494783863 1 /* Copyright (C) 2012 mbed.org, MIT License
samux 1:fb4494783863 2 *
samux 1:fb4494783863 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
samux 1:fb4494783863 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
samux 1:fb4494783863 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
samux 1:fb4494783863 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
samux 1:fb4494783863 7 * furnished to do so, subject to the following conditions:
samux 1:fb4494783863 8 *
samux 1:fb4494783863 9 * The above copyright notice and this permission notice shall be included in all copies or
samux 1:fb4494783863 10 * substantial portions of the Software.
samux 1:fb4494783863 11 *
samux 1:fb4494783863 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
samux 1:fb4494783863 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
samux 1:fb4494783863 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
samux 1:fb4494783863 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
samux 1:fb4494783863 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
samux 1:fb4494783863 17 */
samux 1:fb4494783863 18
samux 1:fb4494783863 19 #include "mbed.h"
samux 1:fb4494783863 20 #include "Wifly.h"
samux 1:fb4494783863 21 #include <string>
samux 1:fb4494783863 22 #include <algorithm>
samux 1:fb4494783863 23
samux 1:fb4494783863 24 //Debug is disabled by default
screamer 10:131675c17372 25 #if (defined(DEBUG))
samux 1:fb4494783863 26 #define DBG(x, ...) std::printf("[Wifly : DBG]"x"\r\n", ##__VA_ARGS__);
samux 1:fb4494783863 27 #define WARN(x, ...) std::printf("[Wifly : WARN]"x"\r\n", ##__VA_ARGS__);
samux 1:fb4494783863 28 #define ERR(x, ...) std::printf("[Wifly : ERR]"x"\r\n", ##__VA_ARGS__);
samux 1:fb4494783863 29 #else
samux 1:fb4494783863 30 #define DBG(x, ...)
samux 1:fb4494783863 31 #define WARN(x, ...)
samux 1:fb4494783863 32 #define ERR(x, ...)
samux 1:fb4494783863 33 #endif
samux 1:fb4494783863 34
screamer 10:131675c17372 35 #if defined(DEBUG)
samux 1:fb4494783863 36 #define INFO(x, ...) printf("[Wifly : INFO]"x"\r\n", ##__VA_ARGS__);
samux 1:fb4494783863 37 #else
samux 1:fb4494783863 38 #define INFO(x, ...)
samux 1:fb4494783863 39 #endif
samux 1:fb4494783863 40
samux 1:fb4494783863 41 #define MAX_TRY_JOIN 3
samux 1:fb4494783863 42
samux 1:fb4494783863 43 Wifly * Wifly::inst;
samux 1:fb4494783863 44
samux 1:fb4494783863 45 Wifly::Wifly( PinName tx, PinName rx, PinName _reset, PinName tcp_status, const char * ssid, const char * phrase, Security sec):
samux 1:fb4494783863 46 wifi(tx, rx), reset_pin(_reset), tcp_status(tcp_status), buf_wifly(256)
samux 1:fb4494783863 47 {
samux 1:fb4494783863 48 memset(&state, 0, sizeof(state));
samux 1:fb4494783863 49 state.sec = sec;
samux 1:fb4494783863 50
samux 1:fb4494783863 51 // change all ' ' in '$' in the ssid and the passphrase
samux 1:fb4494783863 52 strcpy(this->ssid, ssid);
samux 1:fb4494783863 53 for (int i = 0; i < strlen(ssid); i++) {
samux 1:fb4494783863 54 if (this->ssid[i] == ' ')
samux 1:fb4494783863 55 this->ssid[i] = '$';
samux 1:fb4494783863 56 }
samux 1:fb4494783863 57 strcpy(this->phrase, phrase);
samux 1:fb4494783863 58 for (int i = 0; i < strlen(phrase); i++) {
samux 1:fb4494783863 59 if (this->phrase[i] == ' ')
samux 1:fb4494783863 60 this->phrase[i] = '$';
samux 1:fb4494783863 61 }
samux 1:fb4494783863 62
samux 1:fb4494783863 63 inst = this;
samux 1:fb4494783863 64 attach_rx(false);
samux 1:fb4494783863 65 state.cmd_mode = false;
samux 1:fb4494783863 66 }
samux 1:fb4494783863 67
samux 1:fb4494783863 68 bool Wifly::join()
samux 1:fb4494783863 69 {
samux 1:fb4494783863 70 char cmd[20];
samux 1:fb4494783863 71
samux 1:fb4494783863 72 for (int i= 0; i < MAX_TRY_JOIN; i++) {
samux 2:8e54830d0df7 73
samux 2:8e54830d0df7 74 // no auto join
samux 2:8e54830d0df7 75 if (!sendCommand("set w j 0\r", "AOK"))
samux 2:8e54830d0df7 76 continue;
samux 2:8e54830d0df7 77
samux 2:8e54830d0df7 78 //no echo
samux 2:8e54830d0df7 79 if (!sendCommand("set u m 1\r", "AOK"))
samux 2:8e54830d0df7 80 continue;
samux 2:8e54830d0df7 81
samux 1:fb4494783863 82 // set time
samux 4:0bcec6272784 83 if (!sendCommand("set c t 30\r", "AOK"))
samux 1:fb4494783863 84 continue;
samux 1:fb4494783863 85
samux 1:fb4494783863 86 // set size
samux 4:0bcec6272784 87 if (!sendCommand("set c s 1024\r", "AOK"))
samux 1:fb4494783863 88 continue;
samux 1:fb4494783863 89
samux 1:fb4494783863 90 // red led on when tcp connection active
samux 1:fb4494783863 91 if (!sendCommand("set s i 0x40\r", "AOK"))
samux 1:fb4494783863 92 continue;
samux 1:fb4494783863 93
samux 1:fb4494783863 94 // no string sent to the tcp client
samux 1:fb4494783863 95 if (!sendCommand("set c r 0\r", "AOK"))
samux 1:fb4494783863 96 continue;
samux 1:fb4494783863 97
samux 1:fb4494783863 98 // tcp protocol
samux 1:fb4494783863 99 if (!sendCommand("set i p 2\r", "AOK"))
samux 1:fb4494783863 100 continue;
samux 1:fb4494783863 101
samux 1:fb4494783863 102 // tcp retry
samux 1:fb4494783863 103 if (!sendCommand("set i f 0x7\r", "AOK"))
samux 1:fb4494783863 104 continue;
samux 2:8e54830d0df7 105
samux 2:8e54830d0df7 106 // set dns server
samux 2:8e54830d0df7 107 if (!sendCommand("set d n rn.microchip.com\r", "AOK"))
samux 1:fb4494783863 108 continue;
samux 1:fb4494783863 109
samux 1:fb4494783863 110 //dhcp
samux 1:fb4494783863 111 sprintf(cmd, "set i d %d\r", (state.dhcp) ? 1 : 0);
samux 1:fb4494783863 112 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 113 continue;
samux 1:fb4494783863 114
samux 1:fb4494783863 115 // ssid
samux 1:fb4494783863 116 sprintf(cmd, "set w s %s\r", ssid);
lz307 7:3152fcc74390 117 if (!sendCommand(cmd, "AOK", NULL, 1000))
samux 1:fb4494783863 118 continue;
samux 1:fb4494783863 119
samux 1:fb4494783863 120 //auth
samux 1:fb4494783863 121 sprintf(cmd, "set w a %d\r", state.sec);
samux 1:fb4494783863 122 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 123 continue;
samux 1:fb4494783863 124
samux 1:fb4494783863 125 // if no dhcp, set ip, netmask and gateway
samux 1:fb4494783863 126 if (!state.dhcp) {
samux 1:fb4494783863 127 DBG("not dhcp\r");
samux 1:fb4494783863 128
samux 1:fb4494783863 129 sprintf(cmd, "set i a %s\r\n", ip);
samux 1:fb4494783863 130 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 131 continue;
samux 1:fb4494783863 132
samux 1:fb4494783863 133 sprintf(cmd, "set i n %s\r", netmask);
samux 1:fb4494783863 134 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 135 continue;
samux 1:fb4494783863 136
samux 1:fb4494783863 137 sprintf(cmd, "set i g %s\r", gateway);
samux 1:fb4494783863 138 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 139 continue;
samux 1:fb4494783863 140 }
samux 1:fb4494783863 141
samux 1:fb4494783863 142 //key step
samux 1:fb4494783863 143 if (state.sec != NONE) {
samux 1:fb4494783863 144 if (state.sec == WPA)
samux 1:fb4494783863 145 sprintf(cmd, "set w p %s\r", phrase);
samux 1:fb4494783863 146 else if (state.sec == WEP_128)
samux 1:fb4494783863 147 sprintf(cmd, "set w k %s\r", phrase);
samux 1:fb4494783863 148
lz307 7:3152fcc74390 149 if (!sendCommand(cmd, "AOK", NULL, 1000))
samux 1:fb4494783863 150 continue;
samux 1:fb4494783863 151 }
samux 1:fb4494783863 152
samux 1:fb4494783863 153 //join the network
samux 1:fb4494783863 154 sprintf(cmd, "join\r");
samux 1:fb4494783863 155 if (!sendCommand(cmd, "Associated", NULL, 3000))
samux 1:fb4494783863 156 continue;
lz307 7:3152fcc74390 157
lz307 7:3152fcc74390 158 if (!sendCommand("", "IP=", NULL, 10000))
lz307 7:3152fcc74390 159 continue;
samux 1:fb4494783863 160
samux 1:fb4494783863 161 if (state.dhcp) {
lz307 7:3152fcc74390 162 if (!sendCommand("get i\r", "DHCP=ON", NULL, 3000))
samux 1:fb4494783863 163 continue;
samux 1:fb4494783863 164 }
samux 1:fb4494783863 165
samux 2:8e54830d0df7 166 if (!sendCommand("save\r", "Stor"))
samux 2:8e54830d0df7 167 continue;
samux 2:8e54830d0df7 168
samux 1:fb4494783863 169 exit();
samux 1:fb4494783863 170
samux 1:fb4494783863 171 state.associated = true;
samux 1:fb4494783863 172 INFO("\r\nssid: %s\r\nphrase: %s\r\nsecurity: %s\r\n\r\n", this->ssid, this->phrase, getStringSecurity());
samux 1:fb4494783863 173 return true;
samux 1:fb4494783863 174 }
samux 1:fb4494783863 175 return false;
samux 1:fb4494783863 176 }
samux 1:fb4494783863 177
samux 1:fb4494783863 178
samux 1:fb4494783863 179 bool Wifly::setProtocol(Protocol p)
samux 1:fb4494783863 180 {
samux 1:fb4494783863 181 // use udp auto pairing
samux 1:fb4494783863 182 char cmd[20];
samux 1:fb4494783863 183 sprintf(cmd, "set i p %d\r", p);
samux 1:fb4494783863 184 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 185 return false;
samux 1:fb4494783863 186
samux 1:fb4494783863 187 switch(p) {
samux 1:fb4494783863 188 case TCP:
samux 1:fb4494783863 189 // set ip flags: tcp retry enabled
samux 1:fb4494783863 190 if (!sendCommand("set i f 0x07\r", "AOK"))
samux 1:fb4494783863 191 return false;
samux 1:fb4494783863 192 break;
samux 1:fb4494783863 193 case UDP:
samux 1:fb4494783863 194 // set ip flags: udp auto pairing enabled
samux 1:fb4494783863 195 if (!sendCommand("set i h 0.0.0.0\r", "AOK"))
samux 1:fb4494783863 196 return false;
samux 4:0bcec6272784 197 if (!sendCommand("set i f 0x40\r", "AOK"))
samux 1:fb4494783863 198 return false;
samux 1:fb4494783863 199 break;
samux 1:fb4494783863 200 }
samux 1:fb4494783863 201 state.proto = p;
samux 1:fb4494783863 202 return true;
samux 1:fb4494783863 203 }
samux 1:fb4494783863 204
samux 1:fb4494783863 205 char * Wifly::getStringSecurity()
samux 1:fb4494783863 206 {
samux 1:fb4494783863 207 switch(state.sec) {
samux 1:fb4494783863 208 case NONE:
samux 1:fb4494783863 209 return "NONE";
samux 1:fb4494783863 210 case WEP_128:
samux 1:fb4494783863 211 return "WEP_128";
samux 1:fb4494783863 212 case WPA:
samux 1:fb4494783863 213 return "WPA";
samux 1:fb4494783863 214 }
samux 1:fb4494783863 215 return "UNKNOWN";
samux 1:fb4494783863 216 }
samux 1:fb4494783863 217
samux 1:fb4494783863 218 bool Wifly::connect(const char * host, int port)
samux 1:fb4494783863 219 {
samux 1:fb4494783863 220 char rcv[20];
samux 1:fb4494783863 221 char cmd[20];
samux 1:fb4494783863 222
samux 2:8e54830d0df7 223 // try to open
samux 2:8e54830d0df7 224 sprintf(cmd, "open %s %d\r", host, port);
samux 2:8e54830d0df7 225 if (sendCommand(cmd, "OPEN", NULL, 10000)) {
samux 2:8e54830d0df7 226 state.tcp = true;
samux 2:8e54830d0df7 227 state.cmd_mode = false;
samux 2:8e54830d0df7 228 return true;
samux 1:fb4494783863 229 }
samux 1:fb4494783863 230
samux 2:8e54830d0df7 231 // if failed, retry and parse the response
samux 2:8e54830d0df7 232 if (sendCommand(cmd, NULL, rcv, 5000)) {
samux 1:fb4494783863 233 if (strstr(rcv, "OPEN") == NULL) {
samux 1:fb4494783863 234 if (strstr(rcv, "Connected") != NULL) {
samux 2:8e54830d0df7 235 wait(0.25);
samux 1:fb4494783863 236 if (!sendCommand("close\r", "CLOS"))
samux 1:fb4494783863 237 return false;
samux 2:8e54830d0df7 238 wait(0.25);
samux 2:8e54830d0df7 239 if (!sendCommand(cmd, "OPEN", NULL, 10000))
samux 1:fb4494783863 240 return false;
samux 1:fb4494783863 241 } else {
samux 1:fb4494783863 242 return false;
samux 1:fb4494783863 243 }
samux 1:fb4494783863 244 }
samux 1:fb4494783863 245 } else {
samux 1:fb4494783863 246 return false;
samux 1:fb4494783863 247 }
samux 2:8e54830d0df7 248
samux 1:fb4494783863 249 state.tcp = true;
samux 1:fb4494783863 250 state.cmd_mode = false;
samux 1:fb4494783863 251
samux 1:fb4494783863 252 return true;
samux 1:fb4494783863 253 }
samux 1:fb4494783863 254
samux 1:fb4494783863 255
samux 1:fb4494783863 256 bool Wifly::gethostbyname(const char * host, char * ip)
samux 1:fb4494783863 257 {
samux 1:fb4494783863 258 string h = host;
samux 1:fb4494783863 259 char cmd[30], rcv[100];
samux 1:fb4494783863 260 int l = 0;
samux 1:fb4494783863 261 char * point;
samux 1:fb4494783863 262 int nb_digits = 0;
samux 1:fb4494783863 263
samux 1:fb4494783863 264 // no dns needed
samux 1:fb4494783863 265 int pos = h.find(".");
samux 1:fb4494783863 266 if (pos != string::npos) {
samux 1:fb4494783863 267 string sub = h.substr(0, h.find("."));
samux 1:fb4494783863 268 nb_digits = atoi(sub.c_str());
samux 1:fb4494783863 269 }
samux 1:fb4494783863 270 //printf("substrL %s\r\n", sub.c_str());
samux 1:fb4494783863 271 if (count(h.begin(), h.end(), '.') == 3 && nb_digits > 0) {
samux 1:fb4494783863 272 strcpy(ip, host);
samux 1:fb4494783863 273 }
samux 1:fb4494783863 274 // dns needed
samux 1:fb4494783863 275 else {
samux 1:fb4494783863 276 nb_digits = 0;
samux 1:fb4494783863 277 sprintf(cmd, "lookup %s\r", host);
samux 1:fb4494783863 278 if (!sendCommand(cmd, NULL, rcv))
samux 1:fb4494783863 279 return false;
samux 1:fb4494783863 280
samux 1:fb4494783863 281 // look for the ip address
samux 1:fb4494783863 282 char * begin = strstr(rcv, "=") + 1;
samux 1:fb4494783863 283 for (int i = 0; i < 3; i++) {
samux 1:fb4494783863 284 point = strstr(begin + l, ".");
samux 1:fb4494783863 285 DBG("str: %s", begin + l);
samux 1:fb4494783863 286 l += point - (begin + l) + 1;
samux 1:fb4494783863 287 }
samux 1:fb4494783863 288 DBG("str: %s", begin + l);
samux 1:fb4494783863 289 while(*(begin + l + nb_digits) >= '0' && *(begin + l + nb_digits) <= '9') {
samux 1:fb4494783863 290 DBG("digit: %c", *(begin + l + nb_digits));
samux 1:fb4494783863 291 nb_digits++;
samux 1:fb4494783863 292 }
samux 1:fb4494783863 293 memcpy(ip, begin, l + nb_digits);
samux 1:fb4494783863 294 ip[l+nb_digits] = 0;
samux 1:fb4494783863 295 DBG("ip from dns: %s", ip);
samux 1:fb4494783863 296 }
samux 1:fb4494783863 297 return true;
samux 1:fb4494783863 298 }
samux 1:fb4494783863 299
samux 1:fb4494783863 300
samux 1:fb4494783863 301 void Wifly::flush()
samux 1:fb4494783863 302 {
samux 1:fb4494783863 303 buf_wifly.flush();
samux 1:fb4494783863 304 }
samux 1:fb4494783863 305
samux 1:fb4494783863 306 bool Wifly::sendCommand(const char * cmd, const char * ack, char * res, int timeout)
samux 1:fb4494783863 307 {
samux 1:fb4494783863 308 if (!state.cmd_mode) {
samux 1:fb4494783863 309 cmdMode();
samux 1:fb4494783863 310 }
samux 1:fb4494783863 311 if (send(cmd, strlen(cmd), ack, res, timeout) == -1) {
samux 1:fb4494783863 312 ERR("sendCommand: cannot %s\r\n", cmd);
samux 1:fb4494783863 313 exit();
samux 1:fb4494783863 314 return false;
samux 1:fb4494783863 315 }
samux 1:fb4494783863 316 return true;
samux 1:fb4494783863 317 }
samux 1:fb4494783863 318
samux 1:fb4494783863 319 bool Wifly::cmdMode()
samux 1:fb4494783863 320 {
samux 1:fb4494783863 321 // if already in cmd mode, return
samux 1:fb4494783863 322 if (state.cmd_mode)
samux 1:fb4494783863 323 return true;
samux 1:fb4494783863 324
lz307 7:3152fcc74390 325 if (send("$$$", 3, "CMD") == -1 && send("\r",1,">") != true) {
samux 1:fb4494783863 326 ERR("cannot enter in cmd mode\r\n");
samux 2:8e54830d0df7 327 exit();
samux 1:fb4494783863 328 return false;
samux 1:fb4494783863 329 }
samux 1:fb4494783863 330 state.cmd_mode = true;
samux 1:fb4494783863 331 return true;
samux 1:fb4494783863 332 }
samux 1:fb4494783863 333
samux 1:fb4494783863 334 bool Wifly::disconnect()
samux 1:fb4494783863 335 {
samux 1:fb4494783863 336 // if already disconnected, return
samux 1:fb4494783863 337 if (!state.associated)
samux 1:fb4494783863 338 return true;
samux 2:8e54830d0df7 339
samux 1:fb4494783863 340 if (!sendCommand("leave\r", "DeAuth"))
samux 1:fb4494783863 341 return false;
samux 1:fb4494783863 342 exit();
samux 2:8e54830d0df7 343
samux 1:fb4494783863 344 state.associated = false;
samux 1:fb4494783863 345 return true;
samux 1:fb4494783863 346
samux 1:fb4494783863 347 }
samux 1:fb4494783863 348
samux 1:fb4494783863 349 bool Wifly::is_connected()
samux 1:fb4494783863 350 {
samux 1:fb4494783863 351 return (tcp_status.read() == 1) ? true : false;
samux 1:fb4494783863 352 }
samux 1:fb4494783863 353
samux 1:fb4494783863 354
samux 1:fb4494783863 355 void Wifly::reset()
samux 1:fb4494783863 356 {
samux 1:fb4494783863 357 reset_pin = 0;
samux 1:fb4494783863 358 wait(0.2);
samux 1:fb4494783863 359 reset_pin = 1;
samux 1:fb4494783863 360 wait(0.2);
samux 1:fb4494783863 361 }
samux 1:fb4494783863 362
samux 3:9aa05e19c62e 363 bool Wifly::reboot()
samux 3:9aa05e19c62e 364 {
samux 3:9aa05e19c62e 365 // if already in cmd mode, return
samux 3:9aa05e19c62e 366 if (!sendCommand("reboot\r"))
samux 3:9aa05e19c62e 367 return false;
samux 3:9aa05e19c62e 368
samux 3:9aa05e19c62e 369 wait(0.3);
samux 3:9aa05e19c62e 370
samux 3:9aa05e19c62e 371 state.cmd_mode = false;
samux 3:9aa05e19c62e 372 return true;
samux 3:9aa05e19c62e 373 }
samux 3:9aa05e19c62e 374
samux 1:fb4494783863 375 bool Wifly::close()
samux 1:fb4494783863 376 {
samux 1:fb4494783863 377 // if not connected, return
samux 1:fb4494783863 378 if (!state.tcp)
samux 1:fb4494783863 379 return true;
samux 2:8e54830d0df7 380
samux 1:fb4494783863 381 wait(0.25);
samux 1:fb4494783863 382 if (!sendCommand("close\r", "CLOS"))
samux 1:fb4494783863 383 return false;
samux 1:fb4494783863 384 exit();
samux 2:8e54830d0df7 385
samux 1:fb4494783863 386 state.tcp = false;
samux 1:fb4494783863 387 return true;
samux 1:fb4494783863 388 }
samux 1:fb4494783863 389
samux 1:fb4494783863 390
samux 1:fb4494783863 391 int Wifly::putc(char c)
samux 1:fb4494783863 392 {
samux 1:fb4494783863 393 while (!wifi.writeable());
samux 1:fb4494783863 394 return wifi.putc(c);
samux 1:fb4494783863 395 }
samux 1:fb4494783863 396
samux 1:fb4494783863 397
samux 1:fb4494783863 398 bool Wifly::exit()
samux 1:fb4494783863 399 {
samux 1:fb4494783863 400 flush();
samux 1:fb4494783863 401 if (!state.cmd_mode)
samux 1:fb4494783863 402 return true;
samux 1:fb4494783863 403 if (!sendCommand("exit\r", "EXIT"))
samux 1:fb4494783863 404 return false;
samux 1:fb4494783863 405 state.cmd_mode = false;
samux 1:fb4494783863 406 flush();
samux 1:fb4494783863 407 return true;
samux 1:fb4494783863 408 }
samux 1:fb4494783863 409
samux 1:fb4494783863 410
samux 1:fb4494783863 411 int Wifly::readable()
samux 1:fb4494783863 412 {
samux 1:fb4494783863 413 return buf_wifly.available();
samux 1:fb4494783863 414 }
samux 1:fb4494783863 415
samux 1:fb4494783863 416 int Wifly::writeable()
samux 1:fb4494783863 417 {
samux 1:fb4494783863 418 return wifi.writeable();
samux 1:fb4494783863 419 }
samux 1:fb4494783863 420
samux 1:fb4494783863 421 char Wifly::getc()
samux 1:fb4494783863 422 {
samux 1:fb4494783863 423 char c;
samux 1:fb4494783863 424 while (!buf_wifly.available());
samux 1:fb4494783863 425 buf_wifly.dequeue(&c);
samux 1:fb4494783863 426 return c;
samux 1:fb4494783863 427 }
samux 1:fb4494783863 428
samux 1:fb4494783863 429 void Wifly::handler_rx(void)
samux 1:fb4494783863 430 {
samux 1:fb4494783863 431 //read characters
samux 1:fb4494783863 432 while (wifi.readable())
samux 1:fb4494783863 433 buf_wifly.queue(wifi.getc());
samux 1:fb4494783863 434 }
samux 1:fb4494783863 435
samux 1:fb4494783863 436 void Wifly::attach_rx(bool callback)
samux 1:fb4494783863 437 {
samux 1:fb4494783863 438 if (!callback)
samux 1:fb4494783863 439 wifi.attach(NULL);
samux 1:fb4494783863 440 else
samux 1:fb4494783863 441 wifi.attach(this, &Wifly::handler_rx);
samux 1:fb4494783863 442 }
samux 1:fb4494783863 443
samux 1:fb4494783863 444
samux 1:fb4494783863 445 int Wifly::send(const char * str, int len, const char * ACK, char * res, int timeout)
samux 1:fb4494783863 446 {
samux 1:fb4494783863 447 char read;
samux 1:fb4494783863 448 size_t found = string::npos;
samux 1:fb4494783863 449 string checking;
samux 1:fb4494783863 450 Timer tmr;
samux 1:fb4494783863 451 int result = 0;
samux 1:fb4494783863 452
samux 1:fb4494783863 453 DBG("will send: %s\r\n",str);
samux 1:fb4494783863 454
samux 1:fb4494783863 455 attach_rx(false);
samux 1:fb4494783863 456
samux 1:fb4494783863 457 //We flush the buffer
samux 1:fb4494783863 458 while (wifi.readable())
samux 1:fb4494783863 459 wifi.getc();
samux 1:fb4494783863 460
samux 1:fb4494783863 461 if (!ACK || !strcmp(ACK, "NO")) {
samux 1:fb4494783863 462 for (int i = 0; i < len; i++)
samux 1:fb4494783863 463 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 1:fb4494783863 464 } else {
samux 1:fb4494783863 465 //We flush the buffer
samux 1:fb4494783863 466 while (wifi.readable())
samux 1:fb4494783863 467 wifi.getc();
samux 1:fb4494783863 468
samux 1:fb4494783863 469 tmr.start();
samux 1:fb4494783863 470 for (int i = 0; i < len; i++)
samux 1:fb4494783863 471 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 1:fb4494783863 472
samux 1:fb4494783863 473 while (1) {
samux 1:fb4494783863 474 if (tmr.read_ms() > timeout) {
samux 1:fb4494783863 475 //We flush the buffer
samux 1:fb4494783863 476 while (wifi.readable())
samux 1:fb4494783863 477 wifi.getc();
samux 1:fb4494783863 478
samux 1:fb4494783863 479 DBG("check: %s\r\n", checking.c_str());
samux 1:fb4494783863 480
samux 1:fb4494783863 481 attach_rx(true);
samux 1:fb4494783863 482 return -1;
samux 1:fb4494783863 483 } else if (wifi.readable()) {
samux 1:fb4494783863 484 read = wifi.getc();
samux 1:fb4494783863 485 if ( read != '\r' && read != '\n') {
samux 1:fb4494783863 486 checking += read;
samux 1:fb4494783863 487 found = checking.find(ACK);
samux 1:fb4494783863 488 if (found != string::npos) {
samux 1:fb4494783863 489 wait(0.01);
samux 1:fb4494783863 490
samux 1:fb4494783863 491 //We flush the buffer
samux 1:fb4494783863 492 while (wifi.readable())
samux 1:fb4494783863 493 wifi.getc();
samux 1:fb4494783863 494
samux 1:fb4494783863 495 break;
samux 1:fb4494783863 496 }
samux 1:fb4494783863 497 }
samux 1:fb4494783863 498 }
samux 1:fb4494783863 499 }
samux 1:fb4494783863 500 DBG("check: %s\r\n", checking.c_str());
samux 1:fb4494783863 501
samux 1:fb4494783863 502 attach_rx(true);
samux 1:fb4494783863 503 return result;
samux 1:fb4494783863 504 }
samux 1:fb4494783863 505
samux 1:fb4494783863 506 //the user wants the result from the command (ACK == NULL, res != NULL)
samux 1:fb4494783863 507 if ( res != NULL) {
samux 1:fb4494783863 508 int i = 0;
samux 1:fb4494783863 509 Timer timeout;
samux 1:fb4494783863 510 timeout.start();
samux 1:fb4494783863 511 tmr.reset();
samux 1:fb4494783863 512 while (1) {
samux 1:fb4494783863 513 if (timeout.read() > 2) {
samux 1:fb4494783863 514 if (i == 0) {
samux 1:fb4494783863 515 res = NULL;
samux 1:fb4494783863 516 break;
samux 1:fb4494783863 517 }
samux 1:fb4494783863 518 res[i] = '\0';
samux 1:fb4494783863 519 DBG("user str 1: %s\r\n", res);
samux 1:fb4494783863 520
samux 1:fb4494783863 521 break;
samux 1:fb4494783863 522 } else {
samux 1:fb4494783863 523 if (tmr.read_ms() > 300) {
samux 1:fb4494783863 524 res[i] = '\0';
samux 1:fb4494783863 525 DBG("user str: %s\r\n", res);
samux 1:fb4494783863 526
samux 1:fb4494783863 527 break;
samux 1:fb4494783863 528 }
samux 1:fb4494783863 529 if (wifi.readable()) {
samux 1:fb4494783863 530 tmr.start();
samux 1:fb4494783863 531 read = wifi.getc();
samux 1:fb4494783863 532
samux 1:fb4494783863 533 // we drop \r and \n
samux 1:fb4494783863 534 if ( read != '\r' && read != '\n') {
samux 1:fb4494783863 535 res[i++] = read;
samux 1:fb4494783863 536 }
samux 1:fb4494783863 537 }
samux 1:fb4494783863 538 }
samux 1:fb4494783863 539 }
samux 1:fb4494783863 540 DBG("user str: %s\r\n", res);
samux 1:fb4494783863 541 }
samux 1:fb4494783863 542
samux 1:fb4494783863 543 //We flush the buffer
samux 1:fb4494783863 544 while (wifi.readable())
samux 1:fb4494783863 545 wifi.getc();
samux 1:fb4494783863 546
samux 1:fb4494783863 547 attach_rx(true);
samux 1:fb4494783863 548 DBG("result: %d\r\n", result)
samux 1:fb4494783863 549 return result;
samux 1:fb4494783863 550 }