MODIFIED from mbed official WiflyInterface (interface for Roving Networks Wifly modules). Numerous performance and reliability improvements (see the detailed documentation). Also, tracking changes in mbed official version to retain functional parity.

Dependents:   Smart-WiFly-WebServer PUB_WiflyInterface_Demo

Fork of WiflyInterface by mbed official

Resources

Derivative from mbed Official

  • Documentation update, improved consistency, documented parameters that were inadvertently omitted.
  • Avoid c++ string handling, which causes dynamic allocation and free, side effect, fewer CPU cycles spent for same purpose.
  • Fixed socket APIs to support non-blocking mode.
  • Increase communication baud-rate to Wifly module
  • sendCommand - added retries for improved robustness.
  • setConnectionState - method to force the connection state (used by TCPSocketServer)
  • gethostbyname - added a length parameter to the size of the buffer being written
  • flushIn - a private method to flush the input buffer
  • Changed the timeout from 500 to 2500 msec for commands - measured some at 700 to 850 msec.
  • Performance improvements - reduced some unnecessary delays.
  • Added additional security options for the wi-fi connection (that are supported by the WiFly module).
  • Added setSecurity API which permits revising the security when connecting to, or selecting from, one of several access points.
  • Improved DEBUG interface (slightly more consistent printout).
  • gathers information from the Wifly module on reboot (SW version info), which permits customizing behavior based on Wifly capabilities (like the improved security).
  • Avoid potential for recursive crash (if exit fails, it calls sendcommand, which calls exit...)
  • Update to support permissible SSID and PassCode lengths.

Robustness testing

I've had some mixed behavior with the Wifly module, some of which seems to be traceable to the module itself, and some in my derivative code. The result, after running for minutes, hours, sometimes days, it hangs and I have to reset the module.

To test, I created a fairly simple test program -

  • check for Watchdog induced reset and count it.
  • initialize the Watchdog for 60 sec timeout.
  • Init the Wifly interface and connect to my network.
  • Wait 10 seconds and force mbed_reset().

If the Watchdog induces the restart, then it is pretty clear that either:

  • The communications hung with the Wifly module causing the failure.
  • The Wifly module decided to go unresponsive.

If it gets to the end, it typically takes about 4 to 6 seconds for the boot and connect, then the 10 second delay.

But I can't really pin down the root cause easily. My strongest theory is that the Wifly module has rebooted, and since I don't store the high baud rate I configure it for, it resets back to 9600.

Also, one of the objectives for my revised send( ) is to avoid the c++ string, as that can fragment memory, and it wasn't very well bounded in behavior.

Latest tests:

Warm BootsWatchdog EventsNotes
100's30An early version of my derivative WiflyInterface, including my derivative of "send( )" API. Let's call this version 0.1.
26684My derivative WiflyInterface, but with the mbed official "send( )" API. Much improved. This was over the course of about 12 hours.
24003Most recent derivative - incremental change to "send( )", but this relative number does not rule out the Wifly module itself.

I think with these numbers, +/- 1 means that the changes have had no measurable effect. Which is good, since this incremental change eliminates the c++ string handling.

Test Software

This is pieces of a test program, clipped and copied to here. What I have compiled and run for hours and hours is almost exactly what you see. This uses this simple Watchdog library.

#include "mbed.h"
#include "WiflyInterface.h"
#include "Watchdog.h"

Serial pc(USBTX, USBRX);

Watchdog wd;
extern "C" void mbed_reset();

// Pinout for SmartBoard
WiflyInterface wifly(p9, p10, p30, p29, "ssid", "pass", WPA);

