mayuresh bharmoria / Mbed OS mbed-os-example-wifi
Committer:
mayur098
Date:
Thu Jun 21 17:50:21 2018 +0000
Revision:
0:8f8e8f3cbd1c
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mayur098 0:8f8e8f3cbd1c 1 /* SPWFSA04 Device
mayur098 0:8f8e8f3cbd1c 2 * Copyright (c) 2015 ARM Limited
mayur098 0:8f8e8f3cbd1c 3 *
mayur098 0:8f8e8f3cbd1c 4 * Licensed under the Apache License, Version 2.0 (the "License");
mayur098 0:8f8e8f3cbd1c 5 * you may not use this file except in compliance with the License.
mayur098 0:8f8e8f3cbd1c 6 * You may obtain a copy of the License at
mayur098 0:8f8e8f3cbd1c 7 *
mayur098 0:8f8e8f3cbd1c 8 * http://www.apache.org/licenses/LICENSE-2.0
mayur098 0:8f8e8f3cbd1c 9 *
mayur098 0:8f8e8f3cbd1c 10 * Unless required by applicable law or agreed to in writing, software
mayur098 0:8f8e8f3cbd1c 11 * distributed under the License is distributed on an "AS IS" BASIS,
mayur098 0:8f8e8f3cbd1c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mayur098 0:8f8e8f3cbd1c 13 * See the License for the specific language governing permissions and
mayur098 0:8f8e8f3cbd1c 14 * limitations under the License.
mayur098 0:8f8e8f3cbd1c 15 */
mayur098 0:8f8e8f3cbd1c 16
mayur098 0:8f8e8f3cbd1c 17 #include "SPWFSA04.h"
mayur098 0:8f8e8f3cbd1c 18 #include "SpwfSAInterface.h"
mayur098 0:8f8e8f3cbd1c 19 #include "mbed_debug.h"
mayur098 0:8f8e8f3cbd1c 20
mayur098 0:8f8e8f3cbd1c 21 #if MBED_CONF_IDW0XX1_EXPANSION_BOARD == IDW04A1
mayur098 0:8f8e8f3cbd1c 22
mayur098 0:8f8e8f3cbd1c 23 SPWFSA04::SPWFSA04(PinName tx, PinName rx,
mayur098 0:8f8e8f3cbd1c 24 PinName rts, PinName cts,
mayur098 0:8f8e8f3cbd1c 25 SpwfSAInterface &ifce, bool debug,
mayur098 0:8f8e8f3cbd1c 26 PinName wakeup, PinName reset)
mayur098 0:8f8e8f3cbd1c 27 : SPWFSAxx(tx, rx, rts, cts, ifce, debug, wakeup, reset) {
mayur098 0:8f8e8f3cbd1c 28 }
mayur098 0:8f8e8f3cbd1c 29
mayur098 0:8f8e8f3cbd1c 30 bool SPWFSA04::open(const char *type, int* spwf_id, const char* addr, int port)
mayur098 0:8f8e8f3cbd1c 31 {
mayur098 0:8f8e8f3cbd1c 32 int socket_id;
mayur098 0:8f8e8f3cbd1c 33 int value;
mayur098 0:8f8e8f3cbd1c 34 int trials;
mayur098 0:8f8e8f3cbd1c 35
mayur098 0:8f8e8f3cbd1c 36 if(!_parser.send("AT+S.SOCKON=%s,%d,NULL,%s", addr, port, type))
mayur098 0:8f8e8f3cbd1c 37 {
mayur098 0:8f8e8f3cbd1c 38 debug_if(_dbg_on, "\r\nSPWF> `SPWFSA04::open`: error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 39 return false;
mayur098 0:8f8e8f3cbd1c 40 }
mayur098 0:8f8e8f3cbd1c 41
mayur098 0:8f8e8f3cbd1c 42 /* handle both response possibilities here before returning
mayur098 0:8f8e8f3cbd1c 43 * otherwise module seems to remain in inconsistent state.
mayur098 0:8f8e8f3cbd1c 44 */
mayur098 0:8f8e8f3cbd1c 45
mayur098 0:8f8e8f3cbd1c 46 if(!_parser.recv("AT-S.")) { // get prefix
mayur098 0:8f8e8f3cbd1c 47 debug_if(_dbg_on, "\r\nSPWF> `SPWFSA04::open`: error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 48 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 49 return false;
mayur098 0:8f8e8f3cbd1c 50 }
mayur098 0:8f8e8f3cbd1c 51
mayur098 0:8f8e8f3cbd1c 52 /* wait for next character */
mayur098 0:8f8e8f3cbd1c 53 trials = 0;
mayur098 0:8f8e8f3cbd1c 54 while((value = _parser.getc()) < 0) {
mayur098 0:8f8e8f3cbd1c 55 if(++trials >= SPWFXX_MAX_TRIALS) {
mayur098 0:8f8e8f3cbd1c 56 debug("\r\nSPWF> `SPWFSA04::open`: error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 57 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 58 return false;
mayur098 0:8f8e8f3cbd1c 59 }
mayur098 0:8f8e8f3cbd1c 60 }
mayur098 0:8f8e8f3cbd1c 61
mayur098 0:8f8e8f3cbd1c 62 switch(value) {
mayur098 0:8f8e8f3cbd1c 63 case 'O':
mayur098 0:8f8e8f3cbd1c 64 /* get next character */
mayur098 0:8f8e8f3cbd1c 65 value = _parser.getc();
mayur098 0:8f8e8f3cbd1c 66 if(value != 'n') {
mayur098 0:8f8e8f3cbd1c 67 debug_if(_dbg_on, "\r\nSPWF> `SPWFSA04::open`: error opening socket (%d) (%d, \'%c\')\r\n",
mayur098 0:8f8e8f3cbd1c 68 __LINE__, value, value);
mayur098 0:8f8e8f3cbd1c 69 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 70 return false;
mayur098 0:8f8e8f3cbd1c 71 }
mayur098 0:8f8e8f3cbd1c 72
mayur098 0:8f8e8f3cbd1c 73 /* get socket id */
mayur098 0:8f8e8f3cbd1c 74 if(!(_parser.recv(":%*u.%*u.%*u.%*u:%d\n", &socket_id)
mayur098 0:8f8e8f3cbd1c 75 && _recv_delim_lf()
mayur098 0:8f8e8f3cbd1c 76 && _recv_ok())) {
mayur098 0:8f8e8f3cbd1c 77 debug_if(_dbg_on, "\r\nSPWF> `SPWFSA04::open`: error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 78 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 79 return false;
mayur098 0:8f8e8f3cbd1c 80 }
mayur098 0:8f8e8f3cbd1c 81 debug_if(_dbg_on, "AT^ AT-S.On:%s:%d\r\n", addr, socket_id);
mayur098 0:8f8e8f3cbd1c 82
mayur098 0:8f8e8f3cbd1c 83 *spwf_id = socket_id;
mayur098 0:8f8e8f3cbd1c 84 return true;
mayur098 0:8f8e8f3cbd1c 85 case 'E':
mayur098 0:8f8e8f3cbd1c 86 int err_nr;
mayur098 0:8f8e8f3cbd1c 87 if(_parser.recv("RROR:%d:%[^\n]\n", &err_nr, _msg_buffer) && _recv_delim_lf()) {
mayur098 0:8f8e8f3cbd1c 88 debug_if(_dbg_on, "AT^ AT-S.ERROR:%d:%s (%d)\r\n", err_nr, _msg_buffer, __LINE__);
mayur098 0:8f8e8f3cbd1c 89 } else {
mayur098 0:8f8e8f3cbd1c 90 debug_if(_dbg_on, "\r\nSPWF> `SPWFSA04::open`: error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 91 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 92 }
mayur098 0:8f8e8f3cbd1c 93 break;
mayur098 0:8f8e8f3cbd1c 94 default:
mayur098 0:8f8e8f3cbd1c 95 debug_if(_dbg_on, "\r\nSPWF> `SPWFSA04::open`: error opening socket (%d) (%d, \'%c\')\r\n",
mayur098 0:8f8e8f3cbd1c 96 __LINE__, value, value);
mayur098 0:8f8e8f3cbd1c 97 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 98 break;
mayur098 0:8f8e8f3cbd1c 99 }
mayur098 0:8f8e8f3cbd1c 100
mayur098 0:8f8e8f3cbd1c 101 return false;
mayur098 0:8f8e8f3cbd1c 102 }
mayur098 0:8f8e8f3cbd1c 103
mayur098 0:8f8e8f3cbd1c 104 int SPWFSA04::_read_in(char* buffer, int spwf_id, uint32_t amount) {
mayur098 0:8f8e8f3cbd1c 105 int ret = -1;
mayur098 0:8f8e8f3cbd1c 106 int received, cumulative;
mayur098 0:8f8e8f3cbd1c 107
mayur098 0:8f8e8f3cbd1c 108 MBED_ASSERT(buffer != NULL);
mayur098 0:8f8e8f3cbd1c 109
mayur098 0:8f8e8f3cbd1c 110 /* block asynchronous indications */
mayur098 0:8f8e8f3cbd1c 111 if(!_winds_off()) {
mayur098 0:8f8e8f3cbd1c 112 return -1;
mayur098 0:8f8e8f3cbd1c 113 }
mayur098 0:8f8e8f3cbd1c 114
mayur098 0:8f8e8f3cbd1c 115 /* read in data */
mayur098 0:8f8e8f3cbd1c 116 if(_parser.send("AT+S.SOCKR=%d,%d", spwf_id, (unsigned int)amount)) {
mayur098 0:8f8e8f3cbd1c 117 if(!(_parser.recv("AT-S.Reading:%d:%d\n", &received, &cumulative) &&
mayur098 0:8f8e8f3cbd1c 118 _recv_delim_lf())) {
mayur098 0:8f8e8f3cbd1c 119 debug_if(_dbg_on, "%s(%d): failed to receive AT-S.Reading\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 120 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 121 } else {
mayur098 0:8f8e8f3cbd1c 122 /* set high timeout */
mayur098 0:8f8e8f3cbd1c 123 _parser.set_timeout(SPWF_READ_BIN_TIMEOUT);
mayur098 0:8f8e8f3cbd1c 124 /* read in binary data */
mayur098 0:8f8e8f3cbd1c 125 int read = _parser.read(buffer, amount);
mayur098 0:8f8e8f3cbd1c 126 /* reset timeout value */
mayur098 0:8f8e8f3cbd1c 127 _parser.set_timeout(_timeout);
mayur098 0:8f8e8f3cbd1c 128 if(read > 0) {
mayur098 0:8f8e8f3cbd1c 129 if(_recv_ok()) {
mayur098 0:8f8e8f3cbd1c 130 ret = amount;
mayur098 0:8f8e8f3cbd1c 131
mayur098 0:8f8e8f3cbd1c 132 /* remove from pending sizes
mayur098 0:8f8e8f3cbd1c 133 * (MUST be done before next async indications handling (e.g. `_winds_on()`)) */
mayur098 0:8f8e8f3cbd1c 134 _remove_pending_pkt_size(spwf_id, amount);
mayur098 0:8f8e8f3cbd1c 135 } else {
mayur098 0:8f8e8f3cbd1c 136 debug_if(_dbg_on, "%s(%d): failed to receive OK\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 137 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 138 }
mayur098 0:8f8e8f3cbd1c 139 } else {
mayur098 0:8f8e8f3cbd1c 140 debug_if(_dbg_on, "%s(%d): failed to read binary data\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 141 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 142 }
mayur098 0:8f8e8f3cbd1c 143 }
mayur098 0:8f8e8f3cbd1c 144 } else {
mayur098 0:8f8e8f3cbd1c 145 debug_if(_dbg_on, "%s(%d): failed to send SOCKR\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 146 }
mayur098 0:8f8e8f3cbd1c 147
mayur098 0:8f8e8f3cbd1c 148 debug_if(_dbg_on, "%s():\t%d:%d\r\n", __func__, spwf_id, amount);
mayur098 0:8f8e8f3cbd1c 149
mayur098 0:8f8e8f3cbd1c 150 /* unblock asynchronous indications */
mayur098 0:8f8e8f3cbd1c 151 _winds_on();
mayur098 0:8f8e8f3cbd1c 152
mayur098 0:8f8e8f3cbd1c 153 return ret;
mayur098 0:8f8e8f3cbd1c 154 }
mayur098 0:8f8e8f3cbd1c 155
mayur098 0:8f8e8f3cbd1c 156 /* betzw - TODO: improve performance! */
mayur098 0:8f8e8f3cbd1c 157 bool SPWFSA04::_recv_ap(nsapi_wifi_ap_t *ap)
mayur098 0:8f8e8f3cbd1c 158 {
mayur098 0:8f8e8f3cbd1c 159 bool ret;
mayur098 0:8f8e8f3cbd1c 160 int curr;
mayur098 0:8f8e8f3cbd1c 161 unsigned int channel;
mayur098 0:8f8e8f3cbd1c 162 int trials;
mayur098 0:8f8e8f3cbd1c 163
mayur098 0:8f8e8f3cbd1c 164 ap->security = NSAPI_SECURITY_UNKNOWN;
mayur098 0:8f8e8f3cbd1c 165
mayur098 0:8f8e8f3cbd1c 166 /* determine list end */
mayur098 0:8f8e8f3cbd1c 167 curr = _parser.getc();
mayur098 0:8f8e8f3cbd1c 168 if(curr == 'A') { // assume end of list ("AT-S.OK")
mayur098 0:8f8e8f3cbd1c 169 if(!(_parser.recv("T-S.OK\n") && _recv_delim_lf())) {
mayur098 0:8f8e8f3cbd1c 170 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 171 }
mayur098 0:8f8e8f3cbd1c 172 return false;
mayur098 0:8f8e8f3cbd1c 173 }
mayur098 0:8f8e8f3cbd1c 174
mayur098 0:8f8e8f3cbd1c 175 /* run to 'horizontal tab' */
mayur098 0:8f8e8f3cbd1c 176 trials = 0;
mayur098 0:8f8e8f3cbd1c 177 while(_parser.getc() != '\x09') {
mayur098 0:8f8e8f3cbd1c 178 if(trials++ > SPWFXX_MAX_TRIALS) {
mayur098 0:8f8e8f3cbd1c 179 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 180 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 181 return false;
mayur098 0:8f8e8f3cbd1c 182 }
mayur098 0:8f8e8f3cbd1c 183 }
mayur098 0:8f8e8f3cbd1c 184
mayur098 0:8f8e8f3cbd1c 185 /* read in next line */
mayur098 0:8f8e8f3cbd1c 186 ret = _parser.recv(" %*s %hhx:%hhx:%hhx:%hhx:%hhx:%hhx CHAN: %u RSSI: %hhd SSID: \'%255[^\']\'",
mayur098 0:8f8e8f3cbd1c 187 &ap->bssid[0], &ap->bssid[1], &ap->bssid[2], &ap->bssid[3], &ap->bssid[4], &ap->bssid[5],
mayur098 0:8f8e8f3cbd1c 188 &channel, &ap->rssi, ssid_buf);
mayur098 0:8f8e8f3cbd1c 189
mayur098 0:8f8e8f3cbd1c 190 if(ret) { // ret == true
mayur098 0:8f8e8f3cbd1c 191 char value;
mayur098 0:8f8e8f3cbd1c 192 char *rest;
mayur098 0:8f8e8f3cbd1c 193 int val_getc;
mayur098 0:8f8e8f3cbd1c 194 unsigned int i;
mayur098 0:8f8e8f3cbd1c 195 size_t first_half;
mayur098 0:8f8e8f3cbd1c 196
mayur098 0:8f8e8f3cbd1c 197 /* read in rest of line */
mayur098 0:8f8e8f3cbd1c 198 first_half = strlen(ssid_buf);
mayur098 0:8f8e8f3cbd1c 199 for(i = first_half; i < sizeof(ssid_buf); i++) {
mayur098 0:8f8e8f3cbd1c 200 val_getc = _parser.getc();
mayur098 0:8f8e8f3cbd1c 201 ssid_buf[i] = (char)val_getc;
mayur098 0:8f8e8f3cbd1c 202 if(val_getc < 0) {
mayur098 0:8f8e8f3cbd1c 203 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 204 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 205 return false;
mayur098 0:8f8e8f3cbd1c 206 } else if(val_getc == _cr_) { // '\r'
mayur098 0:8f8e8f3cbd1c 207 val_getc = _parser.getc();
mayur098 0:8f8e8f3cbd1c 208 if('\n' != (char)val_getc) {
mayur098 0:8f8e8f3cbd1c 209 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 210 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 211 return false;
mayur098 0:8f8e8f3cbd1c 212 }
mayur098 0:8f8e8f3cbd1c 213 break;
mayur098 0:8f8e8f3cbd1c 214 } else if(val_getc == _lf_) { // '\n'; betzw: WORK-AROUND module FW issues
mayur098 0:8f8e8f3cbd1c 215 break;
mayur098 0:8f8e8f3cbd1c 216 }
mayur098 0:8f8e8f3cbd1c 217 }
mayur098 0:8f8e8f3cbd1c 218 ssid_buf[i] = '\0';
mayur098 0:8f8e8f3cbd1c 219
mayur098 0:8f8e8f3cbd1c 220 /* decide about position of `CAPS:` */
mayur098 0:8f8e8f3cbd1c 221 rest = strstr(&ssid_buf[first_half], "CAPS:");
mayur098 0:8f8e8f3cbd1c 222 if(rest == NULL) {
mayur098 0:8f8e8f3cbd1c 223 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 224 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 225 return false;
mayur098 0:8f8e8f3cbd1c 226 }
mayur098 0:8f8e8f3cbd1c 227
mayur098 0:8f8e8f3cbd1c 228 /* substitute <space> with '\0' */
mayur098 0:8f8e8f3cbd1c 229 MBED_ASSERT(&rest[-1] >= &ssid_buf[0]);
mayur098 0:8f8e8f3cbd1c 230 rest[-1] = '\0';
mayur098 0:8f8e8f3cbd1c 231
mayur098 0:8f8e8f3cbd1c 232 /* eventually substitute '\'' with '\0' */
mayur098 0:8f8e8f3cbd1c 233 if((&rest[-2] >= &ssid_buf[0]) && (rest[-2] == '\'')) {
mayur098 0:8f8e8f3cbd1c 234 rest[-2] = '\0';
mayur098 0:8f8e8f3cbd1c 235 }
mayur098 0:8f8e8f3cbd1c 236
mayur098 0:8f8e8f3cbd1c 237 /* copy values */
mayur098 0:8f8e8f3cbd1c 238 memcpy(&ap->ssid, ssid_buf, 32);
mayur098 0:8f8e8f3cbd1c 239 ap->ssid[32] = '\0';
mayur098 0:8f8e8f3cbd1c 240 ap->channel = channel;
mayur098 0:8f8e8f3cbd1c 241
mayur098 0:8f8e8f3cbd1c 242 /* skip `CAPS: 0421 ` */
mayur098 0:8f8e8f3cbd1c 243 if(strlen(rest) < 11) {
mayur098 0:8f8e8f3cbd1c 244 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 245 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 246 return false;
mayur098 0:8f8e8f3cbd1c 247 }
mayur098 0:8f8e8f3cbd1c 248 rest += 11;
mayur098 0:8f8e8f3cbd1c 249
mayur098 0:8f8e8f3cbd1c 250 /* get next character */
mayur098 0:8f8e8f3cbd1c 251 value = *rest++;
mayur098 0:8f8e8f3cbd1c 252 if(value != 'W') { // no security
mayur098 0:8f8e8f3cbd1c 253 ap->security = NSAPI_SECURITY_NONE;
mayur098 0:8f8e8f3cbd1c 254 return true;
mayur098 0:8f8e8f3cbd1c 255 }
mayur098 0:8f8e8f3cbd1c 256
mayur098 0:8f8e8f3cbd1c 257 /* determine security */
mayur098 0:8f8e8f3cbd1c 258 {
mayur098 0:8f8e8f3cbd1c 259 char buffer[10];
mayur098 0:8f8e8f3cbd1c 260
mayur098 0:8f8e8f3cbd1c 261 if(!(sscanf(rest, "%s%*[\x20]", (char*)&buffer) > 0)) { // '\0x20' == <space>
mayur098 0:8f8e8f3cbd1c 262 return true;
mayur098 0:8f8e8f3cbd1c 263 } else if(strncmp("EP", buffer, 10) == 0) {
mayur098 0:8f8e8f3cbd1c 264 ap->security = NSAPI_SECURITY_WEP;
mayur098 0:8f8e8f3cbd1c 265 return true;
mayur098 0:8f8e8f3cbd1c 266 } else if(strncmp("PA2", buffer, 10) == 0) {
mayur098 0:8f8e8f3cbd1c 267 ap->security = NSAPI_SECURITY_WPA2;
mayur098 0:8f8e8f3cbd1c 268 return true;
mayur098 0:8f8e8f3cbd1c 269 } else if(strncmp("PA", buffer, 10) != 0) {
mayur098 0:8f8e8f3cbd1c 270 return true;
mayur098 0:8f8e8f3cbd1c 271 }
mayur098 0:8f8e8f3cbd1c 272
mayur098 0:8f8e8f3cbd1c 273 /* got a "WPA", check for "WPA2" */
mayur098 0:8f8e8f3cbd1c 274 rest += strlen(buffer);
mayur098 0:8f8e8f3cbd1c 275 value = *rest++;
mayur098 0:8f8e8f3cbd1c 276 if(value == '\0') { // no further protocol
mayur098 0:8f8e8f3cbd1c 277 ap->security = NSAPI_SECURITY_WPA;
mayur098 0:8f8e8f3cbd1c 278 return true;
mayur098 0:8f8e8f3cbd1c 279 } else { // assume "WPA2"
mayur098 0:8f8e8f3cbd1c 280 ap->security = NSAPI_SECURITY_WPA_WPA2;
mayur098 0:8f8e8f3cbd1c 281 return true;
mayur098 0:8f8e8f3cbd1c 282 }
mayur098 0:8f8e8f3cbd1c 283 }
mayur098 0:8f8e8f3cbd1c 284 } else { // ret == false
mayur098 0:8f8e8f3cbd1c 285 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 286 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 287 }
mayur098 0:8f8e8f3cbd1c 288
mayur098 0:8f8e8f3cbd1c 289 return ret;
mayur098 0:8f8e8f3cbd1c 290 }
mayur098 0:8f8e8f3cbd1c 291
mayur098 0:8f8e8f3cbd1c 292 nsapi_size_or_error_t SPWFSA04::scan(WiFiAccessPoint *res, unsigned limit)
mayur098 0:8f8e8f3cbd1c 293 {
mayur098 0:8f8e8f3cbd1c 294 unsigned int cnt = 0, found;
mayur098 0:8f8e8f3cbd1c 295 nsapi_wifi_ap_t ap;
mayur098 0:8f8e8f3cbd1c 296
mayur098 0:8f8e8f3cbd1c 297 if (!_parser.send("AT+S.SCAN=s,")) {
mayur098 0:8f8e8f3cbd1c 298 return NSAPI_ERROR_DEVICE_ERROR;
mayur098 0:8f8e8f3cbd1c 299 }
mayur098 0:8f8e8f3cbd1c 300
mayur098 0:8f8e8f3cbd1c 301 if(!(_parser.recv("AT-S.Parsing Networks:%u\n", &found) && _recv_delim_lf())) {
mayur098 0:8f8e8f3cbd1c 302 debug_if(_dbg_on, "SPWF> error start network scanning\r\n");
mayur098 0:8f8e8f3cbd1c 303 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 304 return NSAPI_ERROR_DEVICE_ERROR;
mayur098 0:8f8e8f3cbd1c 305 }
mayur098 0:8f8e8f3cbd1c 306
mayur098 0:8f8e8f3cbd1c 307 debug_if(_dbg_on, "AT^ AT-S.Parsing Networks:%u\r\n", found);
mayur098 0:8f8e8f3cbd1c 308
mayur098 0:8f8e8f3cbd1c 309 if(found > 0) {
mayur098 0:8f8e8f3cbd1c 310 while (_recv_ap(&ap)) {
mayur098 0:8f8e8f3cbd1c 311 if (cnt < limit) {
mayur098 0:8f8e8f3cbd1c 312 res[cnt] = WiFiAccessPoint(ap);
mayur098 0:8f8e8f3cbd1c 313 }
mayur098 0:8f8e8f3cbd1c 314
mayur098 0:8f8e8f3cbd1c 315 if (!((limit != 0) && ((cnt + 1) > limit))) {
mayur098 0:8f8e8f3cbd1c 316 cnt++;
mayur098 0:8f8e8f3cbd1c 317 }
mayur098 0:8f8e8f3cbd1c 318 }
mayur098 0:8f8e8f3cbd1c 319 } else {
mayur098 0:8f8e8f3cbd1c 320 if(!_recv_ok()) {
mayur098 0:8f8e8f3cbd1c 321 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 322 }
mayur098 0:8f8e8f3cbd1c 323 }
mayur098 0:8f8e8f3cbd1c 324
mayur098 0:8f8e8f3cbd1c 325 return cnt;
mayur098 0:8f8e8f3cbd1c 326 }
mayur098 0:8f8e8f3cbd1c 327
mayur098 0:8f8e8f3cbd1c 328 #endif // MBED_CONF_IDW0XX1_EXPANSION_BOARD