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:
Thu Oct 31 06:41:45 2013 +0000
Revision:
8:64184a968e3b
Parent:
5:78943b3945b5
Child:
11:71d67fea5ace
supported mbed RTOS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 5:78943b3945b5 1 /* Copyright (C) 2012 mbed.org, 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 /* Copyright (C) 2013 gsfan, MIT License
gsfan 5:78943b3945b5 19 * port to the GainSpan Wi-FI module GS1011
gsfan 5:78943b3945b5 20 */
gsfan 5:78943b3945b5 21
gsfan 5:78943b3945b5 22 #include "mbed.h"
gsfan 5:78943b3945b5 23 #include "GSwifi.h"
gsfan 5:78943b3945b5 24 #include <string>
gsfan 5:78943b3945b5 25 #include <algorithm>
gsfan 5:78943b3945b5 26
gsfan 5:78943b3945b5 27 GSwifi * GSwifi::_inst;
gsfan 5:78943b3945b5 28
gsfan 8:64184a968e3b 29 GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud):
gsfan 8:64184a968e3b 30 _gs(tx, rx), _reset(reset)
gsfan 5:78943b3945b5 31 {
gsfan 8:64184a968e3b 32 _inst = this;
gsfan 5:78943b3945b5 33 memset(&_state, 0, sizeof(_state));
gsfan 5:78943b3945b5 34 memset(&_con, 0, sizeof(_con));
gsfan 8:64184a968e3b 35 _state.cid = -1;
gsfan 5:78943b3945b5 36 _state.acid = -1;
gsfan 8:64184a968e3b 37 _state.buf = new CircBuffer<char>(CFG_DATA_SIZE);
gsfan 8:64184a968e3b 38 #ifdef RTOS_H
gsfan 8:64184a968e3b 39 for (int i = 0; i < 16; i ++) {
gsfan 8:64184a968e3b 40 _con[i].buf = new CircBuffer<char>(CFG_DATA_SIZE);
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 8:64184a968e3b 55 int GSwifi::join(Security sec, const char *ssid, const char *phrase)
gsfan 5:78943b3945b5 56 {
gsfan 8:64184a968e3b 57 bool r = -1;
gsfan 5:78943b3945b5 58
gsfan 8:64184a968e3b 59 _state.wm = WM_INFRASTRUCTURE;
gsfan 8:64184a968e3b 60 setSsid(sec, ssid, phrase);
gsfan 8:64184a968e3b 61 if (!strlen(_state.name)) {
gsfan 8:64184a968e3b 62 strncpy(_state.name, CFG_DHCPNAME, sizeof(_state.name));
gsfan 8:64184a968e3b 63 }
gsfan 8:64184a968e3b 64 clearFlags();
gsfan 8:64184a968e3b 65 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 66 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 67 if (_flow) {
gsfan 8:64184a968e3b 68 cmdR(true);
gsfan 8:64184a968e3b 69 }
gsfan 8:64184a968e3b 70 cmdBDATA(true);
gsfan 8:64184a968e3b 71 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 72 cmdWM(0); // infrastructure
gsfan 5:78943b3945b5 73 wait_ms(100);
gsfan 5:78943b3945b5 74
gsfan 8:64184a968e3b 75 switch (sec) {
gsfan 5:78943b3945b5 76 case SEC_NONE:
gsfan 5:78943b3945b5 77 case SEC_OPEN:
gsfan 5:78943b3945b5 78 case SEC_WEP:
gsfan 8:64184a968e3b 79 cmdNDHCP(_state.dhcp, _state.name, 0);
gsfan 8:64184a968e3b 80 cmdWAUTH(_state.sec);
gsfan 8:64184a968e3b 81 if (sec != SEC_NONE) {
gsfan 8:64184a968e3b 82 cmdWWEP(1, _state.pass);
gsfan 5:78943b3945b5 83 wait_ms(100);
gsfan 5:78943b3945b5 84 }
gsfan 8:64184a968e3b 85 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 86 if (r) {
gsfan 8:64184a968e3b 87 DBG("retry\r\n");
gsfan 8:64184a968e3b 88 wait_ms(1000);
gsfan 8:64184a968e3b 89 r = cmdWA(_state.ssid);
gsfan 5:78943b3945b5 90 }
gsfan 5:78943b3945b5 91 break;
gsfan 5:78943b3945b5 92 case SEC_WPA_PSK:
gsfan 5:78943b3945b5 93 case SEC_WPA2_PSK:
gsfan 8:64184a968e3b 94 cmdNDHCP(_state.dhcp, _state.name, 0);
gsfan 8:64184a968e3b 95 cmdWAUTH(0);
gsfan 8:64184a968e3b 96 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 5:78943b3945b5 97 wait_ms(100);
gsfan 8:64184a968e3b 98 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 99 if (r) {
gsfan 8:64184a968e3b 100 DBG("retry\r\n");
gsfan 8:64184a968e3b 101 wait_ms(1000);
gsfan 8:64184a968e3b 102 r = cmdWA(_state.ssid);
gsfan 5:78943b3945b5 103 }
gsfan 5:78943b3945b5 104 break;
gsfan 8:64184a968e3b 105 case SEC_WPA_ENT:
gsfan 8:64184a968e3b 106 case SEC_WPA2_ENT:
gsfan 8:64184a968e3b 107 cmdWAUTH(0);
gsfan 8:64184a968e3b 108 DBG("Can't support security\r\n");
gsfan 8:64184a968e3b 109 break;
gsfan 5:78943b3945b5 110 case SEC_WPS_BUTTON:
gsfan 8:64184a968e3b 111 cmdNDHCP(false);
gsfan 8:64184a968e3b 112 cmdWAUTH(0);
gsfan 8:64184a968e3b 113 r = cmdWWPS(true);
gsfan 8:64184a968e3b 114 if (r) break;
gsfan 8:64184a968e3b 115 if (_state.dhcp) {
gsfan 8:64184a968e3b 116 r = cmdNDHCP(_state.dhcp, _state.name);
gsfan 5:78943b3945b5 117 }
gsfan 8:64184a968e3b 118 cmdWSTATUS();
gsfan 8:64184a968e3b 119 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 8:64184a968e3b 120 break;
gsfan 8:64184a968e3b 121 case SEC_WPS_PIN:
gsfan 8:64184a968e3b 122 cmdNDHCP(false);
gsfan 8:64184a968e3b 123 cmdWAUTH(0);
gsfan 8:64184a968e3b 124 r = cmdWWPS(true, _state.pass);
gsfan 8:64184a968e3b 125 if (r) break;
gsfan 8:64184a968e3b 126 if (_state.dhcp) {
gsfan 8:64184a968e3b 127 r = cmdNDHCP(_state.dhcp, _state.name);
gsfan 5:78943b3945b5 128 }
gsfan 8:64184a968e3b 129 cmdWSTATUS();
gsfan 8:64184a968e3b 130 cmdWPAPSK(_state.ssid, _state.pass);
gsfan 5:78943b3945b5 131 break;
gsfan 5:78943b3945b5 132 default:
gsfan 5:78943b3945b5 133 DBG("Can't use security\r\n");
gsfan 5:78943b3945b5 134 break;
gsfan 5:78943b3945b5 135 }
gsfan 5:78943b3945b5 136
gsfan 8:64184a968e3b 137 if (!r) {
gsfan 8:64184a968e3b 138 if (! _state.dhcp) {
gsfan 8:64184a968e3b 139 cmdDNSSET(_state.nameserver);
gsfan 5:78943b3945b5 140 }
gsfan 5:78943b3945b5 141 _state.associated = true;
gsfan 8:64184a968e3b 142 #ifdef RTOS_H
gsfan 8:64184a968e3b 143 _threadPoll = new Thread(&threadPoll);
gsfan 8:64184a968e3b 144 // _threadPoll = new Thread(&threadPoll, NULL, osPriorityLow);
gsfan 8:64184a968e3b 145 #endif
gsfan 5:78943b3945b5 146 }
gsfan 5:78943b3945b5 147 return r;
gsfan 5:78943b3945b5 148 }
gsfan 5:78943b3945b5 149
gsfan 8:64184a968e3b 150 int GSwifi::adhock (Security sec, const char *ssid, const char *phrase)
gsfan 5:78943b3945b5 151 {
gsfan 8:64184a968e3b 152 bool r = -1;
gsfan 5:78943b3945b5 153
gsfan 8:64184a968e3b 154 _state.wm = WM_ADHOCK;
gsfan 8:64184a968e3b 155 setSsid(sec, ssid, phrase);
gsfan 8:64184a968e3b 156 clearFlags();
gsfan 8:64184a968e3b 157 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 158 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 159 if (_flow) {
gsfan 8:64184a968e3b 160 cmdR(true);
gsfan 5:78943b3945b5 161 }
gsfan 8:64184a968e3b 162 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 163 cmdBDATA(true);
gsfan 8:64184a968e3b 164 cmdWM(1); // adhock
gsfan 8:64184a968e3b 165 wait_ms(100);
gsfan 8:64184a968e3b 166
gsfan 8:64184a968e3b 167 cmdNDHCP(false);
gsfan 8:64184a968e3b 168 if (! _state.dhcp) {
gsfan 8:64184a968e3b 169 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 5:78943b3945b5 170 }
gsfan 5:78943b3945b5 171
gsfan 8:64184a968e3b 172 switch (sec) {
gsfan 8:64184a968e3b 173 case SEC_NONE:
gsfan 8:64184a968e3b 174 case SEC_OPEN:
gsfan 8:64184a968e3b 175 case SEC_WEP:
gsfan 8:64184a968e3b 176 cmdWAUTH(_state.sec);
gsfan 8:64184a968e3b 177 if (sec != SEC_NONE) {
gsfan 8:64184a968e3b 178 cmdWWEP(1, _state.pass);
gsfan 8:64184a968e3b 179 wait_ms(100);
gsfan 8:64184a968e3b 180 }
gsfan 8:64184a968e3b 181 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 182 break;
gsfan 8:64184a968e3b 183 default:
gsfan 8:64184a968e3b 184 DBG("Can't use security\r\n");
gsfan 8:64184a968e3b 185 break;
gsfan 5:78943b3945b5 186 }
gsfan 5:78943b3945b5 187
gsfan 8:64184a968e3b 188 if (!r) {
gsfan 8:64184a968e3b 189 _state.associated = true;
gsfan 8:64184a968e3b 190 }
gsfan 8:64184a968e3b 191 return r;
gsfan 5:78943b3945b5 192 }
gsfan 5:78943b3945b5 193
gsfan 8:64184a968e3b 194 int GSwifi::limitedap (Security sec, const char *ssid, const char *phrase)
gsfan 5:78943b3945b5 195 {
gsfan 8:64184a968e3b 196 bool r = -1;
gsfan 8:64184a968e3b 197
gsfan 8:64184a968e3b 198 _state.wm = WM_LIMITEDAP;
gsfan 8:64184a968e3b 199 setSsid(sec, ssid, phrase);
gsfan 8:64184a968e3b 200 if (!strlen(_state.name)) {
gsfan 8:64184a968e3b 201 strncpy(_state.name, CFG_DNSNAME, sizeof(_state.name));
gsfan 8:64184a968e3b 202 }
gsfan 8:64184a968e3b 203 clearFlags();
gsfan 8:64184a968e3b 204 sendCommand(NULL, RES_NULL, 0);
gsfan 8:64184a968e3b 205 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 206 if (_flow) {
gsfan 8:64184a968e3b 207 cmdR(true);
gsfan 8:64184a968e3b 208 }
gsfan 8:64184a968e3b 209 if (cmdNMAC()) return -1;
gsfan 8:64184a968e3b 210 cmdBDATA(true);
gsfan 8:64184a968e3b 211 cmdWM(2); // limitedap
gsfan 8:64184a968e3b 212 wait_ms(100);
gsfan 8:64184a968e3b 213
gsfan 8:64184a968e3b 214 cmdNDHCP(false);
gsfan 8:64184a968e3b 215 if (! _state.dhcp) {
gsfan 8:64184a968e3b 216 cmdNSET(_state.ip, _state.netmask, _state.ip);
gsfan 8:64184a968e3b 217 cmdDNSSET(_state.ip);
gsfan 5:78943b3945b5 218 }
gsfan 8:64184a968e3b 219 cmdDHCPSRVR(true);
gsfan 8:64184a968e3b 220 cmdDNS(true, _state.name);
gsfan 8:64184a968e3b 221
gsfan 8:64184a968e3b 222 switch (sec) {
gsfan 8:64184a968e3b 223 case SEC_NONE:
gsfan 8:64184a968e3b 224 case SEC_OPEN:
gsfan 8:64184a968e3b 225 case SEC_WEP:
gsfan 8:64184a968e3b 226 cmdWAUTH(_state.sec);
gsfan 8:64184a968e3b 227 if (sec != SEC_NONE) {
gsfan 8:64184a968e3b 228 cmdWWEP(1, _state.pass);
gsfan 8:64184a968e3b 229 wait_ms(100);
gsfan 8:64184a968e3b 230 }
gsfan 8:64184a968e3b 231 r = cmdWA(_state.ssid);
gsfan 8:64184a968e3b 232 break;
gsfan 8:64184a968e3b 233 default:
gsfan 8:64184a968e3b 234 DBG("Can't use security\r\n");
gsfan 8:64184a968e3b 235 break;
gsfan 8:64184a968e3b 236 }
gsfan 8:64184a968e3b 237
gsfan 8:64184a968e3b 238 if (!r) {
gsfan 8:64184a968e3b 239 _state.associated = true;
gsfan 8:64184a968e3b 240 }
gsfan 8:64184a968e3b 241 return r;
gsfan 5:78943b3945b5 242 }
gsfan 5:78943b3945b5 243
gsfan 8:64184a968e3b 244 int GSwifi::disconnect()
gsfan 5:78943b3945b5 245 {
gsfan 8:64184a968e3b 246 int i;
gsfan 5:78943b3945b5 247
gsfan 5:78943b3945b5 248 // if already disconnected, return
gsfan 5:78943b3945b5 249 if (!_state.associated)
gsfan 8:64184a968e3b 250 return 0;
gsfan 5:78943b3945b5 251
gsfan 8:64184a968e3b 252 #ifdef RTOS_H
gsfan 8:64184a968e3b 253 if (_threadPoll) {
gsfan 8:64184a968e3b 254 _threadPoll->terminate();
gsfan 8:64184a968e3b 255 delete _threadPoll;
gsfan 8:64184a968e3b 256 }
gsfan 8:64184a968e3b 257 #endif
gsfan 8:64184a968e3b 258 for (i = 0; i < 16; i ++) {
gsfan 8:64184a968e3b 259 if (_con[i].buf) {
gsfan 5:78943b3945b5 260 _con[i].buf->flush();
gsfan 8:64184a968e3b 261 }
gsfan 5:78943b3945b5 262 }
gsfan 8:64184a968e3b 263 cmdNCLOSEALL();
gsfan 8:64184a968e3b 264 cmdWD();
gsfan 8:64184a968e3b 265 cmdNDHCP(false);
gsfan 5:78943b3945b5 266 wait_ms(100);
gsfan 5:78943b3945b5 267
gsfan 5:78943b3945b5 268 _state.associated = false;
gsfan 8:64184a968e3b 269 return 0;
gsfan 5:78943b3945b5 270
gsfan 5:78943b3945b5 271 }
gsfan 5:78943b3945b5 272
gsfan 8:64184a968e3b 273 bool GSwifi::isConnected()
gsfan 5:78943b3945b5 274 {
gsfan 8:64184a968e3b 275 return _state.associated;
gsfan 5:78943b3945b5 276 }
gsfan 5:78943b3945b5 277
gsfan 8:64184a968e3b 278 void GSwifi::poll () {
gsfan 8:64184a968e3b 279 if (_state.wm == WM_INFRASTRUCTURE && (! isConnected()) && _state.ssid) {
gsfan 8:64184a968e3b 280 // Wi-Fi re-associate
gsfan 8:64184a968e3b 281 if (!cmdWA(_state.ssid)) {
gsfan 8:64184a968e3b 282 _state.associated = true;
gsfan 5:78943b3945b5 283 }
gsfan 5:78943b3945b5 284 }
gsfan 5:78943b3945b5 285 }
gsfan 5:78943b3945b5 286
gsfan 8:64184a968e3b 287 #ifdef RTOS_H
gsfan 8:64184a968e3b 288 void GSwifi::threadPoll (void const *args) {
gsfan 8:64184a968e3b 289 GSwifi * _wifi = GSwifi::getInstance();
gsfan 8:64184a968e3b 290 if (_wifi == NULL)
gsfan 8:64184a968e3b 291 error("Socket constructor error: no wifly instance available!\r\n");
gsfan 5:78943b3945b5 292
gsfan 8:64184a968e3b 293 INFO("threadPoll");
gsfan 8:64184a968e3b 294 for (;;) {
gsfan 8:64184a968e3b 295 Thread::signal_wait(1);
gsfan 8:64184a968e3b 296 Thread::wait(1000);
gsfan 8:64184a968e3b 297 INFO("disassociated");
gsfan 8:64184a968e3b 298 while (!_wifi->isConnected()){
gsfan 8:64184a968e3b 299 _wifi->poll();
gsfan 8:64184a968e3b 300 Thread::wait(CFG_TIMEOUT);
gsfan 5:78943b3945b5 301 }
gsfan 5:78943b3945b5 302 }
gsfan 5:78943b3945b5 303 }
gsfan 8:64184a968e3b 304 #endif
gsfan 5:78943b3945b5 305
gsfan 8:64184a968e3b 306 int GSwifi::setSsid (Security sec, const char *ssid, const char *phrase) {
gsfan 8:64184a968e3b 307 int i;
gsfan 5:78943b3945b5 308
gsfan 8:64184a968e3b 309 _state.sec = sec;
gsfan 8:64184a968e3b 310 // change all ' ' in '$' in the ssid and the passphrase
gsfan 8:64184a968e3b 311 strncpy(_state.ssid, ssid, sizeof(_state.ssid));
gsfan 8:64184a968e3b 312 for (i = 0; i < strlen(_state.ssid); i++) {
gsfan 8:64184a968e3b 313 if (_state.ssid[i] == ' ')
gsfan 8:64184a968e3b 314 _state.ssid[i] = '$';
gsfan 5:78943b3945b5 315 }
gsfan 8:64184a968e3b 316 strncpy(_state.pass, phrase, sizeof(_state.pass));
gsfan 8:64184a968e3b 317 for (i = 0; i < strlen(_state.pass); i++) {
gsfan 8:64184a968e3b 318 if (_state.pass[i] == ' ')
gsfan 8:64184a968e3b 319 _state.pass[i] = '$';
gsfan 5:78943b3945b5 320 }
gsfan 5:78943b3945b5 321 return 0;
gsfan 5:78943b3945b5 322 }
gsfan 5:78943b3945b5 323
gsfan 8:64184a968e3b 324 int GSwifi::standby (int msec) {
gsfan 8:64184a968e3b 325 switch (_state.status) {
gsfan 8:64184a968e3b 326 case STAT_READY:
gsfan 8:64184a968e3b 327 cmdSTORENWCONN();
gsfan 8:64184a968e3b 328 for (int i = 0; i < 16; i ++) {
gsfan 8:64184a968e3b 329 _con[i].connected = false;
gsfan 8:64184a968e3b 330 }
gsfan 8:64184a968e3b 331 break;
gsfan 8:64184a968e3b 332 case STAT_WAKEUP:
gsfan 8:64184a968e3b 333 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 334 if (_flow) {
gsfan 8:64184a968e3b 335 cmdR(true);
gsfan 8:64184a968e3b 336 }
gsfan 8:64184a968e3b 337 break;
gsfan 8:64184a968e3b 338 default:
gsfan 8:64184a968e3b 339 return -1;
gsfan 5:78943b3945b5 340 }
gsfan 8:64184a968e3b 341
gsfan 8:64184a968e3b 342 _state.status = STAT_STANDBY;
gsfan 8:64184a968e3b 343 return cmdPSSTBY(msec, 0);
gsfan 8:64184a968e3b 344 }
gsfan 8:64184a968e3b 345
gsfan 8:64184a968e3b 346 int GSwifi::deepSleep () {
gsfan 8:64184a968e3b 347 if (_state.status != STAT_READY) return -1;
gsfan 8:64184a968e3b 348 _state.status = STAT_DEEPSLEEP;
gsfan 8:64184a968e3b 349 return cmdPSDPSLEEP(); // go deep sleep
gsfan 5:78943b3945b5 350 }
gsfan 8:64184a968e3b 351
gsfan 8:64184a968e3b 352 int GSwifi::wakeup () {
gsfan 8:64184a968e3b 353 if (_state.status == STAT_STANDBY) {
gsfan 8:64184a968e3b 354 Timer timeout;
gsfan 8:64184a968e3b 355 setAlarm(true);
gsfan 8:64184a968e3b 356 timeout.start();
gsfan 8:64184a968e3b 357 while (_state.status != STAT_WAKEUP && timeout.read() < CFG_TIMEOUT);
gsfan 8:64184a968e3b 358 timeout.stop();
gsfan 8:64184a968e3b 359 setAlarm(false);
gsfan 8:64184a968e3b 360 }
gsfan 8:64184a968e3b 361
gsfan 8:64184a968e3b 362 switch (_state.status) {
gsfan 8:64184a968e3b 363 case STAT_WAKEUP:
gsfan 8:64184a968e3b 364 _state.status = STAT_READY;
gsfan 8:64184a968e3b 365 if (cmdE(false)) return -1;
gsfan 8:64184a968e3b 366 if (_flow) {
gsfan 8:64184a968e3b 367 cmdR(true);
gsfan 8:64184a968e3b 368 }
gsfan 8:64184a968e3b 369 cmdBDATA(true);
gsfan 8:64184a968e3b 370 int r = cmdRESTORENWCONN();
gsfan 8:64184a968e3b 371 wait_ms(100);
gsfan 8:64184a968e3b 372 // return cmdWRXACTIVE(true);
gsfan 8:64184a968e3b 373 return r;
gsfan 8:64184a968e3b 374 case STAT_DEEPSLEEP:
gsfan 8:64184a968e3b 375 _state.status = STAT_READY;
gsfan 8:64184a968e3b 376 return cmdAT();
gsfan 8:64184a968e3b 377 }
gsfan 8:64184a968e3b 378 return -1;
gsfan 8:64184a968e3b 379 }
gsfan 8:64184a968e3b 380