int main() {
    pc.baud(460800);                         // I like a snappy terminal
    
    wd.Configure(60.0);                     // Set time limit for the test to 1 minute
    LPC_RTC->GPREG0++;                      // Count boots here
    if (wd.WatchdogCausedReset()) {
        LPC_RTC->GPREG1++;                  // Count Watchdog events here
        pc.printf("\r\n\r\nWatchdog event.\r\n");
    }
    pc.printf("\r\nWifly Test: %d boots, %d watchdogs. %s %s\r\n", LPC_RTC->GPREG0, LPC_RTC->GPREG1, __DATE__, __TIME__);
    
    wifly.init(); // use DHCP
    pc.printf("Connect...  ");
    while (!wifly.connect());               // join the network
    pc.printf("Address is %s.  ", wifly.getIPAddress());
    pc.printf("Disconnect...  ");
    wifly.disconnect();
    pc.printf("OK. Reset in 10 sec...\r\n");
    wait(10);
    if (pc.readable()) {
        if (pc.getc() == 'r') {             // secret 'r'eset of the counters
            LPC_RTC->GPREG0 = 0;
            LPC_RTC->GPREG1 = 0;
            pc.printf("counters reset\r\n");
        }
    }
    mbed_reset();                           // reset here indicates successful communication
}
Committer:
WiredHome
Date:
Fri Sep 06 23:49:08 2013 +0000
Revision:
35:2dc12224cbd6
Parent:
34:52e4eec8b790
Child:
36:8d868fea6fe6
Modified a version extraction to handle both v2.36 and v4.00 (it was looking for a case sensitive match of wifly before it parsed Ver X.YY).; WiFly Ver 2.36, 09-27-2012 on RN-171; wifly-EZX Ver 4.00.1, Apr 19 2013 11:47:16 on RN-171

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>
WiredHome 35:2dc12224cbd6 23 #include <ctype.h>
samux 1:fb4494783863 24
WiredHome 25:a740eb74a86a 25 // Defined to disable remote configuration via telnet which increases security of this device.
WiredHome 25:a740eb74a86a 26 #define INCREASE_SECURITY
WiredHome 25:a740eb74a86a 27
WiredHome 35:2dc12224cbd6 28 #define DEBUG //Debug is disabled by default
WiredHome 20:906b0f951bc3 29
WiredHome 20:906b0f951bc3 30 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 20:906b0f951bc3 31 #define DBG(x, ...) std::printf("[DBG Wifly%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
WiredHome 20:906b0f951bc3 32 #define WARN(x, ...) std::printf("[WRN Wifly%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
WiredHome 20:906b0f951bc3 33 #define ERR(x, ...) std::printf("[ERR Wifly%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
WiredHome 20:906b0f951bc3 34 #define INFO(x, ...) std::printf("[INF Wifly%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
samux 1:fb4494783863 35 #else
samux 1:fb4494783863 36 #define DBG(x, ...)
samux 1:fb4494783863 37 #define WARN(x, ...)
samux 1:fb4494783863 38 #define ERR(x, ...)
WiredHome 20:906b0f951bc3 39 #define INFO(x, ...)
samux 1:fb4494783863 40 #endif
samux 1:fb4494783863 41
samux 1:fb4494783863 42 #define MAX_TRY_JOIN 3
samux 1:fb4494783863 43
samux 1:fb4494783863 44 Wifly * Wifly::inst;
samux 1:fb4494783863 45
samux 1:fb4494783863 46 Wifly::Wifly( PinName tx, PinName rx, PinName _reset, PinName tcp_status, const char * ssid, const char * phrase, Security sec):
WiredHome 20:906b0f951bc3 47 wifi(tx, rx), reset_pin(_reset), tcp_status(tcp_status), baudrate(9600), buf_wifly(256)
samux 1:fb4494783863 48 {
samux 1:fb4494783863 49 memset(&state, 0, sizeof(state));
samux 1:fb4494783863 50 state.sec = sec;
samux 1:fb4494783863 51
WiredHome 24:5012a535b1d5 52 FixPhrase(&this->ssid, ssid);
WiredHome 24:5012a535b1d5 53 FixPhrase(&this->phrase, phrase);
samux 1:fb4494783863 54
samux 1:fb4494783863 55 inst = this;
samux 1:fb4494783863 56 attach_rx(false);
WiredHome 34:52e4eec8b790 57 setCmdMode(false);
WiredHome 25:a740eb74a86a 58 wiflyVersionString = NULL;
samux 1:fb4494783863 59 }
samux 1:fb4494783863 60
WiredHome 25:a740eb74a86a 61
WiredHome 25:a740eb74a86a 62 Wifly::~Wifly()
WiredHome 25:a740eb74a86a 63 {
WiredHome 25:a740eb74a86a 64 if (ssid) {
WiredHome 25:a740eb74a86a 65 free(ssid);
WiredHome 25:a740eb74a86a 66 ssid = NULL;
WiredHome 25:a740eb74a86a 67 }
WiredHome 25:a740eb74a86a 68 if (phrase) {
WiredHome 25:a740eb74a86a 69 free(phrase);
WiredHome 25:a740eb74a86a 70 phrase = NULL;
WiredHome 25:a740eb74a86a 71 }
WiredHome 25:a740eb74a86a 72 if (wiflyVersionString) {
WiredHome 25:a740eb74a86a 73 free(wiflyVersionString);
WiredHome 25:a740eb74a86a 74 wiflyVersionString = NULL;
WiredHome 25:a740eb74a86a 75 }
WiredHome 25:a740eb74a86a 76 }
WiredHome 25:a740eb74a86a 77
WiredHome 25:a740eb74a86a 78
samux 1:fb4494783863 79 bool Wifly::join()
samux 1:fb4494783863 80 {
samux 1:fb4494783863 81 char cmd[20];
samux 1:fb4494783863 82
WiredHome 31:e4422f192d25 83 INFO("join");
samux 1:fb4494783863 84 for (int i= 0; i < MAX_TRY_JOIN; i++) {
samux 2:8e54830d0df7 85
samux 2:8e54830d0df7 86 // no auto join
samux 2:8e54830d0df7 87 if (!sendCommand("set w j 0\r", "AOK"))
samux 2:8e54830d0df7 88 continue;
samux 2:8e54830d0df7 89
WiredHome 27:8509ec4a0a0a 90 // no echo
samux 2:8e54830d0df7 91 if (!sendCommand("set u m 1\r", "AOK"))
samux 2:8e54830d0df7 92 continue;
samux 2:8e54830d0df7 93
WiredHome 27:8509ec4a0a0a 94 // set comm time to flush (ms)
samux 4:0bcec6272784 95 if (!sendCommand("set c t 30\r", "AOK"))
samux 1:fb4494783863 96 continue;
samux 1:fb4494783863 97
WiredHome 27:8509ec4a0a0a 98 // set comm size to auto-send
WiredHome 27:8509ec4a0a0a 99 if (!sendCommand("set c s 1420\r", "AOK"))
samux 1:fb4494783863 100 continue;
samux 1:fb4494783863 101
WiredHome 29:49876a8c445b 102 // set comm idle time to auto-close (sec)
WiredHome 29:49876a8c445b 103 //if (!sendCommand("set c i 5\r", "AOK"))
WiredHome 29:49876a8c445b 104 // continue;
WiredHome 29:49876a8c445b 105
samux 1:fb4494783863 106 // red led on when tcp connection active
samux 1:fb4494783863 107 if (!sendCommand("set s i 0x40\r", "AOK"))
samux 1:fb4494783863 108 continue;
samux 1:fb4494783863 109
WiredHome 27:8509ec4a0a0a 110 // no hello string sent to the tcp client
samux 1:fb4494783863 111 if (!sendCommand("set c r 0\r", "AOK"))
samux 1:fb4494783863 112 continue;
samux 1:fb4494783863 113
samux 1:fb4494783863 114 // tcp protocol
samux 1:fb4494783863 115 if (!sendCommand("set i p 2\r", "AOK"))
samux 1:fb4494783863 116 continue;
samux 1:fb4494783863 117
WiredHome 27:8509ec4a0a0a 118 // tcp retry (retry enabled, Nagle alg, retain link)
samux 1:fb4494783863 119 if (!sendCommand("set i f 0x7\r", "AOK"))
samux 1:fb4494783863 120 continue;
WiredHome 20:906b0f951bc3 121
WiredHome 25:a740eb74a86a 122 #ifdef INCREASE_SECURITY
WiredHome 25:a740eb74a86a 123 // tcp-mode 0x10 = disable remote configuration
WiredHome 25:a740eb74a86a 124 // only in SW 2.27 and higher (see 2.3.39)
WiredHome 25:a740eb74a86a 125 if ((swVersion >= 2.27) && (!sendCommand("set i t 0x10\r", "AOK")))
WiredHome 25:a740eb74a86a 126 continue;
WiredHome 25:a740eb74a86a 127 #endif
WiredHome 25:a740eb74a86a 128
samux 2:8e54830d0df7 129 // set dns server
samux 2:8e54830d0df7 130 if (!sendCommand("set d n rn.microchip.com\r", "AOK"))
samux 1:fb4494783863 131 continue;
samux 1:fb4494783863 132
samux 1:fb4494783863 133 //dhcp
samux 1:fb4494783863 134 sprintf(cmd, "set i d %d\r", (state.dhcp) ? 1 : 0);
samux 1:fb4494783863 135 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 136 continue;
samux 1:fb4494783863 137
samux 1:fb4494783863 138 // ssid
samux 1:fb4494783863 139 sprintf(cmd, "set w s %s\r", ssid);
samux 1:fb4494783863 140 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 141 continue;
samux 1:fb4494783863 142
samux 1:fb4494783863 143 //auth
samux 1:fb4494783863 144 sprintf(cmd, "set w a %d\r", state.sec);
samux 1:fb4494783863 145 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 146 continue;
samux 1:fb4494783863 147
samux 1:fb4494783863 148 // if no dhcp, set ip, netmask and gateway
samux 1:fb4494783863 149 if (!state.dhcp) {
WiredHome 20:906b0f951bc3 150 DBG("not dhcp");
samux 1:fb4494783863 151
samux 1:fb4494783863 152 sprintf(cmd, "set i a %s\r\n", ip);
samux 1:fb4494783863 153 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 154 continue;
samux 1:fb4494783863 155
samux 1:fb4494783863 156 sprintf(cmd, "set i n %s\r", netmask);
samux 1:fb4494783863 157 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 158 continue;
samux 1:fb4494783863 159
samux 1:fb4494783863 160 sprintf(cmd, "set i g %s\r", gateway);
samux 1:fb4494783863 161 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 162 continue;
samux 1:fb4494783863 163 }
samux 1:fb4494783863 164
samux 1:fb4494783863 165 //key step
WiredHome 30:f500260463b7 166 cmd[0] = '\0';
WiredHome 30:f500260463b7 167 switch (state.sec) {
WiredHome 30:f500260463b7 168 case WPE_64: // google searching suggests this is a typo and should be WEP_64
WiredHome 30:f500260463b7 169 case WEP_128:
samux 1:fb4494783863 170 sprintf(cmd, "set w k %s\r", phrase);
WiredHome 30:f500260463b7 171 break;
WiredHome 30:f500260463b7 172 case WPA1:
WiredHome 30:f500260463b7 173 case WPA_MIXED: // alias WPA
WiredHome 30:f500260463b7 174 case WPA2_PSK:
WiredHome 30:f500260463b7 175 sprintf(cmd, "set w p %s\r", phrase);
WiredHome 30:f500260463b7 176 break;
WiredHome 30:f500260463b7 177 case ADHOC:
WiredHome 30:f500260463b7 178 case NONE:
WiredHome 30:f500260463b7 179 default:
WiredHome 30:f500260463b7 180 break;
samux 1:fb4494783863 181 }
WiredHome 30:f500260463b7 182 if (cmd[0] && !sendCommand(cmd, "AOK"))
WiredHome 30:f500260463b7 183 continue;
samux 1:fb4494783863 184
samux 2:8e54830d0df7 185 //join the network (10s timeout)
samux 1:fb4494783863 186 if (state.dhcp) {
samux 2:8e54830d0df7 187 if (!sendCommand("join\r", "DHCP=ON", NULL, 10000))
samux 2:8e54830d0df7 188 continue;
samux 2:8e54830d0df7 189 } else {
samux 2:8e54830d0df7 190 if (!sendCommand("join\r", "Associated", NULL, 10000))
samux 1:fb4494783863 191 continue;
samux 1:fb4494783863 192 }
samux 1:fb4494783863 193
samux 2:8e54830d0df7 194 if (!sendCommand("save\r", "Stor"))
samux 2:8e54830d0df7 195 continue;
samux 2:8e54830d0df7 196
samux 1:fb4494783863 197 exit();
samux 1:fb4494783863 198
samux 1:fb4494783863 199 state.associated = true;
WiredHome 30:f500260463b7 200 // Don't advertise this info
WiredHome 30:f500260463b7 201 //INFO("\r\nssid: %s\r\nphrase: %s\r\nsecurity: %s\r\n\r\n", this->ssid, this->phrase, getStringSecurity());
samux 1:fb4494783863 202 return true;
samux 1:fb4494783863 203 }
samux 1:fb4494783863 204 return false;
samux 1:fb4494783863 205 }
samux 1:fb4494783863 206
samux 1:fb4494783863 207
samux 1:fb4494783863 208 bool Wifly::setProtocol(Protocol p)
samux 1:fb4494783863 209 {
samux 1:fb4494783863 210 // use udp auto pairing
samux 1:fb4494783863 211 char cmd[20];
samux 1:fb4494783863 212 sprintf(cmd, "set i p %d\r", p);
samux 1:fb4494783863 213 if (!sendCommand(cmd, "AOK"))
samux 1:fb4494783863 214 return false;
samux 1:fb4494783863 215
samux 1:fb4494783863 216 switch(p) {
samux 1:fb4494783863 217 case TCP:
samux 1:fb4494783863 218 // set ip flags: tcp retry enabled
samux 1:fb4494783863 219 if (!sendCommand("set i f 0x07\r", "AOK"))
samux 1:fb4494783863 220 return false;
samux 1:fb4494783863 221 break;
samux 1:fb4494783863 222 case UDP:
samux 1:fb4494783863 223 // set ip flags: udp auto pairing enabled
samux 1:fb4494783863 224 if (!sendCommand("set i h 0.0.0.0\r", "AOK"))
samux 1:fb4494783863 225 return false;
samux 4:0bcec6272784 226 if (!sendCommand("set i f 0x40\r", "AOK"))
samux 1:fb4494783863 227 return false;
samux 1:fb4494783863 228 break;
samux 1:fb4494783863 229 }
samux 1:fb4494783863 230 state.proto = p;
samux 1:fb4494783863 231 return true;
samux 1:fb4494783863 232 }
samux 1:fb4494783863 233
WiredHome 25:a740eb74a86a 234
samux 1:fb4494783863 235 char * Wifly::getStringSecurity()
samux 1:fb4494783863 236 {
samux 1:fb4494783863 237 switch(state.sec) {
WiredHome 30:f500260463b7 238 case NONE: // 0
samux 1:fb4494783863 239 return "NONE";
WiredHome 30:f500260463b7 240 case WEP_128: // 1
samux 1:fb4494783863 241 return "WEP_128";
WiredHome 30:f500260463b7 242 case WPA1: // 2
WiredHome 30:f500260463b7 243 return "WPA1";
WiredHome 30:f500260463b7 244 case WPA: // 3
samux 1:fb4494783863 245 return "WPA";
WiredHome 30:f500260463b7 246 case WPA2_PSK: // 4
WiredHome 30:f500260463b7 247 return "WPA2_PSK";
WiredHome 30:f500260463b7 248 case ADHOC: // 6
WiredHome 30:f500260463b7 249 return "ADHOC";
WiredHome 30:f500260463b7 250 case WPE_64: // 8
WiredHome 30:f500260463b7 251 return "WPE_64";
WiredHome 30:f500260463b7 252 default: // ?
WiredHome 30:f500260463b7 253 return "UNKNOWN";
samux 1:fb4494783863 254 }
samux 1:fb4494783863 255 }
samux 1:fb4494783863 256
WiredHome 25:a740eb74a86a 257
samux 1:fb4494783863 258 bool Wifly::connect(const char * host, int port)
samux 1:fb4494783863 259 {
samux 1:fb4494783863 260 char rcv[20];
samux 1:fb4494783863 261 char cmd[20];
samux 1:fb4494783863 262
samux 2:8e54830d0df7 263 // try to open
samux 2:8e54830d0df7 264 sprintf(cmd, "open %s %d\r", host, port);
samux 2:8e54830d0df7 265 if (sendCommand(cmd, "OPEN", NULL, 10000)) {
samux 2:8e54830d0df7 266 state.tcp = true;
WiredHome 25:a740eb74a86a 267 exit();
samux 2:8e54830d0df7 268 return true;
samux 1:fb4494783863 269 }
samux 1:fb4494783863 270
samux 2:8e54830d0df7 271 // if failed, retry and parse the response
samux 2:8e54830d0df7 272 if (sendCommand(cmd, NULL, rcv, 5000)) {
samux 1:fb4494783863 273 if (strstr(rcv, "OPEN") == NULL) {
samux 1:fb4494783863 274 if (strstr(rcv, "Connected") != NULL) {
samux 1:fb4494783863 275 if (!sendCommand("close\r", "CLOS"))
samux 1:fb4494783863 276 return false;
samux 2:8e54830d0df7 277 if (!sendCommand(cmd, "OPEN", NULL, 10000))
samux 1:fb4494783863 278 return false;
samux 1:fb4494783863 279 } else {
samux 1:fb4494783863 280 return false;
samux 1:fb4494783863 281 }
samux 1:fb4494783863 282 }
samux 1:fb4494783863 283 } else {
samux 1:fb4494783863 284 return false;
samux 1:fb4494783863 285 }
samux 2:8e54830d0df7 286
samux 1:fb4494783863 287 state.tcp = true;
WiredHome 25:a740eb74a86a 288 exit();
samux 1:fb4494783863 289 return true;
samux 1:fb4494783863 290 }
samux 1:fb4494783863 291
samux 1:fb4494783863 292
samux 1:fb4494783863 293 bool Wifly::gethostbyname(const char * host, char * ip)
samux 1:fb4494783863 294 {
samux 1:fb4494783863 295 string h = host;
samux 1:fb4494783863 296 char cmd[30], rcv[100];
samux 1:fb4494783863 297 int l = 0;
samux 1:fb4494783863 298 char * point;
samux 1:fb4494783863 299 int nb_digits = 0;
samux 1:fb4494783863 300
samux 1:fb4494783863 301 // no dns needed
samux 1:fb4494783863 302 int pos = h.find(".");
samux 1:fb4494783863 303 if (pos != string::npos) {
samux 1:fb4494783863 304 string sub = h.substr(0, h.find("."));
samux 1:fb4494783863 305 nb_digits = atoi(sub.c_str());
samux 1:fb4494783863 306 }
samux 1:fb4494783863 307 //printf("substrL %s\r\n", sub.c_str());
samux 1:fb4494783863 308 if (count(h.begin(), h.end(), '.') == 3 && nb_digits > 0) {
samux 1:fb4494783863 309 strcpy(ip, host);
samux 1:fb4494783863 310 }
samux 1:fb4494783863 311 // dns needed
samux 1:fb4494783863 312 else {
samux 1:fb4494783863 313 nb_digits = 0;
samux 1:fb4494783863 314 sprintf(cmd, "lookup %s\r", host);
samux 1:fb4494783863 315 if (!sendCommand(cmd, NULL, rcv))
samux 1:fb4494783863 316 return false;
samux 1:fb4494783863 317
samux 1:fb4494783863 318 // look for the ip address
samux 1:fb4494783863 319 char * begin = strstr(rcv, "=") + 1;
samux 1:fb4494783863 320 for (int i = 0; i < 3; i++) {
samux 1:fb4494783863 321 point = strstr(begin + l, ".");
WiredHome 29:49876a8c445b 322 INFO("str: %s", begin + l);
samux 1:fb4494783863 323 l += point - (begin + l) + 1;
samux 1:fb4494783863 324 }
WiredHome 29:49876a8c445b 325 INFO("str: %s", begin + l);
samux 1:fb4494783863 326 while(*(begin + l + nb_digits) >= '0' && *(begin + l + nb_digits) <= '9') {
WiredHome 29:49876a8c445b 327 INFO("digit: %c", *(begin + l + nb_digits));
samux 1:fb4494783863 328 nb_digits++;
samux 1:fb4494783863 329 }
samux 1:fb4494783863 330 memcpy(ip, begin, l + nb_digits);
samux 1:fb4494783863 331 ip[l+nb_digits] = 0;
WiredHome 29:49876a8c445b 332 INFO("ip from dns: %s", ip);
samux 1:fb4494783863 333 }
samux 1:fb4494783863 334 return true;
samux 1:fb4494783863 335 }
samux 1:fb4494783863 336
samux 1:fb4494783863 337
samux 1:fb4494783863 338 void Wifly::flush()
samux 1:fb4494783863 339 {
WiredHome 29:49876a8c445b 340 #ifdef DEBUG
WiredHome 29:49876a8c445b 341 char chatter[500];
WiredHome 29:49876a8c445b 342 int count = 0;
WiredHome 29:49876a8c445b 343 char c;
WiredHome 29:49876a8c445b 344
WiredHome 29:49876a8c445b 345 while (buf_wifly.available()) {
WiredHome 29:49876a8c445b 346 buf_wifly.dequeue(&c);
WiredHome 29:49876a8c445b 347 chatter[count++] = c;
WiredHome 29:49876a8c445b 348 }
WiredHome 29:49876a8c445b 349 chatter[count] = '\0';
WiredHome 29:49876a8c445b 350 if (count)
WiredHome 29:49876a8c445b 351 DBG("Wifly::flush {%s}", chatter);
WiredHome 29:49876a8c445b 352 #endif
samux 1:fb4494783863 353 buf_wifly.flush();
samux 1:fb4494783863 354 }
samux 1:fb4494783863 355
WiredHome 25:a740eb74a86a 356
samux 1:fb4494783863 357 bool Wifly::sendCommand(const char * cmd, const char * ack, char * res, int timeout)
samux 1:fb4494783863 358 {
WiredHome 20:906b0f951bc3 359 int tries = 1;
WiredHome 29:49876a8c445b 360
WiredHome 34:52e4eec8b790 361 INFO("sendCommand %s", cmd);
WiredHome 20:906b0f951bc3 362 while (tries <= 2) {
WiredHome 29:49876a8c445b 363 cmdMode(); // some influences to the wifi module sometimes kick it out
WiredHome 20:906b0f951bc3 364 if (send(cmd, strlen(cmd), ack, res, timeout) >= 0) {
WiredHome 20:906b0f951bc3 365 return true;
WiredHome 20:906b0f951bc3 366 }
WiredHome 34:52e4eec8b790 367 setCmdMode(false); // must not really be in cmd mode
WiredHome 34:52e4eec8b790 368 INFO(" cmdMode = false");
WiredHome 29:49876a8c445b 369 ERR("sendCommand: failure %d when sending: %s", tries, cmd);
WiredHome 20:906b0f951bc3 370 tries++;
samux 1:fb4494783863 371 }
WiredHome 17:213844a1864f 372 return false;
samux 1:fb4494783863 373 }
samux 1:fb4494783863 374
WiredHome 25:a740eb74a86a 375
samux 1:fb4494783863 376 bool Wifly::cmdMode()
samux 1:fb4494783863 377 {
samux 1:fb4494783863 378 // if already in cmd mode, return
WiredHome 29:49876a8c445b 379 if (state.cmd_mode) {
WiredHome 29:49876a8c445b 380 // Quick verify to ensure we really are in cmd mode
WiredHome 29:49876a8c445b 381 flushIn(0);
WiredHome 29:49876a8c445b 382 if (send("\r", 1, ">") == 1) {
WiredHome 29:49876a8c445b 383 return true;
WiredHome 34:52e4eec8b790 384 } else {
WiredHome 34:52e4eec8b790 385 setCmdMode(false);
WiredHome 34:52e4eec8b790 386 }
WiredHome 29:49876a8c445b 387 }
WiredHome 29:49876a8c445b 388 wait_ms(260); // manual 1.2.1 (250 msec before and after)
samux 1:fb4494783863 389 if (send("$$$", 3, "CMD") == -1) {
WiredHome 34:52e4eec8b790 390 ERR("cannot enter in cmd mode");
samux 1:fb4494783863 391 return false;
samux 1:fb4494783863 392 }
WiredHome 34:52e4eec8b790 393 setCmdMode(true);
samux 1:fb4494783863 394 return true;
samux 1:fb4494783863 395 }
samux 1:fb4494783863 396
WiredHome 25:a740eb74a86a 397
samux 1:fb4494783863 398 bool Wifly::disconnect()
samux 1:fb4494783863 399 {
samux 1:fb4494783863 400 // if already disconnected, return
samux 1:fb4494783863 401 if (!state.associated)
samux 1:fb4494783863 402 return true;
samux 2:8e54830d0df7 403
samux 1:fb4494783863 404 if (!sendCommand("leave\r", "DeAuth"))
samux 1:fb4494783863 405 return false;
samux 1:fb4494783863 406 exit();
samux 2:8e54830d0df7 407
samux 1:fb4494783863 408 state.associated = false;
samux 1:fb4494783863 409 return true;
samux 1:fb4494783863 410 }
samux 1:fb4494783863 411
WiredHome 25:a740eb74a86a 412
samux 1:fb4494783863 413 bool Wifly::is_connected()
samux 1:fb4494783863 414 {
samux 1:fb4494783863 415 return (tcp_status.read() == 1) ? true : false;
samux 1:fb4494783863 416 }
samux 1:fb4494783863 417
samux 1:fb4494783863 418
samux 1:fb4494783863 419 void Wifly::reset()
samux 1:fb4494783863 420 {
samux 1:fb4494783863 421 reset_pin = 0;
WiredHome 25:a740eb74a86a 422 wifi.baud(9600);
WiredHome 25:a740eb74a86a 423 wait_ms(200);
samux 1:fb4494783863 424 reset_pin = 1;
WiredHome 25:a740eb74a86a 425 GatherLogonInfo();
samux 1:fb4494783863 426 }
samux 1:fb4494783863 427
WiredHome 25:a740eb74a86a 428
samux 3:9aa05e19c62e 429 bool Wifly::reboot()
samux 3:9aa05e19c62e 430 {
WiredHome 26:78a1a09afdc9 431 if (sendCommand("reboot\r", "Reboot")) {
WiredHome 34:52e4eec8b790 432 setCmdMode(false);
WiredHome 34:52e4eec8b790 433 INFO(" cmdMode = false");
WiredHome 26:78a1a09afdc9 434 wait_ms(500);
WiredHome 26:78a1a09afdc9 435 wifi.baud(9600);
WiredHome 26:78a1a09afdc9 436 baud(baudrate);
WiredHome 26:78a1a09afdc9 437 exit();
WiredHome 26:78a1a09afdc9 438 return true;
WiredHome 26:78a1a09afdc9 439 } else {
samux 3:9aa05e19c62e 440 return false;
WiredHome 26:78a1a09afdc9 441 }
samux 3:9aa05e19c62e 442 }
samux 3:9aa05e19c62e 443
WiredHome 25:a740eb74a86a 444
samux 1:fb4494783863 445 bool Wifly::close()
samux 1:fb4494783863 446 {
samux 1:fb4494783863 447 if (!state.tcp)
WiredHome 34:52e4eec8b790 448 return true; // already closed
WiredHome 34:52e4eec8b790 449 if (!sendCommand("close\r", "*CLOS*"))
WiredHome 34:52e4eec8b790 450 return false; // failed to close
WiredHome 34:52e4eec8b790 451 #if 1
WiredHome 34:52e4eec8b790 452 // It appears that the close exits cmd mode
WiredHome 34:52e4eec8b790 453 // so we won't both trying to close which
WiredHome 34:52e4eec8b790 454 // could cause it to open command mode to
WiredHome 34:52e4eec8b790 455 // send the close (which add more 0.25s
WiredHome 34:52e4eec8b790 456 // delays).
WiredHome 34:52e4eec8b790 457 setCmdMode(false);
WiredHome 34:52e4eec8b790 458 #else
WiredHome 34:52e4eec8b790 459 flushIn();
WiredHome 34:52e4eec8b790 460 exit();
WiredHome 34:52e4eec8b790 461 #endif
samux 1:fb4494783863 462 state.tcp = false;
WiredHome 34:52e4eec8b790 463 return true; // succeeded to close
samux 1:fb4494783863 464 }
samux 1:fb4494783863 465
samux 1:fb4494783863 466
samux 1:fb4494783863 467 int Wifly::putc(char c)
samux 1:fb4494783863 468 {
WiredHome 25:a740eb74a86a 469 while (!wifi.writeable())
WiredHome 25:a740eb74a86a 470 ;
samux 1:fb4494783863 471 return wifi.putc(c);
samux 1:fb4494783863 472 }
samux 1:fb4494783863 473
samux 1:fb4494783863 474
samux 1:fb4494783863 475 bool Wifly::exit()
samux 1:fb4494783863 476 {
WiredHome 34:52e4eec8b790 477 if (!sendCommand("exit\r", "EXIT")) {
WiredHome 34:52e4eec8b790 478 ERR(" failed to exit.");
samux 1:fb4494783863 479 return false;
WiredHome 34:52e4eec8b790 480 }
WiredHome 34:52e4eec8b790 481 setCmdMode(false);
samux 1:fb4494783863 482 return true;
samux 1:fb4494783863 483 }
samux 1:fb4494783863 484
samux 1:fb4494783863 485
samux 1:fb4494783863 486 int Wifly::readable()
samux 1:fb4494783863 487 {
samux 1:fb4494783863 488 return buf_wifly.available();
samux 1:fb4494783863 489 }
samux 1:fb4494783863 490
WiredHome 25:a740eb74a86a 491
samux 1:fb4494783863 492 int Wifly::writeable()
samux 1:fb4494783863 493 {
samux 1:fb4494783863 494 return wifi.writeable();
samux 1:fb4494783863 495 }
samux 1:fb4494783863 496
WiredHome 25:a740eb74a86a 497
samux 1:fb4494783863 498 char Wifly::getc()
samux 1:fb4494783863 499 {
samux 1:fb4494783863 500 char c;
WiredHome 25:a740eb74a86a 501 while (!buf_wifly.available())
WiredHome 25:a740eb74a86a 502 ;
samux 1:fb4494783863 503 buf_wifly.dequeue(&c);
samux 1:fb4494783863 504 return c;
samux 1:fb4494783863 505 }
samux 1:fb4494783863 506
WiredHome 25:a740eb74a86a 507
samux 1:fb4494783863 508 void Wifly::handler_rx(void)
samux 1:fb4494783863 509 {
samux 1:fb4494783863 510 //read characters
samux 1:fb4494783863 511 while (wifi.readable())
samux 1:fb4494783863 512 buf_wifly.queue(wifi.getc());
samux 1:fb4494783863 513 }
samux 1:fb4494783863 514
WiredHome 25:a740eb74a86a 515
samux 1:fb4494783863 516 void Wifly::attach_rx(bool callback)
samux 1:fb4494783863 517 {
samux 1:fb4494783863 518 if (!callback)
samux 1:fb4494783863 519 wifi.attach(NULL);
samux 1:fb4494783863 520 else
samux 1:fb4494783863 521 wifi.attach(this, &Wifly::handler_rx);
samux 1:fb4494783863 522 }
samux 1:fb4494783863 523
samux 1:fb4494783863 524
samux 1:fb4494783863 525 int Wifly::send(const char * str, int len, const char * ACK, char * res, int timeout)
samux 1:fb4494783863 526 {
samux 1:fb4494783863 527 char read;
WiredHome 34:52e4eec8b790 528 //size_t found = string::npos;
WiredHome 34:52e4eec8b790 529 //string checking;
WiredHome 34:52e4eec8b790 530 int ackIndex = 0;
samux 1:fb4494783863 531 Timer tmr;
samux 1:fb4494783863 532 int result = 0;
samux 1:fb4494783863 533
WiredHome 34:52e4eec8b790 534 //DBG("send: %s", str);
samux 1:fb4494783863 535 attach_rx(false);
WiredHome 34:52e4eec8b790 536 // flushIn(0);
WiredHome 20:906b0f951bc3 537 tmr.start();
samux 1:fb4494783863 538 if (!ACK || !strcmp(ACK, "NO")) {
samux 1:fb4494783863 539 for (int i = 0; i < len; i++)
samux 1:fb4494783863 540 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 1:fb4494783863 541 } else {
samux 1:fb4494783863 542 for (int i = 0; i < len; i++)
samux 1:fb4494783863 543 result = (putc(str[i]) == str[i]) ? result + 1 : result;
samux 1:fb4494783863 544
samux 1:fb4494783863 545 while (1) {
samux 1:fb4494783863 546 if (tmr.read_ms() > timeout) {
WiredHome 18:18ab3993d00d 547 flushIn();
WiredHome 34:52e4eec8b790 548 WARN("Can't find [%s] from [%s]", ACK, str);
samux 1:fb4494783863 549 attach_rx(true);
samux 1:fb4494783863 550 return -1;
samux 1:fb4494783863 551 } else if (wifi.readable()) {
samux 1:fb4494783863 552 read = wifi.getc();
WiredHome 34:52e4eec8b790 553 #if 1
WiredHome 35:2dc12224cbd6 554 if (tolower(read) == tolower(ACK[ackIndex])) {
WiredHome 34:52e4eec8b790 555 ackIndex++;
WiredHome 34:52e4eec8b790 556 if (ackIndex == strlen(ACK))
WiredHome 34:52e4eec8b790 557 //flushIn(5);
WiredHome 34:52e4eec8b790 558 break;
WiredHome 34:52e4eec8b790 559 } else {
WiredHome 34:52e4eec8b790 560 ackIndex = 0;
WiredHome 34:52e4eec8b790 561 }
WiredHome 34:52e4eec8b790 562 #else
samux 1:fb4494783863 563 if ( read != '\r' && read != '\n') {
samux 1:fb4494783863 564 checking += read;
samux 1:fb4494783863 565 found = checking.find(ACK);
samux 1:fb4494783863 566 if (found != string::npos) {
WiredHome 34:52e4eec8b790 567 flushIn(6);
samux 1:fb4494783863 568 break;
samux 1:fb4494783863 569 }
samux 1:fb4494783863 570 }
WiredHome 34:52e4eec8b790 571 #endif
samux 1:fb4494783863 572 }
samux 1:fb4494783863 573 }
WiredHome 34:52e4eec8b790 574 DBG(" found %s.", ACK);
samux 1:fb4494783863 575 attach_rx(true);
samux 1:fb4494783863 576 return result;
samux 1:fb4494783863 577 }
samux 1:fb4494783863 578
samux 1:fb4494783863 579 //the user wants the result from the command (ACK == NULL, res != NULL)
samux 1:fb4494783863 580 if ( res != NULL) {
samux 1:fb4494783863 581 int i = 0;
samux 1:fb4494783863 582 while (1) {
WiredHome 19:b0c2488222a3 583 if (tmr.read_ms() > timeout) {
WiredHome 19:b0c2488222a3 584 res[i] = '\0';
samux 1:fb4494783863 585 if (i == 0) {
samux 1:fb4494783863 586 res = NULL;
samux 1:fb4494783863 587 }
WiredHome 31:e4422f192d25 588 INFO("timeout awaiting response to %s", str);
samux 1:fb4494783863 589 break;
samux 1:fb4494783863 590 } else {
samux 1:fb4494783863 591 if (wifi.readable()) {
samux 1:fb4494783863 592 read = wifi.getc();
WiredHome 25:a740eb74a86a 593 // we drop \r and \n, but should we since it is for user code...
samux 1:fb4494783863 594 if ( read != '\r' && read != '\n') {
samux 1:fb4494783863 595 res[i++] = read;
samux 1:fb4494783863 596 }
samux 1:fb4494783863 597 }
samux 1:fb4494783863 598 }
samux 1:fb4494783863 599 }
WiredHome 26:78a1a09afdc9 600 DBG("user str: {%s}", res);
samux 1:fb4494783863 601 }
samux 1:fb4494783863 602
WiredHome 18:18ab3993d00d 603 flushIn();
samux 1:fb4494783863 604 attach_rx(true);
samux 1:fb4494783863 605 return result;
WiredHome 18:18ab3993d00d 606 }
WiredHome 18:18ab3993d00d 607
WiredHome 19:b0c2488222a3 608
WiredHome 18:18ab3993d00d 609 void Wifly::flushIn(int timeout_ms)
WiredHome 18:18ab3993d00d 610 {
WiredHome 18:18ab3993d00d 611 Timer tmr;
WiredHome 18:18ab3993d00d 612 #ifdef DEBUG
WiredHome 18:18ab3993d00d 613 char chatter[500];
WiredHome 18:18ab3993d00d 614 int count = 0;
WiredHome 18:18ab3993d00d 615 int c;
WiredHome 18:18ab3993d00d 616 #endif
WiredHome 18:18ab3993d00d 617
WiredHome 34:52e4eec8b790 618 if (timeout_ms <= 0) {
WiredHome 34:52e4eec8b790 619 timeout_ms = 1; // 2 * 10000 / baudrate; // compute minimal timeout
WiredHome 34:52e4eec8b790 620 //if (timeout_ms < 5)
WiredHome 34:52e4eec8b790 621 // timeout_ms = 5;
WiredHome 18:18ab3993d00d 622 }
WiredHome 18:18ab3993d00d 623 tmr.start();
WiredHome 18:18ab3993d00d 624 while (wifi.readable() || (tmr.read_ms() < timeout_ms)) {
WiredHome 18:18ab3993d00d 625 if (wifi.readable()) {
WiredHome 29:49876a8c445b 626 #ifdef DEBUG
WiredHome 29:49876a8c445b 627 c = wifi.getc();
WiredHome 34:52e4eec8b790 628 if (count < sizeof(chatter)-1) // guard overflow
WiredHome 34:52e4eec8b790 629 chatter[count++] = c;
WiredHome 18:18ab3993d00d 630 #else
WiredHome 29:49876a8c445b 631 wifi.getc();
WiredHome 18:18ab3993d00d 632 #endif
WiredHome 18:18ab3993d00d 633 tmr.reset();
WiredHome 18:18ab3993d00d 634 tmr.start(); // start should not be necessary
WiredHome 18:18ab3993d00d 635 }
WiredHome 18:18ab3993d00d 636 }
WiredHome 18:18ab3993d00d 637 #ifdef DEBUG
WiredHome 18:18ab3993d00d 638 chatter[count] = '\0';
WiredHome 29:49876a8c445b 639 if (count)
WiredHome 29:49876a8c445b 640 DBG("Wifly::flushIn(%d) {%s}", timeout_ms, chatter);
WiredHome 18:18ab3993d00d 641 #endif
WiredHome 18:18ab3993d00d 642 }
WiredHome 20:906b0f951bc3 643
WiredHome 20:906b0f951bc3 644
WiredHome 20:906b0f951bc3 645 // The ARM uart and the Wifly uart have to be in sync or we get
WiredHome 20:906b0f951bc3 646 // no meaningful response, so then have to try the possibilities.
WiredHome 20:906b0f951bc3 647 //
WiredHome 20:906b0f951bc3 648 // First try is at the currently configured ARM uart baud, if
WiredHome 20:906b0f951bc3 649 // that fails then it shifts the ARM uart baud through the probable
WiredHome 20:906b0f951bc3 650 // speeds, trying to establish contact with the Wifly module.
WiredHome 20:906b0f951bc3 651 // Once contact is demonstrated (response to the 'ver' command),
WiredHome 20:906b0f951bc3 652 // then it sets the Wifly module and then the ARM uart.
WiredHome 20:906b0f951bc3 653 bool Wifly::baud(int _targetBaud)
WiredHome 20:906b0f951bc3 654 {
WiredHome 20:906b0f951bc3 655 // in testing, 460800 and 921600 may change the Wifly module where you can't
WiredHome 20:906b0f951bc3 656 // change it back w/o a reset. So, we won't even permit those speeds.
WiredHome 20:906b0f951bc3 657 const int baudrates[] = {2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400}; //, 460800, 921600};
WiredHome 20:906b0f951bc3 658 #define BRCOUNT (sizeof(baudrates)/sizeof(baudrates[0]))
WiredHome 20:906b0f951bc3 659 char cmd[20]; // sized for "set u i 460800\r" [15+1], plus margin [4]
WiredHome 20:906b0f951bc3 660 int tryIndex = 0;
WiredHome 20:906b0f951bc3 661 bool res = false;
WiredHome 20:906b0f951bc3 662 int userIndex;
WiredHome 20:906b0f951bc3 663
WiredHome 20:906b0f951bc3 664 sprintf(cmd, "set u i %d\r", _targetBaud);
WiredHome 20:906b0f951bc3 665 // set u i # should cause it to exit command mode (manual 2.3.64),
WiredHome 20:906b0f951bc3 666 // but testing indicates that it does not.
WiredHome 20:906b0f951bc3 667 for (userIndex=0; userIndex < BRCOUNT; userIndex++) {
WiredHome 20:906b0f951bc3 668 if (_targetBaud == baudrates[userIndex]) {
WiredHome 20:906b0f951bc3 669 while (tryIndex <= BRCOUNT) {
WiredHome 26:78a1a09afdc9 670 DBG("baud() try: %d", tryIndex);
WiredHome 20:906b0f951bc3 671 sendCommand(cmd); // shift Wifly to desired speed [it may not respond (see 2.3.64)]
WiredHome 34:52e4eec8b790 672 // setCmdMode(false); // see note above why this is disabled
WiredHome 20:906b0f951bc3 673 wifi.baud(_targetBaud); // shift the ARM uart to match
WiredHome 20:906b0f951bc3 674 if (sendCommand("ver\r", "wifly", NULL, timeToRespond(4))) { // use this to verify communications
WiredHome 20:906b0f951bc3 675 baudrate = _targetBaud;
WiredHome 20:906b0f951bc3 676 res = true;
WiredHome 20:906b0f951bc3 677 break; // success
WiredHome 20:906b0f951bc3 678 }
WiredHome 20:906b0f951bc3 679 // keep trying baudrates between ARM and WiFly
WiredHome 20:906b0f951bc3 680 if (tryIndex < BRCOUNT) {
WiredHome 29:49876a8c445b 681 WARN(" baud() set to %d", baudrates[tryIndex]);
WiredHome 20:906b0f951bc3 682 wifi.baud(baudrates[tryIndex]);
WiredHome 20:906b0f951bc3 683 }
WiredHome 20:906b0f951bc3 684 tryIndex++;
WiredHome 20:906b0f951bc3 685 }
WiredHome 20:906b0f951bc3 686 break; // if they selected a legitimate baud, try no others
WiredHome 20:906b0f951bc3 687 }
WiredHome 20:906b0f951bc3 688 }
WiredHome 26:78a1a09afdc9 689 DBG(" baud() result: %d", res);
WiredHome 20:906b0f951bc3 690 return res;
WiredHome 20:906b0f951bc3 691 }
WiredHome 20:906b0f951bc3 692
WiredHome 25:a740eb74a86a 693
WiredHome 29:49876a8c445b 694 int Wifly::timeToRespond(int stringLen)
WiredHome 20:906b0f951bc3 695 {
WiredHome 20:906b0f951bc3 696 return 150 + (1 | 10000/baudrate) * stringLen;
WiredHome 21:97294686b4a1 697 }
WiredHome 23:6e77c65ced00 698
WiredHome 24:5012a535b1d5 699
WiredHome 24:5012a535b1d5 700 void Wifly::FixPhrase(char ** dst, const char * src)
WiredHome 24:5012a535b1d5 701 {
WiredHome 24:5012a535b1d5 702 // change all ' ' in '$' in the ssid and the passphrase
WiredHome 24:5012a535b1d5 703 *dst = (char *)malloc(strlen(src)+1);
WiredHome 24:5012a535b1d5 704 if (*dst) {
WiredHome 24:5012a535b1d5 705 strcpy(*dst, src);
WiredHome 24:5012a535b1d5 706 for (int i = 0; i < strlen(*dst); i++) {
WiredHome 24:5012a535b1d5 707 if ((*dst)[i] == ' ')
WiredHome 24:5012a535b1d5 708 (*dst)[i] = '$';
WiredHome 24:5012a535b1d5 709 }
WiredHome 24:5012a535b1d5 710 } else {
WiredHome 24:5012a535b1d5 711 *dst = NULL;
WiredHome 24:5012a535b1d5 712 }
WiredHome 24:5012a535b1d5 713 }
WiredHome 25:a740eb74a86a 714
WiredHome 25:a740eb74a86a 715
WiredHome 25:a740eb74a86a 716 void Wifly::GatherLogonInfo()
WiredHome 25:a740eb74a86a 717 {
WiredHome 25:a740eb74a86a 718 Timer timer;
WiredHome 25:a740eb74a86a 719 char logonText[200];
WiredHome 25:a740eb74a86a 720 int i = 0;
WiredHome 25:a740eb74a86a 721 char *p;
WiredHome 25:a740eb74a86a 722
WiredHome 25:a740eb74a86a 723 timer.start();
WiredHome 25:a740eb74a86a 724 if (wiflyVersionString) {
WiredHome 25:a740eb74a86a 725 free(wiflyVersionString);
WiredHome 25:a740eb74a86a 726 wiflyVersionString = NULL;
WiredHome 25:a740eb74a86a 727 }
WiredHome 25:a740eb74a86a 728 logonText[i] = '\0';
WiredHome 25:a740eb74a86a 729 while (timer.read_ms() < 500) {
WiredHome 25:a740eb74a86a 730 while (wifi.readable()) {
WiredHome 25:a740eb74a86a 731 logonText[i++] = wifi.getc();
WiredHome 25:a740eb74a86a 732 }
WiredHome 25:a740eb74a86a 733 }
WiredHome 25:a740eb74a86a 734 logonText[i] = '\0';
WiredHome 25:a740eb74a86a 735 p = strchr(logonText, '\r');
WiredHome 25:a740eb74a86a 736 if (p)
WiredHome 25:a740eb74a86a 737 *p = '\0';
WiredHome 25:a740eb74a86a 738 wiflyVersionString = (char *)malloc(strlen(logonText)+1);
WiredHome 25:a740eb74a86a 739 if (wiflyVersionString)
WiredHome 25:a740eb74a86a 740 strcpy(wiflyVersionString, logonText);
WiredHome 25:a740eb74a86a 741 p = strstr(logonText, "Ver ");
WiredHome 25:a740eb74a86a 742 if (p) {
WiredHome 25:a740eb74a86a 743 p += 4;
WiredHome 25:a740eb74a86a 744 swVersion = atof(p);
WiredHome 25:a740eb74a86a 745 }
WiredHome 29:49876a8c445b 746 INFO("swVersion: %3.2f, versionString: {%s}", swVersion, wiflyVersionString);
WiredHome 25:a740eb74a86a 747 }
WiredHome 25:a740eb74a86a 748
WiredHome 25:a740eb74a86a 749
WiredHome 25:a740eb74a86a 750 float Wifly::getWiflyVersion()
WiredHome 25:a740eb74a86a 751 {
WiredHome 25:a740eb74a86a 752 return swVersion;
WiredHome 25:a740eb74a86a 753 }
WiredHome 25:a740eb74a86a 754
WiredHome 25:a740eb74a86a 755
WiredHome 25:a740eb74a86a 756 char * Wifly::getWiflyVersionString()
WiredHome 25:a740eb74a86a 757 {
WiredHome 25:a740eb74a86a 758 return wiflyVersionString;
WiredHome 25:a740eb74a86a 759 }
WiredHome 25:a740eb74a86a 760
WiredHome 26:78a1a09afdc9 761
WiredHome 26:78a1a09afdc9 762 void Wifly::setConnectionState(bool value)
WiredHome 26:78a1a09afdc9 763 {
WiredHome 26:78a1a09afdc9 764 state.tcp = value;
WiredHome 26:78a1a09afdc9 765 }
WiredHome 26:78a1a09afdc9 766
WiredHome 34:52e4eec8b790 767 void Wifly::setCmdMode(bool newState)
WiredHome 34:52e4eec8b790 768 {
WiredHome 34:52e4eec8b790 769 //INFO("setCmdMode(%s)", state ? "true" : "false");
WiredHome 34:52e4eec8b790 770 state.cmd_mode = newState;
WiredHome 34:52e4eec8b790 771 }