wifly/socket interface for wifly modules

Dependents:   WiFi neurGAI_WIFI thingspeak thingspeak2

Committer:
samux
Date:
Thu Aug 23 10:32:45 2012 +0000
Revision:
4:74bfdd00362a
Parent:
3:10b3866f0ea2
Child:
5:8e253731f76f
no reboot needed/add timeout param in send function

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 3:10b3866f0ea2 45 this->phrase = phrase;
samux 3:10b3866f0ea2 46 this->ssid = ssid;
samux 3:10b3866f0ea2 47 inst = this;
samux 3:10b3866f0ea2 48 attach_rx(false);
samux 3:10b3866f0ea2 49 cmd_mode = false;
samux 3:10b3866f0ea2 50 }
samux 3:10b3866f0ea2 51
samux 3:10b3866f0ea2 52 bool Wifly::join()
samux 3:10b3866f0ea2 53 {
samux 3:10b3866f0ea2 54 char cmd[100];
samux 3:10b3866f0ea2 55
samux 4:74bfdd00362a 56 for (int i= 0; i < MAX_TRY_JOIN; i++) {
samux 4:74bfdd00362a 57 if (!sendCommand("set comm time 20\r", "AOK"))
samux 4:74bfdd00362a 58 continue;
samux 4:74bfdd00362a 59
samux 4:74bfdd00362a 60 if (!sendCommand("set comm size 128\r", "AOK"))
samux 4:74bfdd00362a 61 continue;
samux 3:10b3866f0ea2 62
samux 4:74bfdd00362a 63 if (!sendCommand("set sys iofunc 0x40\r", "AOK"))
samux 4:74bfdd00362a 64 continue;
samux 3:10b3866f0ea2 65
samux 4:74bfdd00362a 66 // no string sent to the tcp client
samux 4:74bfdd00362a 67 if (!sendCommand("set comm remote 0\r", "AOK"))
samux 4:74bfdd00362a 68 continue;
samux 3:10b3866f0ea2 69
samux 4:74bfdd00362a 70 // tcp protocol
samux 4:74bfdd00362a 71 if (!sendCommand("set ip proto 2\r", "AOK"))
samux 4:74bfdd00362a 72 continue;
samux 3:10b3866f0ea2 73
samux 4:74bfdd00362a 74 // tcp retry
samux 4:74bfdd00362a 75 if (!sendCommand("set ip flags 0x7\r", "AOK"))
samux 4:74bfdd00362a 76 continue;
samux 3:10b3866f0ea2 77
samux 4:74bfdd00362a 78 //no echo
samux 4:74bfdd00362a 79 if (!sendCommand("set u m 1\r", "AOK"))
samux 4:74bfdd00362a 80 continue;
samux 3:10b3866f0ea2 81
samux 4:74bfdd00362a 82 // no auto join
samux 4:74bfdd00362a 83 if (!sendCommand("set w j 0\r", "AOK"))
samux 4:74bfdd00362a 84 continue;
samux 3:10b3866f0ea2 85
samux 4:74bfdd00362a 86 //dhcp
samux 4:74bfdd00362a 87 sprintf(cmd, "set i d %d\r", (dhcp) ? 1 : 0);
samux 4:74bfdd00362a 88 if (!sendCommand(cmd, "AOK"))
samux 4:74bfdd00362a 89 continue;
samux 3:10b3866f0ea2 90
samux 4:74bfdd00362a 91 // ssid
samux 4:74bfdd00362a 92 sprintf(cmd, "set w s %s\r", ssid);
samux 4:74bfdd00362a 93 if (!sendCommand(cmd, "AOK"))
samux 4:74bfdd00362a 94 continue;
samux 4:74bfdd00362a 95
samux 4:74bfdd00362a 96 //auth
samux 4:74bfdd00362a 97 sprintf(cmd, "set w a %d\r", (wpa) ? 3 : 1);
samux 4:74bfdd00362a 98 if (!sendCommand(cmd, "AOK"))
samux 4:74bfdd00362a 99 continue;
samux 3:10b3866f0ea2 100
samux 4:74bfdd00362a 101 // if no dhcp, set ip, netmask and gateway
samux 4:74bfdd00362a 102 if (!dhcp) {
samux 4:74bfdd00362a 103 DBG("not dhcp\r");
samux 4:74bfdd00362a 104
samux 4:74bfdd00362a 105 sprintf(cmd, "set i a %s\r\n", ip);
samux 4:74bfdd00362a 106 if (!sendCommand(cmd, "AOK"))
samux 4:74bfdd00362a 107 continue;
samux 4:74bfdd00362a 108
samux 4:74bfdd00362a 109 sprintf(cmd, "set i n %s\r", netmask);
samux 4:74bfdd00362a 110 if (!sendCommand(cmd, "AOK"))
samux 4:74bfdd00362a 111 continue;
samux 4:74bfdd00362a 112
samux 4:74bfdd00362a 113 sprintf(cmd, "set i g %s\r", gateway);
samux 4:74bfdd00362a 114 if (!sendCommand(cmd, "AOK"))
samux 4:74bfdd00362a 115 continue;
samux 3:10b3866f0ea2 116 }
samux 3:10b3866f0ea2 117
samux 4:74bfdd00362a 118 //key step
samux 4:74bfdd00362a 119 if (wpa)
samux 4:74bfdd00362a 120 sprintf(cmd, "set w p %s\r", phrase);
samux 4:74bfdd00362a 121 else
samux 4:74bfdd00362a 122 sprintf(cmd, "set w k %s\r", phrase);
samux 3:10b3866f0ea2 123
samux 4:74bfdd00362a 124 if (!sendCommand(cmd, "AOK"))
samux 4:74bfdd00362a 125 continue;
samux 3:10b3866f0ea2 126
samux 4:74bfdd00362a 127 // save
samux 4:74bfdd00362a 128 if (!sendCommand("save\r", "Stor"))
samux 3:10b3866f0ea2 129 return false;
samux 3:10b3866f0ea2 130
samux 4:74bfdd00362a 131 //join the network
samux 4:74bfdd00362a 132 sprintf(cmd, "join\r");
samux 4:74bfdd00362a 133 if (!sendCommand(cmd, "Associated", NULL, 3000))
samux 4:74bfdd00362a 134 continue;
samux 3:10b3866f0ea2 135
samux 4:74bfdd00362a 136 if (dhcp) {
samux 4:74bfdd00362a 137 if (!sendCommand("", "DHCP=ON", NULL, 3000))
samux 4:74bfdd00362a 138 continue;
samux 4:74bfdd00362a 139 }
samux 3:10b3866f0ea2 140
samux 4:74bfdd00362a 141 exit();
samux 3:10b3866f0ea2 142
samux 4:74bfdd00362a 143 INFO("\r\nssid: %s\r\nphrase: %s\r\nsecurity: %s\r\n\r\n", this->ssid, this->phrase, (wpa) ? "WPA" : "WEP");
samux 4:74bfdd00362a 144 return true;
samux 4:74bfdd00362a 145 }
samux 4:74bfdd00362a 146 return false;
samux 3:10b3866f0ea2 147 }
samux 3:10b3866f0ea2 148
samux 3:10b3866f0ea2 149
samux 3:10b3866f0ea2 150 bool Wifly::dnsLookup(const char * host, char * ip)
samux 3:10b3866f0ea2 151 {
samux 3:10b3866f0ea2 152 string h = host;
samux 4:74bfdd00362a 153 char cmd[30], rcv[100];
samux 3:10b3866f0ea2 154 int l = 0;
samux 3:10b3866f0ea2 155 char * point;
samux 3:10b3866f0ea2 156 int nb_digits = 0;
samux 3:10b3866f0ea2 157
samux 3:10b3866f0ea2 158 // no dns needed
samux 4:74bfdd00362a 159 int pos = h.find(".");
samux 4:74bfdd00362a 160 if (pos != string::npos) {
samux 4:74bfdd00362a 161 string sub = h.substr(0, h.find("."));
samux 4:74bfdd00362a 162 nb_digits = atoi(sub.c_str());
samux 4:74bfdd00362a 163 }
samux 4:74bfdd00362a 164 //printf("substrL %s\r\n", sub.c_str());
samux 4:74bfdd00362a 165 if (count(h.begin(), h.end(), '.') == 3 && nb_digits > 0) {
samux 3:10b3866f0ea2 166 strcpy(ip, host);
samux 3:10b3866f0ea2 167 }
samux 3:10b3866f0ea2 168 // dns needed
samux 3:10b3866f0ea2 169 else {
samux 4:74bfdd00362a 170 nb_digits = 0;
samux 3:10b3866f0ea2 171 sprintf(cmd, "lookup %s\r", host);
samux 3:10b3866f0ea2 172 if (!sendCommand(cmd, NULL, rcv))
samux 3:10b3866f0ea2 173 return false;
samux 3:10b3866f0ea2 174
samux 3:10b3866f0ea2 175 // look for the ip address
samux 3:10b3866f0ea2 176 char * begin = strstr(rcv, "=") + 1;
samux 3:10b3866f0ea2 177 for (int i = 0; i < 3; i++) {
samux 3:10b3866f0ea2 178 point = strstr(begin + l, ".");
samux 3:10b3866f0ea2 179 DBG("str: %s", begin + l);
samux 3:10b3866f0ea2 180 l += point - (begin + l) + 1;
samux 3:10b3866f0ea2 181 }
samux 3:10b3866f0ea2 182 DBG("str: %s", begin + l);
samux 3:10b3866f0ea2 183 while(*(begin + l + nb_digits) >= '0' && *(begin + l + nb_digits) <= '9') {
samux 3:10b3866f0ea2 184 DBG("digit: %c", *(begin + l + nb_digits));
samux 3:10b3866f0ea2 185 nb_digits++;
samux 3:10b3866f0ea2 186 }
samux 3:10b3866f0ea2 187 memcpy(ip, begin, l + nb_digits);
samux 3:10b3866f0ea2 188 ip[l+nb_digits] = 0;
samux 3:10b3866f0ea2 189 DBG("ip from dns: %s", ip);
samux 3:10b3866f0ea2 190 }
samux 3:10b3866f0ea2 191 return true;
samux 3:10b3866f0ea2 192 }
samux 3:10b3866f0ea2 193
samux 3:10b3866f0ea2 194
samux 3:10b3866f0ea2 195 void Wifly::flush()
samux 3:10b3866f0ea2 196 {
samux 3:10b3866f0ea2 197 buf_wifly.flush();
samux 3:10b3866f0ea2 198 }
samux 3:10b3866f0ea2 199
samux 4:74bfdd00362a 200 bool Wifly::sendCommand(const char * cmd, const char * ack, char * res, int timeout)
samux 3:10b3866f0ea2 201 {
samux 3:10b3866f0ea2 202 if (!cmd_mode) {
samux 3:10b3866f0ea2 203 cmdMode();
samux 3:10b3866f0ea2 204 }
samux 4:74bfdd00362a 205 if (send(cmd, strlen(cmd), ack, res, timeout) == -1) {
samux 3:10b3866f0ea2 206 ERR("sendCommand: cannot %s\r\n", cmd);
samux 3:10b3866f0ea2 207 exit();
samux 3:10b3866f0ea2 208 return false;
samux 3:10b3866f0ea2 209 }
samux 3:10b3866f0ea2 210 return true;
samux 3:10b3866f0ea2 211 }
samux 3:10b3866f0ea2 212
samux 3:10b3866f0ea2 213 bool Wifly::cmdMode()
samux 3:10b3866f0ea2 214 {
samux 3:10b3866f0ea2 215 if (send("$$$", 3, "CMD") == -1) {
samux 3:10b3866f0ea2 216 ERR("cannot enter in cmd mode\r\n");
samux 3:10b3866f0ea2 217 return false;
samux 3:10b3866f0ea2 218 }
samux 3:10b3866f0ea2 219 cmd_mode = true;
samux 3:10b3866f0ea2 220 return true;
samux 3:10b3866f0ea2 221 }
samux 3:10b3866f0ea2 222
samux 3:10b3866f0ea2 223 bool Wifly::leave()
samux 3:10b3866f0ea2 224 {
samux 3:10b3866f0ea2 225 if (!sendCommand("leave\r", "DeAuth"))
samux 3:10b3866f0ea2 226 return false;
samux 3:10b3866f0ea2 227 exit();
samux 3:10b3866f0ea2 228 return true;
samux 3:10b3866f0ea2 229
samux 3:10b3866f0ea2 230 }
samux 3:10b3866f0ea2 231
samux 3:10b3866f0ea2 232 bool Wifly::is_connected()
samux 3:10b3866f0ea2 233 {
samux 3:10b3866f0ea2 234 return (tcp_status.read() == 1) ? true : false;
samux 3:10b3866f0ea2 235 }
samux 3:10b3866f0ea2 236
samux 3:10b3866f0ea2 237
samux 3:10b3866f0ea2 238 void Wifly::reset()
samux 3:10b3866f0ea2 239 {
samux 3:10b3866f0ea2 240 reset_pin = 0;
samux 3:10b3866f0ea2 241 wait(0.2);
samux 3:10b3866f0ea2 242 reset_pin = 1;
samux 3:10b3866f0ea2 243 wait(0.2);
samux 3:10b3866f0ea2 244 }
samux 3:10b3866f0ea2 245
samux 3:10b3866f0ea2 246 bool Wifly::close()
samux 3:10b3866f0ea2 247 {
samux 3:10b3866f0ea2 248 wait(0.25);
samux 3:10b3866f0ea2 249 if (!cmdMode())
samux 3:10b3866f0ea2 250 return false;
samux 3:10b3866f0ea2 251 if (send("close\r", 6, "CLOS") == -1)
samux 3:10b3866f0ea2 252 return false;
samux 3:10b3866f0ea2 253 exit();
samux 3:10b3866f0ea2 254 return true;
samux 3:10b3866f0ea2 255 }
samux 3:10b3866f0ea2 256
samux 3:10b3866f0ea2 257
samux 3:10b3866f0ea2 258 int Wifly::putc(char c)
samux 3:10b3866f0ea2 259 {
samux 3:10b3866f0ea2 260 while (!wifi.writeable());
samux 3:10b3866f0ea2 261 return wifi.putc(c);
samux 3:10b3866f0ea2 262 }
samux 3:10b3866f0ea2 263
samux 3:10b3866f0ea2 264
samux 3:10b3866f0ea2 265 bool Wifly::read(char * str)
samux 3:10b3866f0ea2 266 {
samux 3:10b3866f0ea2 267 int length = buf_wifly.available();
samux 3:10b3866f0ea2 268 if (length == 0)
samux 3:10b3866f0ea2 269 return false;
samux 3:10b3866f0ea2 270 for (int i = 0; i < length; i++)
samux 3:10b3866f0ea2 271 buf_wifly.dequeue(&str[i]);
samux 3:10b3866f0ea2 272 str[length] = 0;
samux 3:10b3866f0ea2 273 return true;
samux 3:10b3866f0ea2 274 }
samux 3:10b3866f0ea2 275
samux 3:10b3866f0ea2 276
samux 3:10b3866f0ea2 277 bool Wifly::exit()
samux 3:10b3866f0ea2 278 {
samux 3:10b3866f0ea2 279 flush();
samux 4:74bfdd00362a 280 if (!cmd_mode)
samux 4:74bfdd00362a 281 return true;
samux 3:10b3866f0ea2 282 if (send("exit\r", 5, "EXIT") == -1)
samux 3:10b3866f0ea2 283 return false;
samux 3:10b3866f0ea2 284 cmd_mode = false;
samux 4:74bfdd00362a 285 flush();
samux 3:10b3866f0ea2 286 return true;
samux 3:10b3866f0ea2 287 }
samux 3:10b3866f0ea2 288
samux 3:10b3866f0ea2 289
samux 3:10b3866f0ea2 290 int Wifly::readable()
samux 3:10b3866f0ea2 291 {
samux 3:10b3866f0ea2 292 return buf_wifly.available();
samux 3:10b3866f0ea2 293 }
samux 3:10b3866f0ea2 294
samux 3:10b3866f0ea2 295 int Wifly::writeable()
samux 3:10b3866f0ea2 296 {
samux 3:10b3866f0ea2 297 return wifi.writeable();
samux 3:10b3866f0ea2 298 }
samux 3:10b3866f0ea2 299
samux 3:10b3866f0ea2 300 char Wifly::getc()
samux 3:10b3866f0ea2 301 {
samux 3:10b3866f0ea2 302 char c;
samux 3:10b3866f0ea2 303 while (!buf_wifly.available());
samux 3:10b3866f0ea2 304 buf_wifly.dequeue(&c);
samux 3:10b3866f0ea2 305 return c;
samux 3:10b3866f0ea2 306 }
samux 3:10b3866f0ea2 307
samux 3:10b3866f0ea2 308 void Wifly::handler_rx(void)
samux 3:10b3866f0ea2 309 {
samux 3:10b3866f0ea2 310 //read characters
samux 3:10b3866f0ea2 311 while (wifi.readable())
samux 3:10b3866f0ea2 312 buf_wifly.queue(wifi.getc());
samux 3:10b3866f0ea2 313 }
samux 3:10b3866f0ea2 314
samux 3:10b3866f0ea2 315 void Wifly::attach_rx(bool callback)
samux 3:10b3866f0ea2 316 {
samux 3:10b3866f0ea2 317 if (!callback)
samux 3:10b3866f0ea2 318 wifi.attach(NULL);
samux 3:10b3866f0ea2 319 else
samux 3:10b3866f0ea2 320 wifi.attach(this, &Wifly::handler_rx);
samux 3:10b3866f0ea2 321 }
samux 3:10b3866f0ea2 322
samux 3:10b3866f0ea2 323
samux 4:74bfdd00362a 324 int Wifly::send(const char * str, int len, const char * ACK, char * res, int timeout)
samux 3:10b3866f0ea2 325 {
samux 3:10b3866f0ea2 326 char read;
samux 3:10b3866f0ea2 327 size_t found = string::npos;
samux 3:10b3866f0ea2 328 string checking;
samux 3:10b3866f0ea2 329 Timer tmr;
samux 3:10b3866f0ea2 330 int result = 0;
samux 3:10b3866f0ea2 331
samux 3:10b3866f0ea2 332 DBG("will send: %s\r\n",str);
samux 3:10b3866f0ea2 333
samux 3:10b3866f0ea2 334 attach_rx(false);
samux 3:10b3866f0ea2 335
samux 3:10b3866f0ea2 336 //We flush the buffer
samux 3:10b3866f0ea2 337 while (wifi.readable())
samux 3:10b3866f0ea2 338 wifi.getc();
samux 3:10b3866f0ea2 339
samux 3:10b3866f0ea2 340 if (!ACK || !strcmp(ACK, "NO")) {
samux 3:10b3866f0ea2 341 for (int i = 0; i < len; i++)
samux 3:10b3866f0ea2 342 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 3:10b3866f0ea2 343 } else {
samux 3:10b3866f0ea2 344 //We flush the buffer
samux 3:10b3866f0ea2 345 while (wifi.readable())
samux 3:10b3866f0ea2 346 wifi.getc();
samux 3:10b3866f0ea2 347
samux 3:10b3866f0ea2 348 tmr.start();
samux 3:10b3866f0ea2 349 for (int i = 0; i < len; i++)
samux 3:10b3866f0ea2 350 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 3:10b3866f0ea2 351
samux 3:10b3866f0ea2 352 while (1) {
samux 4:74bfdd00362a 353 if (tmr.read_ms() > timeout) {
samux 3:10b3866f0ea2 354 //We flush the buffer
samux 3:10b3866f0ea2 355 while (wifi.readable())
samux 3:10b3866f0ea2 356 wifi.getc();
samux 3:10b3866f0ea2 357
samux 3:10b3866f0ea2 358 DBG("check: %s\r\n", checking.c_str());
samux 3:10b3866f0ea2 359
samux 3:10b3866f0ea2 360 attach_rx(true);
samux 3:10b3866f0ea2 361 return -1;
samux 3:10b3866f0ea2 362 } else if (wifi.readable()) {
samux 3:10b3866f0ea2 363 read = wifi.getc();
samux 3:10b3866f0ea2 364 if ( read != '\r' && read != '\n') {
samux 3:10b3866f0ea2 365 checking += read;
samux 3:10b3866f0ea2 366 found = checking.find(ACK);
samux 3:10b3866f0ea2 367 if (found != string::npos) {
samux 3:10b3866f0ea2 368 wait(0.01);
samux 3:10b3866f0ea2 369
samux 3:10b3866f0ea2 370 //We flush the buffer
samux 3:10b3866f0ea2 371 while (wifi.readable())
samux 3:10b3866f0ea2 372 wifi.getc();
samux 3:10b3866f0ea2 373
samux 3:10b3866f0ea2 374 break;
samux 3:10b3866f0ea2 375 }
samux 3:10b3866f0ea2 376 }
samux 3:10b3866f0ea2 377 }
samux 3:10b3866f0ea2 378 }
samux 3:10b3866f0ea2 379 DBG("check: %s\r\n", checking.c_str());
samux 3:10b3866f0ea2 380
samux 3:10b3866f0ea2 381 attach_rx(true);
samux 3:10b3866f0ea2 382 return result;
samux 3:10b3866f0ea2 383 }
samux 3:10b3866f0ea2 384
samux 3:10b3866f0ea2 385 //the user wants the result from the command (ACK == NULL, res != NULL)
samux 3:10b3866f0ea2 386 if ( res != NULL) {
samux 3:10b3866f0ea2 387 int i = 0;
samux 3:10b3866f0ea2 388 Timer timeout;
samux 3:10b3866f0ea2 389 timeout.start();
samux 3:10b3866f0ea2 390 tmr.reset();
samux 3:10b3866f0ea2 391 while (1) {
samux 3:10b3866f0ea2 392 if (timeout.read() > 2) {
samux 3:10b3866f0ea2 393 if (i == 0) {
samux 3:10b3866f0ea2 394 res = NULL;
samux 3:10b3866f0ea2 395 break;
samux 3:10b3866f0ea2 396 }
samux 3:10b3866f0ea2 397 res[i] = '\0';
samux 3:10b3866f0ea2 398 DBG("user str 1: %s\r\n", res);
samux 3:10b3866f0ea2 399
samux 3:10b3866f0ea2 400 break;
samux 3:10b3866f0ea2 401 } else {
samux 3:10b3866f0ea2 402 if (tmr.read_ms() > 300) {
samux 3:10b3866f0ea2 403 res[i] = '\0';
samux 3:10b3866f0ea2 404 DBG("user str: %s\r\n", res);
samux 3:10b3866f0ea2 405
samux 3:10b3866f0ea2 406 break;
samux 3:10b3866f0ea2 407 }
samux 3:10b3866f0ea2 408 if (wifi.readable()) {
samux 3:10b3866f0ea2 409 tmr.start();
samux 3:10b3866f0ea2 410 read = wifi.getc();
samux 3:10b3866f0ea2 411
samux 3:10b3866f0ea2 412 // we drop \r and \n
samux 3:10b3866f0ea2 413 if ( read != '\r' && read != '\n') {
samux 3:10b3866f0ea2 414 res[i++] = read;
samux 3:10b3866f0ea2 415 }
samux 3:10b3866f0ea2 416 }
samux 3:10b3866f0ea2 417 }
samux 3:10b3866f0ea2 418 }
samux 3:10b3866f0ea2 419 DBG("user str: %s\r\n", res);
samux 3:10b3866f0ea2 420 }
samux 3:10b3866f0ea2 421
samux 3:10b3866f0ea2 422 //We flush the buffer
samux 3:10b3866f0ea2 423 while (wifi.readable())
samux 3:10b3866f0ea2 424 wifi.getc();
samux 3:10b3866f0ea2 425
samux 3:10b3866f0ea2 426 attach_rx(true);
samux 3:10b3866f0ea2 427 DBG("result: %d\r\n", result)
samux 3:10b3866f0ea2 428 return result;
samux 0:6ffb0aeb3972 429 }