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:
Mon Feb 11 06:01:46 2013 +0000
Revision:
25:f6e5622d2930
Parent:
24:5c350ae2e703
Child:
26:b347ee3a1087
split the file

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