GSwifiInterface library (interface for GainSpan Wi-Fi GS1011 modules) Please see https://mbed.org/users/gsfan/notebook/GSwifiInterface/

Dependents:   GSwifiInterface_HelloWorld GSwifiInterface_HelloServo GSwifiInterface_UDPEchoServer GSwifiInterface_UDPEchoClient ... more

Fork of WiflyInterface by mbed official

GainSpan Wi-Fi library

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

mbed RTOS supported.

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

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

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

mbed RTOS に対応しています。(mbed2.0)

Committer:
gsfan
Date:
Tue Sep 24 06:24:37 2019 +0000
Revision:
22:d25a5a0d2497
Parent:
16:105b56570533
UART Command and SPI Data supported.; bug fix.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 8:64184a968e3b 1 /* Copyright (C) 2013 gsfan, MIT License
gsfan 8:64184a968e3b 2 *
gsfan 8:64184a968e3b 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gsfan 8:64184a968e3b 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
gsfan 8:64184a968e3b 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
gsfan 8:64184a968e3b 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
gsfan 8:64184a968e3b 7 * furnished to do so, subject to the following conditions:
gsfan 8:64184a968e3b 8 *
gsfan 8:64184a968e3b 9 * The above copyright notice and this permission notice shall be included in all copies or
gsfan 8:64184a968e3b 10 * substantial portions of the Software.
gsfan 8:64184a968e3b 11 *
gsfan 8:64184a968e3b 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gsfan 8:64184a968e3b 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gsfan 8:64184a968e3b 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gsfan 8:64184a968e3b 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gsfan 8:64184a968e3b 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gsfan 8:64184a968e3b 17 */
gsfan 8:64184a968e3b 18
gsfan 8:64184a968e3b 19 #include "GSwifi.h"
gsfan 8:64184a968e3b 20
gsfan 11:71d67fea5ace 21 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 22 #undef DBG
gsfan 8:64184a968e3b 23 #define DBG(x, ...)
gsfan 8:64184a968e3b 24 #endif
gsfan 8:64184a968e3b 25
gsfan 8:64184a968e3b 26 void GSwifi::recvData (char c) {
gsfan 11:71d67fea5ace 27 static int cid, sub, len, count;
gsfan 8:64184a968e3b 28
gsfan 8:64184a968e3b 29 #ifdef DEBUG_DUMP
gsfan 15:086d1a33a197 30 if (c < 0x20 || c >= 0x7f) {
gsfan 15:086d1a33a197 31 std::printf("_%02x", c);
gsfan 8:64184a968e3b 32 } else {
gsfan 15:086d1a33a197 33 std::printf("_%c", c);
gsfan 8:64184a968e3b 34 }
gsfan 8:64184a968e3b 35 #endif
gsfan 8:64184a968e3b 36 switch (_state.mode) {
gsfan 8:64184a968e3b 37 case MODE_COMMAND:
gsfan 8:64184a968e3b 38 switch (c) {
gsfan 8:64184a968e3b 39 case 0:
gsfan 8:64184a968e3b 40 case 0x0a: // LF
gsfan 8:64184a968e3b 41 case 0x0d: // CR
gsfan 8:64184a968e3b 42 break;
gsfan 8:64184a968e3b 43 case 0x1b: // ESC
gsfan 8:64184a968e3b 44 _state.buf->flush();
gsfan 8:64184a968e3b 45 _state.mode = MODE_ESCAPE;
gsfan 22:d25a5a0d2497 46 _state.escape = false;
gsfan 22:d25a5a0d2497 47 break;
gsfan 22:d25a5a0d2497 48 case 0xf3: // SPI link ready indication
gsfan 22:d25a5a0d2497 49 case 0xf5: // IDLE
gsfan 8:64184a968e3b 50 break;
gsfan 8:64184a968e3b 51 default:
gsfan 8:64184a968e3b 52 _state.buf->flush();
gsfan 8:64184a968e3b 53 _state.buf->queue(c);
gsfan 8:64184a968e3b 54 _state.mode = MODE_CMDRESP;
gsfan 22:d25a5a0d2497 55 _state.escape = false;
gsfan 8:64184a968e3b 56 break;
gsfan 8:64184a968e3b 57 }
gsfan 8:64184a968e3b 58 break;
gsfan 8:64184a968e3b 59
gsfan 8:64184a968e3b 60 case MODE_CMDRESP:
gsfan 8:64184a968e3b 61 switch (c) {
gsfan 8:64184a968e3b 62 case 0:
gsfan 8:64184a968e3b 63 break;
gsfan 8:64184a968e3b 64 case 0x0a: // LF
gsfan 8:64184a968e3b 65 case 0x0d: // CR
gsfan 8:64184a968e3b 66 // _state.buf->queue(c);
gsfan 14:1e89a3f0282d 67 if (_flow == 2) setRts(false);
gsfan 15:086d1a33a197 68 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 69 parseMessage();
gsfan 14:1e89a3f0282d 70 if (_flow == 2) setRts(true);
gsfan 8:64184a968e3b 71 break;
gsfan 8:64184a968e3b 72 case 0x1b: // ESC
gsfan 8:64184a968e3b 73 _state.mode = MODE_ESCAPE;
gsfan 8:64184a968e3b 74 break;
gsfan 8:64184a968e3b 75 default:
gsfan 8:64184a968e3b 76 _state.buf->queue(c);
gsfan 8:64184a968e3b 77 break;
gsfan 8:64184a968e3b 78 }
gsfan 8:64184a968e3b 79 break;
gsfan 8:64184a968e3b 80
gsfan 8:64184a968e3b 81 case MODE_ESCAPE:
gsfan 8:64184a968e3b 82 sub = 0;
gsfan 8:64184a968e3b 83 switch (c) {
gsfan 8:64184a968e3b 84 case 'H':
gsfan 8:64184a968e3b 85 _state.mode = MODE_DATA_RXHTTP;
gsfan 8:64184a968e3b 86 break;
gsfan 8:64184a968e3b 87 case 'u':
gsfan 8:64184a968e3b 88 _state.mode = MODE_DATA_RXUDP;
gsfan 8:64184a968e3b 89 break;
gsfan 8:64184a968e3b 90 case 'y':
gsfan 8:64184a968e3b 91 _state.mode = MODE_DATA_RXUDP_BULK;
gsfan 8:64184a968e3b 92 break;
gsfan 8:64184a968e3b 93 case 'Z':
gsfan 8:64184a968e3b 94 _state.mode = MODE_DATA_RX_BULK;
gsfan 8:64184a968e3b 95 break;
gsfan 8:64184a968e3b 96 case 'S':
gsfan 8:64184a968e3b 97 _state.mode = MODE_DATA_RX;
gsfan 8:64184a968e3b 98 break;
gsfan 8:64184a968e3b 99 case ':':
gsfan 8:64184a968e3b 100 _state.mode = MODE_DATA_RAW;
gsfan 8:64184a968e3b 101 break;
gsfan 8:64184a968e3b 102 case 'O':
gsfan 8:64184a968e3b 103 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 104 _state.ok = true;
gsfan 8:64184a968e3b 105 return;
gsfan 8:64184a968e3b 106 case 'F':
gsfan 8:64184a968e3b 107 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 108 _state.failure = true;
gsfan 8:64184a968e3b 109 return;
gsfan 8:64184a968e3b 110 default:
gsfan 8:64184a968e3b 111 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 112 return;
gsfan 8:64184a968e3b 113 }
gsfan 8:64184a968e3b 114 break;
gsfan 8:64184a968e3b 115
gsfan 8:64184a968e3b 116 case MODE_DATA_RX:
gsfan 8:64184a968e3b 117 case MODE_DATA_RXUDP:
gsfan 8:64184a968e3b 118 switch (sub) {
gsfan 8:64184a968e3b 119 case 0:
gsfan 8:64184a968e3b 120 // cid
gsfan 11:71d67fea5ace 121 cid = x2i(c);
gsfan 8:64184a968e3b 122 sub ++;
gsfan 8:64184a968e3b 123 count = 0;
gsfan 8:64184a968e3b 124 if (_state.mode == MODE_DATA_RX) {
gsfan 8:64184a968e3b 125 sub = 3;
gsfan 8:64184a968e3b 126 }
gsfan 8:64184a968e3b 127 break;
gsfan 8:64184a968e3b 128 case 1:
gsfan 8:64184a968e3b 129 // ip
gsfan 8:64184a968e3b 130 if ((c >= '0' && c <= '9') || c == '.') {
gsfan 11:71d67fea5ace 131 _con[cid].ip[count] = c;
gsfan 8:64184a968e3b 132 count ++;
gsfan 8:64184a968e3b 133 } else {
gsfan 11:71d67fea5ace 134 _con[cid].ip[count] = 0;
gsfan 11:71d67fea5ace 135 _con[cid].port = 0;
gsfan 8:64184a968e3b 136 sub ++;
gsfan 8:64184a968e3b 137 }
gsfan 8:64184a968e3b 138 break;
gsfan 8:64184a968e3b 139 case 2:
gsfan 8:64184a968e3b 140 // port
gsfan 8:64184a968e3b 141 if (c >= '0' && c <= '9') {
gsfan 11:71d67fea5ace 142 _con[cid].port = (_con[cid].port * 10) + (c - '0');
gsfan 8:64184a968e3b 143 } else {
gsfan 8:64184a968e3b 144 sub ++;
gsfan 8:64184a968e3b 145 count = 0;
gsfan 8:64184a968e3b 146 }
gsfan 8:64184a968e3b 147 break;
gsfan 8:64184a968e3b 148 default:
gsfan 8:64184a968e3b 149 // data
gsfan 8:64184a968e3b 150 if (_state.escape) {
gsfan 8:64184a968e3b 151 if (c == 'E') {
gsfan 11:71d67fea5ace 152 DBG("recv ascii %d %d/a\r\n", cid, count);
gsfan 11:71d67fea5ace 153 _con[cid].received = true;
gsfan 8:64184a968e3b 154 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 155 } else {
gsfan 11:71d67fea5ace 156 if (_con[cid].buf != NULL) {
gsfan 11:71d67fea5ace 157 _con[cid].buf->queue(0x1b);
gsfan 11:71d67fea5ace 158 _con[cid].buf->queue(c);
gsfan 8:64184a968e3b 159 }
gsfan 8:64184a968e3b 160 count += 2;
gsfan 8:64184a968e3b 161 }
gsfan 8:64184a968e3b 162 _state.escape = false;
gsfan 8:64184a968e3b 163 } else
gsfan 8:64184a968e3b 164 if (c == 0x1b) {
gsfan 8:64184a968e3b 165 _state.escape = true;
gsfan 8:64184a968e3b 166 } else {
gsfan 11:71d67fea5ace 167 if (_con[cid].buf != NULL) {
gsfan 11:71d67fea5ace 168 _con[cid].buf->queue(c);
gsfan 16:105b56570533 169 if (_con[cid].func != NULL && _con[cid].buf->available() > CFG_DATA_SIZE - 16) {
gsfan 8:64184a968e3b 170 setRts(false);
gsfan 11:71d67fea5ace 171 _con[cid].received = true;
gsfan 12:057089026a20 172 WARN("buf full");
gsfan 8:64184a968e3b 173 }
gsfan 8:64184a968e3b 174 }
gsfan 8:64184a968e3b 175 count ++;
gsfan 8:64184a968e3b 176 }
gsfan 8:64184a968e3b 177 break;
gsfan 8:64184a968e3b 178 }
gsfan 8:64184a968e3b 179 break;
gsfan 8:64184a968e3b 180
gsfan 8:64184a968e3b 181 case MODE_DATA_RX_BULK:
gsfan 8:64184a968e3b 182 case MODE_DATA_RXUDP_BULK:
gsfan 8:64184a968e3b 183 case MODE_DATA_RXHTTP:
gsfan 8:64184a968e3b 184 switch (sub) {
gsfan 8:64184a968e3b 185 case 0:
gsfan 8:64184a968e3b 186 // cid
gsfan 11:71d67fea5ace 187 cid = x2i(c);
gsfan 8:64184a968e3b 188 sub ++;
gsfan 8:64184a968e3b 189 len = 0;
gsfan 8:64184a968e3b 190 count = 0;
gsfan 12:057089026a20 191 if (_state.mode != MODE_DATA_RXUDP_BULK) {
gsfan 8:64184a968e3b 192 sub = 3;
gsfan 8:64184a968e3b 193 }
gsfan 8:64184a968e3b 194 break;
gsfan 8:64184a968e3b 195 case 1:
gsfan 8:64184a968e3b 196 // ip
gsfan 8:64184a968e3b 197 if ((c >= '0' && c <= '9') || c == '.') {
gsfan 11:71d67fea5ace 198 _con[cid].ip[count] = c;
gsfan 8:64184a968e3b 199 count ++;
gsfan 8:64184a968e3b 200 } else {
gsfan 11:71d67fea5ace 201 _con[cid].ip[count] = 0;
gsfan 11:71d67fea5ace 202 _con[cid].port = 0;
gsfan 8:64184a968e3b 203 sub ++;
gsfan 8:64184a968e3b 204 }
gsfan 8:64184a968e3b 205 break;
gsfan 8:64184a968e3b 206 case 2:
gsfan 8:64184a968e3b 207 // port
gsfan 8:64184a968e3b 208 if (c >= '0' && c <= '9') {
gsfan 11:71d67fea5ace 209 _con[cid].port = (_con[cid].port * 10) + (c - '0');
gsfan 8:64184a968e3b 210 } else {
gsfan 8:64184a968e3b 211 sub ++;
gsfan 8:64184a968e3b 212 count = 0;
gsfan 8:64184a968e3b 213 }
gsfan 8:64184a968e3b 214 break;
gsfan 8:64184a968e3b 215 case 3:
gsfan 8:64184a968e3b 216 // length
gsfan 8:64184a968e3b 217 len = (len * 10) + (c - '0');
gsfan 8:64184a968e3b 218 count ++;
gsfan 8:64184a968e3b 219 if (count >= 4) {
gsfan 8:64184a968e3b 220 sub ++;
gsfan 8:64184a968e3b 221 count = 0;
gsfan 8:64184a968e3b 222 }
gsfan 8:64184a968e3b 223 break;
gsfan 8:64184a968e3b 224 default:
gsfan 8:64184a968e3b 225 // data
gsfan 12:057089026a20 226 #ifdef CFG_ENABLE_HTTPD
gsfan 12:057089026a20 227 if (_con[cid].protocol == PROTO_HTTPD) {
gsfan 12:057089026a20 228 httpdRecvData(cid, c);
gsfan 12:057089026a20 229 } else
gsfan 12:057089026a20 230 #endif
gsfan 11:71d67fea5ace 231 if (_con[cid].buf != NULL) {
gsfan 22:d25a5a0d2497 232 #ifdef CFG_SPI_DATAINTERFACE
gsfan 22:d25a5a0d2497 233 if (_state.datainterface) {
gsfan 22:d25a5a0d2497 234 if (_state.escape) { // dencode
gsfan 22:d25a5a0d2497 235 _con[cid].buf->queue(c ^ 0x20); // xor
gsfan 22:d25a5a0d2497 236 _state.escape = false;
gsfan 22:d25a5a0d2497 237 } else
gsfan 22:d25a5a0d2497 238 if (c == 0xfb) {
gsfan 22:d25a5a0d2497 239 _state.escape = true;
gsfan 22:d25a5a0d2497 240 } else {
gsfan 22:d25a5a0d2497 241 _con[cid].buf->queue(c);
gsfan 22:d25a5a0d2497 242 }
gsfan 22:d25a5a0d2497 243 } else {
gsfan 22:d25a5a0d2497 244 _con[cid].buf->queue(c);
gsfan 22:d25a5a0d2497 245 }
gsfan 22:d25a5a0d2497 246 #else
gsfan 11:71d67fea5ace 247 _con[cid].buf->queue(c);
gsfan 22:d25a5a0d2497 248 #endif
gsfan 16:105b56570533 249 if (_con[cid].func != NULL && _con[cid].buf->available() > CFG_DATA_SIZE - 16) {
gsfan 8:64184a968e3b 250 setRts(false);
gsfan 11:71d67fea5ace 251 _con[cid].received = true;
gsfan 12:057089026a20 252 WARN("buf full");
gsfan 8:64184a968e3b 253 }
gsfan 8:64184a968e3b 254 }
gsfan 22:d25a5a0d2497 255 if (!_state.escape) count ++;
gsfan 8:64184a968e3b 256 if (count >= len) {
gsfan 11:71d67fea5ace 257 DBG("recv bulk %d %d/%d\r\n", cid, count, len);
gsfan 11:71d67fea5ace 258 _con[cid].received = true;
gsfan 8:64184a968e3b 259 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 260 }
gsfan 8:64184a968e3b 261 break;
gsfan 8:64184a968e3b 262 }
gsfan 8:64184a968e3b 263 break;
gsfan 8:64184a968e3b 264 }
gsfan 8:64184a968e3b 265 }
gsfan 8:64184a968e3b 266
gsfan 22:d25a5a0d2497 267 #define MSG_TABLE_NUM 16
gsfan 13:189e04ac70bd 268 #define RES_TABLE_NUM 11
gsfan 8:64184a968e3b 269 int GSwifi::parseMessage () {
gsfan 8:64184a968e3b 270 int i;
gsfan 8:64184a968e3b 271 char buf[256];
gsfan 8:64184a968e3b 272 static const struct MSG_TABLE {
gsfan 8:64184a968e3b 273 const char msg[24];
gsfan 8:64184a968e3b 274 void (GSwifi::*func)(const char*);
gsfan 8:64184a968e3b 275 } msg_table[MSG_TABLE_NUM] = {
gsfan 8:64184a968e3b 276 {"OK", &GSwifi::msgOk},
gsfan 8:64184a968e3b 277 {"ERROR", &GSwifi::msgError},
gsfan 8:64184a968e3b 278 {"INVALID INPUT", &GSwifi::msgError},
gsfan 8:64184a968e3b 279 {"CONNECT ", &GSwifi::msgConnect},
gsfan 8:64184a968e3b 280 {"DISCONNECT ", &GSwifi::msgDisconnect},
gsfan 8:64184a968e3b 281 {"DISASSOCIATED", &GSwifi::msgDisassociated},
gsfan 8:64184a968e3b 282 {"Disassociated", &GSwifi::msgDisassociated},
gsfan 8:64184a968e3b 283 {"Disassociation Event", &GSwifi::msgDisassociated},
gsfan 8:64184a968e3b 284 {"Serial2WiFi APP", &GSwifi::msgReset},
gsfan 8:64184a968e3b 285 {"UnExpected Warm Boot", &GSwifi::msgReset},
gsfan 8:64184a968e3b 286 {"APP Reset-APP SW Reset", &GSwifi::msgReset},
gsfan 8:64184a968e3b 287 {"APP Reset-Wlan Except", &GSwifi::msgReset},
gsfan 8:64184a968e3b 288 {"Out of StandBy-Timer", &GSwifi::msgOutofStandby},
gsfan 8:64184a968e3b 289 {"Out of StandBy-Alarm", &GSwifi::msgOutofStandby},
gsfan 8:64184a968e3b 290 {"Out of Deep Sleep", &GSwifi::msgOutofDeepsleep},
gsfan 22:d25a5a0d2497 291 {"DataInterfaceReady", &GSwifi::msgDataInterfaceReady},
gsfan 8:64184a968e3b 292 };
gsfan 8:64184a968e3b 293 static const struct RES_TABLE {
gsfan 8:64184a968e3b 294 const Response res;
gsfan 8:64184a968e3b 295 void (GSwifi::*func)(const char*);
gsfan 8:64184a968e3b 296 } res_table[RES_TABLE_NUM] = {
gsfan 8:64184a968e3b 297 {RES_NULL, NULL},
gsfan 8:64184a968e3b 298 {RES_CONNECT, &GSwifi::resConnect},
gsfan 13:189e04ac70bd 299 {RES_WPAPSK, &GSwifi::resWpapsk},
gsfan 8:64184a968e3b 300 {RES_WPS, &GSwifi::resWps},
gsfan 8:64184a968e3b 301 {RES_MACADDRESS, &GSwifi::resMacAddress},
gsfan 8:64184a968e3b 302 {RES_DHCP, &GSwifi::resIp},
gsfan 8:64184a968e3b 303 {RES_DNSLOOKUP, &GSwifi::resLookup},
gsfan 12:057089026a20 304 {RES_HTTP, &GSwifi::resHttp},
gsfan 8:64184a968e3b 305 {RES_RSSI, &GSwifi::resRssi},
gsfan 8:64184a968e3b 306 {RES_TIME, &GSwifi::resTime},
gsfan 8:64184a968e3b 307 {RES_STATUS, &GSwifi::resStatus},
gsfan 8:64184a968e3b 308 };
gsfan 8:64184a968e3b 309
gsfan 8:64184a968e3b 310 for (i = 0; i < sizeof(buf); i++) {
gsfan 8:64184a968e3b 311 if (_state.buf->dequeue(&buf[i]) == false) break;
gsfan 8:64184a968e3b 312 }
gsfan 8:64184a968e3b 313 buf[i] = 0;
gsfan 8:64184a968e3b 314
gsfan 8:64184a968e3b 315 if (_state.res != RES_NULL) {
gsfan 8:64184a968e3b 316 for (i = 0; i < RES_TABLE_NUM; i ++) {
gsfan 8:64184a968e3b 317 if (res_table[i].res == _state.res) {
gsfan 8:64184a968e3b 318 DBG("parse res %d '%s'\r\n", i, buf);
gsfan 8:64184a968e3b 319 if (res_table[i].func != NULL) {
gsfan 8:64184a968e3b 320 (this->*(res_table[i].func))(buf);
gsfan 8:64184a968e3b 321 }
gsfan 8:64184a968e3b 322 }
gsfan 8:64184a968e3b 323 }
gsfan 8:64184a968e3b 324 }
gsfan 8:64184a968e3b 325
gsfan 8:64184a968e3b 326 for (i = 0; i < MSG_TABLE_NUM; i ++) {
gsfan 8:64184a968e3b 327 if (strncmp(buf, msg_table[i].msg, strlen(msg_table[i].msg)) == 0) {
gsfan 8:64184a968e3b 328 DBG("parse msg %d '%s'\r\n", i, buf);
gsfan 8:64184a968e3b 329 if (msg_table[i].func != NULL) {
gsfan 8:64184a968e3b 330 (this->*(msg_table[i].func))(buf);
gsfan 8:64184a968e3b 331 }
gsfan 8:64184a968e3b 332 return 0;
gsfan 8:64184a968e3b 333 }
gsfan 8:64184a968e3b 334 }
gsfan 8:64184a968e3b 335
gsfan 8:64184a968e3b 336 return -1;
gsfan 8:64184a968e3b 337 }
gsfan 8:64184a968e3b 338
gsfan 8:64184a968e3b 339 void GSwifi::msgOk (const char *buf) {
gsfan 8:64184a968e3b 340 _state.ok = true;
gsfan 11:71d67fea5ace 341 if (_state.status == STAT_DEEPSLEEP) {
gsfan 11:71d67fea5ace 342 _state.status = STAT_READY;
gsfan 11:71d67fea5ace 343 }
gsfan 8:64184a968e3b 344 }
gsfan 8:64184a968e3b 345
gsfan 8:64184a968e3b 346 void GSwifi::msgError (const char *buf) {
gsfan 8:64184a968e3b 347 _state.failure = true;
gsfan 8:64184a968e3b 348 }
gsfan 8:64184a968e3b 349
gsfan 8:64184a968e3b 350 void GSwifi::msgConnect (const char *buf) {
gsfan 8:64184a968e3b 351 int i, count;
gsfan 11:71d67fea5ace 352 int cid, acid;
gsfan 8:64184a968e3b 353
gsfan 8:64184a968e3b 354 if (buf[8] < '0' || buf[8] > 'F' || buf[9] != ' ') return;
gsfan 8:64184a968e3b 355
gsfan 11:71d67fea5ace 356 cid = x2i(buf[8]);
gsfan 11:71d67fea5ace 357 acid = x2i(buf[10]);
gsfan 11:71d67fea5ace 358 DBG("forked %d -> %d\r\n", cid, acid);
gsfan 8:64184a968e3b 359 // ip
gsfan 8:64184a968e3b 360 count = 0;
gsfan 8:64184a968e3b 361 for (i = 12; i < strlen(buf); i ++) {
gsfan 8:64184a968e3b 362 if ((buf[i] >= '0' && buf[i] <= '9') || buf[i] == '.') {
gsfan 11:71d67fea5ace 363 _con[acid].ip[count] = buf[i];
gsfan 8:64184a968e3b 364 count ++;
gsfan 8:64184a968e3b 365 } else {
gsfan 11:71d67fea5ace 366 _con[acid].ip[count] = 0;
gsfan 8:64184a968e3b 367 break;
gsfan 8:64184a968e3b 368 }
gsfan 8:64184a968e3b 369 }
gsfan 8:64184a968e3b 370 // port
gsfan 11:71d67fea5ace 371 _con[acid].port = 0;
gsfan 8:64184a968e3b 372 count = 0;
gsfan 8:64184a968e3b 373 for (; i < strlen(buf); i ++) {
gsfan 8:64184a968e3b 374 if (buf[i] >= '0' && buf[i] <= '9') {
gsfan 11:71d67fea5ace 375 _con[acid].port = (_con[acid].port * 10) + (buf[i] - '0');
gsfan 8:64184a968e3b 376 } else {
gsfan 8:64184a968e3b 377 break;
gsfan 8:64184a968e3b 378 }
gsfan 8:64184a968e3b 379 }
gsfan 8:64184a968e3b 380
gsfan 12:057089026a20 381 // initialize
gsfan 12:057089026a20 382 initCon(acid, true);
gsfan 11:71d67fea5ace 383 _con[acid].protocol = _con[cid].protocol;
gsfan 11:71d67fea5ace 384 _con[acid].type = _con[cid].type;
gsfan 11:71d67fea5ace 385 _con[acid].parent = cid;
gsfan 12:057089026a20 386 _con[acid].func = _con[cid].func;
gsfan 11:71d67fea5ace 387 _con[acid].accept = true;
gsfan 15:086d1a33a197 388
gsfan 15:086d1a33a197 389 #ifdef CFG_ENABLE_HTTPD
gsfan 15:086d1a33a197 390 if (_con[acid].protocol == PROTO_HTTPD) {
gsfan 15:086d1a33a197 391 _httpd[acid].mode = HTTPDMODE_REQUEST;
gsfan 15:086d1a33a197 392 #ifdef CFG_ENABLE_WEBSOCKET
gsfan 15:086d1a33a197 393 _httpd[acid].websocket = 0;
gsfan 15:086d1a33a197 394 #endif
gsfan 15:086d1a33a197 395 }
gsfan 15:086d1a33a197 396 #endif
gsfan 8:64184a968e3b 397 }
gsfan 8:64184a968e3b 398
gsfan 8:64184a968e3b 399 void GSwifi::msgDisconnect (const char *buf) {
gsfan 8:64184a968e3b 400 int cid;
gsfan 8:64184a968e3b 401
gsfan 8:64184a968e3b 402 if (buf[11] < '0' || buf[11] > 'F') return;
gsfan 8:64184a968e3b 403
gsfan 8:64184a968e3b 404 cid = x2i(buf[11]);
gsfan 8:64184a968e3b 405 DBG("disconnect %d\r\n", cid);
gsfan 8:64184a968e3b 406 _con[cid].connected = false;
gsfan 8:64184a968e3b 407 }
gsfan 8:64184a968e3b 408
gsfan 8:64184a968e3b 409 void GSwifi::msgDisassociated (const char *buf) {
gsfan 8:64184a968e3b 410 int i;
gsfan 8:64184a968e3b 411 DBG("disassociate\r\n");
gsfan 8:64184a968e3b 412 _state.associated = false;
gsfan 8:64184a968e3b 413 for (i = 0; i < 16; i ++) {
gsfan 8:64184a968e3b 414 _con[i].connected = false;
gsfan 8:64184a968e3b 415 }
gsfan 11:71d67fea5ace 416 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 417 if (_threadPoll)
gsfan 8:64184a968e3b 418 _threadPoll->signal_set(1);
gsfan 8:64184a968e3b 419 #endif
gsfan 8:64184a968e3b 420 }
gsfan 8:64184a968e3b 421
gsfan 8:64184a968e3b 422 void GSwifi::msgReset (const char *buf) {
gsfan 11:71d67fea5ace 423 DBG("reset\r\n");
gsfan 11:71d67fea5ace 424 _state.initialized = false;
gsfan 8:64184a968e3b 425 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 426 _state.status = STAT_READY;
gsfan 8:64184a968e3b 427 msgDisassociated(NULL);
gsfan 11:71d67fea5ace 428 clearFlags();
gsfan 11:71d67fea5ace 429 #ifdef CFG_ENABLE_RTOS
gsfan 11:71d67fea5ace 430 if (_threadPoll) {
gsfan 11:71d67fea5ace 431 _threadPoll->terminate();
gsfan 11:71d67fea5ace 432 delete _threadPoll;
gsfan 11:71d67fea5ace 433 }
gsfan 11:71d67fea5ace 434 #endif
gsfan 8:64184a968e3b 435 }
gsfan 8:64184a968e3b 436
gsfan 8:64184a968e3b 437 void GSwifi::msgOutofStandby (const char *buf) {
gsfan 11:71d67fea5ace 438 DBG("OutofStandby\r\n");
gsfan 8:64184a968e3b 439 _state.status = STAT_WAKEUP;
gsfan 8:64184a968e3b 440 }
gsfan 8:64184a968e3b 441
gsfan 8:64184a968e3b 442 void GSwifi::msgOutofDeepsleep (const char *buf) {
gsfan 11:71d67fea5ace 443 DBG("OutofDeepsleep\r\n");
gsfan 8:64184a968e3b 444 _state.status = STAT_READY;
gsfan 8:64184a968e3b 445 }
gsfan 8:64184a968e3b 446
gsfan 22:d25a5a0d2497 447 void GSwifi::msgDataInterfaceReady (const char *buf) {
gsfan 22:d25a5a0d2497 448 DBG("DataInterfaceReady\r\n");
gsfan 22:d25a5a0d2497 449 _state.datainterface = true;
gsfan 22:d25a5a0d2497 450 _state.status = STAT_READY;
gsfan 22:d25a5a0d2497 451 }
gsfan 22:d25a5a0d2497 452
gsfan 8:64184a968e3b 453 void GSwifi::resConnect (const char *buf) {
gsfan 11:71d67fea5ace 454 int cid;
gsfan 11:71d67fea5ace 455
gsfan 11:71d67fea5ace 456 // udp/tcp listen socket
gsfan 8:64184a968e3b 457 if (strncmp(buf, "CONNECT ", 8) == 0 && buf[9] == 0) {
gsfan 11:71d67fea5ace 458 cid = x2i(buf[8]);
gsfan 11:71d67fea5ace 459 DBG("connect %d\r\n", cid);
gsfan 12:057089026a20 460 // initialize
gsfan 12:057089026a20 461 initCon(cid, true);
gsfan 11:71d67fea5ace 462 _state.cid = cid;
gsfan 8:64184a968e3b 463 _state.res = RES_NULL;
gsfan 8:64184a968e3b 464 }
gsfan 8:64184a968e3b 465 }
gsfan 8:64184a968e3b 466
gsfan 13:189e04ac70bd 467 void GSwifi::resWpapsk (const char *buf) {
gsfan 13:189e04ac70bd 468 if (strncmp(buf, "Computing PSK from SSID and PassPhrase", 38) == 0) {
gsfan 13:189e04ac70bd 469 _state.res = RES_NULL;
gsfan 13:189e04ac70bd 470 DBG("wpapsk\r\n");
gsfan 13:189e04ac70bd 471 }
gsfan 13:189e04ac70bd 472 }
gsfan 13:189e04ac70bd 473
gsfan 8:64184a968e3b 474 void GSwifi::resWps (const char *buf) {
gsfan 8:64184a968e3b 475 if (_state.n == 0 && strncmp(buf, "SSID", 4) == 0) {
gsfan 8:64184a968e3b 476 strncpy(_state.ssid, &buf[5], sizeof(_state.ssid));
gsfan 8:64184a968e3b 477 _state.n ++;
gsfan 8:64184a968e3b 478 } else
gsfan 8:64184a968e3b 479 if (_state.n == 1 && strncmp(buf, "CHANNEL", 7) == 0) {
gsfan 8:64184a968e3b 480 _state.n ++;
gsfan 8:64184a968e3b 481 } else
gsfan 8:64184a968e3b 482 if (_state.n == 2 && strncmp(buf, "PASSPHRASE", 10) == 0) {
gsfan 8:64184a968e3b 483 strncpy(_state.pass, &buf[11], sizeof(_state.pass));
gsfan 8:64184a968e3b 484 _state.n ++;
gsfan 8:64184a968e3b 485 _state.res = RES_NULL;
gsfan 11:71d67fea5ace 486 DBG("wps %s %s\r\n", _state.ssid, _state.pass);
gsfan 8:64184a968e3b 487 }
gsfan 8:64184a968e3b 488 }
gsfan 8:64184a968e3b 489
gsfan 8:64184a968e3b 490 void GSwifi::resMacAddress (const char *buf) {
gsfan 8:64184a968e3b 491 if (buf[2] == ':' && buf[5] == ':') {
gsfan 8:64184a968e3b 492 strncpy(_state.mac, buf, sizeof(_state.mac));
gsfan 8:64184a968e3b 493 _state.mac[17] = 0;
gsfan 8:64184a968e3b 494 _state.res = RES_NULL;
gsfan 11:71d67fea5ace 495 DBG("mac %s\r\n", _state.mac);
gsfan 8:64184a968e3b 496 }
gsfan 8:64184a968e3b 497 }
gsfan 8:64184a968e3b 498
gsfan 8:64184a968e3b 499 void GSwifi::resIp (const char *buf) {
gsfan 8:64184a968e3b 500 const char *tmp, *tmp2;
gsfan 8:64184a968e3b 501
gsfan 8:64184a968e3b 502 if (_state.n == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) {
gsfan 8:64184a968e3b 503 _state.n ++;
gsfan 8:64184a968e3b 504 } else
gsfan 22:d25a5a0d2497 505 if (_state.n == 1 && buf[0] == ' ') {
gsfan 8:64184a968e3b 506 tmp = buf + 1;
gsfan 8:64184a968e3b 507 tmp2 = strstr(tmp, ":");
gsfan 8:64184a968e3b 508 strncpy(_state.ip, tmp, tmp2 - tmp);
gsfan 22:d25a5a0d2497 509 tmp = tmp2 + 1;
gsfan 8:64184a968e3b 510 tmp2 = strstr(tmp, ":");
gsfan 8:64184a968e3b 511 strncpy(_state.netmask, tmp, tmp2 - tmp);
gsfan 22:d25a5a0d2497 512 tmp = tmp2 + 1;
gsfan 8:64184a968e3b 513 strncpy(_state.gateway, tmp, sizeof(_state.gateway));
gsfan 8:64184a968e3b 514 _state.n ++;
gsfan 8:64184a968e3b 515 _state.res = RES_NULL;
gsfan 8:64184a968e3b 516 DBG("ip: %s\r\nnetmask: %s\r\ngateway: %s", _state.ip, _state.netmask, _state.gateway);
gsfan 8:64184a968e3b 517 }
gsfan 8:64184a968e3b 518 }
gsfan 8:64184a968e3b 519
gsfan 8:64184a968e3b 520 void GSwifi::resLookup (const char *buf) {
gsfan 8:64184a968e3b 521 if (strncmp(buf, "IP:", 3) == 0) {
gsfan 8:64184a968e3b 522 strncpy(_state.resolv, &buf[3], sizeof(_state.resolv));
gsfan 8:64184a968e3b 523 _state.res = RES_NULL;
gsfan 11:71d67fea5ace 524 DBG("resolv: %s\r\n", _state.resolv);
gsfan 8:64184a968e3b 525 }
gsfan 8:64184a968e3b 526 }
gsfan 8:64184a968e3b 527
gsfan 8:64184a968e3b 528 void GSwifi::resRssi (const char *buf) {
gsfan 8:64184a968e3b 529 if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) {
gsfan 8:64184a968e3b 530 _state.rssi = atoi(buf);
gsfan 8:64184a968e3b 531 _state.res = RES_NULL;
gsfan 11:71d67fea5ace 532 DBG("rssi: %d\r\n", _state.rssi);
gsfan 8:64184a968e3b 533 }
gsfan 8:64184a968e3b 534 }
gsfan 8:64184a968e3b 535
gsfan 8:64184a968e3b 536 void GSwifi::resTime (const char *buf) {
gsfan 8:64184a968e3b 537 int year, month, day, hour, min, sec;
gsfan 8:64184a968e3b 538 struct tm t;
gsfan 8:64184a968e3b 539 if (buf[0] >= '0' && buf[0] <= '9') {
gsfan 8:64184a968e3b 540 sscanf(buf, "%d/%d/%d,%d:%d:%d", &day, &month, &year, &hour, &min, &sec);
gsfan 8:64184a968e3b 541 t.tm_sec = sec;
gsfan 8:64184a968e3b 542 t.tm_min = min;
gsfan 8:64184a968e3b 543 t.tm_hour = hour;
gsfan 8:64184a968e3b 544 t.tm_mday = day;
gsfan 8:64184a968e3b 545 t.tm_mon = month - 1;
gsfan 8:64184a968e3b 546 t.tm_year = year - 1900;
gsfan 8:64184a968e3b 547 _state.time = mktime(&t);
gsfan 8:64184a968e3b 548 _state.res = RES_NULL;
gsfan 8:64184a968e3b 549 }
gsfan 8:64184a968e3b 550 }
gsfan 8:64184a968e3b 551
gsfan 8:64184a968e3b 552 void GSwifi::resChannel (const char *buf) {
gsfan 8:64184a968e3b 553 }
gsfan 8:64184a968e3b 554
gsfan 8:64184a968e3b 555 void GSwifi::resStatus (const char *buf) {
gsfan 8:64184a968e3b 556 if (_state.n == 0 && strncmp(buf, "NOT ASSOCIATED", 14) == 0) {
gsfan 8:64184a968e3b 557 msgDisassociated(NULL);
gsfan 8:64184a968e3b 558 _state.res = RES_NULL;
gsfan 8:64184a968e3b 559 }
gsfan 8:64184a968e3b 560
gsfan 8:64184a968e3b 561 if (_state.n == 0 && strncmp(buf, "MODE:", 5) == 0) {
gsfan 8:64184a968e3b 562 _state.n ++;
gsfan 8:64184a968e3b 563 } else
gsfan 8:64184a968e3b 564 if (_state.n == 1 && strncmp(buf, "BSSID:", 6) == 0) {
gsfan 8:64184a968e3b 565 const char *tmp = strstr(buf, "SECURITY:") + 2;
gsfan 8:64184a968e3b 566 if (strncmp(tmp, "WEP (OPEN)", 10) == NULL) {
gsfan 8:64184a968e3b 567 _state.sec = SEC_OPEN;
gsfan 8:64184a968e3b 568 } else
gsfan 8:64184a968e3b 569 if (strncmp(tmp, "WEP (SHARED)", 12) == NULL) {
gsfan 8:64184a968e3b 570 _state.sec = SEC_WEP;
gsfan 8:64184a968e3b 571 } else
gsfan 8:64184a968e3b 572 if (strncmp(tmp, "WPA-PERSONAL", 12) == NULL) {
gsfan 8:64184a968e3b 573 _state.sec = SEC_WPA_PSK;
gsfan 8:64184a968e3b 574 } else
gsfan 8:64184a968e3b 575 if (strncmp(tmp, "WPA2-PERSONAL", 13) == NULL) {
gsfan 8:64184a968e3b 576 _state.sec = SEC_WPA2_PSK;
gsfan 8:64184a968e3b 577 }
gsfan 8:64184a968e3b 578 _state.res = RES_NULL;
gsfan 8:64184a968e3b 579 }
gsfan 8:64184a968e3b 580 }
gsfan 12:057089026a20 581
gsfan 12:057089026a20 582 void GSwifi::resHttp (const char *buf) {
gsfan 12:057089026a20 583 int cid;
gsfan 12:057089026a20 584
gsfan 12:057089026a20 585 // http client socket
gsfan 12:057089026a20 586 if (buf[0] >= '0' && buf[0] <= 'F' && buf[1] == 0) {
gsfan 12:057089026a20 587 cid = x2i(buf[0]);
gsfan 12:057089026a20 588 DBG("connect %d\r\n", cid);
gsfan 12:057089026a20 589 // initialize
gsfan 12:057089026a20 590 initCon(cid, true);
gsfan 12:057089026a20 591 _state.cid = cid;
gsfan 12:057089026a20 592 _state.res = RES_NULL;
gsfan 12:057089026a20 593 }
gsfan 12:057089026a20 594 }