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:
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?

UserRevisionLine numberNew contents of line
gsfan 11:71d67fea5ace 1 /* Copyright (C) 2013 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 8:64184a968e3b 26 GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud):
gsfan 8:64184a968e3b 27 _gs(tx, rx), _reset(reset)
gsfan 5:78943b3945b5 28 {
gsfan 8:64184a968e3b 29 _inst = this;
gsfan 5:78943b3945b5 30 memset(&_state, 0, sizeof(_state));
gsfan 5:78943b3945b5 31 memset(&_con, 0, sizeof(_con));
gsfan 11:71d67fea5ace 32 _state.initialized = false;
gsfan 11:71d67fea5ace 33 _state.status = STAT_READY;
gsfan 8:64184a968e3b 34 _state.cid = -1;
gsfan 8:64184a968e3b 35 _state.buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 11:71d67fea5ace 36 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 37 for (int i = 0; i < 16; i ++) {
gsfan 8:64184a968e3b 38 _con[i].buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 11:71d67fea5ace 39 if (_con[i].buf == NULL)
gsfan 11:71d67fea5ace 40 error("CircBuffer failed");
gsfan 5:78943b3945b5 41 }
gsfan 8:64184a968e3b 42 _threadPoll = NULL;
gsfan 5:78943b3945b5 43 #endif
gsfan 8:64184a968e3b 44
gsfan 8:64184a968e3b 45 setReset(true);
gsfan 8:64184a968e3b 46 initUart(cts, rts, alarm, baud);
gsfan 8:64184a968e3b 47 setAlarm(true);
gsfan 8:64184a968e3b 48 wait_ms(10);
gsfan 8:64184a968e3b 49 setAlarm(false);
gsfan 8:64184a968e3b 50 wait_ms(100);
gsfan 8:64184a968e3b 51 setReset(false);
gsfan 8:64184a968e3b 52 wait_ms(100);
gsfan 5:78943b3945b5 53 }
gsfan 5:78943b3945b5 54
gsfan 11:71d67fea5ace 55 int GSwifi::join()
gsfan 5:78943b3945b5 56 {
gsfan 11:71d67fea5ace 57 int i;
gsfan 8:64184a968e3b 58 bool r = -1;
gsfan 5:78943b3945b5 59
gsfan 8:64184a968e3b 60 _state.wm = WM_INFRASTRUCTURE;
gsfan 11:71d67fea5ace 61 _state.initialized = true;
gsfan 8:64184a968e3b 62 if (!strlen(_state.name)) {
gsfan 8:64184a968e3b 63 strncpy(_state.name, CFG_DHCPNAME, sizeof(_state.name));
gsfan 8:64184a968e3b 64 }
gsfan 8:64184a968e3b 65 clearFlags();
gsfan 12:057089026a20 66 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 67 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 68 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 69 if (_flow) {
gsfan 8:64184a968e3b 70 cmdR(true);
gsfan 8:64184a968e3b 71 }
gsfan 8:64184a968e3b 72 cmdBDATA(true);
gsfan 8:64184a968e3b 73 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 74 cmdWM(0); // infrastructure
gsfan 5:78943b3945b5 75 wait_ms(100);
gsfan 5:78943b3945b5 76
gsfan 11:71d67fea5ace 77 switch (_state.sec) {
gsfan 5:78943b3945b5 78 case SEC_NONE:
gsfan 5:78943b3945b5 79 case SEC_OPEN:
gsfan 5:78943b3945b5 80 case SEC_WEP:
gsfan 8:64184a968e3b 81 cmdNDHCP(_state.dhcp, _state.name, 0);
gsfan 8:64184a968e3b 82 cmdWAUTH(_state.sec);
gsfan 11:71d67fea5ace 83 if (_state.sec != SEC_NONE) {
gsfan 8:64184a968e3b 84 cmdWWEP(1, _state.pass);
gsfan 5:78943b3945b5 85 wait_ms(100);
gsfan 5:78943b3945b5 86 }
gsfan 11:71d67fea5ace 87 for (i = 0; i < CFG_TRYJOIN; i ++) {
gsfan 11:71d67fea5ace 88 r = cmdWA(_state.ssid);
gsfan 11:71d67fea5ace 89 if (!r) break;
gsfan 8:64184a968e3b 90 DBG("retry\r\n");
gsfan 8:64184a968e3b 91 wait_ms(1000);
gsfan 5:78943b3945b5 92 }
gsfan 5:78943b3945b5 93 break;
gsfan 5:78943b3945b5 94 case SEC_WPA_PSK:
gsfan 5:78943b3945b5 95 case SEC_WPA2_PSK:
gsfan 8:64184a968e3b 96 cmdNDHCP(_state.dhcp, _state.name, 0);
gsfan 8:64184a968e3b 97 cmdWAUTH(0);
gsfan 8:64184a968e3b 98 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 5:78943b3945b5 99 wait_ms(100);
gsfan 11:71d67fea5ace 100 for (i = 0; i < CFG_TRYJOIN; i ++) {
gsfan 11:71d67fea5ace 101 r = cmdWA(_state.ssid);
gsfan 11:71d67fea5ace 102 if (!r) break;
gsfan 8:64184a968e3b 103 DBG("retry\r\n");
gsfan 8:64184a968e3b 104 wait_ms(1000);
gsfan 5:78943b3945b5 105 }
gsfan 5:78943b3945b5 106 break;
gsfan 8:64184a968e3b 107 case SEC_WPA_ENT:
gsfan 8:64184a968e3b 108 case SEC_WPA2_ENT:
gsfan 8:64184a968e3b 109 cmdWAUTH(0);
gsfan 8:64184a968e3b 110 DBG("Can't support security\r\n");
gsfan 8:64184a968e3b 111 break;
gsfan 5:78943b3945b5 112 case SEC_WPS_BUTTON:
gsfan 8:64184a968e3b 113 cmdNDHCP(false);
gsfan 8:64184a968e3b 114 cmdWAUTH(0);
gsfan 8:64184a968e3b 115 r = cmdWWPS(true);
gsfan 8:64184a968e3b 116 if (r) break;
gsfan 8:64184a968e3b 117 if (_state.dhcp) {
gsfan 8:64184a968e3b 118 r = cmdNDHCP(_state.dhcp, _state.name);
gsfan 5:78943b3945b5 119 }
gsfan 8:64184a968e3b 120 cmdWSTATUS();
gsfan 8:64184a968e3b 121 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 8:64184a968e3b 122 break;
gsfan 8:64184a968e3b 123 case SEC_WPS_PIN:
gsfan 8:64184a968e3b 124 cmdNDHCP(false);
gsfan 8:64184a968e3b 125 cmdWAUTH(0);
gsfan 8:64184a968e3b 126 r = cmdWWPS(true, _state.pass);
gsfan 8:64184a968e3b 127 if (r) break;
gsfan 8:64184a968e3b 128 if (_state.dhcp) {
gsfan 8:64184a968e3b 129 r = cmdNDHCP(_state.dhcp, _state.name);
gsfan 5:78943b3945b5 130 }
gsfan 8:64184a968e3b 131 cmdWSTATUS();
gsfan 8:64184a968e3b 132 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 5:78943b3945b5 133 break;
gsfan 5:78943b3945b5 134 default:
gsfan 5:78943b3945b5 135 DBG("Can't use security\r\n");
gsfan 5:78943b3945b5 136 break;
gsfan 5:78943b3945b5 137 }
gsfan 5:78943b3945b5 138
gsfan 8:64184a968e3b 139 if (!r) {
gsfan 11:71d67fea5ace 140 // connected
gsfan 8:64184a968e3b 141 if (! _state.dhcp) {
gsfan 8:64184a968e3b 142 cmdDNSSET(_state.nameserver);
gsfan 5:78943b3945b5 143 }
gsfan 5:78943b3945b5 144 _state.associated = true;
gsfan 11:71d67fea5ace 145 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 146 _threadPoll = new Thread(&threadPoll);
gsfan 8:64184a968e3b 147 // _threadPoll = new Thread(&threadPoll, NULL, osPriorityLow);
gsfan 8:64184a968e3b 148 #endif
gsfan 5:78943b3945b5 149 }
gsfan 5:78943b3945b5 150 return r;
gsfan 5:78943b3945b5 151 }
gsfan 5:78943b3945b5 152
gsfan 11:71d67fea5ace 153 int GSwifi::adhock ()
gsfan 5:78943b3945b5 154 {
gsfan 8:64184a968e3b 155 bool r = -1;
gsfan 5:78943b3945b5 156
gsfan 8:64184a968e3b 157 _state.wm = WM_ADHOCK;
gsfan 11:71d67fea5ace 158 _state.initialized = true;
gsfan 8:64184a968e3b 159 clearFlags();
gsfan 12:057089026a20 160 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 161 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 162 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 163 if (_flow) {
gsfan 8:64184a968e3b 164 cmdR(true);
gsfan 5:78943b3945b5 165 }
gsfan 8:64184a968e3b 166 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 167 cmdBDATA(true);
gsfan 8:64184a968e3b 168 cmdWM(1); // adhock
gsfan 8:64184a968e3b 169 wait_ms(100);
gsfan 8:64184a968e3b 170
gsfan 8:64184a968e3b 171 cmdNDHCP(false);
gsfan 8:64184a968e3b 172 if (! _state.dhcp) {
gsfan 8:64184a968e3b 173 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 5:78943b3945b5 174 }
gsfan 5:78943b3945b5 175
gsfan 11:71d67fea5ace 176 switch (_state.sec) {
gsfan 8:64184a968e3b 177 case SEC_NONE:
gsfan 8:64184a968e3b 178 case SEC_OPEN:
gsfan 8:64184a968e3b 179 case SEC_WEP:
gsfan 8:64184a968e3b 180 cmdWAUTH(_state.sec);
gsfan 11:71d67fea5ace 181 if (_state.sec != SEC_NONE) {
gsfan 8:64184a968e3b 182 cmdWWEP(1, _state.pass);
gsfan 8:64184a968e3b 183 wait_ms(100);
gsfan 8:64184a968e3b 184 }
gsfan 8:64184a968e3b 185 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 186 break;
gsfan 8:64184a968e3b 187 default:
gsfan 8:64184a968e3b 188 DBG("Can't use security\r\n");
gsfan 8:64184a968e3b 189 break;
gsfan 5:78943b3945b5 190 }
gsfan 5:78943b3945b5 191
gsfan 8:64184a968e3b 192 if (!r) {
gsfan 11:71d67fea5ace 193 // connected
gsfan 8:64184a968e3b 194 _state.associated = true;
gsfan 8:64184a968e3b 195 }
gsfan 8:64184a968e3b 196 return r;
gsfan 5:78943b3945b5 197 }
gsfan 5:78943b3945b5 198
gsfan 11:71d67fea5ace 199 int GSwifi::limitedap ()
gsfan 5:78943b3945b5 200 {
gsfan 8:64184a968e3b 201 bool r = -1;
gsfan 8:64184a968e3b 202
gsfan 8:64184a968e3b 203 _state.wm = WM_LIMITEDAP;
gsfan 11:71d67fea5ace 204 _state.initialized = true;
gsfan 8:64184a968e3b 205 if (!strlen(_state.name)) {
gsfan 8:64184a968e3b 206 strncpy(_state.name, CFG_DNSNAME, sizeof(_state.name));
gsfan 8:64184a968e3b 207 }
gsfan 8:64184a968e3b 208 clearFlags();
gsfan 12:057089026a20 209 _state.mode = MODE_COMMAND;
gsfan 8:64184a968e3b 210 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 211 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 212 if (_flow) {
gsfan 8:64184a968e3b 213 cmdR(true);
gsfan 8:64184a968e3b 214 }
gsfan 8:64184a968e3b 215 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 216 cmdBDATA(true);
gsfan 8:64184a968e3b 217 cmdWM(2); // limitedap
gsfan 8:64184a968e3b 218 wait_ms(100);
gsfan 8:64184a968e3b 219
gsfan 8:64184a968e3b 220 cmdNDHCP(false);
gsfan 8:64184a968e3b 221 if (! _state.dhcp) {
gsfan 8:64184a968e3b 222 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 8:64184a968e3b 223 cmdDNSSET(_state.ip);
gsfan 5:78943b3945b5 224 }
gsfan 8:64184a968e3b 225 cmdDHCPSRVR(true);
gsfan 8:64184a968e3b 226 cmdDNS(true, _state.name);
gsfan 8:64184a968e3b 227
gsfan 11:71d67fea5ace 228 switch (_state.sec) {
gsfan 8:64184a968e3b 229 case SEC_NONE:
gsfan 8:64184a968e3b 230 case SEC_OPEN:
gsfan 8:64184a968e3b 231 case SEC_WEP:
gsfan 8:64184a968e3b 232 cmdWAUTH(_state.sec);
gsfan 11:71d67fea5ace 233 if (_state.sec != SEC_NONE) {
gsfan 8:64184a968e3b 234 cmdWWEP(1, _state.pass);
gsfan 8:64184a968e3b 235 wait_ms(100);
gsfan 8:64184a968e3b 236 }
gsfan 8:64184a968e3b 237 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 238 break;
gsfan 8:64184a968e3b 239 default:
gsfan 8:64184a968e3b 240 DBG("Can't use security\r\n");
gsfan 8:64184a968e3b 241 break;
gsfan 8:64184a968e3b 242 }
gsfan 8:64184a968e3b 243
gsfan 8:64184a968e3b 244 if (!r) {
gsfan 11:71d67fea5ace 245 // connected
gsfan 8:64184a968e3b 246 _state.associated = true;
gsfan 8:64184a968e3b 247 }
gsfan 8:64184a968e3b 248 return r;
gsfan 5:78943b3945b5 249 }
gsfan 5:78943b3945b5 250
gsfan 12:057089026a20 251 int GSwifi::dissociate()
gsfan 5:78943b3945b5 252 {
gsfan 8:64184a968e3b 253 int i;
gsfan 5:78943b3945b5 254
gsfan 5:78943b3945b5 255 // if already disconnected, return
gsfan 5:78943b3945b5 256 if (!_state.associated)
gsfan 8:64184a968e3b 257 return 0;
gsfan 5:78943b3945b5 258
gsfan 11:71d67fea5ace 259 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 260 if (_threadPoll) {
gsfan 8:64184a968e3b 261 _threadPoll->terminate();
gsfan 8:64184a968e3b 262 delete _threadPoll;
gsfan 8:64184a968e3b 263 }
gsfan 8:64184a968e3b 264 #endif
gsfan 8:64184a968e3b 265 for (i = 0; i < 16; i ++) {
gsfan 8:64184a968e3b 266 if (_con[i].buf) {
gsfan 5:78943b3945b5 267 _con[i].buf->flush();
gsfan 8:64184a968e3b 268 }
gsfan 5:78943b3945b5 269 }
gsfan 8:64184a968e3b 270 cmdNCLOSEALL();
gsfan 8:64184a968e3b 271 cmdWD();
gsfan 8:64184a968e3b 272 cmdNDHCP(false);
gsfan 5:78943b3945b5 273 wait_ms(100);
gsfan 5:78943b3945b5 274
gsfan 5:78943b3945b5 275 _state.associated = false;
gsfan 8:64184a968e3b 276 return 0;
gsfan 5:78943b3945b5 277
gsfan 5:78943b3945b5 278 }
gsfan 5:78943b3945b5 279
gsfan 12:057089026a20 280 bool GSwifi::isAssociated()
gsfan 5:78943b3945b5 281 {
gsfan 8:64184a968e3b 282 return _state.associated;
gsfan 5:78943b3945b5 283 }
gsfan 5:78943b3945b5 284
gsfan 8:64184a968e3b 285 void GSwifi::poll () {
gsfan 11:71d67fea5ace 286 #ifndef CFG_ENABLE_RTOS
gsfan 11:71d67fea5ace 287 static int t = 0;
gsfan 11:71d67fea5ace 288
gsfan 12:057089026a20 289 if (_state.wm == WM_INFRASTRUCTURE && (! isAssociated()) && _state.ssid) {
gsfan 11:71d67fea5ace 290 if (t && time(NULL) > t) {
gsfan 11:71d67fea5ace 291 // Wi-Fi re-associate
gsfan 11:71d67fea5ace 292 if (_state.initialized) {
gsfan 11:71d67fea5ace 293 if (!cmdWA(_state.ssid)) {
gsfan 11:71d67fea5ace 294 _state.associated = true;
gsfan 11:71d67fea5ace 295 t = 0;
gsfan 11:71d67fea5ace 296 } else {
gsfan 11:71d67fea5ace 297 t = time(NULL) + CFG_RECONNECT;
gsfan 11:71d67fea5ace 298 }
gsfan 11:71d67fea5ace 299 } else {
gsfan 11:71d67fea5ace 300 if (join()) {
gsfan 11:71d67fea5ace 301 t = 0;
gsfan 11:71d67fea5ace 302 } else {
gsfan 11:71d67fea5ace 303 t = time(NULL) + CFG_RECONNECT;
gsfan 11:71d67fea5ace 304 }
gsfan 11:71d67fea5ace 305 }
gsfan 11:71d67fea5ace 306 }
gsfan 11:71d67fea5ace 307 } else {
gsfan 11:71d67fea5ace 308 if (t == 0)
gsfan 11:71d67fea5ace 309 t = time(NULL) + CFG_RECONNECT;
gsfan 11:71d67fea5ace 310 }
gsfan 11:71d67fea5ace 311 #else
gsfan 12:057089026a20 312 if (_state.wm == WM_INFRASTRUCTURE && (! isAssociated()) && _state.ssid) {
gsfan 8:64184a968e3b 313 // Wi-Fi re-associate
gsfan 11:71d67fea5ace 314 if (_state.initialized) {
gsfan 11:71d67fea5ace 315 if (!cmdWA(_state.ssid)) {
gsfan 11:71d67fea5ace 316 _state.associated = true;
gsfan 11:71d67fea5ace 317 }
gsfan 11:71d67fea5ace 318 } else {
gsfan 11:71d67fea5ace 319 join();
gsfan 5:78943b3945b5 320 }
gsfan 5:78943b3945b5 321 }
gsfan 11:71d67fea5ace 322 #endif
gsfan 12:057089026a20 323
gsfan 12:057089026a20 324 for (int i = 0; i < 16; i ++) {
gsfan 12:057089026a20 325 if (isConnected(i) && _con[i].received && _con[i].buf)
gsfan 12:057089026a20 326 if (_con[i].func != NULL && !_con[i].buf->isEmpty()) {
gsfan 12:057089026a20 327 _con[i].func(i);
gsfan 12:057089026a20 328 if (_con[i].buf->isEmpty()) {
gsfan 12:057089026a20 329 _con[i].received = false;
gsfan 12:057089026a20 330 }
gsfan 12:057089026a20 331 }
gsfan 12:057089026a20 332 }
gsfan 12:057089026a20 333
gsfan 12:057089026a20 334 #ifdef CFG_ENABLE_HTTPD
gsfan 12:057089026a20 335 httpdPoll();
gsfan 12:057089026a20 336 #endif
gsfan 5:78943b3945b5 337 }
gsfan 5:78943b3945b5 338
gsfan 11:71d67fea5ace 339 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 340 void GSwifi::threadPoll (void const *args) {
gsfan 8:64184a968e3b 341 GSwifi * _wifi = GSwifi::getInstance();
gsfan 8:64184a968e3b 342 if (_wifi == NULL)
gsfan 8:64184a968e3b 343 error("Socket constructor error: no wifly instance available!\r\n");
gsfan 5:78943b3945b5 344
gsfan 8:64184a968e3b 345 INFO("threadPoll");
gsfan 8:64184a968e3b 346 for (;;) {
gsfan 8:64184a968e3b 347 Thread::signal_wait(1);
gsfan 8:64184a968e3b 348 Thread::wait(1000);
gsfan 8:64184a968e3b 349 INFO("disassociated");
gsfan 12:057089026a20 350 while (!_wifi->isAssociated()){
gsfan 8:64184a968e3b 351 _wifi->poll();
gsfan 8:64184a968e3b 352 Thread::wait(CFG_TIMEOUT);
gsfan 5:78943b3945b5 353 }
gsfan 5:78943b3945b5 354 }
gsfan 5:78943b3945b5 355 }
gsfan 8:64184a968e3b 356 #endif
gsfan 5:78943b3945b5 357
gsfan 12:057089026a20 358 GSwifi::Status GSwifi::getStatus () {
gsfan 12:057089026a20 359 return _state.status;
gsfan 12:057089026a20 360 }
gsfan 12:057089026a20 361
gsfan 12:057089026a20 362 int GSwifi::setMacAddress (const char *mac) {
gsfan 12:057089026a20 363 if (cmdNMAC(mac)) return -1;
gsfan 12:057089026a20 364 strncpy(_state.mac, mac, sizeof(_state.mac));
gsfan 12:057089026a20 365 return 0;
gsfan 12:057089026a20 366 }
gsfan 12:057089026a20 367
gsfan 12:057089026a20 368 int GSwifi::getMacAddress (char *mac) {
gsfan 12:057089026a20 369 if (cmdNMAC()) return -1;
gsfan 12:057089026a20 370 strcpy(mac, _state.mac);
gsfan 12:057089026a20 371 return 0;
gsfan 12:057089026a20 372 }
gsfan 12:057089026a20 373
gsfan 11:71d67fea5ace 374 int GSwifi::setAddress (const char *name) {
gsfan 11:71d67fea5ace 375 _state.dhcp = true;
gsfan 11:71d67fea5ace 376 strncpy(_state.name, name, sizeof(_state.name));
gsfan 11:71d67fea5ace 377 return 0;
gsfan 11:71d67fea5ace 378 }
gsfan 11:71d67fea5ace 379
gsfan 11:71d67fea5ace 380 int GSwifi::setAddress (const char *ip, const char *netmask, const char *gateway, const char *name) {
gsfan 11:71d67fea5ace 381 _state.dhcp = false;
gsfan 11:71d67fea5ace 382 strncpy(_state.ip, ip, sizeof(_state.ip));
gsfan 11:71d67fea5ace 383 strncpy(_state.netmask, netmask, sizeof(_state.netmask));
gsfan 11:71d67fea5ace 384 strncpy(_state.gateway, gateway, sizeof(_state.gateway));
gsfan 11:71d67fea5ace 385 strncpy(_state.name, name, sizeof(_state.name));
gsfan 11:71d67fea5ace 386 return 0;
gsfan 11:71d67fea5ace 387 }
gsfan 11:71d67fea5ace 388
gsfan 11:71d67fea5ace 389 int GSwifi::getAddress (char *ip, char *netmask, char *gateway) {
gsfan 11:71d67fea5ace 390 strcpy(ip, _state.ip);
gsfan 11:71d67fea5ace 391 strcpy(netmask, _state.netmask);
gsfan 11:71d67fea5ace 392 strcpy(gateway, _state.gateway);
gsfan 11:71d67fea5ace 393 return 0;
gsfan 11:71d67fea5ace 394 }
gsfan 11:71d67fea5ace 395
gsfan 8:64184a968e3b 396 int GSwifi::setSsid (Security sec, const char *ssid, const char *phrase) {
gsfan 8:64184a968e3b 397 int i;
gsfan 5:78943b3945b5 398
gsfan 8:64184a968e3b 399 _state.sec = sec;
gsfan 11:71d67fea5ace 400
gsfan 8:64184a968e3b 401 // change all ' ' in '$' in the ssid and the passphrase
gsfan 8:64184a968e3b 402 strncpy(_state.ssid, ssid, sizeof(_state.ssid));
gsfan 8:64184a968e3b 403 for (i = 0; i < strlen(_state.ssid); i++) {
gsfan 8:64184a968e3b 404 if (_state.ssid[i] == ' ')
gsfan 8:64184a968e3b 405 _state.ssid[i] = '$';
gsfan 5:78943b3945b5 406 }
gsfan 11:71d67fea5ace 407
gsfan 11:71d67fea5ace 408 if (sec == SEC_WEP) {
gsfan 11:71d67fea5ace 409 if (strlen(phrase) == 5 || strlen(phrase) == 13) {
gsfan 11:71d67fea5ace 410 for (i = 0; i < strlen(phrase); i++) {
gsfan 11:71d67fea5ace 411 _state.pass[i * 2] = '0' + ((phrase[i] >> 4) & 0x0f);
gsfan 11:71d67fea5ace 412 _state.pass[i * 2 + 1] = '0' + (phrase[i + 1] & 0x0f);
gsfan 11:71d67fea5ace 413 }
gsfan 11:71d67fea5ace 414 } else {
gsfan 11:71d67fea5ace 415 strncpy(_state.pass, phrase, strlen(phrase));
gsfan 11:71d67fea5ace 416 }
gsfan 11:71d67fea5ace 417 } else {
gsfan 11:71d67fea5ace 418 strncpy(_state.pass, phrase, sizeof(_state.pass));
gsfan 11:71d67fea5ace 419 }
gsfan 8:64184a968e3b 420 for (i = 0; i < strlen(_state.pass); i++) {
gsfan 8:64184a968e3b 421 if (_state.pass[i] == ' ')
gsfan 8:64184a968e3b 422 _state.pass[i] = '$';
gsfan 5:78943b3945b5 423 }
gsfan 5:78943b3945b5 424 return 0;
gsfan 5:78943b3945b5 425 }
gsfan 5:78943b3945b5 426