fixed recv to support wind msg and rx fragments

Dependencies:   ATParser

Fork of SPWF01SA by ST

Committer:
mapellil
Date:
Fri Oct 14 15:24:17 2016 +0000
Revision:
23:38b37bf10da7
Parent:
22:0fb8db6110be
removed old recv

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:9e5d98ceea74 1 /* SPWFInterface Example
mridup 0:9e5d98ceea74 2 * Copyright (c) 2015 ARM Limited
mridup 0:9e5d98ceea74 3 *
mridup 0:9e5d98ceea74 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 0:9e5d98ceea74 5 * you may not use this file except in compliance with the License.
mridup 0:9e5d98ceea74 6 * You may obtain a copy of the License at
mridup 0:9e5d98ceea74 7 *
mridup 0:9e5d98ceea74 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 0:9e5d98ceea74 9 *
mridup 0:9e5d98ceea74 10 * Unless required by applicable law or agreed to in writing, software
mridup 0:9e5d98ceea74 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 0:9e5d98ceea74 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 0:9e5d98ceea74 13 * See the License for the specific language governing permissions and
mridup 0:9e5d98ceea74 14 * limitations under the License.
mridup 0:9e5d98ceea74 15 */
mridup 0:9e5d98ceea74 16
mridup 0:9e5d98ceea74 17 #include "SPWFSA01.h"
mridup 13:f21e4e73bbb6 18 #include "mbed_debug.h"
mridup 0:9e5d98ceea74 19
mridup 20:01031cd39e73 20 #define SPWFSA01_CONNECT_TIMEOUT 15000
mridup 20:01031cd39e73 21 #define SPWFSA01_SEND_TIMEOUT 500
mridup 20:01031cd39e73 22 #define SPWFSA01_RECV_TIMEOUT 1500//some commands like AT&F/W takes some time to get the result back!
mridup 20:01031cd39e73 23 #define SPWFSA01_MISC_TIMEOUT 500
mridup 20:01031cd39e73 24 #define SPWFSA01_SOCKQ_TIMEOUT 3000
mridup 0:9e5d98ceea74 25
mridup 0:9e5d98ceea74 26 SPWFSA01::SPWFSA01(PinName tx, PinName rx, bool debug)
mridup 0:9e5d98ceea74 27 : _serial(tx, rx, 1024), _parser(_serial),
mridup 14:868b0fd4e84a 28 _wakeup(D14, PIN_INPUT, PullNone, 0), _reset(D15, PIN_INPUT, PullNone, 1),
mridup 14:868b0fd4e84a 29 //PC_12->D15, PC_8->D14 (re-wires needed in-case used, currently not used)
mapellil 22:0fb8db6110be 30 dbg_on(debug), _recv_state(RESIDUAL_DATA_ON_RECV)
mridup 0:9e5d98ceea74 31 //Pin PC_8 is wakeup pin
mridup 0:9e5d98ceea74 32 //Pin PA_12 is reset pin
mridup 0:9e5d98ceea74 33 {
mridup 0:9e5d98ceea74 34 _serial.baud(115200);
mridup 0:9e5d98ceea74 35 _reset.output();
mridup 0:9e5d98ceea74 36 _wakeup.output();
mridup 0:9e5d98ceea74 37 _parser.debugOn(debug);
mapellil 22:0fb8db6110be 38 memset (_ip_buffer, 0, sizeof(_ip_buffer));
mapellil 22:0fb8db6110be 39 memset (_mac_buffer, 0, sizeof(_mac_buffer));
mapellil 22:0fb8db6110be 40 _recv_residual_data=0;
mridup 0:9e5d98ceea74 41 }
mridup 0:9e5d98ceea74 42
mridup 0:9e5d98ceea74 43 bool SPWFSA01::startup(int mode)
mridup 0:9e5d98ceea74 44 {
mridup 0:9e5d98ceea74 45 setTimeout(SPWFSA01_RECV_TIMEOUT);
mridup 0:9e5d98ceea74 46
mridup 0:9e5d98ceea74 47 /*Test module before reset*/
mridup 0:9e5d98ceea74 48 waitSPWFReady();
mridup 0:9e5d98ceea74 49 /*Reset module*/
mridup 0:9e5d98ceea74 50 reset();
mridup 0:9e5d98ceea74 51
mridup 0:9e5d98ceea74 52 /*set local echo to 0*/
mridup 8:a4425b8dd2e4 53 if(!(_parser.send("AT+S.SCFG=localecho1,%d\r", 0) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 54 {
mridup 13:f21e4e73bbb6 55 debug_if(dbg_on, "SPWF> error local echo set\r\n");
mridup 0:9e5d98ceea74 56 return false;
mridup 0:9e5d98ceea74 57 }
mridup 0:9e5d98ceea74 58 /*reset factory settings*/
mridup 0:9e5d98ceea74 59 if(!(_parser.send("AT&F") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 60 {
mridup 13:f21e4e73bbb6 61 debug_if(dbg_on, "SPWF> error AT&F\r\n");
mridup 0:9e5d98ceea74 62 return false;
mridup 0:9e5d98ceea74 63 }
mridup 0:9e5d98ceea74 64
mridup 0:9e5d98ceea74 65 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
mridup 0:9e5d98ceea74 66 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", mode) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 67 {
mridup 13:f21e4e73bbb6 68 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
mridup 0:9e5d98ceea74 69 return false;
mridup 0:9e5d98ceea74 70 }
mridup 0:9e5d98ceea74 71
mridup 0:9e5d98ceea74 72 /* save current setting in flash */
mridup 0:9e5d98ceea74 73 if(!(_parser.send("AT&W") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 74 {
mridup 13:f21e4e73bbb6 75 debug_if(dbg_on, "SPWF> error AT&W\r\n");
mridup 0:9e5d98ceea74 76 return false;
mridup 0:9e5d98ceea74 77 }
mridup 0:9e5d98ceea74 78
mridup 0:9e5d98ceea74 79 /*reset again and send AT command and check for result (AT->OK)*/
mridup 0:9e5d98ceea74 80 reset();
mridup 0:9e5d98ceea74 81
mridup 0:9e5d98ceea74 82 return true;
mridup 0:9e5d98ceea74 83 }
mridup 0:9e5d98ceea74 84
mridup 0:9e5d98ceea74 85 bool SPWFSA01::hw_reset(void)
mridup 0:9e5d98ceea74 86 {
mridup 0:9e5d98ceea74 87 /* reset the pin PC12 */
mridup 0:9e5d98ceea74 88 _reset.write(0);
mridup 0:9e5d98ceea74 89 wait_ms(200);
mridup 0:9e5d98ceea74 90 _reset.write(1);
mridup 0:9e5d98ceea74 91 wait_ms(100);
mridup 0:9e5d98ceea74 92 return 1;
mridup 0:9e5d98ceea74 93 }
mridup 0:9e5d98ceea74 94
mridup 0:9e5d98ceea74 95 bool SPWFSA01::reset(void)
mridup 0:9e5d98ceea74 96 {
mridup 0:9e5d98ceea74 97 if(!_parser.send("AT+CFUN=1")) return false;
mridup 0:9e5d98ceea74 98 while(1) {
mridup 8:a4425b8dd2e4 99 if (_parser.recv("+WIND:32:WiFi Hardware Started\r")) {
mridup 0:9e5d98ceea74 100 return true;
mridup 0:9e5d98ceea74 101 }
mridup 0:9e5d98ceea74 102 }
mridup 0:9e5d98ceea74 103 }
mridup 0:9e5d98ceea74 104
mridup 0:9e5d98ceea74 105 void SPWFSA01::waitSPWFReady(void)
mridup 0:9e5d98ceea74 106 {
mridup 0:9e5d98ceea74 107 //wait_ms(200);
mridup 0:9e5d98ceea74 108 while(1)
mridup 0:9e5d98ceea74 109 if(_parser.send("AT") && _parser.recv("OK"))
mridup 0:9e5d98ceea74 110 //till we get OK from AT command
mridup 0:9e5d98ceea74 111 //printf("\r\nwaiting for reset to complete..\n");
mridup 0:9e5d98ceea74 112 return;
mridup 0:9e5d98ceea74 113
mridup 0:9e5d98ceea74 114 }
mridup 0:9e5d98ceea74 115
mridup 0:9e5d98ceea74 116 /* Security Mode
mridup 0:9e5d98ceea74 117 None = 0,
mridup 0:9e5d98ceea74 118 WEP = 1,
mridup 0:9e5d98ceea74 119 WPA_Personal = 2,
mridup 0:9e5d98ceea74 120 */
mridup 0:9e5d98ceea74 121 bool SPWFSA01::connect(const char *ap, const char *passPhrase, int securityMode)
mridup 0:9e5d98ceea74 122 {
mridup 0:9e5d98ceea74 123 uint32_t n1, n2, n3, n4;
mridup 0:9e5d98ceea74 124
mridup 0:9e5d98ceea74 125 //AT+S.SCFG=wifi_wpa_psk_text,%s\r
mridup 0:9e5d98ceea74 126 if(!(_parser.send("AT+S.SCFG=wifi_wpa_psk_text,%s", passPhrase) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 127 {
mridup 13:f21e4e73bbb6 128 debug_if(dbg_on, "SPWF> error pass set\r\n");
mridup 0:9e5d98ceea74 129 return false;
mridup 0:9e5d98ceea74 130 }
mridup 0:9e5d98ceea74 131 //AT+S.SSIDTXT=%s\r
mridup 0:9e5d98ceea74 132 if(!(_parser.send("AT+S.SSIDTXT=%s", ap) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 133 {
mridup 13:f21e4e73bbb6 134 debug_if(dbg_on, "SPWF> error ssid set\r\n");
mridup 0:9e5d98ceea74 135 return false;
mridup 0:9e5d98ceea74 136 }
mridup 0:9e5d98ceea74 137 //AT+S.SCFG=wifi_priv_mode,%d\r
mridup 0:9e5d98ceea74 138 if(!(_parser.send("AT+S.SCFG=wifi_priv_mode,%d", securityMode) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 139 {
mridup 13:f21e4e73bbb6 140 debug_if(dbg_on, "SPWF> error security mode set\r\n");
mridup 0:9e5d98ceea74 141 return false;
mridup 0:9e5d98ceea74 142 }
mridup 0:9e5d98ceea74 143 //"AT+S.SCFG=wifi_mode,%d\r"
mridup 0:9e5d98ceea74 144 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
mridup 0:9e5d98ceea74 145 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 1) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 146 {
mridup 13:f21e4e73bbb6 147 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
mridup 0:9e5d98ceea74 148 return false;
mridup 0:9e5d98ceea74 149 }
mridup 0:9e5d98ceea74 150 //AT&W
mridup 0:9e5d98ceea74 151 /* save current setting in flash */
mridup 0:9e5d98ceea74 152 if(!(_parser.send("AT&W") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 153 {
mridup 13:f21e4e73bbb6 154 debug_if(dbg_on, "SPWF> error AT&W\r\n");
mridup 0:9e5d98ceea74 155 return false;
mridup 0:9e5d98ceea74 156 }
mridup 0:9e5d98ceea74 157 //reset module
mridup 0:9e5d98ceea74 158 reset();
mridup 0:9e5d98ceea74 159
mridup 0:9e5d98ceea74 160 while(1)
mansiag 18:fd46c2ca8eb7 161 if((_parser.recv("+WIND:24:WiFi Up:%u.%u.%u.%u",&n1, &n2, &n3, &n4)))
mridup 0:9e5d98ceea74 162 {
mridup 0:9e5d98ceea74 163 break;
mridup 8:a4425b8dd2e4 164 }
mridup 0:9e5d98ceea74 165
mridup 0:9e5d98ceea74 166 return true;
mridup 0:9e5d98ceea74 167 }
mridup 0:9e5d98ceea74 168
mridup 0:9e5d98ceea74 169 bool SPWFSA01::disconnect(void)
mridup 0:9e5d98ceea74 170 {
mridup 0:9e5d98ceea74 171 //"AT+S.SCFG=wifi_mode,%d\r"
mridup 0:9e5d98ceea74 172 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
mridup 0:9e5d98ceea74 173 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 0) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 174 {
mridup 13:f21e4e73bbb6 175 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
mridup 0:9e5d98ceea74 176 return false;
mridup 0:9e5d98ceea74 177 }
mridup 0:9e5d98ceea74 178 //AT&W
mridup 0:9e5d98ceea74 179 /* save current setting in flash */
mridup 0:9e5d98ceea74 180 if(!(_parser.send("AT&W") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 181 {
mridup 13:f21e4e73bbb6 182 debug_if(dbg_on, "SPWF> error AT&W\r\n");
mridup 0:9e5d98ceea74 183 return false;
mridup 0:9e5d98ceea74 184 }
mridup 0:9e5d98ceea74 185 //reset module
mridup 0:9e5d98ceea74 186 reset();
mridup 0:9e5d98ceea74 187 return true;
mridup 0:9e5d98ceea74 188 }
mridup 0:9e5d98ceea74 189
mridup 5:f17d6351e942 190 bool SPWFSA01::dhcp(int mode)
mridup 0:9e5d98ceea74 191 {
mridup 0:9e5d98ceea74 192 //only 3 valid modes
mridup 5:f17d6351e942 193 //0->off(ip_addr must be set by user), 1->on(auto set by AP), 2->on&customize(miniAP ip_addr can be set by user)
mridup 0:9e5d98ceea74 194 if(mode < 0 || mode > 2) {
mridup 0:9e5d98ceea74 195 return false;
mridup 0:9e5d98ceea74 196 }
mridup 5:f17d6351e942 197
mridup 5:f17d6351e942 198 return _parser.send("AT+S.SCFG=ip_use_dhcp,%d\r", mode)
mridup 0:9e5d98ceea74 199 && _parser.recv("OK");
mridup 0:9e5d98ceea74 200 }
mridup 0:9e5d98ceea74 201
mridup 0:9e5d98ceea74 202
mridup 0:9e5d98ceea74 203 const char *SPWFSA01::getIPAddress(void)
mridup 0:9e5d98ceea74 204 {
mridup 0:9e5d98ceea74 205 uint32_t n1, n2, n3, n4;
mridup 0:9e5d98ceea74 206
mridup 0:9e5d98ceea74 207 if (!(_parser.send("AT+S.STS=ip_ipaddr")
mridup 1:becf69a794fb 208 && _parser.recv("# ip_ipaddr = %u.%u.%u.%u", &n1, &n2, &n3, &n4)
mridup 0:9e5d98ceea74 209 && _parser.recv("OK"))) {
mridup 13:f21e4e73bbb6 210 debug_if(dbg_on, "SPWF> getIPAddress error\r\n");
mridup 0:9e5d98ceea74 211 return 0;
mridup 0:9e5d98ceea74 212 }
mridup 2:40d183d7dc19 213
mridup 0:9e5d98ceea74 214 sprintf((char*)_ip_buffer,"%u.%u.%u.%u", n1, n2, n3, n4);
mridup 0:9e5d98ceea74 215
mridup 0:9e5d98ceea74 216 return _ip_buffer;
mridup 0:9e5d98ceea74 217 }
mridup 0:9e5d98ceea74 218
mridup 0:9e5d98ceea74 219 const char *SPWFSA01::getMACAddress(void)
mridup 0:9e5d98ceea74 220 {
mridup 2:40d183d7dc19 221 uint32_t n1, n2, n3, n4, n5, n6;
mridup 1:becf69a794fb 222
mridup 1:becf69a794fb 223 if (!(_parser.send("AT+S.GCFG=nv_wifi_macaddr")
mridup 2:40d183d7dc19 224 && _parser.recv("# nv_wifi_macaddr = %x:%x:%x:%x:%x:%x", &n1, &n2, &n3, &n4, &n5, &n6)
mridup 0:9e5d98ceea74 225 && _parser.recv("OK"))) {
mridup 13:f21e4e73bbb6 226 debug_if(dbg_on, "SPWF> getMACAddress error\r\n");
mridup 0:9e5d98ceea74 227 return 0;
mridup 0:9e5d98ceea74 228 }
mridup 2:40d183d7dc19 229
mridup 2:40d183d7dc19 230 sprintf((char*)_mac_buffer,"%02X:%02X:%02X:%02X:%02X:%02X", n1, n2, n3, n4, n5, n6);
mridup 0:9e5d98ceea74 231
mridup 0:9e5d98ceea74 232 return _mac_buffer;
mridup 0:9e5d98ceea74 233 }
mridup 0:9e5d98ceea74 234
mridup 0:9e5d98ceea74 235 bool SPWFSA01::isConnected(void)
mridup 0:9e5d98ceea74 236 {
mridup 0:9e5d98ceea74 237 return getIPAddress() != 0;
mridup 0:9e5d98ceea74 238 }
mridup 0:9e5d98ceea74 239
mridup 3:2af9df1068a5 240 bool SPWFSA01::open(const char *type, int* id, const char* addr, int port)
mridup 0:9e5d98ceea74 241 {
mridup 13:f21e4e73bbb6 242 Timer timer;
mridup 13:f21e4e73bbb6 243 timer.start();
mridup 3:2af9df1068a5 244
mridup 3:2af9df1068a5 245 if(!_parser.send("AT+S.SOCKON=%s,%d,%s,ind", addr, port, type))
mridup 3:2af9df1068a5 246 {
mridup 13:f21e4e73bbb6 247 debug_if(dbg_on, "SPWF> error opening socket\r\n");
mridup 3:2af9df1068a5 248 return false;
mridup 3:2af9df1068a5 249 }
mridup 3:2af9df1068a5 250
mridup 3:2af9df1068a5 251 while(1)
mridup 3:2af9df1068a5 252 {
mridup 3:2af9df1068a5 253 if( _parser.recv(" ID: %d", id)
mridup 3:2af9df1068a5 254 && _parser.recv("OK"))
mridup 3:2af9df1068a5 255 break;
mridup 13:f21e4e73bbb6 256
mridup 13:f21e4e73bbb6 257 if (timer.read_ms() > SPWFSA01_CONNECT_TIMEOUT) {
mridup 13:f21e4e73bbb6 258 return false;
mridup 13:f21e4e73bbb6 259 }
mridup 13:f21e4e73bbb6 260
mridup 3:2af9df1068a5 261 //TODO:implement time-out functionality in case of no response
mridup 4:042d5b9bb6e7 262 //if(timeout) return false;
mridup 7:551de95939e2 263 //TODO: deal with errors like "ERROR: Failed to resolve name"
mridup 11:643a8c0f07ea 264 //TODO: deal with errors like "ERROR: Data mode not available"
mridup 3:2af9df1068a5 265 }
mridup 0:9e5d98ceea74 266
mridup 3:2af9df1068a5 267 return true;
mridup 0:9e5d98ceea74 268 }
mridup 0:9e5d98ceea74 269
mridup 0:9e5d98ceea74 270 bool SPWFSA01::send(int id, const void *data, uint32_t amount)
mridup 11:643a8c0f07ea 271 {
mridup 11:643a8c0f07ea 272 char _buf[18];
mridup 11:643a8c0f07ea 273
mridup 11:643a8c0f07ea 274 setTimeout(SPWFSA01_SEND_TIMEOUT);
mridup 11:643a8c0f07ea 275
mridup 11:643a8c0f07ea 276 sprintf((char*)_buf,"AT+S.SOCKW=%d,%d\r", id, amount);
mridup 11:643a8c0f07ea 277
mridup 0:9e5d98ceea74 278 //May take a second try if device is busy
mridup 0:9e5d98ceea74 279 for (unsigned i = 0; i < 2; i++) {
mridup 11:643a8c0f07ea 280 if (_parser.write((char*)_buf, strlen(_buf)) >=0
mridup 7:551de95939e2 281 && _parser.write((char*)data, (int)amount) >= 0
mridup 7:551de95939e2 282 && _parser.recv("OK")) {
mridup 0:9e5d98ceea74 283 return true;
mridup 0:9e5d98ceea74 284 }
mridup 0:9e5d98ceea74 285 }
mridup 0:9e5d98ceea74 286
mridup 0:9e5d98ceea74 287 return false;
mridup 0:9e5d98ceea74 288 }
mridup 0:9e5d98ceea74 289
mapellil 22:0fb8db6110be 290
mapellil 22:0fb8db6110be 291 int32_t SPWFSA01::recv(int id, void *data, uint32_t amount)
mapellil 22:0fb8db6110be 292 {
mapellil 22:0fb8db6110be 293 Timer timer;
mapellil 22:0fb8db6110be 294 uint32_t recv_amount=0, wid, sid;
mapellil 22:0fb8db6110be 295
mapellil 22:0fb8db6110be 296 timer.start();
mapellil 22:0fb8db6110be 297 while (1) {
mapellil 22:0fb8db6110be 298 switch (_recv_state) {
mapellil 22:0fb8db6110be 299 case WAITING_WIND:
mapellil 22:0fb8db6110be 300 if (_parser.recv("+WIND:%d:Pending Data:%d:%d", &wid, &sid, &recv_amount) && wid == 55 ){
mapellil 22:0fb8db6110be 301 if(recv_amount > amount) { _recv_state=RESIDUAL_DATA_ON_RECV; _recv_residual_data=recv_amount - amount; recv_amount = amount; }/*FIXME save residual data on sock*/
mapellil 22:0fb8db6110be 302 _parser.flush();
mapellil 22:0fb8db6110be 303 if(!(_parser.send("AT+S.SOCKR=%d,%d", id, recv_amount))){ return -2; }
mapellil 22:0fb8db6110be 304 if(!((_parser.read((char*)data, recv_amount) >0) && _parser.recv("OK"))) { return -2; }
mapellil 22:0fb8db6110be 305 return recv_amount;
mapellil 22:0fb8db6110be 306 } /* FIXME: manage WIND != 55 */
mapellil 22:0fb8db6110be 307 break;
mapellil 22:0fb8db6110be 308 case RESIDUAL_DATA_ON_RECV:
mapellil 22:0fb8db6110be 309 recv_amount=_recv_residual_data;
mapellil 22:0fb8db6110be 310 if (amount >= _recv_residual_data) {
mapellil 22:0fb8db6110be 311 recv_amount = _recv_residual_data; _recv_residual_data = 0; _recv_state = WAITING_WIND;
mapellil 22:0fb8db6110be 312 }else if(amount < _recv_residual_data) {
mapellil 22:0fb8db6110be 313 recv_amount=amount; _recv_residual_data = _recv_residual_data - amount; _recv_state = RESIDUAL_DATA_ON_RECV;
mapellil 22:0fb8db6110be 314 }
mapellil 22:0fb8db6110be 315 if(!(_parser.send("AT+S.SOCKR=%d,%d", id, recv_amount))) return -2; /* read no more than the residual data to avoid reading subsequent WIND msg */
mapellil 22:0fb8db6110be 316 if(!((_parser.read((char*)data, recv_amount) >0) && _parser.recv("OK"))) return -2;
mapellil 22:0fb8db6110be 317 if ( recv_amount == 0 ) break; // wait for incoming data until timeout expires
mapellil 22:0fb8db6110be 318 return recv_amount;
mapellil 22:0fb8db6110be 319 break;
mapellil 22:0fb8db6110be 320 default:
mapellil 22:0fb8db6110be 321 printf ("ERROR RECV UNKNOWN STATE: %d\n\r", _recv_state); return -2;
mapellil 22:0fb8db6110be 322 }
mapellil 22:0fb8db6110be 323 if (timer.read_ms() >= SPWFSA01_SOCKQ_TIMEOUT) { return -2; }
mapellil 22:0fb8db6110be 324 }
mapellil 22:0fb8db6110be 325 }
mridup 0:9e5d98ceea74 326
mridup 0:9e5d98ceea74 327 bool SPWFSA01::close(int id)
mridup 0:9e5d98ceea74 328 {
mridup 4:042d5b9bb6e7 329 //May take a second try if device is busy or error is returned
mridup 0:9e5d98ceea74 330 for (unsigned i = 0; i < 2; i++) {
mridup 4:042d5b9bb6e7 331 if (_parser.send("AT+S.SOCKC=%d", id)
mridup 0:9e5d98ceea74 332 && _parser.recv("OK")) {
mridup 0:9e5d98ceea74 333 return true;
mridup 0:9e5d98ceea74 334 }
mridup 7:551de95939e2 335 else
mridup 7:551de95939e2 336 {
mridup 7:551de95939e2 337 if(_parser.recv("ERROR: Pending data"))
mridup 13:f21e4e73bbb6 338 debug_if(dbg_on, "SPWF> ERROR!!!!\r\n");
mridup 7:551de95939e2 339 return false;
mridup 7:551de95939e2 340 }
mridup 6:258b093eec08 341 //TODO: Deal with "ERROR: Pending data" (Closing a socket with pending data)
mridup 0:9e5d98ceea74 342 }
mridup 0:9e5d98ceea74 343
mridup 0:9e5d98ceea74 344 return false;
mridup 0:9e5d98ceea74 345 }
mridup 0:9e5d98ceea74 346
mridup 0:9e5d98ceea74 347 void SPWFSA01::setTimeout(uint32_t timeout_ms)
mridup 0:9e5d98ceea74 348 {
mridup 0:9e5d98ceea74 349 _parser.setTimeout(timeout_ms);
mridup 0:9e5d98ceea74 350 }
mridup 0:9e5d98ceea74 351
mridup 0:9e5d98ceea74 352 bool SPWFSA01::readable()
mridup 0:9e5d98ceea74 353 {
mridup 0:9e5d98ceea74 354 return _serial.readable();
mridup 0:9e5d98ceea74 355 }
mridup 0:9e5d98ceea74 356
mridup 0:9e5d98ceea74 357 bool SPWFSA01::writeable()
mridup 0:9e5d98ceea74 358 {
mridup 0:9e5d98ceea74 359 return _serial.writeable();
mridup 0:9e5d98ceea74 360 }