ACTUALIZED LIBRARY 0 Open (Default) 1 WEP-128 2 WPA1 3 Mixed WPA1 & WPA2-PSK 4 WPA2-PSK 5 Not Used 6 Adhoc, Join any Adhoc network

Dependents:   mbed_Arduino_sensor

Fork of WiflyInterface by Samuel Mokrani

Committer:
samux
Date:
Thu Aug 23 10:37:27 2012 +0000
Revision:
5:8e253731f76f
Parent:
4:74bfdd00362a
Child:
6:f281180726e8
support whitespace in ssid and passphrase

Who changed what in which revision?

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