Changes required by X-NUCLEO-IDWM01M1 and mbed-os 5.2.2

Dependencies:   ATParser

Dependents:   X_NUCLEO_IDW01M1v2-lapi-1

Fork of SPWF01SA by ST

Committer:
lapi
Date:
Sun Nov 20 20:20:25 2016 +0000
Revision:
24:b9f7b00b2635
Parent:
23:0b01aa59bb6f
Changes required by X-NUCLEO-IDW01M1 and the new version of mbed-os

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
lapi 24:b9f7b00b2635 26 SPWFSA01::SPWFSA01(PinName tx, PinName rx, bool debug, PinName resetPin, PinName wakeupPin) :
lapi 24:b9f7b00b2635 27 _serial(tx, rx, 1024), _parser(_serial),
lapi 24:b9f7b00b2635 28 _reset(resetPin, PIN_INPUT, PullNone, 1), _wakeup(wakeupPin, PIN_INPUT, PullNone, 0),
lapi 24:b9f7b00b2635 29 dbg_on(debug)
mridup 0:9e5d98ceea74 30 {
mridup 0:9e5d98ceea74 31 _serial.baud(115200);
mridup 0:9e5d98ceea74 32 _reset.output();
mridup 0:9e5d98ceea74 33 _wakeup.output();
mridup 0:9e5d98ceea74 34 _parser.debugOn(debug);
mridup 0:9e5d98ceea74 35 }
mridup 0:9e5d98ceea74 36
mridup 0:9e5d98ceea74 37 bool SPWFSA01::startup(int mode)
mridup 0:9e5d98ceea74 38 {
mridup 0:9e5d98ceea74 39 setTimeout(SPWFSA01_RECV_TIMEOUT);
mridup 0:9e5d98ceea74 40
mridup 0:9e5d98ceea74 41 /*Test module before reset*/
mridup 0:9e5d98ceea74 42 waitSPWFReady();
mridup 0:9e5d98ceea74 43 /*Reset module*/
mridup 0:9e5d98ceea74 44 reset();
mridup 0:9e5d98ceea74 45
mridup 0:9e5d98ceea74 46 /*set local echo to 0*/
mridup 8:a4425b8dd2e4 47 if(!(_parser.send("AT+S.SCFG=localecho1,%d\r", 0) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 48 {
mridup 13:f21e4e73bbb6 49 debug_if(dbg_on, "SPWF> error local echo set\r\n");
mridup 0:9e5d98ceea74 50 return false;
mridup 0:9e5d98ceea74 51 }
mridup 0:9e5d98ceea74 52 /*reset factory settings*/
mridup 0:9e5d98ceea74 53 if(!(_parser.send("AT&F") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 54 {
mridup 13:f21e4e73bbb6 55 debug_if(dbg_on, "SPWF> error AT&F\r\n");
mridup 0:9e5d98ceea74 56 return false;
mridup 0:9e5d98ceea74 57 }
mansiag 23:0b01aa59bb6f 58
mansiag 23:0b01aa59bb6f 59 /*set Wi-Fi mode and rate to b/g/n*/
mansiag 23:0b01aa59bb6f 60 if(!(_parser.send("AT+S.SCFG=wifi_ht_mode,%d\r",1) && _parser.recv("OK")))
mansiag 23:0b01aa59bb6f 61 {
mansiag 23:0b01aa59bb6f 62 debug_if(dbg_on, "SPWF> error setting ht_mode\r\n");
mansiag 23:0b01aa59bb6f 63 return false;
mansiag 23:0b01aa59bb6f 64 }
mansiag 23:0b01aa59bb6f 65
mansiag 23:0b01aa59bb6f 66 if(!(_parser.send("AT+S.SCFG=wifi_opr_rate_mask,0x003FFFCF\r") && _parser.recv("OK")))
mansiag 23:0b01aa59bb6f 67 {
mansiag 23:0b01aa59bb6f 68 debug_if(dbg_on, "SPWF> error setting operational rates\r\n");
mansiag 23:0b01aa59bb6f 69 return false;
mansiag 23:0b01aa59bb6f 70 }
mridup 0:9e5d98ceea74 71
mridup 0:9e5d98ceea74 72 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
mridup 0:9e5d98ceea74 73 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", mode) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 74 {
mridup 13:f21e4e73bbb6 75 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
mridup 0:9e5d98ceea74 76 return false;
mridup 0:9e5d98ceea74 77 }
mridup 0:9e5d98ceea74 78
mridup 0:9e5d98ceea74 79 /* save current setting in flash */
mridup 0:9e5d98ceea74 80 if(!(_parser.send("AT&W") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 81 {
mridup 13:f21e4e73bbb6 82 debug_if(dbg_on, "SPWF> error AT&W\r\n");
mridup 0:9e5d98ceea74 83 return false;
mridup 0:9e5d98ceea74 84 }
mridup 0:9e5d98ceea74 85
mridup 0:9e5d98ceea74 86 /*reset again and send AT command and check for result (AT->OK)*/
mridup 0:9e5d98ceea74 87 reset();
mridup 0:9e5d98ceea74 88
mridup 0:9e5d98ceea74 89 return true;
mridup 0:9e5d98ceea74 90 }
mridup 0:9e5d98ceea74 91
mridup 0:9e5d98ceea74 92 bool SPWFSA01::hw_reset(void)
mridup 0:9e5d98ceea74 93 {
mridup 0:9e5d98ceea74 94 /* reset the pin PC12 */
mridup 0:9e5d98ceea74 95 _reset.write(0);
mridup 0:9e5d98ceea74 96 wait_ms(200);
mridup 0:9e5d98ceea74 97 _reset.write(1);
mridup 0:9e5d98ceea74 98 wait_ms(100);
mridup 0:9e5d98ceea74 99 return 1;
mridup 0:9e5d98ceea74 100 }
mridup 0:9e5d98ceea74 101
mridup 0:9e5d98ceea74 102 bool SPWFSA01::reset(void)
mridup 0:9e5d98ceea74 103 {
mridup 0:9e5d98ceea74 104 if(!_parser.send("AT+CFUN=1")) return false;
mridup 0:9e5d98ceea74 105 while(1) {
mridup 8:a4425b8dd2e4 106 if (_parser.recv("+WIND:32:WiFi Hardware Started\r")) {
mridup 0:9e5d98ceea74 107 return true;
mridup 0:9e5d98ceea74 108 }
mridup 0:9e5d98ceea74 109 }
mridup 0:9e5d98ceea74 110 }
mridup 0:9e5d98ceea74 111
mridup 0:9e5d98ceea74 112 void SPWFSA01::waitSPWFReady(void)
mridup 0:9e5d98ceea74 113 {
mridup 0:9e5d98ceea74 114 //wait_ms(200);
lapi 24:b9f7b00b2635 115 while(1) {
lapi 24:b9f7b00b2635 116 if(_parser.send("AT") && _parser.recv("OK")) {
mridup 0:9e5d98ceea74 117 //till we get OK from AT command
lapi 24:b9f7b00b2635 118 printf("\r\nwaiting for SPWFSA01 Ready..\n");
mridup 0:9e5d98ceea74 119 return;
lapi 24:b9f7b00b2635 120 }
lapi 24:b9f7b00b2635 121 }
mridup 0:9e5d98ceea74 122 }
mridup 0:9e5d98ceea74 123
mridup 0:9e5d98ceea74 124 /* Security Mode
mridup 0:9e5d98ceea74 125 None = 0,
mridup 0:9e5d98ceea74 126 WEP = 1,
mridup 0:9e5d98ceea74 127 WPA_Personal = 2,
mridup 0:9e5d98ceea74 128 */
lapi 24:b9f7b00b2635 129 bool SPWFSA01::connect(const char *ap, const char *passPhrase, int securityMode, int channel)
mridup 0:9e5d98ceea74 130 {
mridup 0:9e5d98ceea74 131 uint32_t n1, n2, n3, n4;
mridup 0:9e5d98ceea74 132
mridup 0:9e5d98ceea74 133 //AT+S.SCFG=wifi_wpa_psk_text,%s\r
mridup 0:9e5d98ceea74 134 if(!(_parser.send("AT+S.SCFG=wifi_wpa_psk_text,%s", passPhrase) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 135 {
mridup 13:f21e4e73bbb6 136 debug_if(dbg_on, "SPWF> error pass set\r\n");
mridup 0:9e5d98ceea74 137 return false;
mridup 0:9e5d98ceea74 138 }
mridup 0:9e5d98ceea74 139 //AT+S.SSIDTXT=%s\r
mridup 0:9e5d98ceea74 140 if(!(_parser.send("AT+S.SSIDTXT=%s", ap) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 141 {
mridup 13:f21e4e73bbb6 142 debug_if(dbg_on, "SPWF> error ssid set\r\n");
mridup 0:9e5d98ceea74 143 return false;
mridup 0:9e5d98ceea74 144 }
lapi 24:b9f7b00b2635 145 //AT+S.SCFG=wifi_auth_type,%d\r, is 1 for WEP, 0 for none and WPA/WPA2
lapi 24:b9f7b00b2635 146 if(!(_parser.send("AT+S.SCFG=wifi_auth_type,%d", securityMode == 1 ? 1 : 0) && _parser.recv("OK")))
lapi 24:b9f7b00b2635 147 {
lapi 24:b9f7b00b2635 148 debug_if(dbg_on, "SPWF> error auth type set\r\n");
lapi 24:b9f7b00b2635 149 return false;
lapi 24:b9f7b00b2635 150 }
mridup 0:9e5d98ceea74 151 //AT+S.SCFG=wifi_priv_mode,%d\r
mridup 0:9e5d98ceea74 152 if(!(_parser.send("AT+S.SCFG=wifi_priv_mode,%d", securityMode) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 153 {
mridup 13:f21e4e73bbb6 154 debug_if(dbg_on, "SPWF> error security mode set\r\n");
mridup 0:9e5d98ceea74 155 return false;
mridup 0:9e5d98ceea74 156 }
mridup 0:9e5d98ceea74 157 //"AT+S.SCFG=wifi_mode,%d\r"
mridup 0:9e5d98ceea74 158 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
mridup 0:9e5d98ceea74 159 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 1) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 160 {
mridup 13:f21e4e73bbb6 161 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
mridup 0:9e5d98ceea74 162 return false;
mridup 0:9e5d98ceea74 163 }
lapi 24:b9f7b00b2635 164 //"AT+S.SCFG=wifi_channelnum,%d\r"
lapi 24:b9f7b00b2635 165 /*set channel*/
lapi 24:b9f7b00b2635 166 if(!(_parser.send("AT+S.SCFG=wifi_channelnum,%d\r", channel) && _parser.recv("OK")))
lapi 24:b9f7b00b2635 167 {
lapi 24:b9f7b00b2635 168 debug_if(dbg_on, "SPWF> error wifi channel set\r\n");
lapi 24:b9f7b00b2635 169 return false;
lapi 24:b9f7b00b2635 170 }
mridup 0:9e5d98ceea74 171 //AT&W
mridup 0:9e5d98ceea74 172 /* save current setting in flash */
mridup 0:9e5d98ceea74 173 if(!(_parser.send("AT&W") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 174 {
mridup 13:f21e4e73bbb6 175 debug_if(dbg_on, "SPWF> error AT&W\r\n");
mridup 0:9e5d98ceea74 176 return false;
mridup 0:9e5d98ceea74 177 }
mridup 0:9e5d98ceea74 178 //reset module
mridup 0:9e5d98ceea74 179 reset();
mridup 0:9e5d98ceea74 180
mridup 0:9e5d98ceea74 181 while(1)
mansiag 18:fd46c2ca8eb7 182 if((_parser.recv("+WIND:24:WiFi Up:%u.%u.%u.%u",&n1, &n2, &n3, &n4)))
mridup 0:9e5d98ceea74 183 {
mridup 0:9e5d98ceea74 184 break;
mridup 8:a4425b8dd2e4 185 }
mridup 0:9e5d98ceea74 186
mridup 0:9e5d98ceea74 187 return true;
mridup 0:9e5d98ceea74 188 }
mridup 0:9e5d98ceea74 189
mridup 0:9e5d98ceea74 190 bool SPWFSA01::disconnect(void)
mridup 0:9e5d98ceea74 191 {
mridup 0:9e5d98ceea74 192 //"AT+S.SCFG=wifi_mode,%d\r"
mridup 0:9e5d98ceea74 193 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
mridup 0:9e5d98ceea74 194 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 0) && _parser.recv("OK")))
mridup 0:9e5d98ceea74 195 {
mridup 13:f21e4e73bbb6 196 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
mridup 0:9e5d98ceea74 197 return false;
mridup 0:9e5d98ceea74 198 }
mridup 0:9e5d98ceea74 199 //AT&W
mridup 0:9e5d98ceea74 200 /* save current setting in flash */
mridup 0:9e5d98ceea74 201 if(!(_parser.send("AT&W") && _parser.recv("OK")))
mridup 0:9e5d98ceea74 202 {
mridup 13:f21e4e73bbb6 203 debug_if(dbg_on, "SPWF> error AT&W\r\n");
mridup 0:9e5d98ceea74 204 return false;
mridup 0:9e5d98ceea74 205 }
mridup 0:9e5d98ceea74 206 //reset module
mridup 0:9e5d98ceea74 207 reset();
mridup 0:9e5d98ceea74 208 return true;
mridup 0:9e5d98ceea74 209 }
mridup 0:9e5d98ceea74 210
mridup 5:f17d6351e942 211 bool SPWFSA01::dhcp(int mode)
mridup 0:9e5d98ceea74 212 {
mridup 0:9e5d98ceea74 213 //only 3 valid modes
mridup 5:f17d6351e942 214 //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 215 if(mode < 0 || mode > 2) {
mridup 0:9e5d98ceea74 216 return false;
mridup 0:9e5d98ceea74 217 }
mridup 5:f17d6351e942 218
mridup 5:f17d6351e942 219 return _parser.send("AT+S.SCFG=ip_use_dhcp,%d\r", mode)
mridup 0:9e5d98ceea74 220 && _parser.recv("OK");
mridup 0:9e5d98ceea74 221 }
mridup 0:9e5d98ceea74 222
mridup 0:9e5d98ceea74 223
lapi 24:b9f7b00b2635 224 int8_t SPWFSA01::getRSSI(void)
lapi 24:b9f7b00b2635 225 {
lapi 24:b9f7b00b2635 226 int32_t rssi;
lapi 24:b9f7b00b2635 227
lapi 24:b9f7b00b2635 228 if (!(_parser.send("AT+S.RCFG=rx_rssi")
lapi 24:b9f7b00b2635 229 && _parser.recv("# rx_rssi = %d", &rssi)
lapi 24:b9f7b00b2635 230 && _parser.recv("OK"))) {
lapi 24:b9f7b00b2635 231 debug_if(dbg_on, "SPWF> getIPAddress error\r\n");
lapi 24:b9f7b00b2635 232 return 0;
lapi 24:b9f7b00b2635 233 }
lapi 24:b9f7b00b2635 234
lapi 24:b9f7b00b2635 235 return (int8_t)rssi;
lapi 24:b9f7b00b2635 236 }
lapi 24:b9f7b00b2635 237
lapi 24:b9f7b00b2635 238
mridup 0:9e5d98ceea74 239 const char *SPWFSA01::getIPAddress(void)
mridup 0:9e5d98ceea74 240 {
mridup 0:9e5d98ceea74 241 uint32_t n1, n2, n3, n4;
mridup 0:9e5d98ceea74 242
mridup 0:9e5d98ceea74 243 if (!(_parser.send("AT+S.STS=ip_ipaddr")
mridup 1:becf69a794fb 244 && _parser.recv("# ip_ipaddr = %u.%u.%u.%u", &n1, &n2, &n3, &n4)
mridup 0:9e5d98ceea74 245 && _parser.recv("OK"))) {
mridup 13:f21e4e73bbb6 246 debug_if(dbg_on, "SPWF> getIPAddress error\r\n");
mridup 0:9e5d98ceea74 247 return 0;
mridup 0:9e5d98ceea74 248 }
mridup 2:40d183d7dc19 249
mridup 0:9e5d98ceea74 250 sprintf((char*)_ip_buffer,"%u.%u.%u.%u", n1, n2, n3, n4);
mridup 0:9e5d98ceea74 251
mridup 0:9e5d98ceea74 252 return _ip_buffer;
mridup 0:9e5d98ceea74 253 }
mridup 0:9e5d98ceea74 254
mridup 0:9e5d98ceea74 255 const char *SPWFSA01::getMACAddress(void)
mridup 0:9e5d98ceea74 256 {
mridup 2:40d183d7dc19 257 uint32_t n1, n2, n3, n4, n5, n6;
mridup 1:becf69a794fb 258
mridup 1:becf69a794fb 259 if (!(_parser.send("AT+S.GCFG=nv_wifi_macaddr")
mridup 2:40d183d7dc19 260 && _parser.recv("# nv_wifi_macaddr = %x:%x:%x:%x:%x:%x", &n1, &n2, &n3, &n4, &n5, &n6)
mridup 0:9e5d98ceea74 261 && _parser.recv("OK"))) {
mridup 13:f21e4e73bbb6 262 debug_if(dbg_on, "SPWF> getMACAddress error\r\n");
mridup 0:9e5d98ceea74 263 return 0;
mridup 0:9e5d98ceea74 264 }
mridup 2:40d183d7dc19 265
mridup 2:40d183d7dc19 266 sprintf((char*)_mac_buffer,"%02X:%02X:%02X:%02X:%02X:%02X", n1, n2, n3, n4, n5, n6);
mridup 0:9e5d98ceea74 267
mridup 0:9e5d98ceea74 268 return _mac_buffer;
mridup 0:9e5d98ceea74 269 }
mridup 0:9e5d98ceea74 270
mridup 0:9e5d98ceea74 271 bool SPWFSA01::isConnected(void)
mridup 0:9e5d98ceea74 272 {
mridup 0:9e5d98ceea74 273 return getIPAddress() != 0;
mridup 0:9e5d98ceea74 274 }
mridup 0:9e5d98ceea74 275
mridup 3:2af9df1068a5 276 bool SPWFSA01::open(const char *type, int* id, const char* addr, int port)
mridup 0:9e5d98ceea74 277 {
mridup 13:f21e4e73bbb6 278 Timer timer;
mridup 13:f21e4e73bbb6 279 timer.start();
mridup 3:2af9df1068a5 280
mridup 3:2af9df1068a5 281 if(!_parser.send("AT+S.SOCKON=%s,%d,%s,ind", addr, port, type))
mridup 3:2af9df1068a5 282 {
mridup 13:f21e4e73bbb6 283 debug_if(dbg_on, "SPWF> error opening socket\r\n");
mridup 3:2af9df1068a5 284 return false;
mridup 3:2af9df1068a5 285 }
mridup 3:2af9df1068a5 286
mridup 3:2af9df1068a5 287 while(1)
mridup 3:2af9df1068a5 288 {
mridup 3:2af9df1068a5 289 if( _parser.recv(" ID: %d", id)
mridup 3:2af9df1068a5 290 && _parser.recv("OK"))
mridup 3:2af9df1068a5 291 break;
mridup 13:f21e4e73bbb6 292
mridup 13:f21e4e73bbb6 293 if (timer.read_ms() > SPWFSA01_CONNECT_TIMEOUT) {
mridup 13:f21e4e73bbb6 294 return false;
mridup 13:f21e4e73bbb6 295 }
mridup 13:f21e4e73bbb6 296
mridup 3:2af9df1068a5 297 //TODO:implement time-out functionality in case of no response
mridup 4:042d5b9bb6e7 298 //if(timeout) return false;
mridup 7:551de95939e2 299 //TODO: deal with errors like "ERROR: Failed to resolve name"
mridup 11:643a8c0f07ea 300 //TODO: deal with errors like "ERROR: Data mode not available"
mridup 3:2af9df1068a5 301 }
mridup 0:9e5d98ceea74 302
mridup 3:2af9df1068a5 303 return true;
mridup 0:9e5d98ceea74 304 }
mridup 0:9e5d98ceea74 305
mridup 0:9e5d98ceea74 306 bool SPWFSA01::send(int id, const void *data, uint32_t amount)
mridup 11:643a8c0f07ea 307 {
mridup 11:643a8c0f07ea 308 char _buf[18];
mridup 11:643a8c0f07ea 309
mridup 11:643a8c0f07ea 310 setTimeout(SPWFSA01_SEND_TIMEOUT);
mridup 11:643a8c0f07ea 311
mridup 11:643a8c0f07ea 312 sprintf((char*)_buf,"AT+S.SOCKW=%d,%d\r", id, amount);
mridup 11:643a8c0f07ea 313
mridup 0:9e5d98ceea74 314 //May take a second try if device is busy
mridup 0:9e5d98ceea74 315 for (unsigned i = 0; i < 2; i++) {
mridup 11:643a8c0f07ea 316 if (_parser.write((char*)_buf, strlen(_buf)) >=0
mridup 7:551de95939e2 317 && _parser.write((char*)data, (int)amount) >= 0
mridup 7:551de95939e2 318 && _parser.recv("OK")) {
mridup 0:9e5d98ceea74 319 return true;
mridup 0:9e5d98ceea74 320 }
mridup 0:9e5d98ceea74 321 }
mridup 0:9e5d98ceea74 322
mridup 0:9e5d98ceea74 323 return false;
mridup 0:9e5d98ceea74 324 }
mridup 0:9e5d98ceea74 325
mansiag 19:df8d7f70a740 326 /*
mridup 0:9e5d98ceea74 327 int32_t SPWFSA01::recv(int id, void *data, uint32_t amount)
mridup 0:9e5d98ceea74 328 {
mansiag 15:e56c9e744ab6 329 uint32_t recv_amount;
mridup 0:9e5d98ceea74 330 int recv_id;
mansiag 15:e56c9e744ab6 331 bool wind_recv = true;
mansiag 15:e56c9e744ab6 332
mridup 7:551de95939e2 333 if (!(_parser.recv("+WIND:55:Pending Data:%d:%u", &recv_id, &recv_amount)
mansiag 15:e56c9e744ab6 334 && recv_id == id
mansiag 15:e56c9e744ab6 335 && recv_amount <= amount
mansiag 15:e56c9e744ab6 336 && recv_amount%730
mansiag 15:e56c9e744ab6 337 && _parser.send("AT+S.SOCKQ=%d", id) //send a query (will be required for secure sockets)
mansiag 15:e56c9e744ab6 338 && _parser.recv(" DATALEN: %u", &recv_amount)
mansiag 15:e56c9e744ab6 339 && _parser.recv("OK")
mansiag 15:e56c9e744ab6 340 && recv_amount > 0
mansiag 15:e56c9e744ab6 341 && _parser.send("AT+S.SOCKR=%d,%d", id, recv_amount)
mansiag 15:e56c9e744ab6 342 && (_parser.read((char*)data, recv_amount) >0)
mansiag 15:e56c9e744ab6 343 && _parser.recv("OK"))) {
mansiag 15:e56c9e744ab6 344 if(!(recv_amount%730))
mansiag 15:e56c9e744ab6 345 {
mansiag 15:e56c9e744ab6 346 // receive all the WIND messages
mansiag 15:e56c9e744ab6 347 do {
mansiag 15:e56c9e744ab6 348 if (!(_parser.recv("+WIND:55:Pending Data:%d:%u", &recv_id, &recv_amount)
mansiag 15:e56c9e744ab6 349 && recv_id == id
mansiag 15:e56c9e744ab6 350 && recv_amount <= amount
mansiag 15:e56c9e744ab6 351 && recv_amount > 0))
mansiag 15:e56c9e744ab6 352 wind_recv = false;
mansiag 15:e56c9e744ab6 353 } while (!(recv_amount%730) && wind_recv);
mansiag 15:e56c9e744ab6 354
mansiag 15:e56c9e744ab6 355 // Read all the data pending on a socket
mansiag 15:e56c9e744ab6 356 if(!( recv_amount > 0
mansiag 15:e56c9e744ab6 357 && _parser.send("AT+S.SOCKR=%d,%d", id, recv_amount)
mansiag 15:e56c9e744ab6 358 && (_parser.read((char*)data, recv_amount) >0)
mansiag 15:e56c9e744ab6 359 && _parser.recv("OK"))) {
mansiag 15:e56c9e744ab6 360 return -1;
mansiag 15:e56c9e744ab6 361 }
mridup 13:f21e4e73bbb6 362 }
mansiag 15:e56c9e744ab6 363 else {
mansiag 15:e56c9e744ab6 364 return -2;
mridup 13:f21e4e73bbb6 365 }
mansiag 15:e56c9e744ab6 366 }
mridup 0:9e5d98ceea74 367 return recv_amount;
mridup 0:9e5d98ceea74 368 }
mansiag 19:df8d7f70a740 369 */
mansiag 19:df8d7f70a740 370
mansiag 19:df8d7f70a740 371 int32_t SPWFSA01::recv(int id, void *data, uint32_t amount)
mansiag 19:df8d7f70a740 372 {
mridup 20:01031cd39e73 373 Timer timer;
mridup 20:01031cd39e73 374 timer.start();
mridup 20:01031cd39e73 375
mansiag 19:df8d7f70a740 376 uint32_t recv_amount=0;
mridup 20:01031cd39e73 377 int recv_id;
mridup 20:01031cd39e73 378
mridup 20:01031cd39e73 379 if(!(_parser.recv("+WIND:55:Pending Data:%d:", &recv_id))) {
mridup 20:01031cd39e73 380 //do nothing;
mridup 20:01031cd39e73 381 debug_if(dbg_on, "SPWF> WIND:55 Timeout\r\n");
mridup 20:01031cd39e73 382 }
mansiag 19:df8d7f70a740 383
mansiag 19:df8d7f70a740 384 while(!recv_amount) {
mansiag 19:df8d7f70a740 385 if(!(_parser.send("AT+S.SOCKQ=%d", id) //send a query (will be required for secure sockets)
mansiag 19:df8d7f70a740 386 && _parser.recv(" DATALEN: %u", &recv_amount)
mansiag 19:df8d7f70a740 387 && _parser.recv("OK"))) {
mansiag 19:df8d7f70a740 388 return -2;
mansiag 19:df8d7f70a740 389 }
mridup 20:01031cd39e73 390 if (timer.read_ms() > SPWFSA01_SOCKQ_TIMEOUT) {
mansiag 22:2eb9b3c54506 391 return -1;
mridup 20:01031cd39e73 392 }
mansiag 19:df8d7f70a740 393 }
mansiag 19:df8d7f70a740 394 if(recv_amount > amount)
mansiag 19:df8d7f70a740 395 recv_amount = amount;
mansiag 19:df8d7f70a740 396
mansiag 19:df8d7f70a740 397 _parser.flush();
mansiag 21:cd722edbb644 398 if(!(_parser.send("AT+S.SOCKR=%d,%d", id, recv_amount)))
mansiag 21:cd722edbb644 399 return -2;
mansiag 21:cd722edbb644 400
mansiag 21:cd722edbb644 401 /* only when the data recv is greater than 3 bytes */
mansiag 21:cd722edbb644 402 if(recv_amount > 3) {
mansiag 21:cd722edbb644 403 /* look for WIND messages in data */
mansiag 21:cd722edbb644 404
mansiag 21:cd722edbb644 405 // get first 3 bytes of data
mansiag 21:cd722edbb644 406 for(int i=0;i<3;i++) {
mansiag 21:cd722edbb644 407 int c = -1;
mansiag 21:cd722edbb644 408 while(c < 0) {
mansiag 21:cd722edbb644 409 c = _parser.getc();
mansiag 21:cd722edbb644 410 }
mansiag 21:cd722edbb644 411 ((char *)data)[i] = c;
mansiag 21:cd722edbb644 412 }
mansiag 21:cd722edbb644 413
mansiag 21:cd722edbb644 414 /* 0xD: \r && 0xA: \n */
mansiag 21:cd722edbb644 415 if(((char *)data)[0] == 0xD
mansiag 21:cd722edbb644 416 &&((char *)data)[1] == 0xA
mansiag 21:cd722edbb644 417 &&((char *)data)[2] == '+') {
mansiag 21:cd722edbb644 418 ((char *)data)[0] = 0;
mansiag 21:cd722edbb644 419 while(((char *)data)[0] != 0xA) {
mansiag 21:cd722edbb644 420 ((char *)data)[0] = _parser.getc();
mansiag 21:cd722edbb644 421 }
mansiag 21:cd722edbb644 422
mansiag 21:cd722edbb644 423 // complete data is yet to be read
mansiag 21:cd722edbb644 424 if(!((_parser.read((char*)data, recv_amount) >0)
mansiag 21:cd722edbb644 425 && _parser.recv("OK"))) {
mansiag 21:cd722edbb644 426 return -2;
mansiag 21:cd722edbb644 427 }
mansiag 21:cd722edbb644 428 }
mansiag 21:cd722edbb644 429 else {
mansiag 21:cd722edbb644 430 // data left to be read is 3 bytes less.
mansiag 21:cd722edbb644 431 if(!((_parser.read((char*)data+3, recv_amount-3) >0)
mansiag 21:cd722edbb644 432 && _parser.recv("OK"))) {
mansiag 21:cd722edbb644 433 return -2;
mansiag 19:df8d7f70a740 434 }
mansiag 21:cd722edbb644 435 }
mansiag 21:cd722edbb644 436 }
mansiag 21:cd722edbb644 437 else {
mansiag 21:cd722edbb644 438 if(!((_parser.read((char*)data, recv_amount) >0)
mansiag 21:cd722edbb644 439 && _parser.recv("OK"))) {
mansiag 21:cd722edbb644 440 return -2;
mansiag 21:cd722edbb644 441 }
mansiag 21:cd722edbb644 442 }
mansiag 19:df8d7f70a740 443 return recv_amount;
mansiag 19:df8d7f70a740 444 }
mridup 0:9e5d98ceea74 445
mridup 0:9e5d98ceea74 446 bool SPWFSA01::close(int id)
mridup 0:9e5d98ceea74 447 {
mridup 4:042d5b9bb6e7 448 //May take a second try if device is busy or error is returned
mridup 0:9e5d98ceea74 449 for (unsigned i = 0; i < 2; i++) {
mridup 4:042d5b9bb6e7 450 if (_parser.send("AT+S.SOCKC=%d", id)
mridup 0:9e5d98ceea74 451 && _parser.recv("OK")) {
mridup 0:9e5d98ceea74 452 return true;
mridup 0:9e5d98ceea74 453 }
mridup 7:551de95939e2 454 else
mridup 7:551de95939e2 455 {
mridup 7:551de95939e2 456 if(_parser.recv("ERROR: Pending data"))
mridup 13:f21e4e73bbb6 457 debug_if(dbg_on, "SPWF> ERROR!!!!\r\n");
mridup 7:551de95939e2 458 return false;
mridup 7:551de95939e2 459 }
mridup 6:258b093eec08 460 //TODO: Deal with "ERROR: Pending data" (Closing a socket with pending data)
mridup 0:9e5d98ceea74 461 }
mridup 0:9e5d98ceea74 462
mridup 0:9e5d98ceea74 463 return false;
mridup 0:9e5d98ceea74 464 }
mridup 0:9e5d98ceea74 465
mridup 0:9e5d98ceea74 466 void SPWFSA01::setTimeout(uint32_t timeout_ms)
mridup 0:9e5d98ceea74 467 {
mridup 0:9e5d98ceea74 468 _parser.setTimeout(timeout_ms);
mridup 0:9e5d98ceea74 469 }
mridup 0:9e5d98ceea74 470
mridup 0:9e5d98ceea74 471 bool SPWFSA01::readable()
mridup 0:9e5d98ceea74 472 {
mridup 0:9e5d98ceea74 473 return _serial.readable();
mridup 0:9e5d98ceea74 474 }
mridup 0:9e5d98ceea74 475
mridup 0:9e5d98ceea74 476 bool SPWFSA01::writeable()
mridup 0:9e5d98ceea74 477 {
mridup 0:9e5d98ceea74 478 return _serial.writeable();
mridup 0:9e5d98ceea74 479 }