private fork

Fork of GSwifiInterface by gs fan

Committer:
gsfan
Date:
Mon Mar 11 08:21:14 2013 +0000
Revision:
7:f94c59d0c735
Parent:
5:78943b3945b5
fix getmacaddress

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 5:78943b3945b5 1 /* Copyright (C) 2012 mbed.org, MIT License
gsfan 5:78943b3945b5 2 *
gsfan 5:78943b3945b5 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gsfan 5:78943b3945b5 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
gsfan 5:78943b3945b5 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
gsfan 5:78943b3945b5 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
gsfan 5:78943b3945b5 7 * furnished to do so, subject to the following conditions:
gsfan 5:78943b3945b5 8 *
gsfan 5:78943b3945b5 9 * The above copyright notice and this permission notice shall be included in all copies or
gsfan 5:78943b3945b5 10 * substantial portions of the Software.
gsfan 5:78943b3945b5 11 *
gsfan 5:78943b3945b5 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gsfan 5:78943b3945b5 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gsfan 5:78943b3945b5 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gsfan 5:78943b3945b5 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gsfan 5:78943b3945b5 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gsfan 5:78943b3945b5 17 */
gsfan 5:78943b3945b5 18 /* Copyright (C) 2013 gsfan, MIT License
gsfan 5:78943b3945b5 19 * port to the GainSpan Wi-FI module GS1011
gsfan 5:78943b3945b5 20 */
gsfan 5:78943b3945b5 21
gsfan 5:78943b3945b5 22 #include "mbed.h"
gsfan 5:78943b3945b5 23 #include "GSwifi.h"
gsfan 5:78943b3945b5 24 #include <string>
gsfan 5:78943b3945b5 25 #include <algorithm>
gsfan 5:78943b3945b5 26
gsfan 5:78943b3945b5 27 GSwifi * GSwifi::_inst;
gsfan 5:78943b3945b5 28
gsfan 5:78943b3945b5 29 GSwifi::GSwifi( PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, const char * ssid, const char * phrase, Security sec):
gsfan 5:78943b3945b5 30 _uart(tx, rx), _reset(reset), _buf_gswifi(CFG_CMD_SIZE)
gsfan 5:78943b3945b5 31 {
gsfan 5:78943b3945b5 32 memset(&_state, 0, sizeof(_state));
gsfan 5:78943b3945b5 33 memset(&_con, 0, sizeof(_con));
gsfan 5:78943b3945b5 34 _state.sec = sec;
gsfan 5:78943b3945b5 35 _state.acid = -1;
gsfan 5:78943b3945b5 36
gsfan 5:78943b3945b5 37 // change all ' ' in '$' in the ssid and the passphrase
gsfan 5:78943b3945b5 38 strncpy(_ssid, ssid, sizeof(_ssid));
gsfan 5:78943b3945b5 39 for (int i = 0; i < strlen(ssid); i++) {
gsfan 5:78943b3945b5 40 if (_ssid[i] == ' ')
gsfan 5:78943b3945b5 41 _ssid[i] = '$';
gsfan 5:78943b3945b5 42 }
gsfan 5:78943b3945b5 43 strncpy(_phrase, phrase, sizeof(_phrase));
gsfan 5:78943b3945b5 44 for (int i = 0; i < strlen(phrase); i++) {
gsfan 5:78943b3945b5 45 if (_phrase[i] == ' ')
gsfan 5:78943b3945b5 46 _phrase[i] = '$';
gsfan 5:78943b3945b5 47 }
gsfan 5:78943b3945b5 48
gsfan 5:78943b3945b5 49 _inst = this;
gsfan 5:78943b3945b5 50 _state.mode = MODE_COMMAND;
gsfan 5:78943b3945b5 51
gsfan 5:78943b3945b5 52 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
gsfan 5:78943b3945b5 53 if (cts == p12) { // CTS input (P0_17)
gsfan 5:78943b3945b5 54 LPC_UART1->MCR |= (1<<7); // CTSEN
gsfan 5:78943b3945b5 55 LPC_PINCON->PINSEL1 &= ~(3 << 2);
gsfan 5:78943b3945b5 56 LPC_PINCON->PINSEL1 |= (1 << 2); // UART CTS
gsfan 5:78943b3945b5 57 }
gsfan 5:78943b3945b5 58 if (rts == P0_22) { // RTS output (P0_22)
gsfan 5:78943b3945b5 59 LPC_UART1->MCR |= (1<<6); // RTSEN
gsfan 5:78943b3945b5 60 LPC_PINCON->PINSEL1 &= ~(3 << 12);
gsfan 5:78943b3945b5 61 LPC_PINCON->PINSEL1 |= (1 << 12); // UART RTS
gsfan 5:78943b3945b5 62 _rts = true;
gsfan 5:78943b3945b5 63 } else {
gsfan 5:78943b3945b5 64 _rts = false;
gsfan 5:78943b3945b5 65 }
gsfan 5:78943b3945b5 66 #elif defined(TARGET_LPC11U24)
gsfan 5:78943b3945b5 67 if (cts == p21) { // CTS input (P0_7)
gsfan 5:78943b3945b5 68 LPC_USART->MCR |= (1<<7); // CTSEN
gsfan 5:78943b3945b5 69 LPC_IOCON->PIO0_7 &= ~0x07;
gsfan 5:78943b3945b5 70 LPC_IOCON->PIO0_7 |= 0x01; // UART CTS
gsfan 5:78943b3945b5 71 }
gsfan 5:78943b3945b5 72 if (rts == p22) { // RTS output (P0_17)
gsfan 5:78943b3945b5 73 LPC_USART->MCR |= (1<<6); // RTSEN
gsfan 5:78943b3945b5 74 LPC_IOCON->PIO0_17 &= ~0x07;
gsfan 5:78943b3945b5 75 LPC_IOCON->PIO0_17 |= 0x01; // UART RTS
gsfan 5:78943b3945b5 76 _rts = true;
gsfan 5:78943b3945b5 77 } else {
gsfan 5:78943b3945b5 78 _rts = false;
gsfan 5:78943b3945b5 79 }
gsfan 5:78943b3945b5 80 #endif
gsfan 5:78943b3945b5 81 _uart.baud(CFG_UART_BAUD);
gsfan 5:78943b3945b5 82 _uart.attach(this, &GSwifi::handler_rx);
gsfan 5:78943b3945b5 83 this->reset();
gsfan 5:78943b3945b5 84 }
gsfan 5:78943b3945b5 85
gsfan 5:78943b3945b5 86 bool GSwifi::join()
gsfan 5:78943b3945b5 87 {
gsfan 5:78943b3945b5 88 bool r;
gsfan 5:78943b3945b5 89 char cmd[CFG_CMD_SIZE];
gsfan 5:78943b3945b5 90
gsfan 5:78943b3945b5 91 send("\r\n", 2);
gsfan 5:78943b3945b5 92 if (sendCommand("ATE0") == false) return -1;
gsfan 5:78943b3945b5 93 if (_rts) {
gsfan 5:78943b3945b5 94 sendCommand("AT&R1");
gsfan 5:78943b3945b5 95 }
gsfan 5:78943b3945b5 96
gsfan 5:78943b3945b5 97 disconnect();
gsfan 5:78943b3945b5 98 sendCommand("AT+WREGDOMAIN=" CFG_WREGDOMAIN);
gsfan 5:78943b3945b5 99 sendCommand("AT+BDATA=1");
gsfan 5:78943b3945b5 100 sendCommand("AT+WM=0"); // infrastructure
gsfan 5:78943b3945b5 101 wait_ms(100);
gsfan 5:78943b3945b5 102 if (_state.dhcp && _state.sec != SEC_WPS_BUTTON) {
gsfan 5:78943b3945b5 103 sendCommand("AT+NDHCP=1");
gsfan 5:78943b3945b5 104 } else {
gsfan 5:78943b3945b5 105 sendCommand("AT+NDHCP=0");
gsfan 5:78943b3945b5 106 }
gsfan 5:78943b3945b5 107
gsfan 5:78943b3945b5 108 switch (_state.sec) {
gsfan 5:78943b3945b5 109 case SEC_NONE:
gsfan 5:78943b3945b5 110 case SEC_OPEN:
gsfan 5:78943b3945b5 111 case SEC_WEP:
gsfan 5:78943b3945b5 112 sprintf(cmd, "AT+WAUTH=%d", _ssid);
gsfan 5:78943b3945b5 113 sendCommand(cmd);
gsfan 5:78943b3945b5 114 if (_state.sec != SEC_NONE) {
gsfan 5:78943b3945b5 115 sprintf(cmd, "AT+WWEP1=%s", _phrase);
gsfan 5:78943b3945b5 116 sendCommand(cmd);
gsfan 5:78943b3945b5 117 wait_ms(100);
gsfan 5:78943b3945b5 118 }
gsfan 5:78943b3945b5 119 sprintf(cmd, "AT+WA=%s", _ssid);
gsfan 5:78943b3945b5 120 for (int i= 0; i < MAX_TRY_JOIN; i++) {
gsfan 5:78943b3945b5 121 r = sendCommand(cmd, RES_DHCP, CFG_TIMEOUT2);
gsfan 5:78943b3945b5 122 if (r) break;
gsfan 5:78943b3945b5 123 }
gsfan 5:78943b3945b5 124 break;
gsfan 5:78943b3945b5 125 case SEC_WPA_PSK:
gsfan 5:78943b3945b5 126 case SEC_WPA2_PSK:
gsfan 5:78943b3945b5 127 sendCommand("AT+WAUTH=0");
gsfan 5:78943b3945b5 128 sprintf(cmd, "AT+WPAPSK=%s,%s", _ssid, _phrase);
gsfan 5:78943b3945b5 129 sendCommand(cmd, RES_NORMAL, CFG_TIMEOUT2);
gsfan 5:78943b3945b5 130 wait_ms(100);
gsfan 5:78943b3945b5 131 sprintf(cmd, "AT+WA=%s", _ssid);
gsfan 5:78943b3945b5 132 for (int i= 0; i < MAX_TRY_JOIN; i++) {
gsfan 5:78943b3945b5 133 r = sendCommand(cmd, RES_DHCP, CFG_TIMEOUT2);
gsfan 5:78943b3945b5 134 if (r) break;
gsfan 5:78943b3945b5 135 }
gsfan 5:78943b3945b5 136 break;
gsfan 5:78943b3945b5 137 case SEC_WPS_BUTTON:
gsfan 5:78943b3945b5 138 sendCommand("AT+WAUTH=0");
gsfan 5:78943b3945b5 139 for (int i= 0; i < MAX_TRY_JOIN; i++) {
gsfan 5:78943b3945b5 140 r = sendCommand("AT+WWPS=1", RES_WPS, CFG_TIMEOUT2);
gsfan 5:78943b3945b5 141 if (r) break;
gsfan 5:78943b3945b5 142 }
gsfan 5:78943b3945b5 143 if (r && _state.dhcp) {
gsfan 5:78943b3945b5 144 r = sendCommand("AT+NDHCP=1", RES_DHCP, CFG_TIMEOUT2);
gsfan 5:78943b3945b5 145 }
gsfan 5:78943b3945b5 146 break;
gsfan 5:78943b3945b5 147 default:
gsfan 5:78943b3945b5 148 DBG("Can't use security\r\n");
gsfan 5:78943b3945b5 149 r = false;
gsfan 5:78943b3945b5 150 break;
gsfan 5:78943b3945b5 151 }
gsfan 5:78943b3945b5 152
gsfan 5:78943b3945b5 153 if (r) {
gsfan 5:78943b3945b5 154 if (!_state.dhcp) {
gsfan 5:78943b3945b5 155 sprintf(cmd, "AT+NSET=%s,%s,%s", _ip, _netmask, _gateway);
gsfan 5:78943b3945b5 156 sendCommand(cmd);
gsfan 5:78943b3945b5 157 sprintf(cmd, "AT+DNSSET=%s", _nameserver);
gsfan 5:78943b3945b5 158 sendCommand(cmd);
gsfan 5:78943b3945b5 159 }
gsfan 5:78943b3945b5 160
gsfan 5:78943b3945b5 161 _state.associated = true;
gsfan 5:78943b3945b5 162 INFO("ssid: %s\r\nphrase: %s\r\nsecurity: %d", _ssid, _phrase, _state.sec);
gsfan 5:78943b3945b5 163 }
gsfan 5:78943b3945b5 164
gsfan 5:78943b3945b5 165 return r;
gsfan 5:78943b3945b5 166 }
gsfan 5:78943b3945b5 167
gsfan 5:78943b3945b5 168
gsfan 5:78943b3945b5 169 bool GSwifi::gethostbyname(const char * host, char * ip)
gsfan 5:78943b3945b5 170 {
gsfan 5:78943b3945b5 171 int i, flg = 0;
gsfan 5:78943b3945b5 172 char cmd[CFG_CMD_SIZE];
gsfan 5:78943b3945b5 173
gsfan 5:78943b3945b5 174 for (i = 0; i < strlen(host); i ++) {
gsfan 5:78943b3945b5 175 if ((host[i] < '0' || host[i] > '9') && host[i] != '.') {
gsfan 5:78943b3945b5 176 flg = 1;
gsfan 5:78943b3945b5 177 break;
gsfan 5:78943b3945b5 178 }
gsfan 5:78943b3945b5 179 }
gsfan 5:78943b3945b5 180 if (!flg) {
gsfan 5:78943b3945b5 181 strncpy(ip, host, 16);
gsfan 5:78943b3945b5 182 return true;
gsfan 5:78943b3945b5 183 }
gsfan 5:78943b3945b5 184
gsfan 5:78943b3945b5 185 sprintf(cmd, "AT+DNSLOOKUP=%s", host);
gsfan 5:78943b3945b5 186 if (sendCommand(cmd, RES_DNSLOOKUP)) {
gsfan 5:78943b3945b5 187 strncpy(ip, _resolv, 16);
gsfan 5:78943b3945b5 188 return true;
gsfan 5:78943b3945b5 189 }
gsfan 5:78943b3945b5 190
gsfan 5:78943b3945b5 191 return false;
gsfan 5:78943b3945b5 192 }
gsfan 5:78943b3945b5 193
gsfan 5:78943b3945b5 194
gsfan 5:78943b3945b5 195 void GSwifi::flush(int cid)
gsfan 5:78943b3945b5 196 {
gsfan 5:78943b3945b5 197 if (cid < 0) {
gsfan 5:78943b3945b5 198 return _buf_gswifi.flush();
gsfan 5:78943b3945b5 199 } else {
gsfan 5:78943b3945b5 200 if (_con[cid].buf == NULL)
gsfan 5:78943b3945b5 201 _con[cid].buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 5:78943b3945b5 202 return _con[cid].buf->flush();
gsfan 5:78943b3945b5 203 }
gsfan 5:78943b3945b5 204 }
gsfan 5:78943b3945b5 205
gsfan 5:78943b3945b5 206 bool GSwifi::sendCommand(const char * cmd, Response res, int timeout)
gsfan 5:78943b3945b5 207 {
gsfan 5:78943b3945b5 208 DBG("command: %s",cmd);
gsfan 5:78943b3945b5 209
gsfan 5:78943b3945b5 210 send(cmd, strlen(cmd));
gsfan 5:78943b3945b5 211 if (send("\r\n", 2, res, timeout) == -1) {
gsfan 5:78943b3945b5 212 ERR("sendCommand: cannot %s", cmd);
gsfan 5:78943b3945b5 213 return false;
gsfan 5:78943b3945b5 214 }
gsfan 5:78943b3945b5 215 return true;
gsfan 5:78943b3945b5 216 }
gsfan 5:78943b3945b5 217
gsfan 5:78943b3945b5 218
gsfan 5:78943b3945b5 219 bool GSwifi::disconnect()
gsfan 5:78943b3945b5 220 {
gsfan 5:78943b3945b5 221 // if already disconnected, return
gsfan 5:78943b3945b5 222 if (!_state.associated)
gsfan 5:78943b3945b5 223 return true;
gsfan 5:78943b3945b5 224
gsfan 5:78943b3945b5 225 for (int i = 0; i < 16; i ++) {
gsfan 5:78943b3945b5 226 if (_con[i].buf)
gsfan 5:78943b3945b5 227 _con[i].buf->flush();
gsfan 5:78943b3945b5 228 }
gsfan 5:78943b3945b5 229 sendCommand("AT+NCLOSEALL");
gsfan 5:78943b3945b5 230 sendCommand("AT+WD");
gsfan 5:78943b3945b5 231 sendCommand("AT+NDHCP=0");
gsfan 5:78943b3945b5 232 wait_ms(100);
gsfan 5:78943b3945b5 233
gsfan 5:78943b3945b5 234 _state.associated = false;
gsfan 5:78943b3945b5 235 return true;
gsfan 5:78943b3945b5 236
gsfan 5:78943b3945b5 237 }
gsfan 5:78943b3945b5 238
gsfan 5:78943b3945b5 239 bool GSwifi::is_connected(int cid)
gsfan 5:78943b3945b5 240 {
gsfan 5:78943b3945b5 241 return _con[cid].connected;
gsfan 5:78943b3945b5 242 }
gsfan 5:78943b3945b5 243
gsfan 5:78943b3945b5 244
gsfan 5:78943b3945b5 245 void GSwifi::reset()
gsfan 5:78943b3945b5 246 {
gsfan 5:78943b3945b5 247 _reset = 0;
gsfan 5:78943b3945b5 248 wait_ms(100);
gsfan 5:78943b3945b5 249 _reset = 1;
gsfan 5:78943b3945b5 250 wait_ms(500);
gsfan 5:78943b3945b5 251 }
gsfan 5:78943b3945b5 252
gsfan 5:78943b3945b5 253
gsfan 5:78943b3945b5 254 int GSwifi::putc(char c)
gsfan 5:78943b3945b5 255 {
gsfan 5:78943b3945b5 256 while (!_uart.writeable());
gsfan 5:78943b3945b5 257 return _uart.putc(c);
gsfan 5:78943b3945b5 258 }
gsfan 5:78943b3945b5 259
gsfan 5:78943b3945b5 260
gsfan 5:78943b3945b5 261 int GSwifi::readable(int cid)
gsfan 5:78943b3945b5 262 {
gsfan 5:78943b3945b5 263 if (cid < 0) {
gsfan 5:78943b3945b5 264 return _buf_gswifi.available();
gsfan 5:78943b3945b5 265 } else {
gsfan 5:78943b3945b5 266 return _con[cid].buf->available();
gsfan 5:78943b3945b5 267 }
gsfan 5:78943b3945b5 268 }
gsfan 5:78943b3945b5 269
gsfan 5:78943b3945b5 270 int GSwifi::writeable()
gsfan 5:78943b3945b5 271 {
gsfan 5:78943b3945b5 272 return _uart.writeable();
gsfan 5:78943b3945b5 273 }
gsfan 5:78943b3945b5 274
gsfan 5:78943b3945b5 275 char GSwifi::getc(int cid)
gsfan 5:78943b3945b5 276 {
gsfan 5:78943b3945b5 277 char c;
gsfan 5:78943b3945b5 278 if (cid < 0) {
gsfan 5:78943b3945b5 279 while (!_buf_gswifi.available());
gsfan 5:78943b3945b5 280 _buf_gswifi.dequeue(&c);
gsfan 5:78943b3945b5 281 } else {
gsfan 5:78943b3945b5 282 while (!_con[cid].buf->available());
gsfan 5:78943b3945b5 283 _con[cid].buf->dequeue(&c);
gsfan 5:78943b3945b5 284 }
gsfan 5:78943b3945b5 285 return c;
gsfan 5:78943b3945b5 286 }
gsfan 5:78943b3945b5 287
gsfan 5:78943b3945b5 288 void GSwifi::handler_rx(void)
gsfan 5:78943b3945b5 289 {
gsfan 5:78943b3945b5 290 static int len, flg;
gsfan 5:78943b3945b5 291 static char tmp[20];
gsfan 5:78943b3945b5 292 char dat;
gsfan 5:78943b3945b5 293
gsfan 5:78943b3945b5 294 while (_uart.readable()) {
gsfan 5:78943b3945b5 295
gsfan 5:78943b3945b5 296 dat = _uart.getc();
gsfan 5:78943b3945b5 297
gsfan 5:78943b3945b5 298 switch (_state.mode) {
gsfan 5:78943b3945b5 299 case MODE_COMMAND: // command responce
gsfan 5:78943b3945b5 300 if (_state.escape) {
gsfan 5:78943b3945b5 301 // esc
gsfan 5:78943b3945b5 302 switch (dat) {
gsfan 5:78943b3945b5 303 case 'O':
gsfan 5:78943b3945b5 304 DBG("ok");
gsfan 5:78943b3945b5 305 _state.retres = RES_OK;
gsfan 5:78943b3945b5 306 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 307 break;
gsfan 5:78943b3945b5 308 case 'F':
gsfan 5:78943b3945b5 309 DBG("failure");
gsfan 5:78943b3945b5 310 _state.retres = RES_FAILURE;
gsfan 5:78943b3945b5 311 _state.cmdres = RES_FAILURE;
gsfan 5:78943b3945b5 312 break;
gsfan 5:78943b3945b5 313 case 'Z':
gsfan 5:78943b3945b5 314 case 'H':
gsfan 5:78943b3945b5 315 DBG("GSMODE_DATA_RX");
gsfan 5:78943b3945b5 316 _state.mode = MODE_DATA_RX;
gsfan 5:78943b3945b5 317 flg = 0;
gsfan 5:78943b3945b5 318 break;
gsfan 5:78943b3945b5 319 case 'y':
gsfan 5:78943b3945b5 320 DBG("GSMODE_DATA_RXUDP");
gsfan 5:78943b3945b5 321 _state.mode = MODE_DATA_RXUDP;
gsfan 5:78943b3945b5 322 flg = 0;
gsfan 5:78943b3945b5 323 break;
gsfan 5:78943b3945b5 324 case 'S':
gsfan 5:78943b3945b5 325 case 'u':
gsfan 5:78943b3945b5 326 default:
gsfan 5:78943b3945b5 327 WARN("unknown [ESC] %02x", dat);
gsfan 5:78943b3945b5 328 break;
gsfan 5:78943b3945b5 329 }
gsfan 5:78943b3945b5 330 _state.escape = 0;
gsfan 5:78943b3945b5 331 } else {
gsfan 5:78943b3945b5 332 if (dat == 0x1b) {
gsfan 5:78943b3945b5 333 _state.escape = 1;
gsfan 5:78943b3945b5 334 } else
gsfan 5:78943b3945b5 335 if (dat == '\n') {
gsfan 5:78943b3945b5 336 parseResponse();
gsfan 5:78943b3945b5 337 } else
gsfan 5:78943b3945b5 338 if (dat != '\r') {
gsfan 5:78943b3945b5 339 // command
gsfan 5:78943b3945b5 340 _buf_gswifi.queue(dat);
gsfan 5:78943b3945b5 341 }
gsfan 5:78943b3945b5 342 }
gsfan 5:78943b3945b5 343 break;
gsfan 5:78943b3945b5 344
gsfan 5:78943b3945b5 345 case MODE_DATA_RX:
gsfan 5:78943b3945b5 346 case MODE_DATA_RXUDP:
gsfan 5:78943b3945b5 347 switch (flg) {
gsfan 5:78943b3945b5 348 case 0:
gsfan 5:78943b3945b5 349 // CID
gsfan 5:78943b3945b5 350 _state.cid = x2i(dat);
gsfan 5:78943b3945b5 351 flg ++;
gsfan 5:78943b3945b5 352 if (_state.mode == MODE_DATA_RX) {
gsfan 5:78943b3945b5 353 flg = 3;
gsfan 5:78943b3945b5 354 }
gsfan 5:78943b3945b5 355 len = 0;
gsfan 5:78943b3945b5 356 break;
gsfan 5:78943b3945b5 357 case 1:
gsfan 5:78943b3945b5 358 // IP (UDP)
gsfan 5:78943b3945b5 359 if ((dat >= '0' && dat <= '9') || dat == '.') {
gsfan 5:78943b3945b5 360 tmp[len] = dat;
gsfan 5:78943b3945b5 361 len ++;
gsfan 5:78943b3945b5 362 } else
gsfan 5:78943b3945b5 363 if (len < sizeof(tmp) - 1) {
gsfan 5:78943b3945b5 364 tmp[len] = 0;
gsfan 5:78943b3945b5 365 strncpy(_con[_state.cid].ip, tmp, sizeof(_con[_state.cid].ip));
gsfan 5:78943b3945b5 366 flg ++;
gsfan 5:78943b3945b5 367 len = 0;
gsfan 5:78943b3945b5 368 }
gsfan 5:78943b3945b5 369 break;
gsfan 5:78943b3945b5 370 case 2:
gsfan 5:78943b3945b5 371 // port
gsfan 5:78943b3945b5 372 if (dat >= '0' && dat <= '9') {
gsfan 5:78943b3945b5 373 tmp[len] = dat;
gsfan 5:78943b3945b5 374 len ++;
gsfan 5:78943b3945b5 375 } else {
gsfan 5:78943b3945b5 376 tmp[len] = 0;
gsfan 5:78943b3945b5 377 _con[_state.cid].port = atoi(tmp);
gsfan 5:78943b3945b5 378 flg ++;
gsfan 5:78943b3945b5 379 len = 0;
gsfan 5:78943b3945b5 380 }
gsfan 5:78943b3945b5 381 break;
gsfan 5:78943b3945b5 382 case 3:
gsfan 5:78943b3945b5 383 // length
gsfan 5:78943b3945b5 384 tmp[len] = dat;
gsfan 5:78943b3945b5 385 len ++;
gsfan 5:78943b3945b5 386 if (len >= 4) {
gsfan 5:78943b3945b5 387 tmp[len] = 0;
gsfan 5:78943b3945b5 388 len = atoi(tmp);
gsfan 5:78943b3945b5 389 flg ++;
gsfan 5:78943b3945b5 390 }
gsfan 5:78943b3945b5 391 break;
gsfan 5:78943b3945b5 392 case 4:
gsfan 5:78943b3945b5 393 // data
gsfan 5:78943b3945b5 394 if (_con[_state.cid].buf != NULL) {
gsfan 5:78943b3945b5 395 _con[_state.cid].buf->queue(dat);
gsfan 5:78943b3945b5 396 }
gsfan 5:78943b3945b5 397 len --;
gsfan 5:78943b3945b5 398
gsfan 5:78943b3945b5 399 if (len == 0 || _con[_state.cid].buf->isFull()) {
gsfan 5:78943b3945b5 400 DBG("recv binary %d", _state.cid);
gsfan 5:78943b3945b5 401 _state.escape = 0;
gsfan 5:78943b3945b5 402 _state.mode = MODE_COMMAND;
gsfan 5:78943b3945b5 403 // recv interrupt
gsfan 5:78943b3945b5 404 /*
gsfan 5:78943b3945b5 405 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET && _gs_sock[_cid].onGsReceive != NULL) {
gsfan 5:78943b3945b5 406 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use());
gsfan 5:78943b3945b5 407 _gs_sock[_cid].received = 0;
gsfan 5:78943b3945b5 408 }
gsfan 5:78943b3945b5 409 */
gsfan 5:78943b3945b5 410 }
gsfan 5:78943b3945b5 411 break;
gsfan 5:78943b3945b5 412 }
gsfan 5:78943b3945b5 413
gsfan 5:78943b3945b5 414 break;
gsfan 5:78943b3945b5 415 }
gsfan 5:78943b3945b5 416
gsfan 5:78943b3945b5 417 } // while
gsfan 5:78943b3945b5 418 }
gsfan 5:78943b3945b5 419
gsfan 5:78943b3945b5 420 void GSwifi::parseResponse () {
gsfan 5:78943b3945b5 421 int i;
gsfan 5:78943b3945b5 422 char buf[CFG_CMD_SIZE];
gsfan 5:78943b3945b5 423
gsfan 5:78943b3945b5 424 while (_buf_gswifi.available()) {
gsfan 5:78943b3945b5 425 i = 0;
gsfan 5:78943b3945b5 426 while (_buf_gswifi.available() && i < sizeof(buf)) {
gsfan 5:78943b3945b5 427 _buf_gswifi.dequeue(&buf[i]);
gsfan 5:78943b3945b5 428 if (buf[i] == '\n') {
gsfan 5:78943b3945b5 429 break;
gsfan 5:78943b3945b5 430 }
gsfan 5:78943b3945b5 431 i ++;
gsfan 5:78943b3945b5 432 }
gsfan 5:78943b3945b5 433 if (i == 0) continue;
gsfan 5:78943b3945b5 434 buf[i] = 0;
gsfan 5:78943b3945b5 435 DBG("parseResponse: %s", buf);
gsfan 5:78943b3945b5 436
gsfan 5:78943b3945b5 437 if (_state.cmdres != RES_NULL) {
gsfan 5:78943b3945b5 438 parseCmdResponse(buf);
gsfan 5:78943b3945b5 439 DBG("parseCmdResponse %d %d", _state.cmdres, _state.retres);
gsfan 5:78943b3945b5 440 }
gsfan 5:78943b3945b5 441
gsfan 5:78943b3945b5 442 if (strncmp(buf, "CONNECT ", 8) == 0 && buf[8] >= '0' && buf[8] <= 'F' && buf[9] != 0) {
gsfan 5:78943b3945b5 443 int cid;
gsfan 5:78943b3945b5 444 char *tmp, *tmp2;
gsfan 5:78943b3945b5 445 cid = x2i(buf[8]);
gsfan 5:78943b3945b5 446 _state.acid = x2i(buf[10]);
gsfan 5:78943b3945b5 447 tmp = buf + 12;
gsfan 5:78943b3945b5 448 tmp2 = strstr(tmp, " ");
gsfan 5:78943b3945b5 449 tmp2[0] = 0;
gsfan 5:78943b3945b5 450 strncpy(_con[_state.acid].ip, tmp, sizeof(_con[_state.acid].ip));
gsfan 5:78943b3945b5 451 tmp = tmp2 + 1;
gsfan 5:78943b3945b5 452 _con[_state.acid].port = atoi(tmp);
gsfan 5:78943b3945b5 453 _con[_state.acid].parent = cid;
gsfan 5:78943b3945b5 454 if (_con[_state.acid].buf == NULL)
gsfan 5:78943b3945b5 455 _con[_state.acid].buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 5:78943b3945b5 456 _con[_state.acid].buf->flush();
gsfan 5:78943b3945b5 457 _con[_state.acid].connected = true;
gsfan 5:78943b3945b5 458 DBG("connect %d -> %d", cid, _state.acid);
gsfan 5:78943b3945b5 459 } else
gsfan 5:78943b3945b5 460 if (strncmp(buf, "DISCONNECT ", 11) == 0) {
gsfan 5:78943b3945b5 461 int cid;
gsfan 5:78943b3945b5 462 cid = x2i(buf[11]);
gsfan 5:78943b3945b5 463 DBG("disconnect %d", cid);
gsfan 5:78943b3945b5 464 _con[cid].connected = false;
gsfan 5:78943b3945b5 465 } else
gsfan 5:78943b3945b5 466 if (strncmp(buf, "DISASSOCIATED", 13) == 0 ||
gsfan 5:78943b3945b5 467 strncmp(buf, "Disassociated", 13) == 0 ||
gsfan 5:78943b3945b5 468 strncmp(buf, "Disassociation Event", 20) == 0 ||
gsfan 5:78943b3945b5 469 strncmp(buf, "UnExpected Warm Boot", 20) == 0) {
gsfan 5:78943b3945b5 470 _state.associated = false;
gsfan 5:78943b3945b5 471 for (i = 0; i < 16; i ++) {
gsfan 5:78943b3945b5 472 _con[i].connected = false;
gsfan 5:78943b3945b5 473 }
gsfan 5:78943b3945b5 474 } else
gsfan 5:78943b3945b5 475 if (strncmp(buf, "Out of StandBy-Timer", 20) == 0 ||
gsfan 5:78943b3945b5 476 strncmp(buf, "Out of StandBy-Alarm", 20) == 0) {
gsfan 5:78943b3945b5 477 _state.status = STAT_WAKEUP;
gsfan 5:78943b3945b5 478 } else
gsfan 5:78943b3945b5 479 if (strncmp(buf, "Out of Deep Sleep", 17) == 0 ) {
gsfan 5:78943b3945b5 480 _state.status = STAT_READY;
gsfan 5:78943b3945b5 481 } else
gsfan 5:78943b3945b5 482 if (strncmp(buf, "Out of", 6) == 0) {
gsfan 5:78943b3945b5 483 }
gsfan 5:78943b3945b5 484 }
gsfan 5:78943b3945b5 485 }
gsfan 5:78943b3945b5 486
gsfan 5:78943b3945b5 487 void GSwifi::parseCmdResponse (char *buf) {
gsfan 5:78943b3945b5 488
gsfan 5:78943b3945b5 489 if (strcmp(buf, "OK") == 0) {
gsfan 5:78943b3945b5 490 _state.retres = RES_OK;
gsfan 5:78943b3945b5 491 } else
gsfan 5:78943b3945b5 492 if (strncmp(buf, "ERROR", 5) == 0) {
gsfan 5:78943b3945b5 493 _state.retres = RES_FAILURE;
gsfan 5:78943b3945b5 494 }
gsfan 5:78943b3945b5 495
gsfan 5:78943b3945b5 496 switch(_state.cmdres) {
gsfan 5:78943b3945b5 497 case RES_NORMAL:
gsfan 5:78943b3945b5 498 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 499 break;
gsfan 5:78943b3945b5 500 case RES_WPS:
gsfan 5:78943b3945b5 501 if (_state.n == 0 && strncmp(buf, "SSID", 4) == 0) {
gsfan 5:78943b3945b5 502 _state.n ++;
gsfan 5:78943b3945b5 503 } else
gsfan 5:78943b3945b5 504 if (_state.n == 1 && strncmp(buf, "CHANNEL", 7) == 0) {
gsfan 5:78943b3945b5 505 _state.n ++;
gsfan 5:78943b3945b5 506 } else
gsfan 5:78943b3945b5 507 if (_state.n == 2 && strncmp(buf, "PASSPHRASE", 10) == 0) {
gsfan 5:78943b3945b5 508 _state.n ++;
gsfan 5:78943b3945b5 509 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 510 }
gsfan 5:78943b3945b5 511 break;
gsfan 5:78943b3945b5 512 case RES_CONNECT:
gsfan 5:78943b3945b5 513 if (strncmp(buf, "CONNECT ", 8) == 0 && buf[9] == 0) {
gsfan 5:78943b3945b5 514 _state.cid = x2i(buf[8]);
gsfan 5:78943b3945b5 515 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 516 if (_con[_state.cid].buf == NULL)
gsfan 5:78943b3945b5 517 _con[_state.cid].buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 5:78943b3945b5 518 _con[_state.cid].buf->flush();
gsfan 5:78943b3945b5 519 _con[_state.cid].connected = true;
gsfan 5:78943b3945b5 520 INFO("connect: %d", _state.cid);
gsfan 5:78943b3945b5 521 }
gsfan 5:78943b3945b5 522 break;
gsfan 5:78943b3945b5 523 case RES_DHCP:
gsfan 5:78943b3945b5 524 if (_state.n == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) {
gsfan 5:78943b3945b5 525 _state.n ++;
gsfan 5:78943b3945b5 526 } else
gsfan 5:78943b3945b5 527 if (_state.n == 1) {
gsfan 5:78943b3945b5 528 char *tmp, *tmp2;
gsfan 5:78943b3945b5 529 tmp = buf + 1;
gsfan 5:78943b3945b5 530 tmp2 = strstr(tmp, ":");
gsfan 5:78943b3945b5 531 tmp2[0] = 0;
gsfan 5:78943b3945b5 532 strncpy(_ip, tmp, sizeof(_ip));
gsfan 5:78943b3945b5 533 tmp = tmp2 + 2;
gsfan 5:78943b3945b5 534 tmp2 = strstr(tmp, ":");
gsfan 5:78943b3945b5 535 tmp2[0] = 0;
gsfan 5:78943b3945b5 536 strncpy(_netmask, tmp, sizeof(_netmask));
gsfan 5:78943b3945b5 537 tmp = tmp2 + 2;
gsfan 5:78943b3945b5 538 strncpy(_gateway, tmp, sizeof(_gateway));
gsfan 5:78943b3945b5 539 _state.n ++;
gsfan 5:78943b3945b5 540 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 541 INFO("ip: %s\r\nnetmask: %s\r\ngateway: %s", _ip, _netmask, _gateway);
gsfan 5:78943b3945b5 542 }
gsfan 5:78943b3945b5 543 break;
gsfan 5:78943b3945b5 544 case RES_MACADDRESS:
gsfan 5:78943b3945b5 545 if (buf[2] == ':' && buf[5] == ':') {
gsfan 7:f94c59d0c735 546 strncpy(_mac, buf, sizeof(_mac));
gsfan 5:78943b3945b5 547 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 548 }
gsfan 5:78943b3945b5 549 break;
gsfan 5:78943b3945b5 550 case RES_DNSLOOKUP:
gsfan 5:78943b3945b5 551 if (strncmp(buf, "IP:", 3) == 0) {
gsfan 5:78943b3945b5 552 strncpy(_resolv, &buf[3], sizeof(_resolv));
gsfan 5:78943b3945b5 553 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 554 INFO("resolv: %s", _resolv);
gsfan 5:78943b3945b5 555 }
gsfan 5:78943b3945b5 556 break;
gsfan 5:78943b3945b5 557 case RES_HTTP:
gsfan 5:78943b3945b5 558 if (buf[0] >= '0' && buf[0] <= 'F') {
gsfan 5:78943b3945b5 559 _state.cid = x2i(buf[0]);
gsfan 5:78943b3945b5 560 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 561 INFO("http: %d", _state.cid);
gsfan 5:78943b3945b5 562 }
gsfan 5:78943b3945b5 563 break;
gsfan 5:78943b3945b5 564 case RES_RSSI:
gsfan 5:78943b3945b5 565 if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) {
gsfan 5:78943b3945b5 566 _rssi = atoi(buf);
gsfan 5:78943b3945b5 567 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 568 INFO("rssi: %d", _rssi);
gsfan 5:78943b3945b5 569 }
gsfan 5:78943b3945b5 570 break;
gsfan 5:78943b3945b5 571 case RES_TIME:
gsfan 5:78943b3945b5 572 if (buf[0] >= '0' && buf[0] <= '9') {
gsfan 5:78943b3945b5 573 int year, month, day, hour, min, sec;
gsfan 5:78943b3945b5 574 struct tm t;
gsfan 5:78943b3945b5 575 sscanf(buf, "%d/%d/%d,%d:%d:%d", &day, &month, &year, &hour, &min, &sec);
gsfan 5:78943b3945b5 576 t.tm_sec = sec;
gsfan 5:78943b3945b5 577 t.tm_min = min;
gsfan 5:78943b3945b5 578 t.tm_hour = hour;
gsfan 5:78943b3945b5 579 t.tm_mday = day;
gsfan 5:78943b3945b5 580 t.tm_mon = month - 1;
gsfan 5:78943b3945b5 581 t.tm_year = year - 1900;
gsfan 5:78943b3945b5 582 _time = mktime(&t);
gsfan 5:78943b3945b5 583 _state.cmdres = RES_OK;
gsfan 5:78943b3945b5 584 }
gsfan 5:78943b3945b5 585 break;
gsfan 5:78943b3945b5 586 }
gsfan 5:78943b3945b5 587 }
gsfan 5:78943b3945b5 588
gsfan 5:78943b3945b5 589 int GSwifi::send(const char * str, int len, Response res, int timeout)
gsfan 5:78943b3945b5 590 {
gsfan 5:78943b3945b5 591 Timer tmr;
gsfan 5:78943b3945b5 592 int result = 0;
gsfan 5:78943b3945b5 593
gsfan 5:78943b3945b5 594 if (res == RES_NULL) {
gsfan 5:78943b3945b5 595 for (int i = 0; i < len; i++)
gsfan 5:78943b3945b5 596 result = (putc(str[i]) == str[i]) ? result + 1 : result;
gsfan 5:78943b3945b5 597 } else {
gsfan 5:78943b3945b5 598 _state.cmdres = res;
gsfan 5:78943b3945b5 599 _state.retres = RES_NULL;
gsfan 5:78943b3945b5 600
gsfan 5:78943b3945b5 601 tmr.start();
gsfan 5:78943b3945b5 602 for (int i = 0; i < len; i++)
gsfan 5:78943b3945b5 603 result = (putc(str[i]) == str[i]) ? result + 1 : result;
gsfan 5:78943b3945b5 604
gsfan 5:78943b3945b5 605 while (1) {
gsfan 5:78943b3945b5 606 if (tmr.read_ms() > timeout || _state.retres == RES_FAILURE) {
gsfan 5:78943b3945b5 607 result = -1;
gsfan 5:78943b3945b5 608 break;
gsfan 5:78943b3945b5 609 }
gsfan 5:78943b3945b5 610 if (_state.retres == RES_OK && _state.cmdres != res) break;
gsfan 5:78943b3945b5 611 }
gsfan 5:78943b3945b5 612 }
gsfan 5:78943b3945b5 613
gsfan 5:78943b3945b5 614 _state.cmdres = RES_NULL;
gsfan 5:78943b3945b5 615 _state.retres = RES_NULL;
gsfan 5:78943b3945b5 616 return result;
gsfan 5:78943b3945b5 617 }
gsfan 5:78943b3945b5 618
gsfan 5:78943b3945b5 619 bool GSwifi::readRemote(int cid, char **ip, int *port) {
gsfan 5:78943b3945b5 620 *ip = _con[cid].ip;
gsfan 5:78943b3945b5 621 *port = _con[cid].port;
gsfan 5:78943b3945b5 622 return true;
gsfan 5:78943b3945b5 623 }
gsfan 5:78943b3945b5 624
gsfan 5:78943b3945b5 625 int GSwifi::readCID () {
gsfan 5:78943b3945b5 626 return _state.cid;
gsfan 5:78943b3945b5 627 }
gsfan 5:78943b3945b5 628
gsfan 5:78943b3945b5 629 int GSwifi::readACID () {
gsfan 5:78943b3945b5 630 int r = -1;
gsfan 5:78943b3945b5 631 if (_state.acid >= 0 && _con[_state.acid].connected == true) {
gsfan 5:78943b3945b5 632 r = _state.acid;
gsfan 5:78943b3945b5 633 _state.acid = -1;
gsfan 5:78943b3945b5 634 }
gsfan 5:78943b3945b5 635 return r;
gsfan 5:78943b3945b5 636 }
gsfan 5:78943b3945b5 637
gsfan 5:78943b3945b5 638 int GSwifi::x2i (char c) {
gsfan 5:78943b3945b5 639 if (c >= '0' && c <= '9') {
gsfan 5:78943b3945b5 640 return c - '0';
gsfan 5:78943b3945b5 641 } else
gsfan 5:78943b3945b5 642 if (c >= 'A' && c <= 'F') {
gsfan 5:78943b3945b5 643 return c - 'A' + 10;
gsfan 5:78943b3945b5 644 } else
gsfan 5:78943b3945b5 645 if (c >= 'a' && c <= 'f') {
gsfan 5:78943b3945b5 646 return c - 'a' + 10;
gsfan 5:78943b3945b5 647 }
gsfan 5:78943b3945b5 648 return 0;
gsfan 5:78943b3945b5 649 }
gsfan 5:78943b3945b5 650
gsfan 5:78943b3945b5 651 char GSwifi::i2x (int i) {
gsfan 5:78943b3945b5 652 if (i >= 0 && i <= 9) {
gsfan 5:78943b3945b5 653 return i + '0';
gsfan 5:78943b3945b5 654 } else
gsfan 5:78943b3945b5 655 if (i >= 10 && i <= 15) {
gsfan 5:78943b3945b5 656 return i - 10 + 'A';
gsfan 5:78943b3945b5 657 }
gsfan 5:78943b3945b5 658 return 0;
gsfan 5:78943b3945b5 659 }