GainSpan Wi-Fi library see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Dependents:   GSwifi_httpd GSwifi_websocket GSwifi_tcpclient GSwifi_tcpserver ... more

Fork of GSwifi by gs fan

GainSpan Wi-Fi library

The GS1011 is an ultra low power 802.11b wireless module from GainSpan.

see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

/media/uploads/gsfan/gs_im_002.jpg /media/uploads/gsfan/gs1011m_2.jpg

ゲインスパン Wi-Fi モジュール ライブラリ

ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011 シリーズ用のライブラリです。

解説: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Committer:
gsfan
Date:
Wed Dec 18 01:29:43 2013 +0000
Revision:
43:0b5e2727e020
Parent:
42:9b3c38d66fa8
fix reconnect

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 25:f6e5622d2930 1 /* Copyright (C) 2013 gsfan, MIT License
gsfan 25:f6e5622d2930 2 *
gsfan 25:f6e5622d2930 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gsfan 25:f6e5622d2930 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
gsfan 25:f6e5622d2930 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
gsfan 25:f6e5622d2930 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
gsfan 25:f6e5622d2930 7 * furnished to do so, subject to the following conditions:
gsfan 25:f6e5622d2930 8 *
gsfan 25:f6e5622d2930 9 * The above copyright notice and this permission notice shall be included in all copies or
gsfan 25:f6e5622d2930 10 * substantial portions of the Software.
gsfan 25:f6e5622d2930 11 *
gsfan 25:f6e5622d2930 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gsfan 25:f6e5622d2930 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gsfan 25:f6e5622d2930 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gsfan 25:f6e5622d2930 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gsfan 25:f6e5622d2930 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gsfan 0:2f6062c6d018 17 */
gsfan 0:2f6062c6d018 18 /** @file
gsfan 0:2f6062c6d018 19 * @brief Gainspan wi-fi module library for mbed
gsfan 0:2f6062c6d018 20 * GS1011MIC, GS1011MIP, GainSpan WiFi Breakout, etc.
gsfan 0:2f6062c6d018 21 */
gsfan 0:2f6062c6d018 22
gsfan 0:2f6062c6d018 23 #include "mbed.h"
gsfan 0:2f6062c6d018 24 #include "GSwifi.h"
gsfan 0:2f6062c6d018 25
gsfan 0:2f6062c6d018 26
gsfan 37:e61ea8267415 27 GSwifi::GSwifi (PinName p_tx, PinName p_rx, PinName p_reset, PinName p_alarm, int baud)
gsfan 37:e61ea8267415 28 : _gs(p_tx, p_rx), _reset(p_reset), _buf_cmd(GS_CMD_SIZE) {
gsfan 25:f6e5622d2930 29
gsfan 25:f6e5622d2930 30 if (p_alarm != NC) {
gsfan 26:b347ee3a1087 31 _alarm = new DigitalInOut(p_alarm);
gsfan 26:b347ee3a1087 32 _alarm->output(); // low
gsfan 26:b347ee3a1087 33 _alarm->write(0);
gsfan 25:f6e5622d2930 34 } else {
gsfan 25:f6e5622d2930 35 _alarm = NULL;
gsfan 25:f6e5622d2930 36 }
gsfan 0:2f6062c6d018 37
gsfan 26:b347ee3a1087 38 _reset.output(); // low
gsfan 26:b347ee3a1087 39 _reset = 0;
gsfan 35:515ec79792d3 40 _baud = baud;
gsfan 35:515ec79792d3 41 if (_baud) _gs.baud(_baud);
gsfan 0:2f6062c6d018 42 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
gsfan 0:2f6062c6d018 43 _rts = false;
gsfan 36:a70b11e1560f 44 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
gsfan 36:a70b11e1560f 45 _uart = LPC_UART1;
gsfan 36:a70b11e1560f 46 #elif defined(TARGET_LPC11U24)
gsfan 36:a70b11e1560f 47 _uart = LPC_USART;
gsfan 36:a70b11e1560f 48 #endif
gsfan 25:f6e5622d2930 49
gsfan 35:515ec79792d3 50 wait_ms(100);
gsfan 25:f6e5622d2930 51 reset();
gsfan 0:2f6062c6d018 52 }
gsfan 0:2f6062c6d018 53
gsfan 37:e61ea8267415 54 GSwifi::GSwifi (PinName p_tx, PinName p_rx, PinName p_cts, PinName p_rts, PinName p_reset, PinName p_alarm, int baud)
gsfan 37:e61ea8267415 55 : _gs(p_tx, p_rx), _reset(p_reset), _buf_cmd(GS_CMD_SIZE) {
gsfan 25:f6e5622d2930 56
gsfan 25:f6e5622d2930 57 if (p_alarm != NC) {
gsfan 26:b347ee3a1087 58 _alarm = new DigitalInOut(p_alarm);
gsfan 26:b347ee3a1087 59 _alarm->output(); // low
gsfan 26:b347ee3a1087 60 _alarm->write(0);
gsfan 25:f6e5622d2930 61 } else {
gsfan 25:f6e5622d2930 62 _alarm = NULL;
gsfan 25:f6e5622d2930 63 }
gsfan 0:2f6062c6d018 64
gsfan 26:b347ee3a1087 65 _reset.output(); // low
gsfan 26:b347ee3a1087 66 _reset = 0;
gsfan 35:515ec79792d3 67 _baud = baud;
gsfan 35:515ec79792d3 68 if (_baud) _gs.baud(_baud);
gsfan 0:2f6062c6d018 69 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
gsfan 33:b5a5a1e6325f 70 _rts = false;
gsfan 0:2f6062c6d018 71 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
gsfan 36:a70b11e1560f 72 _uart = LPC_UART1;
gsfan 0:2f6062c6d018 73 if (p_cts == p12) { // CTS input (P0_17)
gsfan 36:a70b11e1560f 74 _uart->MCR |= (1<<7); // CTSEN
gsfan 0:2f6062c6d018 75 LPC_PINCON->PINSEL1 &= ~(3 << 2);
gsfan 0:2f6062c6d018 76 LPC_PINCON->PINSEL1 |= (1 << 2); // UART CTS
gsfan 38:dfc31d58fa1d 77 } else
gsfan 38:dfc31d58fa1d 78 if (p_cts == P2_2) { // CTS input (P2_2)
gsfan 38:dfc31d58fa1d 79 _uart->MCR |= (1<<7); // CTSEN
gsfan 38:dfc31d58fa1d 80 LPC_PINCON->PINSEL4 &= ~(3 << 4);
gsfan 38:dfc31d58fa1d 81 LPC_PINCON->PINSEL4 |= (2 << 4); // UART CTS
gsfan 0:2f6062c6d018 82 }
gsfan 0:2f6062c6d018 83 if (p_rts == P0_22) { // RTS output (P0_22)
gsfan 36:a70b11e1560f 84 _uart->MCR |= (1<<6); // RTSEN
gsfan 0:2f6062c6d018 85 LPC_PINCON->PINSEL1 &= ~(3 << 12);
gsfan 0:2f6062c6d018 86 LPC_PINCON->PINSEL1 |= (1 << 12); // UART RTS
gsfan 0:2f6062c6d018 87 _rts = true;
gsfan 38:dfc31d58fa1d 88 } else
gsfan 38:dfc31d58fa1d 89 if (p_rts == P2_7) { // RTS output (P2_7)
gsfan 38:dfc31d58fa1d 90 _uart->MCR |= (1<<6); // RTSEN
gsfan 38:dfc31d58fa1d 91 LPC_PINCON->PINSEL4 &= ~(3 << 14);
gsfan 38:dfc31d58fa1d 92 LPC_PINCON->PINSEL4 |= (2 << 14); // UART RTS
gsfan 38:dfc31d58fa1d 93 _rts = true;
gsfan 0:2f6062c6d018 94 }
gsfan 0:2f6062c6d018 95 #elif defined(TARGET_LPC11U24)
gsfan 36:a70b11e1560f 96 _uart = LPC_USART;
gsfan 0:2f6062c6d018 97 if (p_cts == p21) { // CTS input (P0_7)
gsfan 36:a70b11e1560f 98 _uart->MCR |= (1<<7); // CTSEN
gsfan 0:2f6062c6d018 99 LPC_IOCON->PIO0_7 &= ~0x07;
gsfan 0:2f6062c6d018 100 LPC_IOCON->PIO0_7 |= 0x01; // UART CTS
gsfan 0:2f6062c6d018 101 }
gsfan 0:2f6062c6d018 102 if (p_rts == p22) { // RTS output (P0_17)
gsfan 36:a70b11e1560f 103 _uart->MCR |= (1<<6); // RTSEN
gsfan 0:2f6062c6d018 104 LPC_IOCON->PIO0_17 &= ~0x07;
gsfan 0:2f6062c6d018 105 LPC_IOCON->PIO0_17 |= 0x01; // UART RTS
gsfan 0:2f6062c6d018 106 _rts = true;
gsfan 0:2f6062c6d018 107 }
gsfan 0:2f6062c6d018 108 #endif
gsfan 25:f6e5622d2930 109
gsfan 35:515ec79792d3 110 wait_ms(100);
gsfan 25:f6e5622d2930 111 reset();
gsfan 25:f6e5622d2930 112 }
gsfan 25:f6e5622d2930 113
gsfan 25:f6e5622d2930 114 void GSwifi::reset () {
gsfan 26:b347ee3a1087 115
gsfan 26:b347ee3a1087 116 if (_alarm != NULL) {
gsfan 26:b347ee3a1087 117 _alarm->output(); // low
gsfan 26:b347ee3a1087 118 _alarm->write(0);
gsfan 26:b347ee3a1087 119 wait_ms(10);
gsfan 26:b347ee3a1087 120 _alarm->input(); // high
gsfan 28:fbba4c58d14c 121 _alarm->mode(PullUp);
gsfan 26:b347ee3a1087 122 wait_ms(10);
gsfan 26:b347ee3a1087 123 }
gsfan 26:b347ee3a1087 124 _reset.output(); // low
gsfan 26:b347ee3a1087 125 _reset = 0;
gsfan 26:b347ee3a1087 126
gsfan 35:515ec79792d3 127 memset(&_gs_sock, 0, sizeof(_gs_sock));
gsfan 35:515ec79792d3 128 memset(&_mac, 0, sizeof(_mac));
gsfan 25:f6e5622d2930 129 _connect = false;
gsfan 25:f6e5622d2930 130 _status = GSSTAT_READY;
gsfan 41:0afda15e9bb4 131 _escape = false;
gsfan 26:b347ee3a1087 132 resetResponse(GSRES_NONE);
gsfan 25:f6e5622d2930 133 _gs_mode = GSMODE_COMMAND;
gsfan 41:0afda15e9bb4 134 _dhcp = false;
gsfan 25:f6e5622d2930 135 _ssid = NULL;
gsfan 26:b347ee3a1087 136 _pass = NULL;
gsfan 25:f6e5622d2930 137 _reconnect = 0;
gsfan 26:b347ee3a1087 138 _buf_cmd.flush();
gsfan 25:f6e5622d2930 139
gsfan 33:b5a5a1e6325f 140 wait_ms(100);
gsfan 35:515ec79792d3 141 if (! _baud) autobaud(0);
gsfan 26:b347ee3a1087 142 _reset.input(); // high
gsfan 40:72f70748f6e8 143 _reset.mode(PullNone);
gsfan 35:515ec79792d3 144 if (! _baud) autobaud(1);
gsfan 25:f6e5622d2930 145 wait_ms(500);
gsfan 0:2f6062c6d018 146 }
gsfan 0:2f6062c6d018 147
gsfan 35:515ec79792d3 148 int GSwifi::autobaud (int flg) {
gsfan 35:515ec79792d3 149 int i;
gsfan 35:515ec79792d3 150
gsfan 36:a70b11e1560f 151 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24)
gsfan 35:515ec79792d3 152 if (flg == 0) {
gsfan 36:a70b11e1560f 153 _uart->ACR = (1<<2)|(1<<0); // auto-baud mode 0
gsfan 35:515ec79792d3 154 return 0;
gsfan 35:515ec79792d3 155 } else {
gsfan 35:515ec79792d3 156 for (i = 0; i < 50; i ++) {
gsfan 36:a70b11e1560f 157 if (! (_uart->ACR & (1<<0))) {
gsfan 35:515ec79792d3 158 return 0;
gsfan 35:515ec79792d3 159 }
gsfan 35:515ec79792d3 160 wait_ms(10);
gsfan 35:515ec79792d3 161 }
gsfan 36:a70b11e1560f 162 _uart->ACR = 0;
gsfan 35:515ec79792d3 163 }
gsfan 35:515ec79792d3 164 #endif
gsfan 35:515ec79792d3 165 return -1;
gsfan 35:515ec79792d3 166 }
gsfan 35:515ec79792d3 167
gsfan 37:e61ea8267415 168 int GSwifi::acquireUart (int ms) {
gsfan 36:a70b11e1560f 169 Timer timeout;
gsfan 36:a70b11e1560f 170
gsfan 36:a70b11e1560f 171 if (! _rts) return 0;
gsfan 36:a70b11e1560f 172
gsfan 37:e61ea8267415 173 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24)
gsfan 36:a70b11e1560f 174 timeout.start();
gsfan 36:a70b11e1560f 175 while (timeout.read_ms() < ms) {
gsfan 36:a70b11e1560f 176 // CTS check
gsfan 37:e61ea8267415 177 if (_uart->MSR & (1<<4)) {
gsfan 36:a70b11e1560f 178 timeout.stop();
gsfan 37:e61ea8267415 179 _uart->MCR &= ~(1<<6); // RTS off
gsfan 37:e61ea8267415 180 _uart->MCR &= ~(1<<1);
gsfan 36:a70b11e1560f 181 return 0;
gsfan 36:a70b11e1560f 182 }
gsfan 36:a70b11e1560f 183 }
gsfan 36:a70b11e1560f 184 timeout.stop();
gsfan 36:a70b11e1560f 185 DBG("cts timeout\r\n");
gsfan 37:e61ea8267415 186 #endif
gsfan 36:a70b11e1560f 187 return -1;
gsfan 36:a70b11e1560f 188 }
gsfan 36:a70b11e1560f 189
gsfan 37:e61ea8267415 190 void GSwifi::releaseUart () {
gsfan 37:e61ea8267415 191 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24)
gsfan 37:e61ea8267415 192 _uart->MCR |= (1<<6); // RTSEN
gsfan 37:e61ea8267415 193 #endif
gsfan 37:e61ea8267415 194 }
gsfan 37:e61ea8267415 195
gsfan 0:2f6062c6d018 196 // uart interrupt
gsfan 0:2f6062c6d018 197 void GSwifi::isr_recv () {
gsfan 0:2f6062c6d018 198 static int len, mode;
gsfan 0:2f6062c6d018 199 static char tmp[20];
gsfan 33:b5a5a1e6325f 200 char dat;
gsfan 33:b5a5a1e6325f 201
gsfan 1:b127c6c5241d 202 dat = _gs_getc();
gsfan 23:a783c62c36d0 203 #ifdef DEBUG_VIEW
gsfan 26:b347ee3a1087 204 if (dat >= 0x20 && dat < 0x7f) {
gsfan 26:b347ee3a1087 205 DBG("%c_", dat);
gsfan 26:b347ee3a1087 206 } else {
gsfan 26:b347ee3a1087 207 DBG("%02x_", dat);
gsfan 26:b347ee3a1087 208 }
gsfan 23:a783c62c36d0 209 #endif
gsfan 25:f6e5622d2930 210
gsfan 0:2f6062c6d018 211 switch (_gs_mode) {
gsfan 0:2f6062c6d018 212 case GSMODE_COMMAND: // command responce
gsfan 0:2f6062c6d018 213 if (_escape) {
gsfan 0:2f6062c6d018 214 // esc
gsfan 0:2f6062c6d018 215 switch (dat) {
gsfan 0:2f6062c6d018 216 case 'O':
gsfan 0:2f6062c6d018 217 DBG("ok\r\n");
gsfan 26:b347ee3a1087 218 _gs_ok = true;
gsfan 0:2f6062c6d018 219 break;
gsfan 0:2f6062c6d018 220 case 'F':
gsfan 0:2f6062c6d018 221 DBG("failure\r\n");
gsfan 26:b347ee3a1087 222 _gs_failure = true;
gsfan 0:2f6062c6d018 223 break;
gsfan 0:2f6062c6d018 224 case 'S':
gsfan 0:2f6062c6d018 225 DBG("GSMODE_DATA_RX\r\n");
gsfan 0:2f6062c6d018 226 _gs_mode = GSMODE_DATA_RX;
gsfan 0:2f6062c6d018 227 mode = 0;
gsfan 0:2f6062c6d018 228 break;
gsfan 0:2f6062c6d018 229 case 'u':
gsfan 0:2f6062c6d018 230 DBG("GSMODE_DATA_RXUDP\r\n");
gsfan 0:2f6062c6d018 231 _gs_mode = GSMODE_DATA_RXUDP;
gsfan 0:2f6062c6d018 232 mode = 0;
gsfan 0:2f6062c6d018 233 break;
gsfan 0:2f6062c6d018 234 case 'Z':
gsfan 0:2f6062c6d018 235 case 'H':
gsfan 0:2f6062c6d018 236 DBG("GSMODE_DATA_RX_BULK\r\n");
gsfan 0:2f6062c6d018 237 _gs_mode = GSMODE_DATA_RX_BULK;
gsfan 0:2f6062c6d018 238 mode = 0;
gsfan 0:2f6062c6d018 239 break;
gsfan 0:2f6062c6d018 240 case 'y':
gsfan 0:2f6062c6d018 241 DBG("GSMODE_DATA_RXUDP_BULK\r\n");
gsfan 0:2f6062c6d018 242 _gs_mode = GSMODE_DATA_RXUDP_BULK;
gsfan 0:2f6062c6d018 243 mode = 0;
gsfan 0:2f6062c6d018 244 break;
gsfan 0:2f6062c6d018 245 default:
gsfan 0:2f6062c6d018 246 DBG("unknown [ESC] %02x\r\n", dat);
gsfan 0:2f6062c6d018 247 break;
gsfan 0:2f6062c6d018 248 }
gsfan 41:0afda15e9bb4 249 _escape = false;
gsfan 0:2f6062c6d018 250 } else {
gsfan 0:2f6062c6d018 251 if (dat == 0x1b) {
gsfan 41:0afda15e9bb4 252 _escape = true;
gsfan 0:2f6062c6d018 253 } else
gsfan 26:b347ee3a1087 254 if (dat == '\n') {
gsfan 26:b347ee3a1087 255 // end of line
gsfan 26:b347ee3a1087 256 parseResponse();
gsfan 26:b347ee3a1087 257 } else
gsfan 0:2f6062c6d018 258 if (dat != '\r') {
gsfan 0:2f6062c6d018 259 // command
gsfan 25:f6e5622d2930 260 _buf_cmd.queue(dat);
gsfan 0:2f6062c6d018 261 }
gsfan 0:2f6062c6d018 262 }
gsfan 0:2f6062c6d018 263 break;
gsfan 0:2f6062c6d018 264
gsfan 0:2f6062c6d018 265 case GSMODE_DATA_RX:
gsfan 0:2f6062c6d018 266 case GSMODE_DATA_RXUDP:
gsfan 0:2f6062c6d018 267 if (mode == 0) {
gsfan 0:2f6062c6d018 268 // cid
gsfan 0:2f6062c6d018 269 _cid = x2i(dat);
gsfan 26:b347ee3a1087 270 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 271 mode ++;
gsfan 0:2f6062c6d018 272 if (_gs_mode == GSMODE_DATA_RX) {
gsfan 0:2f6062c6d018 273 mode = 3;
gsfan 0:2f6062c6d018 274 }
gsfan 0:2f6062c6d018 275 len = 0;
gsfan 0:2f6062c6d018 276 } else
gsfan 0:2f6062c6d018 277 if (mode == 1) {
gsfan 0:2f6062c6d018 278 // ip
gsfan 0:2f6062c6d018 279 if ((dat < '0' || dat > '9') && dat != '.') {
gsfan 0:2f6062c6d018 280 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 281 tmp[len] = 0;
gsfan 0:2f6062c6d018 282 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 283 _from.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 0:2f6062c6d018 284 mode ++;
gsfan 0:2f6062c6d018 285 len = 0;
gsfan 0:2f6062c6d018 286 break;
gsfan 0:2f6062c6d018 287 }
gsfan 37:e61ea8267415 288 if (len < sizeof(tmp) - 1) {
gsfan 37:e61ea8267415 289 tmp[len] = dat;
gsfan 37:e61ea8267415 290 len ++;
gsfan 37:e61ea8267415 291 }
gsfan 0:2f6062c6d018 292 } else
gsfan 0:2f6062c6d018 293 if (mode == 2) {
gsfan 0:2f6062c6d018 294 // port
gsfan 0:2f6062c6d018 295 if (dat < '0' || dat > '9') {
gsfan 0:2f6062c6d018 296 tmp[len] = 0;
gsfan 0:2f6062c6d018 297 _from.setPort(atoi(tmp));
gsfan 0:2f6062c6d018 298 mode ++;
gsfan 0:2f6062c6d018 299 len = 0;
gsfan 0:2f6062c6d018 300 break;
gsfan 0:2f6062c6d018 301 }
gsfan 37:e61ea8267415 302 if (len < sizeof(tmp) - 1) {
gsfan 37:e61ea8267415 303 tmp[len] = dat;
gsfan 37:e61ea8267415 304 len ++;
gsfan 37:e61ea8267415 305 }
gsfan 0:2f6062c6d018 306 } else
gsfan 0:2f6062c6d018 307 if (_escape) {
gsfan 0:2f6062c6d018 308 // esc
gsfan 0:2f6062c6d018 309 switch (dat) {
gsfan 0:2f6062c6d018 310 case 'E':
gsfan 0:2f6062c6d018 311 DBG("recv ascii %d\r\n", _cid);
gsfan 26:b347ee3a1087 312 _gs_sock[_cid].received = true;
gsfan 0:2f6062c6d018 313 _gs_mode = GSMODE_COMMAND;
gsfan 26:b347ee3a1087 314
gsfan 26:b347ee3a1087 315 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET) {
gsfan 26:b347ee3a1087 316 // recv interrupt
gsfan 29:1c4419512941 317 if (_gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available()) == 0)
gsfan 26:b347ee3a1087 318 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 319 }
gsfan 0:2f6062c6d018 320 break;
gsfan 0:2f6062c6d018 321 default:
gsfan 0:2f6062c6d018 322 DBG("unknown <ESC> %02x\r\n", dat);
gsfan 0:2f6062c6d018 323 break;
gsfan 0:2f6062c6d018 324 }
gsfan 41:0afda15e9bb4 325 _escape = false;
gsfan 0:2f6062c6d018 326 } else {
gsfan 0:2f6062c6d018 327 if (dat == 0x1b) {
gsfan 41:0afda15e9bb4 328 _escape = true;
gsfan 0:2f6062c6d018 329 } else {
gsfan 0:2f6062c6d018 330 // data
gsfan 37:e61ea8267415 331 if (_gs_sock[_cid].data != NULL) {
gsfan 37:e61ea8267415 332 _gs_sock[_cid].data->queue(dat);
gsfan 37:e61ea8267415 333 len ++;
gsfan 26:b347ee3a1087 334
gsfan 37:e61ea8267415 335 if (len < GS_DATA_SIZE && _gs_sock[_cid].data->isFull()) {
gsfan 14:9e89b922ace1 336 // buffer full
gsfan 26:b347ee3a1087 337 // recv interrupt
gsfan 29:1c4419512941 338 _gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available());
gsfan 37:e61ea8267415 339 }
gsfan 12:63e714550791 340 }
gsfan 0:2f6062c6d018 341 }
gsfan 0:2f6062c6d018 342 }
gsfan 0:2f6062c6d018 343 break;
gsfan 0:2f6062c6d018 344
gsfan 0:2f6062c6d018 345 case GSMODE_DATA_RX_BULK:
gsfan 0:2f6062c6d018 346 case GSMODE_DATA_RXUDP_BULK:
gsfan 0:2f6062c6d018 347 if (mode == 0) {
gsfan 0:2f6062c6d018 348 // cid
gsfan 0:2f6062c6d018 349 _cid = x2i(dat);
gsfan 26:b347ee3a1087 350 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 351 mode ++;
gsfan 0:2f6062c6d018 352 if (_gs_mode == GSMODE_DATA_RX_BULK) {
gsfan 0:2f6062c6d018 353 mode = 3;
gsfan 0:2f6062c6d018 354 }
gsfan 0:2f6062c6d018 355 len = 0;
gsfan 0:2f6062c6d018 356 } else
gsfan 0:2f6062c6d018 357 if (mode == 1) {
gsfan 0:2f6062c6d018 358 // ip
gsfan 0:2f6062c6d018 359 if ((dat < '0' || dat > '9') && dat != '.') {
gsfan 0:2f6062c6d018 360 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 361 tmp[len] = 0;
gsfan 0:2f6062c6d018 362 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 363 _from.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 0:2f6062c6d018 364 mode ++;
gsfan 0:2f6062c6d018 365 len = 0;
gsfan 0:2f6062c6d018 366 break;
gsfan 0:2f6062c6d018 367 }
gsfan 37:e61ea8267415 368 if (len < sizeof(tmp) - 1) {
gsfan 37:e61ea8267415 369 tmp[len] = dat;
gsfan 37:e61ea8267415 370 len ++;
gsfan 37:e61ea8267415 371 }
gsfan 0:2f6062c6d018 372 } else
gsfan 0:2f6062c6d018 373 if (mode == 2) {
gsfan 0:2f6062c6d018 374 // port
gsfan 0:2f6062c6d018 375 if (dat < '0' || dat > '9') {
gsfan 0:2f6062c6d018 376 tmp[len] = 0;
gsfan 0:2f6062c6d018 377 _from.setPort(atoi(tmp));
gsfan 0:2f6062c6d018 378 mode ++;
gsfan 0:2f6062c6d018 379 len = 0;
gsfan 0:2f6062c6d018 380 break;
gsfan 0:2f6062c6d018 381 }
gsfan 37:e61ea8267415 382 if (len < sizeof(tmp) - 1) {
gsfan 37:e61ea8267415 383 tmp[len] = dat;
gsfan 37:e61ea8267415 384 len ++;
gsfan 37:e61ea8267415 385 }
gsfan 0:2f6062c6d018 386 } else
gsfan 0:2f6062c6d018 387 if (mode == 3) {
gsfan 0:2f6062c6d018 388 // length
gsfan 0:2f6062c6d018 389 tmp[len] = dat;
gsfan 0:2f6062c6d018 390 len ++;
gsfan 0:2f6062c6d018 391 if (len >= 4) {
gsfan 0:2f6062c6d018 392 tmp[len] = 0;
gsfan 0:2f6062c6d018 393 len = atoi(tmp);
gsfan 0:2f6062c6d018 394 mode ++;
gsfan 0:2f6062c6d018 395 break;
gsfan 0:2f6062c6d018 396 }
gsfan 0:2f6062c6d018 397 } else
gsfan 0:2f6062c6d018 398 if (mode == 4) {
gsfan 0:2f6062c6d018 399 // data
gsfan 5:6def1d0df519 400 if (_gs_sock[_cid].data != NULL) {
gsfan 37:e61ea8267415 401 _gs_sock[_cid].data->queue(dat);
gsfan 37:e61ea8267415 402 len --;
gsfan 26:b347ee3a1087 403
gsfan 37:e61ea8267415 404 if (len && _gs_sock[_cid].data->isFull()) {
gsfan 14:9e89b922ace1 405 // buffer full
gsfan 26:b347ee3a1087 406 // recv interrupt
gsfan 29:1c4419512941 407 _gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available());
gsfan 37:e61ea8267415 408 }
gsfan 12:63e714550791 409 }
gsfan 0:2f6062c6d018 410 if (len == 0) {
gsfan 0:2f6062c6d018 411 DBG("recv binary %d\r\n", _cid);
gsfan 26:b347ee3a1087 412 _gs_sock[_cid].received = true;
gsfan 41:0afda15e9bb4 413 _escape = false;
gsfan 0:2f6062c6d018 414 _gs_mode = GSMODE_COMMAND;
gsfan 26:b347ee3a1087 415
gsfan 26:b347ee3a1087 416 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET) {
gsfan 26:b347ee3a1087 417 // recv interrupt
gsfan 29:1c4419512941 418 if (_gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available()) == 0)
gsfan 26:b347ee3a1087 419 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 420 }
gsfan 0:2f6062c6d018 421 }
gsfan 0:2f6062c6d018 422 }
gsfan 0:2f6062c6d018 423 break;
gsfan 0:2f6062c6d018 424
gsfan 0:2f6062c6d018 425 }
gsfan 0:2f6062c6d018 426 }
gsfan 0:2f6062c6d018 427
gsfan 37:e61ea8267415 428 void GSwifi::parseResponse () {
gsfan 37:e61ea8267415 429 int i;
gsfan 37:e61ea8267415 430 char buf[GS_CMD_SIZE];
gsfan 37:e61ea8267415 431
gsfan 37:e61ea8267415 432 while (! _buf_cmd.isEmpty()) {
gsfan 37:e61ea8267415 433 // received "\n"
gsfan 37:e61ea8267415 434 i = 0;
gsfan 37:e61ea8267415 435 while ((! _buf_cmd.isEmpty()) && i < sizeof(buf)) {
gsfan 37:e61ea8267415 436 _buf_cmd.dequeue(&buf[i]);
gsfan 37:e61ea8267415 437 if (buf[i] == '\n') {
gsfan 37:e61ea8267415 438 break;
gsfan 37:e61ea8267415 439 }
gsfan 37:e61ea8267415 440 i ++;
gsfan 37:e61ea8267415 441 }
gsfan 37:e61ea8267415 442 if (i == 0) continue;
gsfan 37:e61ea8267415 443 buf[i] = 0;
gsfan 37:e61ea8267415 444 DBG("parseResponse: %s\r\n", buf);
gsfan 37:e61ea8267415 445
gsfan 37:e61ea8267415 446 parseCmdResponse(buf);
gsfan 37:e61ea8267415 447
gsfan 37:e61ea8267415 448 if (strncmp(buf, "CONNECT ", 8) == 0 && buf[8] >= '0' && buf[8] <= 'F' && buf[9] != 0) {
gsfan 37:e61ea8267415 449 int cid = x2i(buf[8]);
gsfan 37:e61ea8267415 450 if (_gs_sock[cid].type == GSTYPE_SERVER) {
gsfan 37:e61ea8267415 451 // fork (server socket)
gsfan 37:e61ea8267415 452 int acid, ip1, ip2, ip3, ip4;
gsfan 37:e61ea8267415 453 char *tmp = buf + 12;
gsfan 37:e61ea8267415 454
gsfan 37:e61ea8267415 455 acid = x2i(buf[10]);
gsfan 37:e61ea8267415 456 DBG("connect %d -> %d\r\n", cid, acid);
gsfan 37:e61ea8267415 457 newSock(acid, _gs_sock[cid].type, _gs_sock[cid].protocol);
gsfan 37:e61ea8267415 458 _gs_sock[acid].onGsReceive = _gs_sock[cid].onGsReceive;
gsfan 37:e61ea8267415 459 _gs_sock[acid].lcid = cid;
gsfan 37:e61ea8267415 460 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 37:e61ea8267415 461 _gs_sock[acid].host.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 37:e61ea8267415 462 tmp = strstr(tmp, " ") + 1;
gsfan 37:e61ea8267415 463 _gs_sock[acid].host.setPort(atoi(tmp));
gsfan 37:e61ea8267415 464 _gs_sock[acid].onGsReceive.call(acid, 0); // event connected
gsfan 37:e61ea8267415 465 }
gsfan 37:e61ea8267415 466 } else
gsfan 37:e61ea8267415 467 if (strncmp(buf, "DISCONNECT ", 11) == 0) {
gsfan 37:e61ea8267415 468 int cid = x2i(buf[11]);
gsfan 37:e61ea8267415 469 DBG("disconnect %d\r\n", cid);
gsfan 37:e61ea8267415 470 _gs_sock[cid].connect = false;
gsfan 37:e61ea8267415 471 _gs_sock[cid].onGsReceive.call(cid, -1); // event disconnected
gsfan 37:e61ea8267415 472 } else
gsfan 37:e61ea8267415 473 if (strncmp(buf, "DISASSOCIATED", 13) == 0 ||
gsfan 37:e61ea8267415 474 strncmp(buf, "Disassociated", 13) == 0 ||
gsfan 39:3360db93c65c 475 strncmp(buf, "Disassociation Event", 20) == 0 ) {
gsfan 39:3360db93c65c 476 _connect = false;
gsfan 39:3360db93c65c 477 for (i = 0; i < 16; i ++) {
gsfan 39:3360db93c65c 478 _gs_sock[i].connect = false;
gsfan 39:3360db93c65c 479 }
gsfan 39:3360db93c65c 480 } else
gsfan 39:3360db93c65c 481 if (strncmp(buf, "UnExpected Warm Boot", 20) == 0 ||
gsfan 37:e61ea8267415 482 strncmp(buf, "APP Reset-APP SW Reset", 22) == 0 ||
gsfan 37:e61ea8267415 483 strncmp(buf, "APP Reset-Wlan Except", 21) == 0 ) {
gsfan 37:e61ea8267415 484 DBG("disassociate\r\n");
gsfan 37:e61ea8267415 485 _connect = false;
gsfan 39:3360db93c65c 486 _status = GSSTAT_READY;
gsfan 41:0afda15e9bb4 487 _escape = false;
gsfan 39:3360db93c65c 488 resetResponse(GSRES_NONE);
gsfan 39:3360db93c65c 489 _gs_mode = GSMODE_COMMAND;
gsfan 37:e61ea8267415 490 for (i = 0; i < 16; i ++) {
gsfan 37:e61ea8267415 491 _gs_sock[i].connect = false;
gsfan 37:e61ea8267415 492 }
gsfan 37:e61ea8267415 493 } else
gsfan 37:e61ea8267415 494 if (strncmp(buf, "Out of StandBy-Timer", 20) == 0 ||
gsfan 37:e61ea8267415 495 strncmp(buf, "Out of StandBy-Alarm", 20) == 0) {
gsfan 39:3360db93c65c 496 if (_status == GSSTAT_STANDBY) {
gsfan 37:e61ea8267415 497 _status = GSSTAT_WAKEUP;
gsfan 39:3360db93c65c 498 }
gsfan 37:e61ea8267415 499 } else
gsfan 37:e61ea8267415 500 if (strncmp(buf, "Out of Deep Sleep", 17) == 0 ) {
gsfan 39:3360db93c65c 501 if (_status == GSSTAT_DEEPSLEEP) {
gsfan 37:e61ea8267415 502 _status = GSSTAT_READY;
gsfan 39:3360db93c65c 503 }
gsfan 37:e61ea8267415 504 }
gsfan 37:e61ea8267415 505 DBG("status: %d\r\n", _status);
gsfan 37:e61ea8267415 506 }
gsfan 37:e61ea8267415 507 }
gsfan 37:e61ea8267415 508
gsfan 37:e61ea8267415 509 void GSwifi::parseCmdResponse (char *buf) {
gsfan 37:e61ea8267415 510 if (_gs_res == GSRES_NONE) return;
gsfan 37:e61ea8267415 511
gsfan 37:e61ea8267415 512 if (strcmp(buf, "OK") == 0) {
gsfan 37:e61ea8267415 513 _gs_ok = true;
gsfan 37:e61ea8267415 514 } else
gsfan 37:e61ea8267415 515 if (strncmp(buf, "ERROR", 5) == 0) {
gsfan 37:e61ea8267415 516 _gs_failure = true;
gsfan 37:e61ea8267415 517 }
gsfan 37:e61ea8267415 518
gsfan 37:e61ea8267415 519 switch(_gs_res) {
gsfan 37:e61ea8267415 520 case GSRES_NORMAL:
gsfan 37:e61ea8267415 521 _gs_flg = -1;
gsfan 37:e61ea8267415 522 break;
gsfan 37:e61ea8267415 523 case GSRES_WPS:
gsfan 37:e61ea8267415 524 if (_gs_flg == 0 && strncmp(buf, "SSID=", 5) == 0) {
gsfan 37:e61ea8267415 525 if (!_ssid) _ssid = (char*)malloc(strlen(&buf[5]) + 1);
gsfan 37:e61ea8267415 526 strcpy(_ssid, &buf[5]);
gsfan 37:e61ea8267415 527 _gs_flg ++;
gsfan 37:e61ea8267415 528 } else
gsfan 37:e61ea8267415 529 if (_gs_flg == 1 && strncmp(buf, "CHANNEL=", 8) == 0) {
gsfan 37:e61ea8267415 530 _gs_flg ++;
gsfan 37:e61ea8267415 531 } else
gsfan 37:e61ea8267415 532 if (_gs_flg == 2 && strncmp(buf, "PASSPHRASE=", 11) == 0) {
gsfan 37:e61ea8267415 533 if (!_pass) _pass = (char*)malloc(strlen(&buf[11]) + 1);
gsfan 37:e61ea8267415 534 strcpy(_pass, &buf[11]);
gsfan 37:e61ea8267415 535 _gs_flg = -1;
gsfan 37:e61ea8267415 536 }
gsfan 37:e61ea8267415 537 break;
gsfan 37:e61ea8267415 538 case GSRES_CONNECT:
gsfan 37:e61ea8267415 539 if (strncmp(buf, "CONNECT ", 8) == 0 && buf[9] == 0) {
gsfan 37:e61ea8267415 540 _cid = x2i(buf[8]);
gsfan 37:e61ea8267415 541 _gs_flg = -1;
gsfan 37:e61ea8267415 542 }
gsfan 37:e61ea8267415 543 break;
gsfan 37:e61ea8267415 544 case GSRES_DHCP:
gsfan 37:e61ea8267415 545 if (_gs_flg == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) {
gsfan 37:e61ea8267415 546 _gs_flg ++;
gsfan 37:e61ea8267415 547 } else
gsfan 37:e61ea8267415 548 if (_gs_flg == 1) {
gsfan 37:e61ea8267415 549 int ip1, ip2, ip3, ip4;
gsfan 37:e61ea8267415 550 char *tmp = buf + 1;
gsfan 37:e61ea8267415 551 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 37:e61ea8267415 552 _ipaddr = IpAddr(ip1, ip2, ip3, ip4);
gsfan 37:e61ea8267415 553 tmp = strstr(tmp, ":") + 2;
gsfan 37:e61ea8267415 554 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 37:e61ea8267415 555 _netmask = IpAddr(ip1, ip2, ip3, ip4);
gsfan 37:e61ea8267415 556 tmp = strstr(tmp, ":") + 2;
gsfan 37:e61ea8267415 557 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 37:e61ea8267415 558 _gateway = IpAddr(ip1, ip2, ip3, ip4);
gsfan 37:e61ea8267415 559 _gs_flg = -1;
gsfan 37:e61ea8267415 560 }
gsfan 37:e61ea8267415 561 break;
gsfan 37:e61ea8267415 562 case GSRES_MACADDRESS:
gsfan 37:e61ea8267415 563 if (buf[2] == ':' && buf[5] == ':') {
gsfan 37:e61ea8267415 564 int mac1, mac2, mac3, mac4, mac5, mac6;
gsfan 37:e61ea8267415 565 sscanf(buf, "%x:%x:%x:%x:%x:%x", &mac1, &mac2, &mac3, &mac4, &mac5, &mac6);
gsfan 37:e61ea8267415 566 _mac[0] = mac1;
gsfan 37:e61ea8267415 567 _mac[1] = mac2;
gsfan 37:e61ea8267415 568 _mac[2] = mac3;
gsfan 37:e61ea8267415 569 _mac[3] = mac4;
gsfan 37:e61ea8267415 570 _mac[4] = mac5;
gsfan 37:e61ea8267415 571 _mac[5] = mac6;
gsfan 37:e61ea8267415 572 _gs_flg = -1;
gsfan 37:e61ea8267415 573 }
gsfan 37:e61ea8267415 574 break;
gsfan 37:e61ea8267415 575 case GSRES_DNSLOOKUP:
gsfan 37:e61ea8267415 576 if (strncmp(buf, "IP:", 3) == 0) {
gsfan 37:e61ea8267415 577 int ip1, ip2, ip3, ip4;
gsfan 37:e61ea8267415 578 sscanf(&buf[3], "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 37:e61ea8267415 579 _resolv = IpAddr(ip1, ip2, ip3, ip4);
gsfan 37:e61ea8267415 580 _gs_flg = -1;
gsfan 37:e61ea8267415 581 }
gsfan 37:e61ea8267415 582 break;
gsfan 37:e61ea8267415 583 case GSRES_HTTP:
gsfan 37:e61ea8267415 584 if (buf[0] >= '0' && buf[0] <= 'F' && buf[1] == 0) {
gsfan 37:e61ea8267415 585 _cid = x2i(buf[0]);
gsfan 37:e61ea8267415 586 _gs_flg = -1;
gsfan 37:e61ea8267415 587 }
gsfan 37:e61ea8267415 588 break;
gsfan 37:e61ea8267415 589 case GSRES_RSSI:
gsfan 37:e61ea8267415 590 if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) {
gsfan 37:e61ea8267415 591 _rssi = atoi(buf);
gsfan 37:e61ea8267415 592 _gs_flg = -1;
gsfan 37:e61ea8267415 593 }
gsfan 37:e61ea8267415 594 break;
gsfan 37:e61ea8267415 595 case GSRES_TIME:
gsfan 37:e61ea8267415 596 if (buf[0] >= '0' && buf[0] <= '9') {
gsfan 37:e61ea8267415 597 int year, month, day, hour, min, sec;
gsfan 37:e61ea8267415 598 struct tm t;
gsfan 37:e61ea8267415 599 sscanf(buf, "%d/%d/%d,%d:%d:%d", &day, &month, &year, &hour, &min, &sec);
gsfan 37:e61ea8267415 600 t.tm_sec = sec;
gsfan 37:e61ea8267415 601 t.tm_min = min;
gsfan 37:e61ea8267415 602 t.tm_hour = hour;
gsfan 37:e61ea8267415 603 t.tm_mday = day;
gsfan 37:e61ea8267415 604 t.tm_mon = month - 1;
gsfan 37:e61ea8267415 605 t.tm_year = year - 1900;
gsfan 37:e61ea8267415 606 _time = mktime(&t);
gsfan 37:e61ea8267415 607 _gs_flg = -1;
gsfan 37:e61ea8267415 608 }
gsfan 37:e61ea8267415 609 break;
gsfan 40:72f70748f6e8 610 case GSRES_STATUS:
gsfan 40:72f70748f6e8 611 if (_gs_flg == 0 && strncmp(buf, "NOT ASSOCIATED", 14) == 0) {
gsfan 40:72f70748f6e8 612 _connect = false;
gsfan 40:72f70748f6e8 613 for (int i = 0; i < 16; i ++) {
gsfan 40:72f70748f6e8 614 _gs_sock[i].connect = false;
gsfan 40:72f70748f6e8 615 }
gsfan 40:72f70748f6e8 616 _gs_flg = -1;
gsfan 40:72f70748f6e8 617 }
gsfan 40:72f70748f6e8 618 if (_gs_flg == 0 && strncmp(buf, "MODE:", 5) == 0) {
gsfan 40:72f70748f6e8 619 _gs_flg ++;
gsfan 40:72f70748f6e8 620 } else
gsfan 40:72f70748f6e8 621 if (_gs_flg == 1 && strncmp(buf, "BSSID:", 6) == 0) {
gsfan 40:72f70748f6e8 622 char *tmp = strstr(buf, "SECURITY:") + 2;
gsfan 40:72f70748f6e8 623 if (strncmp(tmp, "WEP (OPEN)", 10) == NULL) {
gsfan 40:72f70748f6e8 624 _sec = GSSEC_OPEN;
gsfan 40:72f70748f6e8 625 } else
gsfan 40:72f70748f6e8 626 if (strncmp(tmp, "WEP (SHARED)", 12) == NULL) {
gsfan 40:72f70748f6e8 627 _sec = GSSEC_WEP;
gsfan 40:72f70748f6e8 628 } else
gsfan 40:72f70748f6e8 629 if (strncmp(tmp, "WPA-PERSONAL", 12) == NULL) {
gsfan 40:72f70748f6e8 630 _sec = GSSEC_WPA_PSK;
gsfan 40:72f70748f6e8 631 } else
gsfan 40:72f70748f6e8 632 if (strncmp(tmp, "WPA2-PERSONAL", 13) == NULL) {
gsfan 40:72f70748f6e8 633 _sec = GSSEC_WPA2_PSK;
gsfan 40:72f70748f6e8 634 }
gsfan 40:72f70748f6e8 635 _gs_flg = -1;
gsfan 40:72f70748f6e8 636 }
gsfan 40:72f70748f6e8 637 break;
gsfan 37:e61ea8267415 638 }
gsfan 37:e61ea8267415 639
gsfan 37:e61ea8267415 640 return;
gsfan 37:e61ea8267415 641 }
gsfan 37:e61ea8267415 642
gsfan 37:e61ea8267415 643 void GSwifi::poll () {
gsfan 37:e61ea8267415 644 int i, j;
gsfan 42:9b3c38d66fa8 645 static int t = 0;
gsfan 42:9b3c38d66fa8 646 static Timer timer;
gsfan 37:e61ea8267415 647
gsfan 37:e61ea8267415 648 for (i = 0; i < 16; i ++) {
gsfan 37:e61ea8267415 649 if (_gs_sock[i].connect && _gs_sock[i].received) {
gsfan 37:e61ea8267415 650 if (_gs_sock[i].data && ! _gs_sock[i].data->isEmpty()) {
gsfan 37:e61ea8267415 651 // recv interrupt
gsfan 37:e61ea8267415 652 _gs_sock[i].received = false;
gsfan 37:e61ea8267415 653 for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) {
gsfan 37:e61ea8267415 654 if (! _gs_sock[i].connect || _gs_sock[i].data->isEmpty()) break;
gsfan 37:e61ea8267415 655 _gs_sock[i].onGsReceive.call(i, _gs_sock[i].data->available());
gsfan 37:e61ea8267415 656 }
gsfan 37:e61ea8267415 657 }
gsfan 37:e61ea8267415 658 }
gsfan 37:e61ea8267415 659 }
gsfan 37:e61ea8267415 660
gsfan 43:0b5e2727e020 661 if (_ssid && ! _connect)
gsfan 43:0b5e2727e020 662 if (t == 0 || timer.read() > _reconnect) {
gsfan 42:9b3c38d66fa8 663 DBG("reconnect\r\n");
gsfan 42:9b3c38d66fa8 664 if (reconnect()) {
gsfan 42:9b3c38d66fa8 665 timer.reset();
gsfan 42:9b3c38d66fa8 666 timer.start();
gsfan 42:9b3c38d66fa8 667 t = 1;
gsfan 37:e61ea8267415 668 }
gsfan 37:e61ea8267415 669 }
gsfan 37:e61ea8267415 670 }
gsfan 37:e61ea8267415 671
gsfan 12:63e714550791 672 int GSwifi::command (const char *cmd, GSRESPONCE res, int timeout) {
gsfan 26:b347ee3a1087 673 int i;
gsfan 0:2f6062c6d018 674
gsfan 37:e61ea8267415 675 if (acquireUart()) return -1;
gsfan 36:a70b11e1560f 676
gsfan 26:b347ee3a1087 677 if (cmd == NULL) {
gsfan 0:2f6062c6d018 678 // dummy CR+LF
gsfan 36:a70b11e1560f 679 _gs_putc('\r');
gsfan 36:a70b11e1560f 680 _gs_putc('\n');
gsfan 37:e61ea8267415 681 releaseUart();
gsfan 26:b347ee3a1087 682 wait_ms(100);
gsfan 26:b347ee3a1087 683 _buf_cmd.flush();
gsfan 0:2f6062c6d018 684 return 0;
gsfan 0:2f6062c6d018 685 }
gsfan 0:2f6062c6d018 686
gsfan 26:b347ee3a1087 687 resetResponse(res);
gsfan 0:2f6062c6d018 688 for (i = 0; i < strlen(cmd); i ++) {
gsfan 1:b127c6c5241d 689 _gs_putc(cmd[i]);
gsfan 0:2f6062c6d018 690 }
gsfan 1:b127c6c5241d 691 _gs_putc('\r');
gsfan 1:b127c6c5241d 692 _gs_putc('\n');
gsfan 37:e61ea8267415 693 releaseUart();
gsfan 0:2f6062c6d018 694 DBG("command: %s\r\n", cmd);
gsfan 0:2f6062c6d018 695 if (strlen(cmd) == 0) return 0;
gsfan 26:b347ee3a1087 696
gsfan 26:b347ee3a1087 697 return waitResponse(timeout);
gsfan 0:2f6062c6d018 698 }
gsfan 0:2f6062c6d018 699
gsfan 26:b347ee3a1087 700 void GSwifi::resetResponse (GSRESPONCE res) {
gsfan 26:b347ee3a1087 701 _gs_ok = false;
gsfan 26:b347ee3a1087 702 _gs_failure = false;
gsfan 26:b347ee3a1087 703 _gs_flg = 0;
gsfan 26:b347ee3a1087 704 _gs_res = res;
gsfan 26:b347ee3a1087 705 }
gsfan 26:b347ee3a1087 706
gsfan 26:b347ee3a1087 707 int GSwifi::waitResponse (int ms) {
gsfan 0:2f6062c6d018 708 Timer timeout;
gsfan 0:2f6062c6d018 709
gsfan 26:b347ee3a1087 710 if (! ms) return 0;
gsfan 26:b347ee3a1087 711
gsfan 0:2f6062c6d018 712 timeout.start();
gsfan 0:2f6062c6d018 713 for (;;) {
gsfan 26:b347ee3a1087 714 if (timeout.read_ms() > ms) {
gsfan 26:b347ee3a1087 715 DBG("timeout\r\n");
gsfan 5:6def1d0df519 716 break;
gsfan 0:2f6062c6d018 717 }
gsfan 26:b347ee3a1087 718 if (_gs_ok && (_gs_flg == -1 || _gs_res == GSRES_NONE)) {
gsfan 26:b347ee3a1087 719 timeout.stop();
gsfan 26:b347ee3a1087 720 _gs_res = GSRES_NONE;
gsfan 26:b347ee3a1087 721 return 0;
gsfan 26:b347ee3a1087 722 }
gsfan 26:b347ee3a1087 723 if (_gs_failure) break;
gsfan 0:2f6062c6d018 724 }
gsfan 26:b347ee3a1087 725 timeout.stop();
gsfan 26:b347ee3a1087 726 _gs_res = GSRES_NONE;
gsfan 26:b347ee3a1087 727 return -1;
gsfan 0:2f6062c6d018 728 }
gsfan 0:2f6062c6d018 729
gsfan 35:515ec79792d3 730 int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect, char *name) {
gsfan 0:2f6062c6d018 731 int r;
gsfan 0:2f6062c6d018 732 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 733
gsfan 0:2f6062c6d018 734 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 735
gsfan 0:2f6062c6d018 736 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 737 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 738 if (_rts) {
gsfan 0:2f6062c6d018 739 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 740 }
gsfan 35:515ec79792d3 741 if (getMacAddress(_mac)) return -1;
gsfan 0:2f6062c6d018 742 #ifdef GS_BULK
gsfan 0:2f6062c6d018 743 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 744 #endif
gsfan 0:2f6062c6d018 745
gsfan 0:2f6062c6d018 746 disconnect();
gsfan 0:2f6062c6d018 747 command("AT+WM=0", GSRES_NORMAL); // infrastructure
gsfan 0:2f6062c6d018 748 wait_ms(100);
gsfan 20:151b5a4fdd29 749 if (dhcp && sec != GSSEC_WPS_BUTTON) {
gsfan 35:515ec79792d3 750 if (name) {
gsfan 35:515ec79792d3 751 sprintf(cmd, "AT+NDHCP=1,%s", name);
gsfan 35:515ec79792d3 752 } else {
gsfan 35:515ec79792d3 753 strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME);
gsfan 35:515ec79792d3 754 }
gsfan 35:515ec79792d3 755 command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 756 } else {
gsfan 0:2f6062c6d018 757 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 758 }
gsfan 0:2f6062c6d018 759
gsfan 0:2f6062c6d018 760 switch (sec) {
gsfan 0:2f6062c6d018 761 case GSSEC_NONE:
gsfan 0:2f6062c6d018 762 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 763 case GSSEC_WEP:
gsfan 0:2f6062c6d018 764 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 765 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 766 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 767 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 768 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 769 wait_ms(100);
gsfan 22:9b077e2823ce 770 }
gsfan 0:2f6062c6d018 771 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 1:b127c6c5241d 772 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 773 if (r) {
gsfan 20:151b5a4fdd29 774 DBG("retry\r\n");
gsfan 26:b347ee3a1087 775 wait_ms(1000);
gsfan 20:151b5a4fdd29 776 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 777 }
gsfan 0:2f6062c6d018 778 break;
gsfan 0:2f6062c6d018 779 case GSSEC_WPA_PSK:
gsfan 28:fbba4c58d14c 780 case GSSEC_WPA_ENT:
gsfan 0:2f6062c6d018 781 case GSSEC_WPA2_PSK:
gsfan 28:fbba4c58d14c 782 case GSSEC_WPA2_ENT:
gsfan 0:2f6062c6d018 783 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 784 // sprintf(cmd, "AT+WWPA=%s", pass);
gsfan 0:2f6062c6d018 785 sprintf(cmd, "AT+WPAPSK=%s,%s", ssid, pass);
gsfan 0:2f6062c6d018 786 command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 787 wait_ms(100);
gsfan 0:2f6062c6d018 788 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 1:b127c6c5241d 789 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 790 if (r) {
gsfan 20:151b5a4fdd29 791 DBG("retry\r\n");
gsfan 26:b347ee3a1087 792 wait_ms(1000);
gsfan 20:151b5a4fdd29 793 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 794 }
gsfan 0:2f6062c6d018 795 break;
gsfan 0:2f6062c6d018 796 case GSSEC_WPS_BUTTON:
gsfan 0:2f6062c6d018 797 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 798 r = command("AT+WWPS=1", GSRES_WPS, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 799 if (r) break;
gsfan 0:2f6062c6d018 800 if (dhcp) {
gsfan 35:515ec79792d3 801 r = setAddress(name);
gsfan 0:2f6062c6d018 802 }
gsfan 0:2f6062c6d018 803 break;
gsfan 28:fbba4c58d14c 804 case GSSEC_WPS_PIN:
gsfan 28:fbba4c58d14c 805 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 28:fbba4c58d14c 806 sprintf(cmd, "AT+WWPS=2,%s", pass);
gsfan 28:fbba4c58d14c 807 r = command(cmd, GSRES_WPS, GS_TIMEOUT2);
gsfan 28:fbba4c58d14c 808 if (r) break;
gsfan 28:fbba4c58d14c 809 if (dhcp) {
gsfan 35:515ec79792d3 810 r = setAddress(name);
gsfan 28:fbba4c58d14c 811 }
gsfan 28:fbba4c58d14c 812 break;
gsfan 6:a423f0d197de 813 default:
gsfan 6:a423f0d197de 814 DBG("Can't use security\r\n");
gsfan 6:a423f0d197de 815 r = -1;
gsfan 6:a423f0d197de 816 break;
gsfan 0:2f6062c6d018 817 }
gsfan 0:2f6062c6d018 818
gsfan 18:4b97804c37d1 819 if (r == 0 && !dhcp) {
gsfan 18:4b97804c37d1 820 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d",
gsfan 18:4b97804c37d1 821 _gateway[0], _gateway[1], _gateway[2], _gateway[3]);
gsfan 18:4b97804c37d1 822 command(cmd, GSRES_NORMAL);
gsfan 18:4b97804c37d1 823 }
gsfan 18:4b97804c37d1 824
gsfan 24:5c350ae2e703 825 if (r == 0) {
gsfan 24:5c350ae2e703 826 _connect = true;
gsfan 42:9b3c38d66fa8 827 _reconnect = reconnect * 1000;
gsfan 28:fbba4c58d14c 828 _sec = sec;
gsfan 40:72f70748f6e8 829 _dhcp = dhcp;
gsfan 35:515ec79792d3 830 if (_reconnect && ssid) {
gsfan 35:515ec79792d3 831 if (!_ssid) _ssid = (char*)malloc(strlen(ssid) + 1);
gsfan 28:fbba4c58d14c 832 strcpy(_ssid, ssid);
gsfan 28:fbba4c58d14c 833 }
gsfan 35:515ec79792d3 834 if (_reconnect && pass) {
gsfan 35:515ec79792d3 835 if (!_pass) _pass = (char*)malloc(strlen(pass) + 1);
gsfan 28:fbba4c58d14c 836 strcpy(_pass, pass);
gsfan 28:fbba4c58d14c 837 }
gsfan 24:5c350ae2e703 838 }
gsfan 0:2f6062c6d018 839 return r;
gsfan 0:2f6062c6d018 840 }
gsfan 0:2f6062c6d018 841
gsfan 19:cad912f5a6ba 842 int GSwifi::adhock (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask) {
gsfan 0:2f6062c6d018 843 int r;
gsfan 0:2f6062c6d018 844 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 845
gsfan 0:2f6062c6d018 846 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 847
gsfan 0:2f6062c6d018 848 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 849 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 850 if (_rts) {
gsfan 0:2f6062c6d018 851 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 852 }
gsfan 35:515ec79792d3 853 if (getMacAddress(_mac)) return -1;
gsfan 0:2f6062c6d018 854 #ifdef GS_BULK
gsfan 0:2f6062c6d018 855 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 856 #endif
gsfan 0:2f6062c6d018 857
gsfan 35:515ec79792d3 858 disconnect();
gsfan 0:2f6062c6d018 859 command("AT+WM=1", GSRES_NORMAL); // adhock
gsfan 0:2f6062c6d018 860 wait_ms(100);
gsfan 0:2f6062c6d018 861 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 862 setAddress(ipaddr, netmask, ipaddr, ipaddr);
gsfan 0:2f6062c6d018 863
gsfan 0:2f6062c6d018 864 switch (sec) {
gsfan 0:2f6062c6d018 865 case GSSEC_NONE:
gsfan 0:2f6062c6d018 866 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 867 case GSSEC_WEP:
gsfan 0:2f6062c6d018 868 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 869 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 870 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 871 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 872 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 873 wait_ms(100);
gsfan 22:9b077e2823ce 874 }
gsfan 0:2f6062c6d018 875 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 0:2f6062c6d018 876 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 877 break;
gsfan 0:2f6062c6d018 878 default:
gsfan 0:2f6062c6d018 879 DBG("Can't use security\r\n");
gsfan 0:2f6062c6d018 880 r = -1;
gsfan 0:2f6062c6d018 881 break;
gsfan 0:2f6062c6d018 882 }
gsfan 0:2f6062c6d018 883
gsfan 0:2f6062c6d018 884 if (r == 0) _connect = true;
gsfan 0:2f6062c6d018 885 return r;
gsfan 0:2f6062c6d018 886 }
gsfan 0:2f6062c6d018 887
gsfan 22:9b077e2823ce 888 int GSwifi::limitedap (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask, char *dns) {
gsfan 0:2f6062c6d018 889 int r;
gsfan 0:2f6062c6d018 890 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 891
gsfan 0:2f6062c6d018 892 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 893
gsfan 0:2f6062c6d018 894 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 895 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 896 if (_rts) {
gsfan 0:2f6062c6d018 897 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 898 }
gsfan 35:515ec79792d3 899 if (getMacAddress(_mac)) return -1;
gsfan 0:2f6062c6d018 900 #ifdef GS_BULK
gsfan 0:2f6062c6d018 901 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 902 #endif
gsfan 0:2f6062c6d018 903
gsfan 35:515ec79792d3 904 disconnect();
gsfan 0:2f6062c6d018 905 command("AT+WM=2", GSRES_NORMAL); // limited ap
gsfan 26:b347ee3a1087 906 wait_ms(100);
gsfan 0:2f6062c6d018 907 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 908 setAddress(ipaddr, netmask, ipaddr, ipaddr);
gsfan 8:bce9e7e51a0d 909 if (command("AT+DHCPSRVR=1", GSRES_NORMAL)) return -1;
gsfan 22:9b077e2823ce 910 if (dns) {
gsfan 22:9b077e2823ce 911 sprintf(cmd, "AT+DNS=1,%s", dns);
gsfan 22:9b077e2823ce 912 } else {
gsfan 22:9b077e2823ce 913 strcpy(cmd, "AT+DNS=1," GS_DNSNAME);
gsfan 22:9b077e2823ce 914 }
gsfan 22:9b077e2823ce 915 if (command(cmd, GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 916
gsfan 0:2f6062c6d018 917 switch (sec) {
gsfan 0:2f6062c6d018 918 case GSSEC_NONE:
gsfan 0:2f6062c6d018 919 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 920 case GSSEC_WEP:
gsfan 0:2f6062c6d018 921 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 922 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 923 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 924 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 925 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 926 wait_ms(100);
gsfan 22:9b077e2823ce 927 }
gsfan 0:2f6062c6d018 928 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 0:2f6062c6d018 929 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 930 break;
gsfan 0:2f6062c6d018 931 default:
gsfan 0:2f6062c6d018 932 DBG("Can't use security\r\n");
gsfan 0:2f6062c6d018 933 r = -1;
gsfan 0:2f6062c6d018 934 break;
gsfan 0:2f6062c6d018 935 }
gsfan 0:2f6062c6d018 936
gsfan 0:2f6062c6d018 937 if (r == 0) _connect = true;
gsfan 0:2f6062c6d018 938 return r;
gsfan 0:2f6062c6d018 939 }
gsfan 0:2f6062c6d018 940
gsfan 0:2f6062c6d018 941 int GSwifi::disconnect () {
gsfan 0:2f6062c6d018 942 int i;
gsfan 0:2f6062c6d018 943
gsfan 0:2f6062c6d018 944 _connect = false;
gsfan 0:2f6062c6d018 945 for (i = 0; i < 16; i ++) {
gsfan 0:2f6062c6d018 946 _gs_sock[i].connect = false;
gsfan 0:2f6062c6d018 947 }
gsfan 0:2f6062c6d018 948 command("AT+NCLOSEALL", GSRES_NORMAL);
gsfan 0:2f6062c6d018 949 command("AT+WD", GSRES_NORMAL);
gsfan 0:2f6062c6d018 950 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 951 wait_ms(100);
gsfan 0:2f6062c6d018 952 return 0;
gsfan 0:2f6062c6d018 953 }
gsfan 0:2f6062c6d018 954
gsfan 28:fbba4c58d14c 955 int GSwifi::reconnect () {
gsfan 28:fbba4c58d14c 956 int r;
gsfan 28:fbba4c58d14c 957 char cmd[GS_CMD_SIZE];
gsfan 28:fbba4c58d14c 958
gsfan 28:fbba4c58d14c 959 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 28:fbba4c58d14c 960 if (!_ssid) return -1;
gsfan 28:fbba4c58d14c 961
gsfan 28:fbba4c58d14c 962 switch (_sec) {
gsfan 28:fbba4c58d14c 963 case GSSEC_WPS_BUTTON:
gsfan 28:fbba4c58d14c 964 case GSSEC_WPS_PIN:
gsfan 28:fbba4c58d14c 965 sprintf(cmd, "AT+WPAPSK=%s,%s", _ssid, _pass);
gsfan 28:fbba4c58d14c 966 command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 28:fbba4c58d14c 967 wait_ms(100);
gsfan 28:fbba4c58d14c 968 case GSSEC_NONE:
gsfan 28:fbba4c58d14c 969 case GSSEC_OPEN:
gsfan 28:fbba4c58d14c 970 case GSSEC_WEP:
gsfan 28:fbba4c58d14c 971 case GSSEC_WPA_PSK:
gsfan 28:fbba4c58d14c 972 case GSSEC_WPA_ENT:
gsfan 28:fbba4c58d14c 973 case GSSEC_WPA2_PSK:
gsfan 28:fbba4c58d14c 974 case GSSEC_WPA2_ENT:
gsfan 40:72f70748f6e8 975 if (_dhcp) {
gsfan 40:72f70748f6e8 976 command("AT+NDHCP=1," GS_DHCPNAME, GSRES_NORMAL);
gsfan 40:72f70748f6e8 977 }
gsfan 28:fbba4c58d14c 978 sprintf(cmd, "AT+WA=%s", _ssid);
gsfan 28:fbba4c58d14c 979 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 28:fbba4c58d14c 980 break;
gsfan 28:fbba4c58d14c 981 default:
gsfan 28:fbba4c58d14c 982 DBG("Can't use security\r\n");
gsfan 28:fbba4c58d14c 983 r = -1;
gsfan 28:fbba4c58d14c 984 break;
gsfan 28:fbba4c58d14c 985 }
gsfan 35:515ec79792d3 986
gsfan 35:515ec79792d3 987 if (r == 0) _connect = true;
gsfan 28:fbba4c58d14c 988 return r;
gsfan 28:fbba4c58d14c 989 }
gsfan 28:fbba4c58d14c 990
gsfan 35:515ec79792d3 991 int GSwifi::setAddress (char *name) {
gsfan 35:515ec79792d3 992 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 993
gsfan 35:515ec79792d3 994 if (name) {
gsfan 35:515ec79792d3 995 sprintf(cmd, "AT+NDHCP=1,%s", name);
gsfan 35:515ec79792d3 996 } else {
gsfan 35:515ec79792d3 997 strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME);
gsfan 35:515ec79792d3 998 }
gsfan 39:3360db93c65c 999 if (command(cmd, GSRES_DHCP, GS_TIMEOUT2)) return -1;
gsfan 0:2f6062c6d018 1000 if (_ipaddr.isNull()) return -1;
gsfan 0:2f6062c6d018 1001 return 0;
gsfan 0:2f6062c6d018 1002 }
gsfan 0:2f6062c6d018 1003
gsfan 0:2f6062c6d018 1004 int GSwifi::setAddress (IpAddr ipaddr, IpAddr netmask, IpAddr gateway, IpAddr nameserver) {
gsfan 0:2f6062c6d018 1005 int r;
gsfan 0:2f6062c6d018 1006 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1007
gsfan 0:2f6062c6d018 1008 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1009 wait_ms(100);
gsfan 0:2f6062c6d018 1010
gsfan 0:2f6062c6d018 1011 sprintf(cmd, "AT+NSET=%d.%d.%d.%d,%d.%d.%d.%d,%d.%d.%d.%d",
gsfan 0:2f6062c6d018 1012 ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3],
gsfan 0:2f6062c6d018 1013 netmask[0], netmask[1], netmask[2], netmask[3],
gsfan 0:2f6062c6d018 1014 gateway[0], gateway[1], gateway[2], gateway[3]);
gsfan 0:2f6062c6d018 1015 r = command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1016 if (r) return -1;
gsfan 0:2f6062c6d018 1017 _ipaddr = ipaddr;
gsfan 0:2f6062c6d018 1018 _netmask = netmask;
gsfan 0:2f6062c6d018 1019 _gateway = gateway;
gsfan 0:2f6062c6d018 1020
gsfan 0:2f6062c6d018 1021 if (ipaddr != nameserver) {
gsfan 0:2f6062c6d018 1022 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d",
gsfan 0:2f6062c6d018 1023 nameserver[0], nameserver[1], nameserver[2], nameserver[3]);
gsfan 0:2f6062c6d018 1024 r = command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1025 }
gsfan 0:2f6062c6d018 1026 return r;
gsfan 0:2f6062c6d018 1027 }
gsfan 0:2f6062c6d018 1028
gsfan 1:b127c6c5241d 1029 int GSwifi::getAddress (IpAddr &ipaddr, IpAddr &netmask, IpAddr &gateway, IpAddr &nameserver) {
gsfan 1:b127c6c5241d 1030 ipaddr = _ipaddr;
gsfan 1:b127c6c5241d 1031 netmask = _netmask;
gsfan 1:b127c6c5241d 1032 gateway = _gateway;
gsfan 1:b127c6c5241d 1033 nameserver = _nameserver;
gsfan 2:c6e0e97901b3 1034 return 0;
gsfan 1:b127c6c5241d 1035 }
gsfan 1:b127c6c5241d 1036
gsfan 29:1c4419512941 1037 int GSwifi::getMacAddress (char *mac) {
gsfan 35:515ec79792d3 1038
gsfan 35:515ec79792d3 1039 command("AT+NMAC=?", GSRES_MACADDRESS);
gsfan 35:515ec79792d3 1040 if (_mac[0] || _mac[1] || _mac[2] || _mac[3] || _mac[4] || _mac[5]) {
gsfan 35:515ec79792d3 1041 memcpy(mac, _mac, 6);
gsfan 35:515ec79792d3 1042 return 0;
gsfan 35:515ec79792d3 1043 }
gsfan 35:515ec79792d3 1044 return -1;
gsfan 26:b347ee3a1087 1045 }
gsfan 26:b347ee3a1087 1046
gsfan 0:2f6062c6d018 1047 int GSwifi::getHostByName (const char* name, IpAddr &addr) {
gsfan 0:2f6062c6d018 1048 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1049
gsfan 0:2f6062c6d018 1050 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1051
gsfan 0:2f6062c6d018 1052 sprintf(cmd, "AT+DNSLOOKUP=%s", name);
gsfan 0:2f6062c6d018 1053 if (command(cmd, GSRES_DNSLOOKUP)) return -1;
gsfan 0:2f6062c6d018 1054
gsfan 0:2f6062c6d018 1055 addr = _resolv;
gsfan 0:2f6062c6d018 1056 return 0;
gsfan 0:2f6062c6d018 1057 }
gsfan 0:2f6062c6d018 1058
gsfan 0:2f6062c6d018 1059 int GSwifi::getHostByName (Host &host) {
gsfan 0:2f6062c6d018 1060 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1061
gsfan 0:2f6062c6d018 1062 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1063
gsfan 0:2f6062c6d018 1064 sprintf(cmd, "AT+DNSLOOKUP=%s", host.getName());
gsfan 0:2f6062c6d018 1065 if (command(cmd, GSRES_DNSLOOKUP)) return -1;
gsfan 0:2f6062c6d018 1066
gsfan 0:2f6062c6d018 1067 host.setIp(_resolv);
gsfan 0:2f6062c6d018 1068 return 0;
gsfan 0:2f6062c6d018 1069 }
gsfan 0:2f6062c6d018 1070
gsfan 37:e61ea8267415 1071 bool GSwifi::isConnected () {
gsfan 40:72f70748f6e8 1072 /*
gsfan 40:72f70748f6e8 1073 if (_status == GSSTAT_READY) {
gsfan 40:72f70748f6e8 1074 command("AT+WSTATUS", GSRES_STATUS);
gsfan 40:72f70748f6e8 1075 }
gsfan 40:72f70748f6e8 1076 */
gsfan 37:e61ea8267415 1077 return _connect;
gsfan 37:e61ea8267415 1078 }
gsfan 37:e61ea8267415 1079
gsfan 37:e61ea8267415 1080 GSwifi::GSSTATUS GSwifi::getStatus () {
gsfan 37:e61ea8267415 1081 return _status;
gsfan 37:e61ea8267415 1082 }
gsfan 37:e61ea8267415 1083
gsfan 37:e61ea8267415 1084 int GSwifi::getRssi () {
gsfan 37:e61ea8267415 1085 if (command("AT+WRSSI=?", GSRES_RSSI)) {
gsfan 37:e61ea8267415 1086 return 0;
gsfan 37:e61ea8267415 1087 }
gsfan 37:e61ea8267415 1088 return _rssi;
gsfan 37:e61ea8267415 1089 }
gsfan 37:e61ea8267415 1090
gsfan 37:e61ea8267415 1091 int GSwifi::setBaud (int baud) {
gsfan 37:e61ea8267415 1092 char cmd[GS_CMD_SIZE];
gsfan 37:e61ea8267415 1093
gsfan 37:e61ea8267415 1094 if (_status != GSSTAT_READY || acquireUart()) return -1;
gsfan 37:e61ea8267415 1095
gsfan 37:e61ea8267415 1096 _baud = baud;
gsfan 37:e61ea8267415 1097 sprintf(cmd, "ATB=%d\r\n", _baud);
gsfan 37:e61ea8267415 1098 _gs_puts(cmd);
gsfan 37:e61ea8267415 1099 releaseUart();
gsfan 37:e61ea8267415 1100 wait_ms(100);
gsfan 37:e61ea8267415 1101 _gs.baud(_baud);
gsfan 37:e61ea8267415 1102 _buf_cmd.flush();
gsfan 37:e61ea8267415 1103 return 0;
gsfan 37:e61ea8267415 1104 }
gsfan 37:e61ea8267415 1105
gsfan 37:e61ea8267415 1106 int GSwifi::setRegion (int reg) {
gsfan 37:e61ea8267415 1107 char cmd[GS_CMD_SIZE];
gsfan 37:e61ea8267415 1108
gsfan 37:e61ea8267415 1109 if (_status != GSSTAT_READY) return -1;
gsfan 37:e61ea8267415 1110
gsfan 37:e61ea8267415 1111 sprintf(cmd, "AT+WREGDOMAIN=%d", reg);
gsfan 37:e61ea8267415 1112 return command(cmd, GSRES_NORMAL);
gsfan 37:e61ea8267415 1113 }
gsfan 37:e61ea8267415 1114
gsfan 37:e61ea8267415 1115 #ifndef GS_LIB_TINY
gsfan 0:2f6062c6d018 1116 int GSwifi::setRFPower (int power) {
gsfan 0:2f6062c6d018 1117 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1118
gsfan 0:2f6062c6d018 1119 if (power < 0 || power > 7) return -1;
gsfan 0:2f6062c6d018 1120
gsfan 0:2f6062c6d018 1121 sprintf(cmd, "AT+WP=%d", power);
gsfan 0:2f6062c6d018 1122 return command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1123 }
gsfan 0:2f6062c6d018 1124
gsfan 2:c6e0e97901b3 1125 int GSwifi::powerSave (int active, int save) {
gsfan 0:2f6062c6d018 1126 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1127
gsfan 0:2f6062c6d018 1128 if (_status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1129
gsfan 2:c6e0e97901b3 1130 sprintf(cmd, "AT+WRXACTIVE=%d", active);
gsfan 0:2f6062c6d018 1131 command(cmd, GSRES_NORMAL);
gsfan 3:1345daf4ec1a 1132 sprintf(cmd, "AT+WRXPS=%d", save);
gsfan 0:2f6062c6d018 1133 return command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1134 }
gsfan 0:2f6062c6d018 1135
gsfan 0:2f6062c6d018 1136 int GSwifi::standby (int msec) {
gsfan 26:b347ee3a1087 1137 int i;
gsfan 0:2f6062c6d018 1138 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1139
gsfan 0:2f6062c6d018 1140 if (_status != GSSTAT_READY && _status != GSSTAT_WAKEUP) return -1;
gsfan 0:2f6062c6d018 1141
gsfan 26:b347ee3a1087 1142 if (_status == GSSTAT_READY) {
gsfan 40:72f70748f6e8 1143 // command("AT+WRXACTIVE=0", GSRES_NORMAL);
gsfan 39:3360db93c65c 1144 command("AT+STORENWCONN", GSRES_NORMAL, 100);
gsfan 0:2f6062c6d018 1145 } else {
gsfan 0:2f6062c6d018 1146 command("ATE0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1147 if (_rts) {
gsfan 0:2f6062c6d018 1148 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1149 }
gsfan 0:2f6062c6d018 1150 }
gsfan 26:b347ee3a1087 1151 for (i = 0; i < 16; i ++) {
gsfan 26:b347ee3a1087 1152 _gs_sock[i].connect = false;
gsfan 26:b347ee3a1087 1153 }
gsfan 0:2f6062c6d018 1154 _status = GSSTAT_STANDBY;
gsfan 0:2f6062c6d018 1155 sprintf(cmd, "AT+PSSTBY=%d,0,0,0", msec); // go standby
gsfan 0:2f6062c6d018 1156 return command(cmd, GSRES_NORMAL, 0);
gsfan 0:2f6062c6d018 1157 }
gsfan 0:2f6062c6d018 1158
gsfan 0:2f6062c6d018 1159 int GSwifi::wakeup () {
gsfan 0:2f6062c6d018 1160
gsfan 26:b347ee3a1087 1161 if (_status == GSSTAT_STANDBY && _alarm != NULL) {
gsfan 25:f6e5622d2930 1162 Timer timeout;
gsfan 26:b347ee3a1087 1163 _alarm->output(); // low
gsfan 25:f6e5622d2930 1164 _alarm->write(0);
gsfan 25:f6e5622d2930 1165 timeout.start();
gsfan 25:f6e5622d2930 1166 while (_status != GSSTAT_WAKEUP && timeout.read() < GS_TIMEOUT) {
gsfan 25:f6e5622d2930 1167 poll();
gsfan 25:f6e5622d2930 1168 }
gsfan 25:f6e5622d2930 1169 timeout.stop();
gsfan 26:b347ee3a1087 1170 _alarm->input(); // high
gsfan 28:fbba4c58d14c 1171 _alarm->mode(PullUp);
gsfan 25:f6e5622d2930 1172 }
gsfan 25:f6e5622d2930 1173
gsfan 0:2f6062c6d018 1174 if (_status == GSSTAT_WAKEUP) {
gsfan 0:2f6062c6d018 1175 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 1176 command("ATE0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1177 if (_rts) {
gsfan 0:2f6062c6d018 1178 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1179 }
gsfan 0:2f6062c6d018 1180 #ifdef GS_BULK
gsfan 0:2f6062c6d018 1181 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1182 #endif
gsfan 40:72f70748f6e8 1183 int r = command("AT+RESTORENWCONN", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1184 wait_ms(100);
gsfan 40:72f70748f6e8 1185 // return command("AT+WRXACTIVE=1", GSRES_NORMAL);
gsfan 40:72f70748f6e8 1186 return r;
gsfan 0:2f6062c6d018 1187 } else
gsfan 0:2f6062c6d018 1188 if (_status == GSSTAT_DEEPSLEEP) {
gsfan 0:2f6062c6d018 1189 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 1190 return command("AT", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1191 }
gsfan 0:2f6062c6d018 1192 return -1;
gsfan 0:2f6062c6d018 1193 }
gsfan 0:2f6062c6d018 1194
gsfan 0:2f6062c6d018 1195 int GSwifi::deepSleep () {
gsfan 0:2f6062c6d018 1196
gsfan 0:2f6062c6d018 1197 if (_status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1198
gsfan 0:2f6062c6d018 1199 _status = GSSTAT_DEEPSLEEP;
gsfan 0:2f6062c6d018 1200 return command("AT+PSDPSLEEP", GSRES_NORMAL, 0); // go deep sleep
gsfan 0:2f6062c6d018 1201 }
gsfan 0:2f6062c6d018 1202
gsfan 5:6def1d0df519 1203 int GSwifi::ntpdate (Host host, int sec) {
gsfan 5:6def1d0df519 1204 char cmd[GS_CMD_SIZE];
gsfan 5:6def1d0df519 1205
gsfan 5:6def1d0df519 1206 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 5:6def1d0df519 1207
gsfan 5:6def1d0df519 1208 if (host.getIp().isNull()) {
gsfan 5:6def1d0df519 1209 if (getHostByName(host)) {
gsfan 5:6def1d0df519 1210 if (getHostByName(host)) return -1;
gsfan 5:6def1d0df519 1211 }
gsfan 5:6def1d0df519 1212 }
gsfan 5:6def1d0df519 1213
gsfan 5:6def1d0df519 1214 if (sec) {
gsfan 5:6def1d0df519 1215 sprintf(cmd, "AT+NTIMESYNC=1,%d.%d.%d.%d,%d,1,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3],
gsfan 5:6def1d0df519 1216 GS_TIMEOUT / 1000, sec);
gsfan 5:6def1d0df519 1217 } else {
gsfan 5:6def1d0df519 1218 sprintf(cmd, "AT+NTIMESYNC=1,%d.%d.%d.%d,%d,0", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3],
gsfan 5:6def1d0df519 1219 GS_TIMEOUT / 1000);
gsfan 5:6def1d0df519 1220 }
gsfan 5:6def1d0df519 1221 return command(cmd, GSRES_NORMAL);
gsfan 5:6def1d0df519 1222 }
gsfan 5:6def1d0df519 1223
gsfan 5:6def1d0df519 1224 int GSwifi::setTime (time_t time) {
gsfan 5:6def1d0df519 1225 char cmd[GS_CMD_SIZE];
gsfan 5:6def1d0df519 1226 struct tm *t;
gsfan 5:6def1d0df519 1227
gsfan 5:6def1d0df519 1228 if (_status != GSSTAT_READY) return -1;
gsfan 5:6def1d0df519 1229
gsfan 5:6def1d0df519 1230 t = localtime(&time);
gsfan 5:6def1d0df519 1231 sprintf(cmd, "AT+SETTIME=%d/%d/%d,%d:%d:%d", t->tm_mday, t->tm_mon + 1, t->tm_year + 1900, t->tm_hour, t->tm_min, t->tm_sec);
gsfan 5:6def1d0df519 1232 return command(cmd, GSRES_NORMAL);
gsfan 5:6def1d0df519 1233 }
gsfan 5:6def1d0df519 1234
gsfan 5:6def1d0df519 1235 time_t GSwifi::getTime () {
gsfan 5:6def1d0df519 1236
gsfan 5:6def1d0df519 1237 if (command("AT+GETTIME=?", GSRES_TIME)) {
gsfan 5:6def1d0df519 1238 return 0;
gsfan 5:6def1d0df519 1239 }
gsfan 5:6def1d0df519 1240 return _time;
gsfan 5:6def1d0df519 1241 }
gsfan 5:6def1d0df519 1242
gsfan 6:a423f0d197de 1243 int GSwifi::gpioOut (int port, int out) {
gsfan 6:a423f0d197de 1244 char cmd[GS_CMD_SIZE];
gsfan 6:a423f0d197de 1245
gsfan 6:a423f0d197de 1246 if (_status != GSSTAT_READY) return -1;
gsfan 6:a423f0d197de 1247
gsfan 6:a423f0d197de 1248 sprintf(cmd, "AT+DGPIO=%d,%d", port, out);
gsfan 6:a423f0d197de 1249 return command(cmd, GSRES_NORMAL);
gsfan 6:a423f0d197de 1250 }
gsfan 6:a423f0d197de 1251
gsfan 19:cad912f5a6ba 1252 int GSwifi::certAdd (const char *name, const char *cert, int len) {
gsfan 0:2f6062c6d018 1253 int i;
gsfan 0:2f6062c6d018 1254 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1255
gsfan 0:2f6062c6d018 1256 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1257
gsfan 0:2f6062c6d018 1258 sprintf(cmd, "AT+TCERTADD=%s,1,%d,1", name, len); // Hex, ram
gsfan 0:2f6062c6d018 1259 command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1260
gsfan 26:b347ee3a1087 1261 resetResponse(GSRES_NORMAL);
gsfan 1:b127c6c5241d 1262 _gs_putc(0x1b);
gsfan 1:b127c6c5241d 1263 _gs_putc('W');
gsfan 0:2f6062c6d018 1264 for (i = 0; i < len; i ++) {
gsfan 1:b127c6c5241d 1265 _gs_putc(cert[i]);
gsfan 0:2f6062c6d018 1266 }
gsfan 26:b347ee3a1087 1267 return waitResponse(GS_TIMEOUT);
gsfan 0:2f6062c6d018 1268 }
gsfan 0:2f6062c6d018 1269
gsfan 22:9b077e2823ce 1270 int GSwifi::provisioning (char *user, char *pass) {
gsfan 22:9b077e2823ce 1271 char cmd[GS_CMD_SIZE];
gsfan 22:9b077e2823ce 1272
gsfan 22:9b077e2823ce 1273 if (_status != GSSTAT_READY) return -1;
gsfan 22:9b077e2823ce 1274
gsfan 22:9b077e2823ce 1275 sprintf(cmd, "AT+WEBPROV=%s,%s", user, pass);
gsfan 22:9b077e2823ce 1276 return command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 1277 }
gsfan 37:e61ea8267415 1278 #endif
gsfan 25:f6e5622d2930 1279
gsfan 20:151b5a4fdd29 1280 int GSwifi::from_hex (int ch) {
gsfan 20:151b5a4fdd29 1281 return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
gsfan 20:151b5a4fdd29 1282 }
gsfan 20:151b5a4fdd29 1283
gsfan 20:151b5a4fdd29 1284 int GSwifi::to_hex (int code) {
gsfan 20:151b5a4fdd29 1285 static char hex[] = "0123456789abcdef";
gsfan 20:151b5a4fdd29 1286 return hex[code & 15];
gsfan 20:151b5a4fdd29 1287 }
gsfan 20:151b5a4fdd29 1288
gsfan 0:2f6062c6d018 1289 int GSwifi::x2i (char c) {
gsfan 0:2f6062c6d018 1290 if (c >= '0' && c <= '9') {
gsfan 0:2f6062c6d018 1291 return c - '0';
gsfan 0:2f6062c6d018 1292 } else
gsfan 0:2f6062c6d018 1293 if (c >= 'A' && c <= 'F') {
gsfan 0:2f6062c6d018 1294 return c - 'A' + 10;
gsfan 0:2f6062c6d018 1295 } else
gsfan 0:2f6062c6d018 1296 if (c >= 'a' && c <= 'f') {
gsfan 0:2f6062c6d018 1297 return c - 'a' + 10;
gsfan 0:2f6062c6d018 1298 }
gsfan 0:2f6062c6d018 1299 return 0;
gsfan 0:2f6062c6d018 1300 }
gsfan 0:2f6062c6d018 1301
gsfan 0:2f6062c6d018 1302 char GSwifi::i2x (int i) {
gsfan 0:2f6062c6d018 1303 if (i >= 0 && i <= 9) {
gsfan 0:2f6062c6d018 1304 return i + '0';
gsfan 0:2f6062c6d018 1305 } else
gsfan 0:2f6062c6d018 1306 if (i >= 10 && i <= 15) {
gsfan 0:2f6062c6d018 1307 return i - 10 + 'A';
gsfan 0:2f6062c6d018 1308 }
gsfan 37:e61ea8267415 1309 return '0';
gsfan 0:2f6062c6d018 1310 }
gsfan 0:2f6062c6d018 1311
gsfan 25:f6e5622d2930 1312
gsfan 22:9b077e2823ce 1313 #ifdef DEBUG
gsfan 0:2f6062c6d018 1314 // for test
gsfan 23:a783c62c36d0 1315 void GSwifi::dump () {
gsfan 23:a783c62c36d0 1316 int i;
gsfan 23:a783c62c36d0 1317
gsfan 23:a783c62c36d0 1318 DBG("GS mode=%d, escape=%d, cid=%d\r\n", _gs_mode, _escape, _cid);
gsfan 23:a783c62c36d0 1319 for (i = 0; i < 16; i ++) {
gsfan 35:515ec79792d3 1320 DBG("[%d] ", i);
gsfan 35:515ec79792d3 1321 DBG("connect=%d, type=%d, protocol=%d, len=%d\r\n", _gs_sock[i].connect, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].data->available());
gsfan 35:515ec79792d3 1322 DBG(" %x, %x\r\n", &_gs_sock[i], _gs_sock[i].data);
gsfan 35:515ec79792d3 1323 #ifdef GS_ENABLE_HTTPD
gsfan 23:a783c62c36d0 1324 if (_gs_sock[i].protocol == GSPROT_HTTPD) {
gsfan 23:a783c62c36d0 1325 DBG(" mode=%d, type=%d, len=%d\r\n", i, _httpd[i].mode, _httpd[i].type, _httpd[i].len);
gsfan 35:515ec79792d3 1326 DBG(" %x, %x\r\n", &_httpd[i], _httpd[i].buf);
gsfan 23:a783c62c36d0 1327 }
gsfan 35:515ec79792d3 1328 #endif
gsfan 23:a783c62c36d0 1329 }
gsfan 23:a783c62c36d0 1330 }
gsfan 0:2f6062c6d018 1331
gsfan 0:2f6062c6d018 1332 void GSwifi::test () {
gsfan 2:c6e0e97901b3 1333 /*
gsfan 0:2f6062c6d018 1334 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1335 wait_ms(100);
gsfan 0:2f6062c6d018 1336 command("AT+NCLOSEALL", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1337 _connect = true;
gsfan 2:c6e0e97901b3 1338 */
gsfan 2:c6e0e97901b3 1339 command("AT+WRXACTIVE=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1340 }
gsfan 0:2f6062c6d018 1341
gsfan 0:2f6062c6d018 1342 int GSwifi::getc() {
gsfan 0:2f6062c6d018 1343 char c;
gsfan 25:f6e5622d2930 1344 if (! _buf_cmd.isEmpty()) {
gsfan 25:f6e5622d2930 1345 _buf_cmd.dequeue(&c);
gsfan 0:2f6062c6d018 1346 }
gsfan 0:2f6062c6d018 1347 /*
gsfan 0:2f6062c6d018 1348 } else
gsfan 0:2f6062c6d018 1349 if (_gs_sock[0].data != NULL) {
gsfan 25:f6e5622d2930 1350 _gs_sock[0].data->dequeue(&c);
gsfan 0:2f6062c6d018 1351 }
gsfan 0:2f6062c6d018 1352 */
gsfan 0:2f6062c6d018 1353 return c;
gsfan 0:2f6062c6d018 1354 }
gsfan 0:2f6062c6d018 1355
gsfan 0:2f6062c6d018 1356 void GSwifi::putc(char c) {
gsfan 1:b127c6c5241d 1357 _gs_putc(c);
gsfan 0:2f6062c6d018 1358 }
gsfan 0:2f6062c6d018 1359
gsfan 0:2f6062c6d018 1360 int GSwifi::readable() {
gsfan 25:f6e5622d2930 1361 return ! _buf_cmd.isEmpty();
gsfan 0:2f6062c6d018 1362 // return _buf_cmd.use() || (_gs_sock[0].data != NULL && _gs_sock[0].data->use());
gsfan 0:2f6062c6d018 1363 }
gsfan 18:4b97804c37d1 1364 #endif