private fork
Fork of GSwifiInterface by
GSwifi/GSwifi.cpp@8:64184a968e3b, 2013-10-31 (annotated)
- 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?
User | Revision | Line number | New 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 |