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
GainSpan Wi-Fi library
The GS1011/GS2100 is an ultra low power 802.11b wireless module from GainSpan.
mbed RTOS supported.
- about this library: http://mbed.org/users/gsfan/notebook/GSwifiInterface/
- about Wi-Fi module: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
ゲインスパン Wi-Fi モジュール ライブラリ
ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011/GS2100 シリーズ用のライブラリです。
mbed RTOS に対応しています。(mbed2.0)
- このライブラリについて: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
- Wi-FIモジュールについて: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
- UARTコマンド、SPIデータインターフェースに対応しました。(2019/09)
GSwifi/GSwifi_msg.cpp@12:057089026a20, 2013-11-22 (annotated)
- Committer:
- gsfan
- Date:
- Fri Nov 22 14:03:07 2013 +0000
- Revision:
- 12:057089026a20
- Parent:
- 11:71d67fea5ace
- Child:
- 13:189e04ac70bd
add more function (smtp, http, httpd, websocket); fix some function;
Who changed what in which revision?
User | Revision | Line number | New 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 | 8:64184a968e3b | 30 | if (c < 0x20) { |
gsfan | 8:64184a968e3b | 31 | DBG("%02x_", c); |
gsfan | 8:64184a968e3b | 32 | } else { |
gsfan | 8:64184a968e3b | 33 | DBG("%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 | 8:64184a968e3b | 46 | break; |
gsfan | 8:64184a968e3b | 47 | default: |
gsfan | 8:64184a968e3b | 48 | _state.buf->flush(); |
gsfan | 8:64184a968e3b | 49 | _state.buf->queue(c); |
gsfan | 8:64184a968e3b | 50 | _state.mode = MODE_CMDRESP; |
gsfan | 8:64184a968e3b | 51 | break; |
gsfan | 8:64184a968e3b | 52 | } |
gsfan | 8:64184a968e3b | 53 | break; |
gsfan | 8:64184a968e3b | 54 | |
gsfan | 8:64184a968e3b | 55 | case MODE_CMDRESP: |
gsfan | 8:64184a968e3b | 56 | switch (c) { |
gsfan | 8:64184a968e3b | 57 | case 0: |
gsfan | 8:64184a968e3b | 58 | break; |
gsfan | 8:64184a968e3b | 59 | case 0x0a: // LF |
gsfan | 8:64184a968e3b | 60 | case 0x0d: // CR |
gsfan | 8:64184a968e3b | 61 | // _state.buf->queue(c); |
gsfan | 8:64184a968e3b | 62 | parseMessage(); |
gsfan | 8:64184a968e3b | 63 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 64 | break; |
gsfan | 8:64184a968e3b | 65 | case 0x1b: // ESC |
gsfan | 8:64184a968e3b | 66 | _state.mode = MODE_ESCAPE; |
gsfan | 8:64184a968e3b | 67 | break; |
gsfan | 8:64184a968e3b | 68 | default: |
gsfan | 8:64184a968e3b | 69 | _state.buf->queue(c); |
gsfan | 8:64184a968e3b | 70 | break; |
gsfan | 8:64184a968e3b | 71 | } |
gsfan | 8:64184a968e3b | 72 | break; |
gsfan | 8:64184a968e3b | 73 | |
gsfan | 8:64184a968e3b | 74 | case MODE_ESCAPE: |
gsfan | 8:64184a968e3b | 75 | sub = 0; |
gsfan | 8:64184a968e3b | 76 | switch (c) { |
gsfan | 8:64184a968e3b | 77 | case 'H': |
gsfan | 8:64184a968e3b | 78 | _state.mode = MODE_DATA_RXHTTP; |
gsfan | 8:64184a968e3b | 79 | break; |
gsfan | 8:64184a968e3b | 80 | case 'u': |
gsfan | 8:64184a968e3b | 81 | _state.mode = MODE_DATA_RXUDP; |
gsfan | 8:64184a968e3b | 82 | break; |
gsfan | 8:64184a968e3b | 83 | case 'y': |
gsfan | 8:64184a968e3b | 84 | _state.mode = MODE_DATA_RXUDP_BULK; |
gsfan | 8:64184a968e3b | 85 | break; |
gsfan | 8:64184a968e3b | 86 | case 'Z': |
gsfan | 8:64184a968e3b | 87 | _state.mode = MODE_DATA_RX_BULK; |
gsfan | 8:64184a968e3b | 88 | break; |
gsfan | 8:64184a968e3b | 89 | case 'S': |
gsfan | 8:64184a968e3b | 90 | _state.mode = MODE_DATA_RX; |
gsfan | 8:64184a968e3b | 91 | break; |
gsfan | 8:64184a968e3b | 92 | case ':': |
gsfan | 8:64184a968e3b | 93 | _state.mode = MODE_DATA_RAW; |
gsfan | 8:64184a968e3b | 94 | break; |
gsfan | 8:64184a968e3b | 95 | case 'O': |
gsfan | 8:64184a968e3b | 96 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 97 | _state.ok = true; |
gsfan | 8:64184a968e3b | 98 | return; |
gsfan | 8:64184a968e3b | 99 | case 'F': |
gsfan | 8:64184a968e3b | 100 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 101 | _state.failure = true; |
gsfan | 8:64184a968e3b | 102 | return; |
gsfan | 8:64184a968e3b | 103 | default: |
gsfan | 8:64184a968e3b | 104 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 105 | return; |
gsfan | 8:64184a968e3b | 106 | } |
gsfan | 8:64184a968e3b | 107 | break; |
gsfan | 8:64184a968e3b | 108 | |
gsfan | 8:64184a968e3b | 109 | case MODE_DATA_RX: |
gsfan | 8:64184a968e3b | 110 | case MODE_DATA_RXUDP: |
gsfan | 8:64184a968e3b | 111 | switch (sub) { |
gsfan | 8:64184a968e3b | 112 | case 0: |
gsfan | 8:64184a968e3b | 113 | // cid |
gsfan | 11:71d67fea5ace | 114 | cid = x2i(c); |
gsfan | 8:64184a968e3b | 115 | sub ++; |
gsfan | 8:64184a968e3b | 116 | count = 0; |
gsfan | 8:64184a968e3b | 117 | if (_state.mode == MODE_DATA_RX) { |
gsfan | 8:64184a968e3b | 118 | sub = 3; |
gsfan | 8:64184a968e3b | 119 | } |
gsfan | 8:64184a968e3b | 120 | break; |
gsfan | 8:64184a968e3b | 121 | case 1: |
gsfan | 8:64184a968e3b | 122 | // ip |
gsfan | 8:64184a968e3b | 123 | if ((c >= '0' && c <= '9') || c == '.') { |
gsfan | 11:71d67fea5ace | 124 | _con[cid].ip[count] = c; |
gsfan | 8:64184a968e3b | 125 | count ++; |
gsfan | 8:64184a968e3b | 126 | } else { |
gsfan | 11:71d67fea5ace | 127 | _con[cid].ip[count] = 0; |
gsfan | 11:71d67fea5ace | 128 | _con[cid].port = 0; |
gsfan | 8:64184a968e3b | 129 | sub ++; |
gsfan | 8:64184a968e3b | 130 | } |
gsfan | 8:64184a968e3b | 131 | break; |
gsfan | 8:64184a968e3b | 132 | case 2: |
gsfan | 8:64184a968e3b | 133 | // port |
gsfan | 8:64184a968e3b | 134 | if (c >= '0' && c <= '9') { |
gsfan | 11:71d67fea5ace | 135 | _con[cid].port = (_con[cid].port * 10) + (c - '0'); |
gsfan | 8:64184a968e3b | 136 | } else { |
gsfan | 8:64184a968e3b | 137 | sub ++; |
gsfan | 8:64184a968e3b | 138 | count = 0; |
gsfan | 8:64184a968e3b | 139 | } |
gsfan | 8:64184a968e3b | 140 | break; |
gsfan | 8:64184a968e3b | 141 | default: |
gsfan | 8:64184a968e3b | 142 | // data |
gsfan | 8:64184a968e3b | 143 | if (_state.escape) { |
gsfan | 8:64184a968e3b | 144 | if (c == 'E') { |
gsfan | 11:71d67fea5ace | 145 | DBG("recv ascii %d %d/a\r\n", cid, count); |
gsfan | 11:71d67fea5ace | 146 | _con[cid].received = true; |
gsfan | 8:64184a968e3b | 147 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 148 | } else { |
gsfan | 11:71d67fea5ace | 149 | if (_con[cid].buf != NULL) { |
gsfan | 11:71d67fea5ace | 150 | _con[cid].buf->queue(0x1b); |
gsfan | 11:71d67fea5ace | 151 | _con[cid].buf->queue(c); |
gsfan | 8:64184a968e3b | 152 | } |
gsfan | 8:64184a968e3b | 153 | count += 2; |
gsfan | 8:64184a968e3b | 154 | } |
gsfan | 8:64184a968e3b | 155 | _state.escape = false; |
gsfan | 8:64184a968e3b | 156 | } else |
gsfan | 8:64184a968e3b | 157 | if (c == 0x1b) { |
gsfan | 8:64184a968e3b | 158 | _state.escape = true; |
gsfan | 8:64184a968e3b | 159 | } else { |
gsfan | 11:71d67fea5ace | 160 | if (_con[cid].buf != NULL) { |
gsfan | 11:71d67fea5ace | 161 | _con[cid].buf->queue(c); |
gsfan | 11:71d67fea5ace | 162 | if (_con[cid].buf->available() > CFG_DATA_SIZE - 16) { |
gsfan | 8:64184a968e3b | 163 | setRts(false); |
gsfan | 11:71d67fea5ace | 164 | _con[cid].received = true; |
gsfan | 12:057089026a20 | 165 | WARN("buf full"); |
gsfan | 8:64184a968e3b | 166 | } |
gsfan | 8:64184a968e3b | 167 | } |
gsfan | 8:64184a968e3b | 168 | count ++; |
gsfan | 8:64184a968e3b | 169 | } |
gsfan | 8:64184a968e3b | 170 | break; |
gsfan | 8:64184a968e3b | 171 | } |
gsfan | 8:64184a968e3b | 172 | break; |
gsfan | 8:64184a968e3b | 173 | |
gsfan | 8:64184a968e3b | 174 | case MODE_DATA_RX_BULK: |
gsfan | 8:64184a968e3b | 175 | case MODE_DATA_RXUDP_BULK: |
gsfan | 8:64184a968e3b | 176 | case MODE_DATA_RXHTTP: |
gsfan | 8:64184a968e3b | 177 | switch (sub) { |
gsfan | 8:64184a968e3b | 178 | case 0: |
gsfan | 8:64184a968e3b | 179 | // cid |
gsfan | 11:71d67fea5ace | 180 | cid = x2i(c); |
gsfan | 8:64184a968e3b | 181 | sub ++; |
gsfan | 8:64184a968e3b | 182 | len = 0; |
gsfan | 8:64184a968e3b | 183 | count = 0; |
gsfan | 12:057089026a20 | 184 | if (_state.mode != MODE_DATA_RXUDP_BULK) { |
gsfan | 8:64184a968e3b | 185 | sub = 3; |
gsfan | 8:64184a968e3b | 186 | } |
gsfan | 8:64184a968e3b | 187 | break; |
gsfan | 8:64184a968e3b | 188 | case 1: |
gsfan | 8:64184a968e3b | 189 | // ip |
gsfan | 8:64184a968e3b | 190 | if ((c >= '0' && c <= '9') || c == '.') { |
gsfan | 11:71d67fea5ace | 191 | _con[cid].ip[count] = c; |
gsfan | 8:64184a968e3b | 192 | count ++; |
gsfan | 8:64184a968e3b | 193 | } else { |
gsfan | 11:71d67fea5ace | 194 | _con[cid].ip[count] = 0; |
gsfan | 11:71d67fea5ace | 195 | _con[cid].port = 0; |
gsfan | 8:64184a968e3b | 196 | sub ++; |
gsfan | 8:64184a968e3b | 197 | } |
gsfan | 8:64184a968e3b | 198 | break; |
gsfan | 8:64184a968e3b | 199 | case 2: |
gsfan | 8:64184a968e3b | 200 | // port |
gsfan | 8:64184a968e3b | 201 | if (c >= '0' && c <= '9') { |
gsfan | 11:71d67fea5ace | 202 | _con[cid].port = (_con[cid].port * 10) + (c - '0'); |
gsfan | 8:64184a968e3b | 203 | } else { |
gsfan | 8:64184a968e3b | 204 | sub ++; |
gsfan | 8:64184a968e3b | 205 | count = 0; |
gsfan | 8:64184a968e3b | 206 | } |
gsfan | 8:64184a968e3b | 207 | break; |
gsfan | 8:64184a968e3b | 208 | case 3: |
gsfan | 8:64184a968e3b | 209 | // length |
gsfan | 8:64184a968e3b | 210 | len = (len * 10) + (c - '0'); |
gsfan | 8:64184a968e3b | 211 | count ++; |
gsfan | 8:64184a968e3b | 212 | if (count >= 4) { |
gsfan | 8:64184a968e3b | 213 | sub ++; |
gsfan | 8:64184a968e3b | 214 | count = 0; |
gsfan | 8:64184a968e3b | 215 | } |
gsfan | 8:64184a968e3b | 216 | break; |
gsfan | 8:64184a968e3b | 217 | default: |
gsfan | 8:64184a968e3b | 218 | // data |
gsfan | 12:057089026a20 | 219 | #ifdef CFG_ENABLE_HTTPD |
gsfan | 12:057089026a20 | 220 | if (_con[cid].protocol == PROTO_HTTPD) { |
gsfan | 12:057089026a20 | 221 | httpdRecvData(cid, c); |
gsfan | 12:057089026a20 | 222 | } else |
gsfan | 12:057089026a20 | 223 | #endif |
gsfan | 11:71d67fea5ace | 224 | if (_con[cid].buf != NULL) { |
gsfan | 11:71d67fea5ace | 225 | _con[cid].buf->queue(c); |
gsfan | 11:71d67fea5ace | 226 | if (_con[cid].buf->available() > CFG_DATA_SIZE - 16) { |
gsfan | 8:64184a968e3b | 227 | setRts(false); |
gsfan | 11:71d67fea5ace | 228 | _con[cid].received = true; |
gsfan | 12:057089026a20 | 229 | WARN("buf full"); |
gsfan | 8:64184a968e3b | 230 | } |
gsfan | 8:64184a968e3b | 231 | } |
gsfan | 8:64184a968e3b | 232 | count ++; |
gsfan | 8:64184a968e3b | 233 | if (count >= len) { |
gsfan | 11:71d67fea5ace | 234 | DBG("recv bulk %d %d/%d\r\n", cid, count, len); |
gsfan | 11:71d67fea5ace | 235 | _con[cid].received = true; |
gsfan | 8:64184a968e3b | 236 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 237 | } |
gsfan | 8:64184a968e3b | 238 | break; |
gsfan | 8:64184a968e3b | 239 | } |
gsfan | 8:64184a968e3b | 240 | break; |
gsfan | 8:64184a968e3b | 241 | } |
gsfan | 8:64184a968e3b | 242 | } |
gsfan | 8:64184a968e3b | 243 | |
gsfan | 12:057089026a20 | 244 | #define MSG_TABLE_NUM 15 |
gsfan | 12:057089026a20 | 245 | #define RES_TABLE_NUM 10 |
gsfan | 8:64184a968e3b | 246 | int GSwifi::parseMessage () { |
gsfan | 8:64184a968e3b | 247 | int i; |
gsfan | 8:64184a968e3b | 248 | char buf[256]; |
gsfan | 8:64184a968e3b | 249 | static const struct MSG_TABLE { |
gsfan | 8:64184a968e3b | 250 | const char msg[24]; |
gsfan | 8:64184a968e3b | 251 | void (GSwifi::*func)(const char*); |
gsfan | 8:64184a968e3b | 252 | } msg_table[MSG_TABLE_NUM] = { |
gsfan | 8:64184a968e3b | 253 | {"OK", &GSwifi::msgOk}, |
gsfan | 8:64184a968e3b | 254 | {"ERROR", &GSwifi::msgError}, |
gsfan | 8:64184a968e3b | 255 | {"INVALID INPUT", &GSwifi::msgError}, |
gsfan | 8:64184a968e3b | 256 | {"CONNECT ", &GSwifi::msgConnect}, |
gsfan | 8:64184a968e3b | 257 | {"DISCONNECT ", &GSwifi::msgDisconnect}, |
gsfan | 8:64184a968e3b | 258 | {"DISASSOCIATED", &GSwifi::msgDisassociated}, |
gsfan | 8:64184a968e3b | 259 | {"Disassociated", &GSwifi::msgDisassociated}, |
gsfan | 8:64184a968e3b | 260 | {"Disassociation Event", &GSwifi::msgDisassociated}, |
gsfan | 8:64184a968e3b | 261 | {"Serial2WiFi APP", &GSwifi::msgReset}, |
gsfan | 8:64184a968e3b | 262 | {"UnExpected Warm Boot", &GSwifi::msgReset}, |
gsfan | 8:64184a968e3b | 263 | {"APP Reset-APP SW Reset", &GSwifi::msgReset}, |
gsfan | 8:64184a968e3b | 264 | {"APP Reset-Wlan Except", &GSwifi::msgReset}, |
gsfan | 8:64184a968e3b | 265 | {"Out of StandBy-Timer", &GSwifi::msgOutofStandby}, |
gsfan | 8:64184a968e3b | 266 | {"Out of StandBy-Alarm", &GSwifi::msgOutofStandby}, |
gsfan | 8:64184a968e3b | 267 | {"Out of Deep Sleep", &GSwifi::msgOutofDeepsleep}, |
gsfan | 8:64184a968e3b | 268 | }; |
gsfan | 8:64184a968e3b | 269 | static const struct RES_TABLE { |
gsfan | 8:64184a968e3b | 270 | const Response res; |
gsfan | 8:64184a968e3b | 271 | void (GSwifi::*func)(const char*); |
gsfan | 8:64184a968e3b | 272 | } res_table[RES_TABLE_NUM] = { |
gsfan | 8:64184a968e3b | 273 | {RES_NULL, NULL}, |
gsfan | 8:64184a968e3b | 274 | {RES_CONNECT, &GSwifi::resConnect}, |
gsfan | 8:64184a968e3b | 275 | {RES_WPS, &GSwifi::resWps}, |
gsfan | 8:64184a968e3b | 276 | {RES_MACADDRESS, &GSwifi::resMacAddress}, |
gsfan | 8:64184a968e3b | 277 | {RES_DHCP, &GSwifi::resIp}, |
gsfan | 8:64184a968e3b | 278 | {RES_DNSLOOKUP, &GSwifi::resLookup}, |
gsfan | 12:057089026a20 | 279 | {RES_HTTP, &GSwifi::resHttp}, |
gsfan | 8:64184a968e3b | 280 | {RES_RSSI, &GSwifi::resRssi}, |
gsfan | 8:64184a968e3b | 281 | {RES_TIME, &GSwifi::resTime}, |
gsfan | 8:64184a968e3b | 282 | {RES_STATUS, &GSwifi::resStatus}, |
gsfan | 8:64184a968e3b | 283 | }; |
gsfan | 8:64184a968e3b | 284 | |
gsfan | 8:64184a968e3b | 285 | for (i = 0; i < sizeof(buf); i++) { |
gsfan | 8:64184a968e3b | 286 | if (_state.buf->dequeue(&buf[i]) == false) break; |
gsfan | 8:64184a968e3b | 287 | } |
gsfan | 8:64184a968e3b | 288 | buf[i] = 0; |
gsfan | 8:64184a968e3b | 289 | |
gsfan | 8:64184a968e3b | 290 | if (_state.res != RES_NULL) { |
gsfan | 8:64184a968e3b | 291 | for (i = 0; i < RES_TABLE_NUM; i ++) { |
gsfan | 8:64184a968e3b | 292 | if (res_table[i].res == _state.res) { |
gsfan | 8:64184a968e3b | 293 | DBG("parse res %d '%s'\r\n", i, buf); |
gsfan | 8:64184a968e3b | 294 | if (res_table[i].func != NULL) { |
gsfan | 8:64184a968e3b | 295 | (this->*(res_table[i].func))(buf); |
gsfan | 8:64184a968e3b | 296 | } |
gsfan | 8:64184a968e3b | 297 | } |
gsfan | 8:64184a968e3b | 298 | } |
gsfan | 8:64184a968e3b | 299 | } |
gsfan | 8:64184a968e3b | 300 | |
gsfan | 8:64184a968e3b | 301 | for (i = 0; i < MSG_TABLE_NUM; i ++) { |
gsfan | 8:64184a968e3b | 302 | if (strncmp(buf, msg_table[i].msg, strlen(msg_table[i].msg)) == 0) { |
gsfan | 8:64184a968e3b | 303 | DBG("parse msg %d '%s'\r\n", i, buf); |
gsfan | 8:64184a968e3b | 304 | if (msg_table[i].func != NULL) { |
gsfan | 8:64184a968e3b | 305 | (this->*(msg_table[i].func))(buf); |
gsfan | 8:64184a968e3b | 306 | } |
gsfan | 8:64184a968e3b | 307 | return 0; |
gsfan | 8:64184a968e3b | 308 | } |
gsfan | 8:64184a968e3b | 309 | } |
gsfan | 8:64184a968e3b | 310 | |
gsfan | 8:64184a968e3b | 311 | return -1; |
gsfan | 8:64184a968e3b | 312 | } |
gsfan | 8:64184a968e3b | 313 | |
gsfan | 8:64184a968e3b | 314 | void GSwifi::msgOk (const char *buf) { |
gsfan | 8:64184a968e3b | 315 | _state.ok = true; |
gsfan | 11:71d67fea5ace | 316 | if (_state.status == STAT_DEEPSLEEP) { |
gsfan | 11:71d67fea5ace | 317 | _state.status = STAT_READY; |
gsfan | 11:71d67fea5ace | 318 | } |
gsfan | 8:64184a968e3b | 319 | } |
gsfan | 8:64184a968e3b | 320 | |
gsfan | 8:64184a968e3b | 321 | void GSwifi::msgError (const char *buf) { |
gsfan | 8:64184a968e3b | 322 | _state.failure = true; |
gsfan | 8:64184a968e3b | 323 | } |
gsfan | 8:64184a968e3b | 324 | |
gsfan | 8:64184a968e3b | 325 | void GSwifi::msgConnect (const char *buf) { |
gsfan | 8:64184a968e3b | 326 | int i, count; |
gsfan | 11:71d67fea5ace | 327 | int cid, acid; |
gsfan | 8:64184a968e3b | 328 | |
gsfan | 8:64184a968e3b | 329 | if (buf[8] < '0' || buf[8] > 'F' || buf[9] != ' ') return; |
gsfan | 8:64184a968e3b | 330 | |
gsfan | 11:71d67fea5ace | 331 | cid = x2i(buf[8]); |
gsfan | 11:71d67fea5ace | 332 | acid = x2i(buf[10]); |
gsfan | 11:71d67fea5ace | 333 | DBG("forked %d -> %d\r\n", cid, acid); |
gsfan | 8:64184a968e3b | 334 | // ip |
gsfan | 8:64184a968e3b | 335 | count = 0; |
gsfan | 8:64184a968e3b | 336 | for (i = 12; i < strlen(buf); i ++) { |
gsfan | 8:64184a968e3b | 337 | if ((buf[i] >= '0' && buf[i] <= '9') || buf[i] == '.') { |
gsfan | 11:71d67fea5ace | 338 | _con[acid].ip[count] = buf[i]; |
gsfan | 8:64184a968e3b | 339 | count ++; |
gsfan | 8:64184a968e3b | 340 | } else { |
gsfan | 11:71d67fea5ace | 341 | _con[acid].ip[count] = 0; |
gsfan | 8:64184a968e3b | 342 | break; |
gsfan | 8:64184a968e3b | 343 | } |
gsfan | 8:64184a968e3b | 344 | } |
gsfan | 8:64184a968e3b | 345 | // port |
gsfan | 11:71d67fea5ace | 346 | _con[acid].port = 0; |
gsfan | 8:64184a968e3b | 347 | count = 0; |
gsfan | 8:64184a968e3b | 348 | for (; i < strlen(buf); i ++) { |
gsfan | 8:64184a968e3b | 349 | if (buf[i] >= '0' && buf[i] <= '9') { |
gsfan | 11:71d67fea5ace | 350 | _con[acid].port = (_con[acid].port * 10) + (buf[i] - '0'); |
gsfan | 8:64184a968e3b | 351 | } else { |
gsfan | 8:64184a968e3b | 352 | break; |
gsfan | 8:64184a968e3b | 353 | } |
gsfan | 8:64184a968e3b | 354 | } |
gsfan | 8:64184a968e3b | 355 | |
gsfan | 12:057089026a20 | 356 | // initialize |
gsfan | 12:057089026a20 | 357 | initCon(acid, true); |
gsfan | 11:71d67fea5ace | 358 | _con[acid].protocol = _con[cid].protocol; |
gsfan | 11:71d67fea5ace | 359 | _con[acid].type = _con[cid].type; |
gsfan | 11:71d67fea5ace | 360 | _con[acid].parent = cid; |
gsfan | 12:057089026a20 | 361 | _con[acid].func = _con[cid].func; |
gsfan | 11:71d67fea5ace | 362 | _con[acid].accept = true; |
gsfan | 8:64184a968e3b | 363 | } |
gsfan | 8:64184a968e3b | 364 | |
gsfan | 8:64184a968e3b | 365 | void GSwifi::msgDisconnect (const char *buf) { |
gsfan | 8:64184a968e3b | 366 | int cid; |
gsfan | 8:64184a968e3b | 367 | |
gsfan | 8:64184a968e3b | 368 | if (buf[11] < '0' || buf[11] > 'F') return; |
gsfan | 8:64184a968e3b | 369 | |
gsfan | 8:64184a968e3b | 370 | cid = x2i(buf[11]); |
gsfan | 8:64184a968e3b | 371 | DBG("disconnect %d\r\n", cid); |
gsfan | 8:64184a968e3b | 372 | _con[cid].connected = false; |
gsfan | 8:64184a968e3b | 373 | } |
gsfan | 8:64184a968e3b | 374 | |
gsfan | 8:64184a968e3b | 375 | void GSwifi::msgDisassociated (const char *buf) { |
gsfan | 8:64184a968e3b | 376 | int i; |
gsfan | 8:64184a968e3b | 377 | DBG("disassociate\r\n"); |
gsfan | 8:64184a968e3b | 378 | _state.associated = false; |
gsfan | 8:64184a968e3b | 379 | for (i = 0; i < 16; i ++) { |
gsfan | 8:64184a968e3b | 380 | _con[i].connected = false; |
gsfan | 8:64184a968e3b | 381 | } |
gsfan | 11:71d67fea5ace | 382 | #ifdef CFG_ENABLE_RTOS |
gsfan | 8:64184a968e3b | 383 | if (_threadPoll) |
gsfan | 8:64184a968e3b | 384 | _threadPoll->signal_set(1); |
gsfan | 8:64184a968e3b | 385 | #endif |
gsfan | 8:64184a968e3b | 386 | } |
gsfan | 8:64184a968e3b | 387 | |
gsfan | 8:64184a968e3b | 388 | void GSwifi::msgReset (const char *buf) { |
gsfan | 11:71d67fea5ace | 389 | DBG("reset\r\n"); |
gsfan | 11:71d67fea5ace | 390 | _state.initialized = false; |
gsfan | 8:64184a968e3b | 391 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 392 | _state.status = STAT_READY; |
gsfan | 8:64184a968e3b | 393 | msgDisassociated(NULL); |
gsfan | 11:71d67fea5ace | 394 | clearFlags(); |
gsfan | 11:71d67fea5ace | 395 | #ifdef CFG_ENABLE_RTOS |
gsfan | 11:71d67fea5ace | 396 | if (_threadPoll) { |
gsfan | 11:71d67fea5ace | 397 | _threadPoll->terminate(); |
gsfan | 11:71d67fea5ace | 398 | delete _threadPoll; |
gsfan | 11:71d67fea5ace | 399 | } |
gsfan | 11:71d67fea5ace | 400 | #endif |
gsfan | 8:64184a968e3b | 401 | } |
gsfan | 8:64184a968e3b | 402 | |
gsfan | 8:64184a968e3b | 403 | void GSwifi::msgOutofStandby (const char *buf) { |
gsfan | 11:71d67fea5ace | 404 | DBG("OutofStandby\r\n"); |
gsfan | 8:64184a968e3b | 405 | _state.status = STAT_WAKEUP; |
gsfan | 8:64184a968e3b | 406 | } |
gsfan | 8:64184a968e3b | 407 | |
gsfan | 8:64184a968e3b | 408 | void GSwifi::msgOutofDeepsleep (const char *buf) { |
gsfan | 11:71d67fea5ace | 409 | DBG("OutofDeepsleep\r\n"); |
gsfan | 8:64184a968e3b | 410 | _state.status = STAT_READY; |
gsfan | 8:64184a968e3b | 411 | } |
gsfan | 8:64184a968e3b | 412 | |
gsfan | 8:64184a968e3b | 413 | void GSwifi::resConnect (const char *buf) { |
gsfan | 11:71d67fea5ace | 414 | int cid; |
gsfan | 11:71d67fea5ace | 415 | |
gsfan | 11:71d67fea5ace | 416 | // udp/tcp listen socket |
gsfan | 8:64184a968e3b | 417 | if (strncmp(buf, "CONNECT ", 8) == 0 && buf[9] == 0) { |
gsfan | 11:71d67fea5ace | 418 | cid = x2i(buf[8]); |
gsfan | 11:71d67fea5ace | 419 | DBG("connect %d\r\n", cid); |
gsfan | 12:057089026a20 | 420 | // initialize |
gsfan | 12:057089026a20 | 421 | initCon(cid, true); |
gsfan | 11:71d67fea5ace | 422 | _state.cid = cid; |
gsfan | 8:64184a968e3b | 423 | _state.res = RES_NULL; |
gsfan | 8:64184a968e3b | 424 | } |
gsfan | 8:64184a968e3b | 425 | } |
gsfan | 8:64184a968e3b | 426 | |
gsfan | 8:64184a968e3b | 427 | void GSwifi::resWps (const char *buf) { |
gsfan | 8:64184a968e3b | 428 | if (_state.n == 0 && strncmp(buf, "SSID", 4) == 0) { |
gsfan | 8:64184a968e3b | 429 | strncpy(_state.ssid, &buf[5], sizeof(_state.ssid)); |
gsfan | 8:64184a968e3b | 430 | _state.n ++; |
gsfan | 8:64184a968e3b | 431 | } else |
gsfan | 8:64184a968e3b | 432 | if (_state.n == 1 && strncmp(buf, "CHANNEL", 7) == 0) { |
gsfan | 8:64184a968e3b | 433 | _state.n ++; |
gsfan | 8:64184a968e3b | 434 | } else |
gsfan | 8:64184a968e3b | 435 | if (_state.n == 2 && strncmp(buf, "PASSPHRASE", 10) == 0) { |
gsfan | 8:64184a968e3b | 436 | strncpy(_state.pass, &buf[11], sizeof(_state.pass)); |
gsfan | 8:64184a968e3b | 437 | _state.n ++; |
gsfan | 8:64184a968e3b | 438 | _state.res = RES_NULL; |
gsfan | 11:71d67fea5ace | 439 | DBG("wps %s %s\r\n", _state.ssid, _state.pass); |
gsfan | 8:64184a968e3b | 440 | } |
gsfan | 8:64184a968e3b | 441 | } |
gsfan | 8:64184a968e3b | 442 | |
gsfan | 8:64184a968e3b | 443 | void GSwifi::resMacAddress (const char *buf) { |
gsfan | 8:64184a968e3b | 444 | if (buf[2] == ':' && buf[5] == ':') { |
gsfan | 8:64184a968e3b | 445 | strncpy(_state.mac, buf, sizeof(_state.mac)); |
gsfan | 8:64184a968e3b | 446 | _state.mac[17] = 0; |
gsfan | 8:64184a968e3b | 447 | _state.res = RES_NULL; |
gsfan | 11:71d67fea5ace | 448 | DBG("mac %s\r\n", _state.mac); |
gsfan | 8:64184a968e3b | 449 | } |
gsfan | 8:64184a968e3b | 450 | } |
gsfan | 8:64184a968e3b | 451 | |
gsfan | 8:64184a968e3b | 452 | void GSwifi::resIp (const char *buf) { |
gsfan | 8:64184a968e3b | 453 | const char *tmp, *tmp2; |
gsfan | 8:64184a968e3b | 454 | |
gsfan | 8:64184a968e3b | 455 | if (_state.n == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) { |
gsfan | 8:64184a968e3b | 456 | _state.n ++; |
gsfan | 8:64184a968e3b | 457 | } else |
gsfan | 8:64184a968e3b | 458 | if (_state.n == 1) { |
gsfan | 8:64184a968e3b | 459 | tmp = buf + 1; |
gsfan | 8:64184a968e3b | 460 | tmp2 = strstr(tmp, ":"); |
gsfan | 8:64184a968e3b | 461 | strncpy(_state.ip, tmp, tmp2 - tmp); |
gsfan | 8:64184a968e3b | 462 | tmp = tmp2 + 2; |
gsfan | 8:64184a968e3b | 463 | tmp2 = strstr(tmp, ":"); |
gsfan | 8:64184a968e3b | 464 | strncpy(_state.netmask, tmp, tmp2 - tmp); |
gsfan | 8:64184a968e3b | 465 | tmp = tmp2 + 2; |
gsfan | 8:64184a968e3b | 466 | strncpy(_state.gateway, tmp, sizeof(_state.gateway)); |
gsfan | 8:64184a968e3b | 467 | _state.n ++; |
gsfan | 8:64184a968e3b | 468 | _state.res = RES_NULL; |
gsfan | 8:64184a968e3b | 469 | DBG("ip: %s\r\nnetmask: %s\r\ngateway: %s", _state.ip, _state.netmask, _state.gateway); |
gsfan | 8:64184a968e3b | 470 | } |
gsfan | 8:64184a968e3b | 471 | } |
gsfan | 8:64184a968e3b | 472 | |
gsfan | 8:64184a968e3b | 473 | void GSwifi::resLookup (const char *buf) { |
gsfan | 8:64184a968e3b | 474 | if (strncmp(buf, "IP:", 3) == 0) { |
gsfan | 8:64184a968e3b | 475 | strncpy(_state.resolv, &buf[3], sizeof(_state.resolv)); |
gsfan | 8:64184a968e3b | 476 | _state.res = RES_NULL; |
gsfan | 11:71d67fea5ace | 477 | DBG("resolv: %s\r\n", _state.resolv); |
gsfan | 8:64184a968e3b | 478 | } |
gsfan | 8:64184a968e3b | 479 | } |
gsfan | 8:64184a968e3b | 480 | |
gsfan | 8:64184a968e3b | 481 | void GSwifi::resRssi (const char *buf) { |
gsfan | 8:64184a968e3b | 482 | if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) { |
gsfan | 8:64184a968e3b | 483 | _state.rssi = atoi(buf); |
gsfan | 8:64184a968e3b | 484 | _state.res = RES_NULL; |
gsfan | 11:71d67fea5ace | 485 | DBG("rssi: %d\r\n", _state.rssi); |
gsfan | 8:64184a968e3b | 486 | } |
gsfan | 8:64184a968e3b | 487 | } |
gsfan | 8:64184a968e3b | 488 | |
gsfan | 8:64184a968e3b | 489 | void GSwifi::resTime (const char *buf) { |
gsfan | 8:64184a968e3b | 490 | int year, month, day, hour, min, sec; |
gsfan | 8:64184a968e3b | 491 | struct tm t; |
gsfan | 8:64184a968e3b | 492 | if (buf[0] >= '0' && buf[0] <= '9') { |
gsfan | 8:64184a968e3b | 493 | sscanf(buf, "%d/%d/%d,%d:%d:%d", &day, &month, &year, &hour, &min, &sec); |
gsfan | 8:64184a968e3b | 494 | t.tm_sec = sec; |
gsfan | 8:64184a968e3b | 495 | t.tm_min = min; |
gsfan | 8:64184a968e3b | 496 | t.tm_hour = hour; |
gsfan | 8:64184a968e3b | 497 | t.tm_mday = day; |
gsfan | 8:64184a968e3b | 498 | t.tm_mon = month - 1; |
gsfan | 8:64184a968e3b | 499 | t.tm_year = year - 1900; |
gsfan | 8:64184a968e3b | 500 | _state.time = mktime(&t); |
gsfan | 8:64184a968e3b | 501 | _state.res = RES_NULL; |
gsfan | 8:64184a968e3b | 502 | } |
gsfan | 8:64184a968e3b | 503 | } |
gsfan | 8:64184a968e3b | 504 | |
gsfan | 8:64184a968e3b | 505 | void GSwifi::resChannel (const char *buf) { |
gsfan | 8:64184a968e3b | 506 | } |
gsfan | 8:64184a968e3b | 507 | |
gsfan | 8:64184a968e3b | 508 | void GSwifi::resStatus (const char *buf) { |
gsfan | 8:64184a968e3b | 509 | if (_state.n == 0 && strncmp(buf, "NOT ASSOCIATED", 14) == 0) { |
gsfan | 8:64184a968e3b | 510 | msgDisassociated(NULL); |
gsfan | 8:64184a968e3b | 511 | _state.res = RES_NULL; |
gsfan | 8:64184a968e3b | 512 | } |
gsfan | 8:64184a968e3b | 513 | |
gsfan | 8:64184a968e3b | 514 | if (_state.n == 0 && strncmp(buf, "MODE:", 5) == 0) { |
gsfan | 8:64184a968e3b | 515 | _state.n ++; |
gsfan | 8:64184a968e3b | 516 | } else |
gsfan | 8:64184a968e3b | 517 | if (_state.n == 1 && strncmp(buf, "BSSID:", 6) == 0) { |
gsfan | 8:64184a968e3b | 518 | const char *tmp = strstr(buf, "SECURITY:") + 2; |
gsfan | 8:64184a968e3b | 519 | if (strncmp(tmp, "WEP (OPEN)", 10) == NULL) { |
gsfan | 8:64184a968e3b | 520 | _state.sec = SEC_OPEN; |
gsfan | 8:64184a968e3b | 521 | } else |
gsfan | 8:64184a968e3b | 522 | if (strncmp(tmp, "WEP (SHARED)", 12) == NULL) { |
gsfan | 8:64184a968e3b | 523 | _state.sec = SEC_WEP; |
gsfan | 8:64184a968e3b | 524 | } else |
gsfan | 8:64184a968e3b | 525 | if (strncmp(tmp, "WPA-PERSONAL", 12) == NULL) { |
gsfan | 8:64184a968e3b | 526 | _state.sec = SEC_WPA_PSK; |
gsfan | 8:64184a968e3b | 527 | } else |
gsfan | 8:64184a968e3b | 528 | if (strncmp(tmp, "WPA2-PERSONAL", 13) == NULL) { |
gsfan | 8:64184a968e3b | 529 | _state.sec = SEC_WPA2_PSK; |
gsfan | 8:64184a968e3b | 530 | } |
gsfan | 8:64184a968e3b | 531 | _state.res = RES_NULL; |
gsfan | 8:64184a968e3b | 532 | } |
gsfan | 8:64184a968e3b | 533 | } |
gsfan | 12:057089026a20 | 534 | |
gsfan | 12:057089026a20 | 535 | void GSwifi::resHttp (const char *buf) { |
gsfan | 12:057089026a20 | 536 | int cid; |
gsfan | 12:057089026a20 | 537 | |
gsfan | 12:057089026a20 | 538 | // http client socket |
gsfan | 12:057089026a20 | 539 | if (buf[0] >= '0' && buf[0] <= 'F' && buf[1] == 0) { |
gsfan | 12:057089026a20 | 540 | cid = x2i(buf[0]); |
gsfan | 12:057089026a20 | 541 | DBG("connect %d\r\n", cid); |
gsfan | 12:057089026a20 | 542 | // initialize |
gsfan | 12:057089026a20 | 543 | initCon(cid, true); |
gsfan | 12:057089026a20 | 544 | _state.cid = cid; |
gsfan | 12:057089026a20 | 545 | _state.res = RES_NULL; |
gsfan | 12:057089026a20 | 546 | } |
gsfan | 12:057089026a20 | 547 | } |