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:
21:6431364fc667
UART Command and SPI Data supported.; bug fix.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 22:d25a5a0d2497 1 /* Copyright (C) 2019 gsfan, MIT License
gsfan 5:78943b3945b5 2 *
gsfan 5:78943b3945b5 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gsfan 5:78943b3945b5 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
gsfan 5:78943b3945b5 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
gsfan 5:78943b3945b5 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
gsfan 5:78943b3945b5 7 * furnished to do so, subject to the following conditions:
gsfan 5:78943b3945b5 8 *
gsfan 5:78943b3945b5 9 * The above copyright notice and this permission notice shall be included in all copies or
gsfan 5:78943b3945b5 10 * substantial portions of the Software.
gsfan 5:78943b3945b5 11 *
gsfan 5:78943b3945b5 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gsfan 5:78943b3945b5 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gsfan 5:78943b3945b5 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gsfan 5:78943b3945b5 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gsfan 5:78943b3945b5 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gsfan 5:78943b3945b5 17 */
gsfan 5:78943b3945b5 18
gsfan 5:78943b3945b5 19 #include "mbed.h"
gsfan 5:78943b3945b5 20 #include "GSwifi.h"
gsfan 5:78943b3945b5 21 #include <string>
gsfan 5:78943b3945b5 22 #include <algorithm>
gsfan 5:78943b3945b5 23
gsfan 5:78943b3945b5 24 GSwifi * GSwifi::_inst;
gsfan 5:78943b3945b5 25
gsfan 22:d25a5a0d2497 26 #ifdef CFG_SPI_DATAINTERFACE
gsfan 22:d25a5a0d2497 27 GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset,
gsfan 22:d25a5a0d2497 28 PinName mosi, PinName miso, PinName sclk, PinName cs, PinName wake,
gsfan 22:d25a5a0d2497 29 PinName alarm, int baud, int freq):
gsfan 22:d25a5a0d2497 30 _gs(tx, rx), _spi(mosi, miso, sclk), _wake(wake), _reset(reset)
gsfan 22:d25a5a0d2497 31 #else
gsfan 8:64184a968e3b 32 GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud):
gsfan 8:64184a968e3b 33 _gs(tx, rx), _reset(reset)
gsfan 22:d25a5a0d2497 34 #endif
gsfan 5:78943b3945b5 35 {
gsfan 8:64184a968e3b 36 _inst = this;
gsfan 5:78943b3945b5 37 memset(&_state, 0, sizeof(_state));
gsfan 5:78943b3945b5 38 memset(&_con, 0, sizeof(_con));
gsfan 11:71d67fea5ace 39 _state.initialized = false;
gsfan 22:d25a5a0d2497 40 _state.datainterface = false;
gsfan 11:71d67fea5ace 41 _state.status = STAT_READY;
gsfan 8:64184a968e3b 42 _state.cid = -1;
gsfan 19:d035412a7803 43 #ifdef CFG_EXTENDED_MEMORY1
gsfan 19:d035412a7803 44 int n = CFG_EXTENDED_SIZE1 / (CFG_MAX_SOCKETS + 1);
gsfan 20:9bfb8a13010c 45 _state.buf = new CircBuffer<char>(n - 1, (void*)CFG_EXTENDED_MEMORY1);
gsfan 19:d035412a7803 46 #ifdef CFG_ENABLE_RTOS
gsfan 19:d035412a7803 47 for (int i = 0; i < CFG_MAX_SOCKETS; i ++) {
gsfan 20:9bfb8a13010c 48 _con[i].buf = new CircBuffer<char>(n - 1, (void*)(CFG_EXTENDED_MEMORY1 + (n * (i + 1))));
gsfan 19:d035412a7803 49 if (_con[i].buf == NULL)
gsfan 19:d035412a7803 50 error("CircBuffer failed");
gsfan 19:d035412a7803 51 }
gsfan 19:d035412a7803 52 _threadPoll = NULL;
gsfan 19:d035412a7803 53 #endif
gsfan 19:d035412a7803 54 #else // CFG_EXTENDED_MEMORY
gsfan 8:64184a968e3b 55 _state.buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 11:71d67fea5ace 56 #ifdef CFG_ENABLE_RTOS
gsfan 16:105b56570533 57 for (int i = 0; i < CFG_MAX_SOCKETS; i ++) {
gsfan 8:64184a968e3b 58 _con[i].buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 11:71d67fea5ace 59 if (_con[i].buf == NULL)
gsfan 11:71d67fea5ace 60 error("CircBuffer failed");
gsfan 5:78943b3945b5 61 }
gsfan 8:64184a968e3b 62 _threadPoll = NULL;
gsfan 5:78943b3945b5 63 #endif
gsfan 19:d035412a7803 64 #endif // CFG_EXTENDED_MEMORY
gsfan 8:64184a968e3b 65
gsfan 8:64184a968e3b 66 setReset(true);
gsfan 8:64184a968e3b 67 initUart(cts, rts, alarm, baud);
gsfan 22:d25a5a0d2497 68 #ifdef CFG_SPI_DATAINTERFACE
gsfan 22:d25a5a0d2497 69 initSpi (cs, freq);
gsfan 22:d25a5a0d2497 70 #endif
gsfan 8:64184a968e3b 71 setAlarm(true);
gsfan 8:64184a968e3b 72 wait_ms(10);
gsfan 8:64184a968e3b 73 setAlarm(false);
gsfan 8:64184a968e3b 74 wait_ms(100);
gsfan 8:64184a968e3b 75 setReset(false);
gsfan 8:64184a968e3b 76 wait_ms(100);
gsfan 5:78943b3945b5 77 }
gsfan 5:78943b3945b5 78
gsfan 11:71d67fea5ace 79 int GSwifi::join()
gsfan 5:78943b3945b5 80 {
gsfan 11:71d67fea5ace 81 int i;
gsfan 8:64184a968e3b 82 bool r = -1;
gsfan 5:78943b3945b5 83
gsfan 8:64184a968e3b 84 _state.wm = WM_INFRASTRUCTURE;
gsfan 11:71d67fea5ace 85 _state.initialized = true;
gsfan 8:64184a968e3b 86 if (!strlen(_state.name)) {
gsfan 8:64184a968e3b 87 strncpy(_state.name, CFG_DHCPNAME, sizeof(_state.name));
gsfan 8:64184a968e3b 88 }
gsfan 22:d25a5a0d2497 89 #ifdef CFG_SPI_DATAINTERFACE
gsfan 22:d25a5a0d2497 90 // if (strstr(
gsfan 22:d25a5a0d2497 91 #endif
gsfan 8:64184a968e3b 92 clearFlags();
gsfan 22:d25a5a0d2497 93 _state.buf->flush();
gsfan 12:057089026a20 94 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 95 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 96 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 97 if (_flow) {
gsfan 8:64184a968e3b 98 cmdR(true);
gsfan 8:64184a968e3b 99 }
gsfan 8:64184a968e3b 100 cmdBDATA(true);
gsfan 8:64184a968e3b 101 if (cmdNMAC()) return -1;
gsfan 13:189e04ac70bd 102 cmdWREGDOMAIN(CFG_WREGDOMAIN);
gsfan 8:64184a968e3b 103 cmdWM(0); // infrastructure
gsfan 5:78943b3945b5 104 wait_ms(100);
gsfan 5:78943b3945b5 105
gsfan 11:71d67fea5ace 106 switch (_state.sec) {
gsfan 5:78943b3945b5 107 case SEC_NONE:
gsfan 5:78943b3945b5 108 case SEC_OPEN:
gsfan 5:78943b3945b5 109 case SEC_WEP:
gsfan 13:189e04ac70bd 110 cmdNDHCP(_state.dhcp, _state.name, DEFAULT_WAIT_RESP_TIMEOUT);
gsfan 15:086d1a33a197 111 if (! _state.dhcp) {
gsfan 15:086d1a33a197 112 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 15:086d1a33a197 113 }
gsfan 8:64184a968e3b 114 cmdWAUTH(_state.sec);
gsfan 11:71d67fea5ace 115 if (_state.sec != SEC_NONE) {
gsfan 8:64184a968e3b 116 cmdWWEP(1, _state.pass);
gsfan 5:78943b3945b5 117 wait_ms(100);
gsfan 5:78943b3945b5 118 }
gsfan 11:71d67fea5ace 119 for (i = 0; i < CFG_TRYJOIN; i ++) {
gsfan 11:71d67fea5ace 120 r = cmdWA(_state.ssid);
gsfan 11:71d67fea5ace 121 if (!r) break;
gsfan 8:64184a968e3b 122 DBG("retry\r\n");
gsfan 8:64184a968e3b 123 wait_ms(1000);
gsfan 5:78943b3945b5 124 }
gsfan 5:78943b3945b5 125 break;
gsfan 5:78943b3945b5 126 case SEC_WPA_PSK:
gsfan 5:78943b3945b5 127 case SEC_WPA2_PSK:
gsfan 13:189e04ac70bd 128 cmdNDHCP(_state.dhcp, _state.name, DEFAULT_WAIT_RESP_TIMEOUT);
gsfan 15:086d1a33a197 129 if (! _state.dhcp) {
gsfan 15:086d1a33a197 130 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 15:086d1a33a197 131 }
gsfan 8:64184a968e3b 132 cmdWAUTH(0);
gsfan 8:64184a968e3b 133 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 5:78943b3945b5 134 wait_ms(100);
gsfan 11:71d67fea5ace 135 for (i = 0; i < CFG_TRYJOIN; i ++) {
gsfan 11:71d67fea5ace 136 r = cmdWA(_state.ssid);
gsfan 11:71d67fea5ace 137 if (!r) break;
gsfan 8:64184a968e3b 138 DBG("retry\r\n");
gsfan 8:64184a968e3b 139 wait_ms(1000);
gsfan 17:c30ed7b1536d 140
gsfan 17:c30ed7b1536d 141 if (_state.dhcp && i == CFG_TRYJOIN - 1) {
gsfan 17:c30ed7b1536d 142 cmdNDHCP(0, NULL, DEFAULT_WAIT_RESP_TIMEOUT);
gsfan 17:c30ed7b1536d 143 r = cmdWA(_state.ssid);
gsfan 17:c30ed7b1536d 144 if (!r && _state.dhcp) {
gsfan 17:c30ed7b1536d 145 wait_ms(1000);
gsfan 17:c30ed7b1536d 146 r = cmdNDHCP(_state.dhcp, NULL, CFG_TIMEOUT);
gsfan 17:c30ed7b1536d 147 }
gsfan 17:c30ed7b1536d 148 break;
gsfan 17:c30ed7b1536d 149 }
gsfan 5:78943b3945b5 150 }
gsfan 5:78943b3945b5 151 break;
gsfan 8:64184a968e3b 152 case SEC_WPA_ENT:
gsfan 8:64184a968e3b 153 case SEC_WPA2_ENT:
gsfan 8:64184a968e3b 154 cmdWAUTH(0);
gsfan 8:64184a968e3b 155 DBG("Can't support security\r\n");
gsfan 8:64184a968e3b 156 break;
gsfan 5:78943b3945b5 157 case SEC_WPS_BUTTON:
gsfan 8:64184a968e3b 158 cmdNDHCP(false);
gsfan 15:086d1a33a197 159 if (! _state.dhcp) {
gsfan 15:086d1a33a197 160 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 15:086d1a33a197 161 }
gsfan 8:64184a968e3b 162 cmdWAUTH(0);
gsfan 8:64184a968e3b 163 r = cmdWWPS(true);
gsfan 8:64184a968e3b 164 if (r) break;
gsfan 8:64184a968e3b 165 if (_state.dhcp) {
gsfan 8:64184a968e3b 166 r = cmdNDHCP(_state.dhcp, _state.name);
gsfan 5:78943b3945b5 167 }
gsfan 8:64184a968e3b 168 cmdWSTATUS();
gsfan 8:64184a968e3b 169 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 8:64184a968e3b 170 break;
gsfan 8:64184a968e3b 171 case SEC_WPS_PIN:
gsfan 8:64184a968e3b 172 cmdNDHCP(false);
gsfan 15:086d1a33a197 173 if (! _state.dhcp) {
gsfan 15:086d1a33a197 174 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 15:086d1a33a197 175 }
gsfan 8:64184a968e3b 176 cmdWAUTH(0);
gsfan 8:64184a968e3b 177 r = cmdWWPS(true, _state.pass);
gsfan 8:64184a968e3b 178 if (r) break;
gsfan 8:64184a968e3b 179 if (_state.dhcp) {
gsfan 8:64184a968e3b 180 r = cmdNDHCP(_state.dhcp, _state.name);
gsfan 5:78943b3945b5 181 }
gsfan 8:64184a968e3b 182 cmdWSTATUS();
gsfan 8:64184a968e3b 183 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 5:78943b3945b5 184 break;
gsfan 5:78943b3945b5 185 default:
gsfan 5:78943b3945b5 186 DBG("Can't use security\r\n");
gsfan 5:78943b3945b5 187 break;
gsfan 5:78943b3945b5 188 }
gsfan 5:78943b3945b5 189
gsfan 8:64184a968e3b 190 if (!r) {
gsfan 11:71d67fea5ace 191 // connected
gsfan 8:64184a968e3b 192 if (! _state.dhcp) {
gsfan 8:64184a968e3b 193 cmdDNSSET(_state.nameserver);
gsfan 5:78943b3945b5 194 }
gsfan 5:78943b3945b5 195 _state.associated = true;
gsfan 11:71d67fea5ace 196 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 197 _threadPoll = new Thread(&threadPoll);
gsfan 8:64184a968e3b 198 // _threadPoll = new Thread(&threadPoll, NULL, osPriorityLow);
gsfan 8:64184a968e3b 199 #endif
gsfan 5:78943b3945b5 200 }
gsfan 5:78943b3945b5 201 return r;
gsfan 5:78943b3945b5 202 }
gsfan 5:78943b3945b5 203
gsfan 11:71d67fea5ace 204 int GSwifi::adhock ()
gsfan 5:78943b3945b5 205 {
gsfan 8:64184a968e3b 206 bool r = -1;
gsfan 5:78943b3945b5 207
gsfan 8:64184a968e3b 208 _state.wm = WM_ADHOCK;
gsfan 11:71d67fea5ace 209 _state.initialized = true;
gsfan 8:64184a968e3b 210 clearFlags();
gsfan 22:d25a5a0d2497 211 _state.buf->flush();
gsfan 12:057089026a20 212 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 213 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 214 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 215 if (_flow) {
gsfan 8:64184a968e3b 216 cmdR(true);
gsfan 5:78943b3945b5 217 }
gsfan 8:64184a968e3b 218 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 219 cmdBDATA(true);
gsfan 13:189e04ac70bd 220 cmdWREGDOMAIN(CFG_WREGDOMAIN);
gsfan 8:64184a968e3b 221 cmdWM(1); // adhock
gsfan 8:64184a968e3b 222 wait_ms(100);
gsfan 8:64184a968e3b 223
gsfan 8:64184a968e3b 224 cmdNDHCP(false);
gsfan 8:64184a968e3b 225 if (! _state.dhcp) {
gsfan 8:64184a968e3b 226 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 5:78943b3945b5 227 }
gsfan 5:78943b3945b5 228
gsfan 11:71d67fea5ace 229 switch (_state.sec) {
gsfan 8:64184a968e3b 230 case SEC_NONE:
gsfan 8:64184a968e3b 231 case SEC_OPEN:
gsfan 8:64184a968e3b 232 case SEC_WEP:
gsfan 8:64184a968e3b 233 cmdWAUTH(_state.sec);
gsfan 11:71d67fea5ace 234 if (_state.sec != SEC_NONE) {
gsfan 8:64184a968e3b 235 cmdWWEP(1, _state.pass);
gsfan 8:64184a968e3b 236 wait_ms(100);
gsfan 8:64184a968e3b 237 }
gsfan 8:64184a968e3b 238 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 239 break;
gsfan 8:64184a968e3b 240 default:
gsfan 8:64184a968e3b 241 DBG("Can't use security\r\n");
gsfan 8:64184a968e3b 242 break;
gsfan 5:78943b3945b5 243 }
gsfan 5:78943b3945b5 244
gsfan 8:64184a968e3b 245 if (!r) {
gsfan 11:71d67fea5ace 246 // connected
gsfan 8:64184a968e3b 247 _state.associated = true;
gsfan 8:64184a968e3b 248 }
gsfan 8:64184a968e3b 249 return r;
gsfan 5:78943b3945b5 250 }
gsfan 5:78943b3945b5 251
gsfan 11:71d67fea5ace 252 int GSwifi::limitedap ()
gsfan 5:78943b3945b5 253 {
gsfan 8:64184a968e3b 254 bool r = -1;
gsfan 8:64184a968e3b 255
gsfan 8:64184a968e3b 256 _state.wm = WM_LIMITEDAP;
gsfan 11:71d67fea5ace 257 _state.initialized = true;
gsfan 8:64184a968e3b 258 if (!strlen(_state.name)) {
gsfan 8:64184a968e3b 259 strncpy(_state.name, CFG_DNSNAME, sizeof(_state.name));
gsfan 8:64184a968e3b 260 }
gsfan 8:64184a968e3b 261 clearFlags();
gsfan 22:d25a5a0d2497 262 _state.buf->flush();
gsfan 12:057089026a20 263 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 264 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 265 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 266 if (_flow) {
gsfan 8:64184a968e3b 267 cmdR(true);
gsfan 8:64184a968e3b 268 }
gsfan 8:64184a968e3b 269 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 270 cmdBDATA(true);
gsfan 13:189e04ac70bd 271 cmdWREGDOMAIN(CFG_WREGDOMAIN);
gsfan 8:64184a968e3b 272 cmdWM(2); // limitedap
gsfan 8:64184a968e3b 273 wait_ms(100);
gsfan 8:64184a968e3b 274
gsfan 8:64184a968e3b 275 cmdNDHCP(false);
gsfan 8:64184a968e3b 276 if (! _state.dhcp) {
gsfan 8:64184a968e3b 277 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 8:64184a968e3b 278 cmdDNSSET(_state.ip);
gsfan 5:78943b3945b5 279 }
gsfan 8:64184a968e3b 280 cmdDHCPSRVR(true);
gsfan 8:64184a968e3b 281 cmdDNS(true, _state.name);
gsfan 8:64184a968e3b 282
gsfan 11:71d67fea5ace 283 switch (_state.sec) {
gsfan 8:64184a968e3b 284 case SEC_NONE:
gsfan 8:64184a968e3b 285 case SEC_OPEN:
gsfan 8:64184a968e3b 286 case SEC_WEP:
gsfan 8:64184a968e3b 287 cmdWAUTH(_state.sec);
gsfan 11:71d67fea5ace 288 if (_state.sec != SEC_NONE) {
gsfan 8:64184a968e3b 289 cmdWWEP(1, _state.pass);
gsfan 8:64184a968e3b 290 wait_ms(100);
gsfan 8:64184a968e3b 291 }
gsfan 8:64184a968e3b 292 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 293 break;
gsfan 8:64184a968e3b 294 default:
gsfan 8:64184a968e3b 295 DBG("Can't use security\r\n");
gsfan 8:64184a968e3b 296 break;
gsfan 8:64184a968e3b 297 }
gsfan 8:64184a968e3b 298
gsfan 8:64184a968e3b 299 if (!r) {
gsfan 11:71d67fea5ace 300 // connected
gsfan 8:64184a968e3b 301 _state.associated = true;
gsfan 8:64184a968e3b 302 }
gsfan 8:64184a968e3b 303 return r;
gsfan 5:78943b3945b5 304 }
gsfan 5:78943b3945b5 305
gsfan 12:057089026a20 306 int GSwifi::dissociate()
gsfan 5:78943b3945b5 307 {
gsfan 8:64184a968e3b 308 int i;
gsfan 5:78943b3945b5 309
gsfan 5:78943b3945b5 310 // if already disconnected, return
gsfan 5:78943b3945b5 311 if (!_state.associated)
gsfan 8:64184a968e3b 312 return 0;
gsfan 5:78943b3945b5 313
gsfan 11:71d67fea5ace 314 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 315 if (_threadPoll) {
gsfan 8:64184a968e3b 316 _threadPoll->terminate();
gsfan 8:64184a968e3b 317 delete _threadPoll;
gsfan 8:64184a968e3b 318 }
gsfan 8:64184a968e3b 319 #endif
gsfan 8:64184a968e3b 320 for (i = 0; i < 16; i ++) {
gsfan 8:64184a968e3b 321 if (_con[i].buf) {
gsfan 5:78943b3945b5 322 _con[i].buf->flush();
gsfan 8:64184a968e3b 323 }
gsfan 5:78943b3945b5 324 }
gsfan 8:64184a968e3b 325 cmdNCLOSEALL();
gsfan 8:64184a968e3b 326 cmdWD();
gsfan 8:64184a968e3b 327 cmdNDHCP(false);
gsfan 5:78943b3945b5 328 wait_ms(100);
gsfan 5:78943b3945b5 329
gsfan 5:78943b3945b5 330 _state.associated = false;
gsfan 8:64184a968e3b 331 return 0;
gsfan 5:78943b3945b5 332
gsfan 5:78943b3945b5 333 }
gsfan 5:78943b3945b5 334
gsfan 12:057089026a20 335 bool GSwifi::isAssociated()
gsfan 5:78943b3945b5 336 {
gsfan 8:64184a968e3b 337 return _state.associated;
gsfan 5:78943b3945b5 338 }
gsfan 5:78943b3945b5 339
gsfan 8:64184a968e3b 340 void GSwifi::poll () {
gsfan 11:71d67fea5ace 341 #ifndef CFG_ENABLE_RTOS
gsfan 11:71d67fea5ace 342 static int t = 0;
gsfan 13:189e04ac70bd 343 static Timer timer;
gsfan 11:71d67fea5ace 344
gsfan 12:057089026a20 345 if (_state.wm == WM_INFRASTRUCTURE && (! isAssociated()) && _state.ssid) {
gsfan 13:189e04ac70bd 346 if (t == 0 || timer.read() > CFG_RECONNECT) {
gsfan 11:71d67fea5ace 347 // Wi-Fi re-associate
gsfan 11:71d67fea5ace 348 if (_state.initialized) {
gsfan 13:189e04ac70bd 349 if (cmdWA(_state.ssid)) {
gsfan 13:189e04ac70bd 350 timer.reset();
gsfan 13:189e04ac70bd 351 timer.start();
gsfan 13:189e04ac70bd 352 t = 1;
gsfan 13:189e04ac70bd 353 } else {
gsfan 11:71d67fea5ace 354 _state.associated = true;
gsfan 13:189e04ac70bd 355 timer.stop();
gsfan 11:71d67fea5ace 356 t = 0;
gsfan 11:71d67fea5ace 357 }
gsfan 11:71d67fea5ace 358 } else {
gsfan 11:71d67fea5ace 359 if (join()) {
gsfan 13:189e04ac70bd 360 timer.reset();
gsfan 13:189e04ac70bd 361 timer.start();
gsfan 13:189e04ac70bd 362 t = 1;
gsfan 11:71d67fea5ace 363 } else {
gsfan 13:189e04ac70bd 364 timer.stop();
gsfan 13:189e04ac70bd 365 t = 0;
gsfan 11:71d67fea5ace 366 }
gsfan 11:71d67fea5ace 367 }
gsfan 11:71d67fea5ace 368 }
gsfan 11:71d67fea5ace 369 }
gsfan 11:71d67fea5ace 370 #else
gsfan 12:057089026a20 371 if (_state.wm == WM_INFRASTRUCTURE && (! isAssociated()) && _state.ssid) {
gsfan 8:64184a968e3b 372 // Wi-Fi re-associate
gsfan 11:71d67fea5ace 373 if (_state.initialized) {
gsfan 11:71d67fea5ace 374 if (!cmdWA(_state.ssid)) {
gsfan 11:71d67fea5ace 375 _state.associated = true;
gsfan 11:71d67fea5ace 376 }
gsfan 11:71d67fea5ace 377 } else {
gsfan 11:71d67fea5ace 378 join();
gsfan 5:78943b3945b5 379 }
gsfan 5:78943b3945b5 380 }
gsfan 11:71d67fea5ace 381 #endif
gsfan 12:057089026a20 382
gsfan 12:057089026a20 383 for (int i = 0; i < 16; i ++) {
gsfan 16:105b56570533 384 if (isConnected(i) && _con[i].received && _con[i].buf != NULL)
gsfan 12:057089026a20 385 if (_con[i].func != NULL && !_con[i].buf->isEmpty()) {
gsfan 12:057089026a20 386 _con[i].func(i);
gsfan 12:057089026a20 387 if (_con[i].buf->isEmpty()) {
gsfan 12:057089026a20 388 _con[i].received = false;
gsfan 12:057089026a20 389 }
gsfan 12:057089026a20 390 }
gsfan 12:057089026a20 391 }
gsfan 12:057089026a20 392
gsfan 12:057089026a20 393 #ifdef CFG_ENABLE_HTTPD
gsfan 12:057089026a20 394 httpdPoll();
gsfan 12:057089026a20 395 #endif
gsfan 5:78943b3945b5 396 }
gsfan 5:78943b3945b5 397
gsfan 11:71d67fea5ace 398 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 399 void GSwifi::threadPoll (void const *args) {
gsfan 8:64184a968e3b 400 GSwifi * _wifi = GSwifi::getInstance();
gsfan 8:64184a968e3b 401 if (_wifi == NULL)
gsfan 8:64184a968e3b 402 error("Socket constructor error: no wifly instance available!\r\n");
gsfan 5:78943b3945b5 403
gsfan 8:64184a968e3b 404 INFO("threadPoll");
gsfan 8:64184a968e3b 405 for (;;) {
gsfan 8:64184a968e3b 406 Thread::signal_wait(1);
gsfan 8:64184a968e3b 407 Thread::wait(1000);
gsfan 8:64184a968e3b 408 INFO("disassociated");
gsfan 12:057089026a20 409 while (!_wifi->isAssociated()){
gsfan 8:64184a968e3b 410 _wifi->poll();
gsfan 13:189e04ac70bd 411 Thread::wait(CFG_RECONNECT * 1000);
gsfan 5:78943b3945b5 412 }
gsfan 5:78943b3945b5 413 }
gsfan 5:78943b3945b5 414 }
gsfan 8:64184a968e3b 415 #endif
gsfan 5:78943b3945b5 416
gsfan 12:057089026a20 417 GSwifi::Status GSwifi::getStatus () {
gsfan 12:057089026a20 418 return _state.status;
gsfan 12:057089026a20 419 }
gsfan 12:057089026a20 420
gsfan 12:057089026a20 421 int GSwifi::setMacAddress (const char *mac) {
gsfan 12:057089026a20 422 if (cmdNMAC(mac)) return -1;
gsfan 12:057089026a20 423 strncpy(_state.mac, mac, sizeof(_state.mac));
gsfan 12:057089026a20 424 return 0;
gsfan 12:057089026a20 425 }
gsfan 12:057089026a20 426
gsfan 12:057089026a20 427 int GSwifi::getMacAddress (char *mac) {
gsfan 12:057089026a20 428 if (cmdNMAC()) return -1;
gsfan 12:057089026a20 429 strcpy(mac, _state.mac);
gsfan 12:057089026a20 430 return 0;
gsfan 12:057089026a20 431 }
gsfan 12:057089026a20 432
gsfan 11:71d67fea5ace 433 int GSwifi::setAddress (const char *name) {
gsfan 11:71d67fea5ace 434 _state.dhcp = true;
gsfan 11:71d67fea5ace 435 strncpy(_state.name, name, sizeof(_state.name));
gsfan 11:71d67fea5ace 436 return 0;
gsfan 11:71d67fea5ace 437 }
gsfan 11:71d67fea5ace 438
gsfan 15:086d1a33a197 439 int GSwifi::setAddress (const char *ip, const char *netmask, const char *gateway, const char *dns, const char *name) {
gsfan 11:71d67fea5ace 440 _state.dhcp = false;
gsfan 11:71d67fea5ace 441 strncpy(_state.ip, ip, sizeof(_state.ip));
gsfan 11:71d67fea5ace 442 strncpy(_state.netmask, netmask, sizeof(_state.netmask));
gsfan 11:71d67fea5ace 443 strncpy(_state.gateway, gateway, sizeof(_state.gateway));
gsfan 21:6431364fc667 444 if (dns) {
gsfan 21:6431364fc667 445 strncpy(_state.nameserver, dns, sizeof(_state.nameserver));
gsfan 21:6431364fc667 446 }
gsfan 21:6431364fc667 447 if (name) {
gsfan 21:6431364fc667 448 strncpy(_state.name, name, sizeof(_state.name));
gsfan 21:6431364fc667 449 }
gsfan 11:71d67fea5ace 450 return 0;
gsfan 11:71d67fea5ace 451 }
gsfan 11:71d67fea5ace 452
gsfan 11:71d67fea5ace 453 int GSwifi::getAddress (char *ip, char *netmask, char *gateway) {
gsfan 11:71d67fea5ace 454 strcpy(ip, _state.ip);
gsfan 11:71d67fea5ace 455 strcpy(netmask, _state.netmask);
gsfan 11:71d67fea5ace 456 strcpy(gateway, _state.gateway);
gsfan 11:71d67fea5ace 457 return 0;
gsfan 11:71d67fea5ace 458 }
gsfan 11:71d67fea5ace 459
gsfan 8:64184a968e3b 460 int GSwifi::setSsid (Security sec, const char *ssid, const char *phrase) {
gsfan 8:64184a968e3b 461 int i;
gsfan 5:78943b3945b5 462
gsfan 8:64184a968e3b 463 _state.sec = sec;
gsfan 11:71d67fea5ace 464
gsfan 8:64184a968e3b 465 // change all ' ' in '$' in the ssid and the passphrase
gsfan 8:64184a968e3b 466 strncpy(_state.ssid, ssid, sizeof(_state.ssid));
gsfan 8:64184a968e3b 467 for (i = 0; i < strlen(_state.ssid); i++) {
gsfan 8:64184a968e3b 468 if (_state.ssid[i] == ' ')
gsfan 8:64184a968e3b 469 _state.ssid[i] = '$';
gsfan 5:78943b3945b5 470 }
gsfan 11:71d67fea5ace 471
gsfan 11:71d67fea5ace 472 if (sec == SEC_WEP) {
gsfan 11:71d67fea5ace 473 if (strlen(phrase) == 5 || strlen(phrase) == 13) {
gsfan 11:71d67fea5ace 474 for (i = 0; i < strlen(phrase); i++) {
gsfan 11:71d67fea5ace 475 _state.pass[i * 2] = '0' + ((phrase[i] >> 4) & 0x0f);
gsfan 11:71d67fea5ace 476 _state.pass[i * 2 + 1] = '0' + (phrase[i + 1] & 0x0f);
gsfan 11:71d67fea5ace 477 }
gsfan 11:71d67fea5ace 478 } else {
gsfan 11:71d67fea5ace 479 strncpy(_state.pass, phrase, strlen(phrase));
gsfan 11:71d67fea5ace 480 }
gsfan 11:71d67fea5ace 481 } else {
gsfan 11:71d67fea5ace 482 strncpy(_state.pass, phrase, sizeof(_state.pass));
gsfan 11:71d67fea5ace 483 }
gsfan 8:64184a968e3b 484 for (i = 0; i < strlen(_state.pass); i++) {
gsfan 8:64184a968e3b 485 if (_state.pass[i] == ' ')
gsfan 8:64184a968e3b 486 _state.pass[i] = '$';
gsfan 5:78943b3945b5 487 }
gsfan 5:78943b3945b5 488 return 0;
gsfan 5:78943b3945b5 489 }
gsfan 5:78943b3945b5 490