no upgrade or change at this. move to new Library for WIZ550io, W5500 -> http://mbed.org/teams/EthernetInterfaceW5500-makers/code/W5500Interface/

Dependents:   LPC11U68_NTPClient_HelloWorld_WIZ550io

Fork of WIZ550ioInterface by ban4jp -

please get the new Library for WIZ550io, W5500 (WIZnet) http://mbed.org/teams/EthernetInterfaceW5500-makers/code/W5500Interface/

Import libraryW5500Interface

This is the Interface library for WIZnet W5500 chip which forked of EthernetInterfaceW5500, WIZnetInterface and WIZ550ioInterface. This library has simple name as "W5500Interface". and can be used for Wiz550io users also.

Committer:
samux
Date:
Thu Dec 20 10:37:52 2012 +0000
Revision:
3:9aa05e19c62e
Parent:
2:8e54830d0df7
Child:
4:0bcec6272784
add reboot method - reboot module for accept (tcp server)

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
samux 2:8e54830d0df7 25 #if (0 && !defined(TARGET_LPC11U24))
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
samux 2:8e54830d0df7 35 #if !defined(TARGET_LPC11U24)
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 1:fb4494783863 83 if (!sendCommand("set c t 20\r", "AOK"))
samux 1:fb4494783863 84 continue;
samux 1:fb4494783863 85
samux 1:fb4494783863 86 // set size
samux 1:fb4494783863 87 if (!sendCommand("set c s 128\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);
samux 1:fb4494783863 117 if (!sendCommand(cmd, "AOK"))
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
samux 1:fb4494783863 149 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 150 continue;
samux 1:fb4494783863 151 }
samux 1:fb4494783863 152
samux 2:8e54830d0df7 153 //join the network (10s timeout)
samux 1:fb4494783863 154 if (state.dhcp) {
samux 2:8e54830d0df7 155 if (!sendCommand("join\r", "DHCP=ON", NULL, 10000))
samux 2:8e54830d0df7 156 continue;
samux 2:8e54830d0df7 157 } else {
samux 2:8e54830d0df7 158 if (!sendCommand("join\r", "Associated", NULL, 10000))
samux 1:fb4494783863 159 continue;
samux 1:fb4494783863 160 }
samux 1:fb4494783863 161
samux 2:8e54830d0df7 162 if (!sendCommand("save\r", "Stor"))
samux 2:8e54830d0df7 163 continue;
samux 2:8e54830d0df7 164
samux 1:fb4494783863 165 exit();
samux 1:fb4494783863 166
samux 1:fb4494783863 167 state.associated = true;
samux 1:fb4494783863 168 INFO("\r\nssid: %s\r\nphrase: %s\r\nsecurity: %s\r\n\r\n", this->ssid, this->phrase, getStringSecurity());
samux 1:fb4494783863 169 return true;
samux 1:fb4494783863 170 }
samux 1:fb4494783863 171 return false;
samux 1:fb4494783863 172 }
samux 1:fb4494783863 173
samux 1:fb4494783863 174
samux 1:fb4494783863 175 bool Wifly::setProtocol(Protocol p)
samux 1:fb4494783863 176 {
samux 1:fb4494783863 177 // use udp auto pairing
samux 1:fb4494783863 178 char cmd[20];
samux 1:fb4494783863 179 sprintf(cmd, "set i p %d\r", p);
samux 1:fb4494783863 180 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 181 return false;
samux 1:fb4494783863 182
samux 1:fb4494783863 183 switch(p) {
samux 1:fb4494783863 184 case TCP:
samux 1:fb4494783863 185 // set ip flags: tcp retry enabled
samux 1:fb4494783863 186 if (!sendCommand("set i f 0x07\r", "AOK"))
samux 1:fb4494783863 187 return false;
samux 1:fb4494783863 188 break;
samux 1:fb4494783863 189 case UDP:
samux 1:fb4494783863 190 // set ip flags: udp auto pairing enabled
samux 1:fb4494783863 191 if (!sendCommand("set i f 0x40\r", "AOK"))
samux 1:fb4494783863 192 return false;
samux 1:fb4494783863 193 if (!sendCommand("set i h 0.0.0.0\r", "AOK"))
samux 1:fb4494783863 194 return false;
samux 1:fb4494783863 195 if (!sendCommand("set i r 0\r", "AOK"))
samux 1:fb4494783863 196 return false;
samux 1:fb4494783863 197 break;
samux 1:fb4494783863 198 }
samux 1:fb4494783863 199 state.proto = p;
samux 1:fb4494783863 200 return true;
samux 1:fb4494783863 201 }
samux 1:fb4494783863 202
samux 1:fb4494783863 203 char * Wifly::getStringSecurity()
samux 1:fb4494783863 204 {
samux 1:fb4494783863 205 switch(state.sec) {
samux 1:fb4494783863 206 case NONE:
samux 1:fb4494783863 207 return "NONE";
samux 1:fb4494783863 208 case WEP_128:
samux 1:fb4494783863 209 return "WEP_128";
samux 1:fb4494783863 210 case WPA:
samux 1:fb4494783863 211 return "WPA";
samux 1:fb4494783863 212 }
samux 1:fb4494783863 213 return "UNKNOWN";
samux 1:fb4494783863 214 }
samux 1:fb4494783863 215
samux 1:fb4494783863 216 bool Wifly::connect(const char * host, int port)
samux 1:fb4494783863 217 {
samux 1:fb4494783863 218 char rcv[20];
samux 1:fb4494783863 219 char cmd[20];
samux 1:fb4494783863 220
samux 2:8e54830d0df7 221 // try to open
samux 2:8e54830d0df7 222 sprintf(cmd, "open %s %d\r", host, port);
samux 2:8e54830d0df7 223 if (sendCommand(cmd, "OPEN", NULL, 10000)) {
samux 2:8e54830d0df7 224 state.tcp = true;
samux 2:8e54830d0df7 225 state.cmd_mode = false;
samux 2:8e54830d0df7 226 return true;
samux 1:fb4494783863 227 }
samux 1:fb4494783863 228
samux 2:8e54830d0df7 229 // if failed, retry and parse the response
samux 2:8e54830d0df7 230 if (sendCommand(cmd, NULL, rcv, 5000)) {
samux 1:fb4494783863 231 if (strstr(rcv, "OPEN") == NULL) {
samux 1:fb4494783863 232 if (strstr(rcv, "Connected") != NULL) {
samux 2:8e54830d0df7 233 wait(0.25);
samux 1:fb4494783863 234 if (!sendCommand("close\r", "CLOS"))
samux 1:fb4494783863 235 return false;
samux 2:8e54830d0df7 236 wait(0.25);
samux 2:8e54830d0df7 237 if (!sendCommand(cmd, "OPEN", NULL, 10000))
samux 1:fb4494783863 238 return false;
samux 1:fb4494783863 239 } else {
samux 1:fb4494783863 240 return false;
samux 1:fb4494783863 241 }
samux 1:fb4494783863 242 }
samux 1:fb4494783863 243 } else {
samux 1:fb4494783863 244 return false;
samux 1:fb4494783863 245 }
samux 2:8e54830d0df7 246
samux 1:fb4494783863 247 state.tcp = true;
samux 1:fb4494783863 248 state.cmd_mode = false;
samux 1:fb4494783863 249
samux 1:fb4494783863 250 return true;
samux 1:fb4494783863 251 }
samux 1:fb4494783863 252
samux 1:fb4494783863 253
samux 1:fb4494783863 254 bool Wifly::gethostbyname(const char * host, char * ip)
samux 1:fb4494783863 255 {
samux 1:fb4494783863 256 string h = host;
samux 1:fb4494783863 257 char cmd[30], rcv[100];
samux 1:fb4494783863 258 int l = 0;
samux 1:fb4494783863 259 char * point;
samux 1:fb4494783863 260 int nb_digits = 0;
samux 1:fb4494783863 261
samux 1:fb4494783863 262 // no dns needed
samux 1:fb4494783863 263 int pos = h.find(".");
samux 1:fb4494783863 264 if (pos != string::npos) {
samux 1:fb4494783863 265 string sub = h.substr(0, h.find("."));
samux 1:fb4494783863 266 nb_digits = atoi(sub.c_str());
samux 1:fb4494783863 267 }
samux 1:fb4494783863 268 //printf("substrL %s\r\n", sub.c_str());
samux 1:fb4494783863 269 if (count(h.begin(), h.end(), '.') == 3 && nb_digits > 0) {
samux 1:fb4494783863 270 strcpy(ip, host);
samux 1:fb4494783863 271 }
samux 1:fb4494783863 272 // dns needed
samux 1:fb4494783863 273 else {
samux 1:fb4494783863 274 nb_digits = 0;
samux 1:fb4494783863 275 sprintf(cmd, "lookup %s\r", host);
samux 1:fb4494783863 276 if (!sendCommand(cmd, NULL, rcv))
samux 1:fb4494783863 277 return false;
samux 1:fb4494783863 278
samux 1:fb4494783863 279 // look for the ip address
samux 1:fb4494783863 280 char * begin = strstr(rcv, "=") + 1;
samux 1:fb4494783863 281 for (int i = 0; i < 3; i++) {
samux 1:fb4494783863 282 point = strstr(begin + l, ".");
samux 1:fb4494783863 283 DBG("str: %s", begin + l);
samux 1:fb4494783863 284 l += point - (begin + l) + 1;
samux 1:fb4494783863 285 }
samux 1:fb4494783863 286 DBG("str: %s", begin + l);
samux 1:fb4494783863 287 while(*(begin + l + nb_digits) >= '0' && *(begin + l + nb_digits) <= '9') {
samux 1:fb4494783863 288 DBG("digit: %c", *(begin + l + nb_digits));
samux 1:fb4494783863 289 nb_digits++;
samux 1:fb4494783863 290 }
samux 1:fb4494783863 291 memcpy(ip, begin, l + nb_digits);
samux 1:fb4494783863 292 ip[l+nb_digits] = 0;
samux 1:fb4494783863 293 DBG("ip from dns: %s", ip);
samux 1:fb4494783863 294 }
samux 1:fb4494783863 295 return true;
samux 1:fb4494783863 296 }
samux 1:fb4494783863 297
samux 1:fb4494783863 298
samux 1:fb4494783863 299 void Wifly::flush()
samux 1:fb4494783863 300 {
samux 1:fb4494783863 301 buf_wifly.flush();
samux 1:fb4494783863 302 }
samux 1:fb4494783863 303
samux 1:fb4494783863 304 bool Wifly::sendCommand(const char * cmd, const char * ack, char * res, int timeout)
samux 1:fb4494783863 305 {
samux 1:fb4494783863 306 if (!state.cmd_mode) {
samux 1:fb4494783863 307 cmdMode();
samux 1:fb4494783863 308 }
samux 1:fb4494783863 309 if (send(cmd, strlen(cmd), ack, res, timeout) == -1) {
samux 1:fb4494783863 310 ERR("sendCommand: cannot %s\r\n", cmd);
samux 1:fb4494783863 311 exit();
samux 1:fb4494783863 312 return false;
samux 1:fb4494783863 313 }
samux 1:fb4494783863 314 return true;
samux 1:fb4494783863 315 }
samux 1:fb4494783863 316
samux 1:fb4494783863 317 bool Wifly::cmdMode()
samux 1:fb4494783863 318 {
samux 1:fb4494783863 319 // if already in cmd mode, return
samux 1:fb4494783863 320 if (state.cmd_mode)
samux 1:fb4494783863 321 return true;
samux 2:8e54830d0df7 322
samux 1:fb4494783863 323 if (send("$$$", 3, "CMD") == -1) {
samux 1:fb4494783863 324 ERR("cannot enter in cmd mode\r\n");
samux 2:8e54830d0df7 325 exit();
samux 1:fb4494783863 326 return false;
samux 1:fb4494783863 327 }
samux 1:fb4494783863 328 state.cmd_mode = true;
samux 1:fb4494783863 329 return true;
samux 1:fb4494783863 330 }
samux 1:fb4494783863 331
samux 1:fb4494783863 332 bool Wifly::disconnect()
samux 1:fb4494783863 333 {
samux 1:fb4494783863 334 // if already disconnected, return
samux 1:fb4494783863 335 if (!state.associated)
samux 1:fb4494783863 336 return true;
samux 2:8e54830d0df7 337
samux 1:fb4494783863 338 if (!sendCommand("leave\r", "DeAuth"))
samux 1:fb4494783863 339 return false;
samux 1:fb4494783863 340 exit();
samux 2:8e54830d0df7 341
samux 1:fb4494783863 342 state.associated = false;
samux 1:fb4494783863 343 return true;
samux 1:fb4494783863 344
samux 1:fb4494783863 345 }
samux 1:fb4494783863 346
samux 1:fb4494783863 347 bool Wifly::is_connected()
samux 1:fb4494783863 348 {
samux 1:fb4494783863 349 return (tcp_status.read() == 1) ? true : false;
samux 1:fb4494783863 350 }
samux 1:fb4494783863 351
samux 1:fb4494783863 352
samux 1:fb4494783863 353 void Wifly::reset()
samux 1:fb4494783863 354 {
samux 1:fb4494783863 355 reset_pin = 0;
samux 1:fb4494783863 356 wait(0.2);
samux 1:fb4494783863 357 reset_pin = 1;
samux 1:fb4494783863 358 wait(0.2);
samux 1:fb4494783863 359 }
samux 1:fb4494783863 360
samux 3:9aa05e19c62e 361 bool Wifly::reboot()
samux 3:9aa05e19c62e 362 {
samux 3:9aa05e19c62e 363 // if already in cmd mode, return
samux 3:9aa05e19c62e 364 if (!sendCommand("reboot\r"))
samux 3:9aa05e19c62e 365 return false;
samux 3:9aa05e19c62e 366
samux 3:9aa05e19c62e 367 wait(0.3);
samux 3:9aa05e19c62e 368
samux 3:9aa05e19c62e 369 state.cmd_mode = false;
samux 3:9aa05e19c62e 370 return true;
samux 3:9aa05e19c62e 371 }
samux 3:9aa05e19c62e 372
samux 1:fb4494783863 373 bool Wifly::close()
samux 1:fb4494783863 374 {
samux 1:fb4494783863 375 // if not connected, return
samux 1:fb4494783863 376 if (!state.tcp)
samux 1:fb4494783863 377 return true;
samux 2:8e54830d0df7 378
samux 1:fb4494783863 379 wait(0.25);
samux 1:fb4494783863 380 if (!sendCommand("close\r", "CLOS"))
samux 1:fb4494783863 381 return false;
samux 1:fb4494783863 382 exit();
samux 2:8e54830d0df7 383
samux 1:fb4494783863 384 state.tcp = false;
samux 1:fb4494783863 385 return true;
samux 1:fb4494783863 386 }
samux 1:fb4494783863 387
samux 1:fb4494783863 388
samux 1:fb4494783863 389 int Wifly::putc(char c)
samux 1:fb4494783863 390 {
samux 1:fb4494783863 391 while (!wifi.writeable());
samux 1:fb4494783863 392 return wifi.putc(c);
samux 1:fb4494783863 393 }
samux 1:fb4494783863 394
samux 1:fb4494783863 395
samux 1:fb4494783863 396 bool Wifly::exit()
samux 1:fb4494783863 397 {
samux 1:fb4494783863 398 flush();
samux 1:fb4494783863 399 if (!state.cmd_mode)
samux 1:fb4494783863 400 return true;
samux 1:fb4494783863 401 if (!sendCommand("exit\r", "EXIT"))
samux 1:fb4494783863 402 return false;
samux 1:fb4494783863 403 state.cmd_mode = false;
samux 1:fb4494783863 404 flush();
samux 1:fb4494783863 405 return true;
samux 1:fb4494783863 406 }
samux 1:fb4494783863 407
samux 1:fb4494783863 408
samux 1:fb4494783863 409 int Wifly::readable()
samux 1:fb4494783863 410 {
samux 1:fb4494783863 411 return buf_wifly.available();
samux 1:fb4494783863 412 }
samux 1:fb4494783863 413
samux 1:fb4494783863 414 int Wifly::writeable()
samux 1:fb4494783863 415 {
samux 1:fb4494783863 416 return wifi.writeable();
samux 1:fb4494783863 417 }
samux 1:fb4494783863 418
samux 1:fb4494783863 419 char Wifly::getc()
samux 1:fb4494783863 420 {
samux 1:fb4494783863 421 char c;
samux 1:fb4494783863 422 while (!buf_wifly.available());
samux 1:fb4494783863 423 buf_wifly.dequeue(&c);
samux 1:fb4494783863 424 return c;
samux 1:fb4494783863 425 }
samux 1:fb4494783863 426
samux 1:fb4494783863 427 void Wifly::handler_rx(void)
samux 1:fb4494783863 428 {
samux 1:fb4494783863 429 //read characters
samux 1:fb4494783863 430 while (wifi.readable())
samux 1:fb4494783863 431 buf_wifly.queue(wifi.getc());
samux 1:fb4494783863 432 }
samux 1:fb4494783863 433
samux 1:fb4494783863 434 void Wifly::attach_rx(bool callback)
samux 1:fb4494783863 435 {
samux 1:fb4494783863 436 if (!callback)
samux 1:fb4494783863 437 wifi.attach(NULL);
samux 1:fb4494783863 438 else
samux 1:fb4494783863 439 wifi.attach(this, &Wifly::handler_rx);
samux 1:fb4494783863 440 }
samux 1:fb4494783863 441
samux 1:fb4494783863 442
samux 1:fb4494783863 443 int Wifly::send(const char * str, int len, const char * ACK, char * res, int timeout)
samux 1:fb4494783863 444 {
samux 1:fb4494783863 445 char read;
samux 1:fb4494783863 446 size_t found = string::npos;
samux 1:fb4494783863 447 string checking;
samux 1:fb4494783863 448 Timer tmr;
samux 1:fb4494783863 449 int result = 0;
samux 1:fb4494783863 450
samux 1:fb4494783863 451 DBG("will send: %s\r\n",str);
samux 1:fb4494783863 452
samux 1:fb4494783863 453 attach_rx(false);
samux 1:fb4494783863 454
samux 1:fb4494783863 455 //We flush the buffer
samux 1:fb4494783863 456 while (wifi.readable())
samux 1:fb4494783863 457 wifi.getc();
samux 1:fb4494783863 458
samux 1:fb4494783863 459 if (!ACK || !strcmp(ACK, "NO")) {
samux 1:fb4494783863 460 for (int i = 0; i < len; i++)
samux 1:fb4494783863 461 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 1:fb4494783863 462 } else {
samux 1:fb4494783863 463 //We flush the buffer
samux 1:fb4494783863 464 while (wifi.readable())
samux 1:fb4494783863 465 wifi.getc();
samux 1:fb4494783863 466
samux 1:fb4494783863 467 tmr.start();
samux 1:fb4494783863 468 for (int i = 0; i < len; i++)
samux 1:fb4494783863 469 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 1:fb4494783863 470
samux 1:fb4494783863 471 while (1) {
samux 1:fb4494783863 472 if (tmr.read_ms() > timeout) {
samux 1:fb4494783863 473 //We flush the buffer
samux 1:fb4494783863 474 while (wifi.readable())
samux 1:fb4494783863 475 wifi.getc();
samux 1:fb4494783863 476
samux 1:fb4494783863 477 DBG("check: %s\r\n", checking.c_str());
samux 1:fb4494783863 478
samux 1:fb4494783863 479 attach_rx(true);
samux 1:fb4494783863 480 return -1;
samux 1:fb4494783863 481 } else if (wifi.readable()) {
samux 1:fb4494783863 482 read = wifi.getc();
samux 1:fb4494783863 483 if ( read != '\r' && read != '\n') {
samux 1:fb4494783863 484 checking += read;
samux 1:fb4494783863 485 found = checking.find(ACK);
samux 1:fb4494783863 486 if (found != string::npos) {
samux 1:fb4494783863 487 wait(0.01);
samux 1:fb4494783863 488
samux 1:fb4494783863 489 //We flush the buffer
samux 1:fb4494783863 490 while (wifi.readable())
samux 1:fb4494783863 491 wifi.getc();
samux 1:fb4494783863 492
samux 1:fb4494783863 493 break;
samux 1:fb4494783863 494 }
samux 1:fb4494783863 495 }
samux 1:fb4494783863 496 }
samux 1:fb4494783863 497 }
samux 1:fb4494783863 498 DBG("check: %s\r\n", checking.c_str());
samux 1:fb4494783863 499
samux 1:fb4494783863 500 attach_rx(true);
samux 1:fb4494783863 501 return result;
samux 1:fb4494783863 502 }
samux 1:fb4494783863 503
samux 1:fb4494783863 504 //the user wants the result from the command (ACK == NULL, res != NULL)
samux 1:fb4494783863 505 if ( res != NULL) {
samux 1:fb4494783863 506 int i = 0;
samux 1:fb4494783863 507 Timer timeout;
samux 1:fb4494783863 508 timeout.start();
samux 1:fb4494783863 509 tmr.reset();
samux 1:fb4494783863 510 while (1) {
samux 1:fb4494783863 511 if (timeout.read() > 2) {
samux 1:fb4494783863 512 if (i == 0) {
samux 1:fb4494783863 513 res = NULL;
samux 1:fb4494783863 514 break;
samux 1:fb4494783863 515 }
samux 1:fb4494783863 516 res[i] = '\0';
samux 1:fb4494783863 517 DBG("user str 1: %s\r\n", res);
samux 1:fb4494783863 518
samux 1:fb4494783863 519 break;
samux 1:fb4494783863 520 } else {
samux 1:fb4494783863 521 if (tmr.read_ms() > 300) {
samux 1:fb4494783863 522 res[i] = '\0';
samux 1:fb4494783863 523 DBG("user str: %s\r\n", res);
samux 1:fb4494783863 524
samux 1:fb4494783863 525 break;
samux 1:fb4494783863 526 }
samux 1:fb4494783863 527 if (wifi.readable()) {
samux 1:fb4494783863 528 tmr.start();
samux 1:fb4494783863 529 read = wifi.getc();
samux 1:fb4494783863 530
samux 1:fb4494783863 531 // we drop \r and \n
samux 1:fb4494783863 532 if ( read != '\r' && read != '\n') {
samux 1:fb4494783863 533 res[i++] = read;
samux 1:fb4494783863 534 }
samux 1:fb4494783863 535 }
samux 1:fb4494783863 536 }
samux 1:fb4494783863 537 }
samux 1:fb4494783863 538 DBG("user str: %s\r\n", res);
samux 1:fb4494783863 539 }
samux 1:fb4494783863 540
samux 1:fb4494783863 541 //We flush the buffer
samux 1:fb4494783863 542 while (wifi.readable())
samux 1:fb4494783863 543 wifi.getc();
samux 1:fb4494783863 544
samux 1:fb4494783863 545 attach_rx(true);
samux 1:fb4494783863 546 DBG("result: %d\r\n", result)
samux 1:fb4494783863 547 return result;
samux 1:fb4494783863 548 }