wifly/socket interface for wifly modules

Dependents:   WiFi neurGAI_WIFI thingspeak thingspeak2

Committer:
samux
Date:
Fri Aug 24 13:07:01 2012 +0000
Revision:
11:b912f91e3212
Parent:
7:a92dbed32890
Child:
12:5ffaed1456c8
add state data structure

Who changed what in which revision?

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