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:
Tue Feb 26 02:48:31 2013 +0000
Revision:
29:1c4419512941
Parent:
28:fbba4c58d14c
Child:
31:0abdc584823d
add websocket client

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