Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SPWF01SA by
SPWFSA01.cpp@19:df8d7f70a740, 2016-09-21 (annotated)
- Committer:
- mansiag
- Date:
- Wed Sep 21 10:22:40 2016 +0000
- Revision:
- 19:df8d7f70a740
- Parent:
- 18:fd46c2ca8eb7
- Child:
- 20:01031cd39e73
modified recv() function
Who changed what in which revision?
| User | Revision | Line number | New 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 | 0:9e5d98ceea74 | 20 | #define SPWFSA01_CONNECT_TIMEOUT 15000 |
| mridup | 0:9e5d98ceea74 | 21 | #define SPWFSA01_SEND_TIMEOUT 500 |
| mridup | 10:580379efe167 | 22 | #define SPWFSA01_RECV_TIMEOUT 1500//some commands like AT&F/W takes some time to get the result back! |
| mridup | 0:9e5d98ceea74 | 23 | #define SPWFSA01_MISC_TIMEOUT 500 |
| mridup | 0:9e5d98ceea74 | 24 | |
| mridup | 0:9e5d98ceea74 | 25 | SPWFSA01::SPWFSA01(PinName tx, PinName rx, bool debug) |
| mridup | 0:9e5d98ceea74 | 26 | : _serial(tx, rx, 1024), _parser(_serial), |
| mridup | 14:868b0fd4e84a | 27 | _wakeup(D14, PIN_INPUT, PullNone, 0), _reset(D15, PIN_INPUT, PullNone, 1), |
| mridup | 14:868b0fd4e84a | 28 | //PC_12->D15, PC_8->D14 (re-wires needed in-case used, currently not used) |
| mridup | 13:f21e4e73bbb6 | 29 | dbg_on(debug) |
| mridup | 0:9e5d98ceea74 | 30 | //Pin PC_8 is wakeup pin |
| mridup | 0:9e5d98ceea74 | 31 | //Pin PA_12 is reset pin |
| mridup | 0:9e5d98ceea74 | 32 | { |
| mridup | 0:9e5d98ceea74 | 33 | _serial.baud(115200); |
| mridup | 0:9e5d98ceea74 | 34 | _reset.output(); |
| mridup | 0:9e5d98ceea74 | 35 | _wakeup.output(); |
| mridup | 0:9e5d98ceea74 | 36 | _parser.debugOn(debug); |
| mridup | 0:9e5d98ceea74 | 37 | } |
| mridup | 0:9e5d98ceea74 | 38 | |
| mridup | 0:9e5d98ceea74 | 39 | bool SPWFSA01::startup(int mode) |
| mridup | 0:9e5d98ceea74 | 40 | { |
| mridup | 0:9e5d98ceea74 | 41 | setTimeout(SPWFSA01_RECV_TIMEOUT); |
| mridup | 0:9e5d98ceea74 | 42 | |
| mridup | 0:9e5d98ceea74 | 43 | /*Test module before reset*/ |
| mridup | 0:9e5d98ceea74 | 44 | waitSPWFReady(); |
| mridup | 0:9e5d98ceea74 | 45 | /*Reset module*/ |
| mridup | 0:9e5d98ceea74 | 46 | reset(); |
| mridup | 0:9e5d98ceea74 | 47 | |
| mridup | 0:9e5d98ceea74 | 48 | /*set local echo to 0*/ |
| mridup | 8:a4425b8dd2e4 | 49 | if(!(_parser.send("AT+S.SCFG=localecho1,%d\r", 0) && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 50 | { |
| mridup | 13:f21e4e73bbb6 | 51 | debug_if(dbg_on, "SPWF> error local echo set\r\n"); |
| mridup | 0:9e5d98ceea74 | 52 | return false; |
| mridup | 0:9e5d98ceea74 | 53 | } |
| mridup | 0:9e5d98ceea74 | 54 | /*reset factory settings*/ |
| mridup | 0:9e5d98ceea74 | 55 | if(!(_parser.send("AT&F") && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 56 | { |
| mridup | 13:f21e4e73bbb6 | 57 | debug_if(dbg_on, "SPWF> error AT&F\r\n"); |
| mridup | 0:9e5d98ceea74 | 58 | return false; |
| mridup | 0:9e5d98ceea74 | 59 | } |
| mridup | 0:9e5d98ceea74 | 60 | |
| mridup | 0:9e5d98ceea74 | 61 | /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/ |
| mridup | 0:9e5d98ceea74 | 62 | if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", mode) && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 63 | { |
| mridup | 13:f21e4e73bbb6 | 64 | debug_if(dbg_on, "SPWF> error wifi mode set\r\n"); |
| mridup | 0:9e5d98ceea74 | 65 | return false; |
| mridup | 0:9e5d98ceea74 | 66 | } |
| mridup | 0:9e5d98ceea74 | 67 | |
| mridup | 0:9e5d98ceea74 | 68 | /* save current setting in flash */ |
| mridup | 0:9e5d98ceea74 | 69 | if(!(_parser.send("AT&W") && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 70 | { |
| mridup | 13:f21e4e73bbb6 | 71 | debug_if(dbg_on, "SPWF> error AT&W\r\n"); |
| mridup | 0:9e5d98ceea74 | 72 | return false; |
| mridup | 0:9e5d98ceea74 | 73 | } |
| mridup | 0:9e5d98ceea74 | 74 | |
| mridup | 0:9e5d98ceea74 | 75 | /*reset again and send AT command and check for result (AT->OK)*/ |
| mridup | 0:9e5d98ceea74 | 76 | reset(); |
| mridup | 0:9e5d98ceea74 | 77 | |
| mridup | 0:9e5d98ceea74 | 78 | return true; |
| mridup | 0:9e5d98ceea74 | 79 | } |
| mridup | 0:9e5d98ceea74 | 80 | |
| mridup | 0:9e5d98ceea74 | 81 | bool SPWFSA01::hw_reset(void) |
| mridup | 0:9e5d98ceea74 | 82 | { |
| mridup | 0:9e5d98ceea74 | 83 | /* reset the pin PC12 */ |
| mridup | 0:9e5d98ceea74 | 84 | _reset.write(0); |
| mridup | 0:9e5d98ceea74 | 85 | wait_ms(200); |
| mridup | 0:9e5d98ceea74 | 86 | _reset.write(1); |
| mridup | 0:9e5d98ceea74 | 87 | wait_ms(100); |
| mridup | 0:9e5d98ceea74 | 88 | return 1; |
| mridup | 0:9e5d98ceea74 | 89 | } |
| mridup | 0:9e5d98ceea74 | 90 | |
| mridup | 0:9e5d98ceea74 | 91 | bool SPWFSA01::reset(void) |
| mridup | 0:9e5d98ceea74 | 92 | { |
| mridup | 0:9e5d98ceea74 | 93 | if(!_parser.send("AT+CFUN=1")) return false; |
| mridup | 0:9e5d98ceea74 | 94 | while(1) { |
| mridup | 8:a4425b8dd2e4 | 95 | if (_parser.recv("+WIND:32:WiFi Hardware Started\r")) { |
| mridup | 0:9e5d98ceea74 | 96 | return true; |
| mridup | 0:9e5d98ceea74 | 97 | } |
| mridup | 0:9e5d98ceea74 | 98 | } |
| mridup | 0:9e5d98ceea74 | 99 | } |
| mridup | 0:9e5d98ceea74 | 100 | |
| mridup | 0:9e5d98ceea74 | 101 | void SPWFSA01::waitSPWFReady(void) |
| mridup | 0:9e5d98ceea74 | 102 | { |
| mridup | 0:9e5d98ceea74 | 103 | //wait_ms(200); |
| mridup | 0:9e5d98ceea74 | 104 | while(1) |
| mridup | 0:9e5d98ceea74 | 105 | if(_parser.send("AT") && _parser.recv("OK")) |
| mridup | 0:9e5d98ceea74 | 106 | //till we get OK from AT command |
| mridup | 0:9e5d98ceea74 | 107 | //printf("\r\nwaiting for reset to complete..\n"); |
| mridup | 0:9e5d98ceea74 | 108 | return; |
| mridup | 0:9e5d98ceea74 | 109 | |
| mridup | 0:9e5d98ceea74 | 110 | } |
| mridup | 0:9e5d98ceea74 | 111 | |
| mridup | 0:9e5d98ceea74 | 112 | /* Security Mode |
| mridup | 0:9e5d98ceea74 | 113 | None = 0, |
| mridup | 0:9e5d98ceea74 | 114 | WEP = 1, |
| mridup | 0:9e5d98ceea74 | 115 | WPA_Personal = 2, |
| mridup | 0:9e5d98ceea74 | 116 | */ |
| mridup | 0:9e5d98ceea74 | 117 | bool SPWFSA01::connect(const char *ap, const char *passPhrase, int securityMode) |
| mridup | 0:9e5d98ceea74 | 118 | { |
| mridup | 0:9e5d98ceea74 | 119 | uint32_t n1, n2, n3, n4; |
| mridup | 0:9e5d98ceea74 | 120 | |
| mridup | 0:9e5d98ceea74 | 121 | //AT+S.SCFG=wifi_wpa_psk_text,%s\r |
| mridup | 0:9e5d98ceea74 | 122 | if(!(_parser.send("AT+S.SCFG=wifi_wpa_psk_text,%s", passPhrase) && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 123 | { |
| mridup | 13:f21e4e73bbb6 | 124 | debug_if(dbg_on, "SPWF> error pass set\r\n"); |
| mridup | 0:9e5d98ceea74 | 125 | return false; |
| mridup | 0:9e5d98ceea74 | 126 | } |
| mridup | 0:9e5d98ceea74 | 127 | //AT+S.SSIDTXT=%s\r |
| mridup | 0:9e5d98ceea74 | 128 | if(!(_parser.send("AT+S.SSIDTXT=%s", ap) && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 129 | { |
| mridup | 13:f21e4e73bbb6 | 130 | debug_if(dbg_on, "SPWF> error ssid set\r\n"); |
| mridup | 0:9e5d98ceea74 | 131 | return false; |
| mridup | 0:9e5d98ceea74 | 132 | } |
| mridup | 0:9e5d98ceea74 | 133 | //AT+S.SCFG=wifi_priv_mode,%d\r |
| mridup | 0:9e5d98ceea74 | 134 | if(!(_parser.send("AT+S.SCFG=wifi_priv_mode,%d", securityMode) && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 135 | { |
| mridup | 13:f21e4e73bbb6 | 136 | debug_if(dbg_on, "SPWF> error security mode set\r\n"); |
| mridup | 0:9e5d98ceea74 | 137 | return false; |
| mridup | 0:9e5d98ceea74 | 138 | } |
| mridup | 0:9e5d98ceea74 | 139 | //"AT+S.SCFG=wifi_mode,%d\r" |
| mridup | 0:9e5d98ceea74 | 140 | /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/ |
| mridup | 0:9e5d98ceea74 | 141 | if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 1) && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 142 | { |
| mridup | 13:f21e4e73bbb6 | 143 | debug_if(dbg_on, "SPWF> error wifi mode set\r\n"); |
| mridup | 0:9e5d98ceea74 | 144 | return false; |
| mridup | 0:9e5d98ceea74 | 145 | } |
| mridup | 0:9e5d98ceea74 | 146 | //AT&W |
| mridup | 0:9e5d98ceea74 | 147 | /* save current setting in flash */ |
| mridup | 0:9e5d98ceea74 | 148 | if(!(_parser.send("AT&W") && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 149 | { |
| mridup | 13:f21e4e73bbb6 | 150 | debug_if(dbg_on, "SPWF> error AT&W\r\n"); |
| mridup | 0:9e5d98ceea74 | 151 | return false; |
| mridup | 0:9e5d98ceea74 | 152 | } |
| mridup | 0:9e5d98ceea74 | 153 | //reset module |
| mridup | 0:9e5d98ceea74 | 154 | reset(); |
| mridup | 0:9e5d98ceea74 | 155 | |
| mridup | 0:9e5d98ceea74 | 156 | while(1) |
| mansiag | 18:fd46c2ca8eb7 | 157 | if((_parser.recv("+WIND:24:WiFi Up:%u.%u.%u.%u",&n1, &n2, &n3, &n4))) |
| mridup | 0:9e5d98ceea74 | 158 | { |
| mridup | 0:9e5d98ceea74 | 159 | break; |
| mridup | 8:a4425b8dd2e4 | 160 | } |
| mridup | 0:9e5d98ceea74 | 161 | |
| mridup | 0:9e5d98ceea74 | 162 | return true; |
| mridup | 0:9e5d98ceea74 | 163 | } |
| mridup | 0:9e5d98ceea74 | 164 | |
| mridup | 0:9e5d98ceea74 | 165 | bool SPWFSA01::disconnect(void) |
| mridup | 0:9e5d98ceea74 | 166 | { |
| mridup | 0:9e5d98ceea74 | 167 | //"AT+S.SCFG=wifi_mode,%d\r" |
| mridup | 0:9e5d98ceea74 | 168 | /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/ |
| mridup | 0:9e5d98ceea74 | 169 | if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 0) && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 170 | { |
| mridup | 13:f21e4e73bbb6 | 171 | debug_if(dbg_on, "SPWF> error wifi mode set\r\n"); |
| mridup | 0:9e5d98ceea74 | 172 | return false; |
| mridup | 0:9e5d98ceea74 | 173 | } |
| mridup | 0:9e5d98ceea74 | 174 | //AT&W |
| mridup | 0:9e5d98ceea74 | 175 | /* save current setting in flash */ |
| mridup | 0:9e5d98ceea74 | 176 | if(!(_parser.send("AT&W") && _parser.recv("OK"))) |
| mridup | 0:9e5d98ceea74 | 177 | { |
| mridup | 13:f21e4e73bbb6 | 178 | debug_if(dbg_on, "SPWF> error AT&W\r\n"); |
| mridup | 0:9e5d98ceea74 | 179 | return false; |
| mridup | 0:9e5d98ceea74 | 180 | } |
| mridup | 0:9e5d98ceea74 | 181 | //reset module |
| mridup | 0:9e5d98ceea74 | 182 | reset(); |
| mridup | 0:9e5d98ceea74 | 183 | return true; |
| mridup | 0:9e5d98ceea74 | 184 | } |
| mridup | 0:9e5d98ceea74 | 185 | |
| mridup | 5:f17d6351e942 | 186 | bool SPWFSA01::dhcp(int mode) |
| mridup | 0:9e5d98ceea74 | 187 | { |
| mridup | 0:9e5d98ceea74 | 188 | //only 3 valid modes |
| mridup | 5:f17d6351e942 | 189 | //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 | 190 | if(mode < 0 || mode > 2) { |
| mridup | 0:9e5d98ceea74 | 191 | return false; |
| mridup | 0:9e5d98ceea74 | 192 | } |
| mridup | 5:f17d6351e942 | 193 | |
| mridup | 5:f17d6351e942 | 194 | return _parser.send("AT+S.SCFG=ip_use_dhcp,%d\r", mode) |
| mridup | 0:9e5d98ceea74 | 195 | && _parser.recv("OK"); |
| mridup | 0:9e5d98ceea74 | 196 | } |
| mridup | 0:9e5d98ceea74 | 197 | |
| mridup | 0:9e5d98ceea74 | 198 | |
| mridup | 0:9e5d98ceea74 | 199 | const char *SPWFSA01::getIPAddress(void) |
| mridup | 0:9e5d98ceea74 | 200 | { |
| mridup | 0:9e5d98ceea74 | 201 | uint32_t n1, n2, n3, n4; |
| mridup | 0:9e5d98ceea74 | 202 | |
| mridup | 0:9e5d98ceea74 | 203 | if (!(_parser.send("AT+S.STS=ip_ipaddr") |
| mridup | 1:becf69a794fb | 204 | && _parser.recv("# ip_ipaddr = %u.%u.%u.%u", &n1, &n2, &n3, &n4) |
| mridup | 0:9e5d98ceea74 | 205 | && _parser.recv("OK"))) { |
| mridup | 13:f21e4e73bbb6 | 206 | debug_if(dbg_on, "SPWF> getIPAddress error\r\n"); |
| mridup | 0:9e5d98ceea74 | 207 | return 0; |
| mridup | 0:9e5d98ceea74 | 208 | } |
| mridup | 2:40d183d7dc19 | 209 | |
| mridup | 0:9e5d98ceea74 | 210 | sprintf((char*)_ip_buffer,"%u.%u.%u.%u", n1, n2, n3, n4); |
| mridup | 0:9e5d98ceea74 | 211 | |
| mridup | 0:9e5d98ceea74 | 212 | return _ip_buffer; |
| mridup | 0:9e5d98ceea74 | 213 | } |
| mridup | 0:9e5d98ceea74 | 214 | |
| mridup | 0:9e5d98ceea74 | 215 | const char *SPWFSA01::getMACAddress(void) |
| mridup | 0:9e5d98ceea74 | 216 | { |
| mridup | 2:40d183d7dc19 | 217 | uint32_t n1, n2, n3, n4, n5, n6; |
| mridup | 1:becf69a794fb | 218 | |
| mridup | 1:becf69a794fb | 219 | if (!(_parser.send("AT+S.GCFG=nv_wifi_macaddr") |
| mridup | 2:40d183d7dc19 | 220 | && _parser.recv("# nv_wifi_macaddr = %x:%x:%x:%x:%x:%x", &n1, &n2, &n3, &n4, &n5, &n6) |
| mridup | 0:9e5d98ceea74 | 221 | && _parser.recv("OK"))) { |
| mridup | 13:f21e4e73bbb6 | 222 | debug_if(dbg_on, "SPWF> getMACAddress error\r\n"); |
| mridup | 0:9e5d98ceea74 | 223 | return 0; |
| mridup | 0:9e5d98ceea74 | 224 | } |
| mridup | 2:40d183d7dc19 | 225 | |
| mridup | 2:40d183d7dc19 | 226 | sprintf((char*)_mac_buffer,"%02X:%02X:%02X:%02X:%02X:%02X", n1, n2, n3, n4, n5, n6); |
| mridup | 0:9e5d98ceea74 | 227 | |
| mridup | 0:9e5d98ceea74 | 228 | return _mac_buffer; |
| mridup | 0:9e5d98ceea74 | 229 | } |
| mridup | 0:9e5d98ceea74 | 230 | |
| mridup | 0:9e5d98ceea74 | 231 | bool SPWFSA01::isConnected(void) |
| mridup | 0:9e5d98ceea74 | 232 | { |
| mridup | 0:9e5d98ceea74 | 233 | return getIPAddress() != 0; |
| mridup | 0:9e5d98ceea74 | 234 | } |
| mridup | 0:9e5d98ceea74 | 235 | |
| mridup | 3:2af9df1068a5 | 236 | bool SPWFSA01::open(const char *type, int* id, const char* addr, int port) |
| mridup | 0:9e5d98ceea74 | 237 | { |
| mridup | 13:f21e4e73bbb6 | 238 | Timer timer; |
| mridup | 13:f21e4e73bbb6 | 239 | timer.start(); |
| mridup | 3:2af9df1068a5 | 240 | |
| mridup | 3:2af9df1068a5 | 241 | if(!_parser.send("AT+S.SOCKON=%s,%d,%s,ind", addr, port, type)) |
| mridup | 3:2af9df1068a5 | 242 | { |
| mridup | 13:f21e4e73bbb6 | 243 | debug_if(dbg_on, "SPWF> error opening socket\r\n"); |
| mridup | 3:2af9df1068a5 | 244 | return false; |
| mridup | 3:2af9df1068a5 | 245 | } |
| mridup | 3:2af9df1068a5 | 246 | |
| mridup | 3:2af9df1068a5 | 247 | while(1) |
| mridup | 3:2af9df1068a5 | 248 | { |
| mridup | 3:2af9df1068a5 | 249 | if( _parser.recv(" ID: %d", id) |
| mridup | 3:2af9df1068a5 | 250 | && _parser.recv("OK")) |
| mridup | 3:2af9df1068a5 | 251 | break; |
| mridup | 13:f21e4e73bbb6 | 252 | |
| mridup | 13:f21e4e73bbb6 | 253 | if (timer.read_ms() > SPWFSA01_CONNECT_TIMEOUT) { |
| mridup | 13:f21e4e73bbb6 | 254 | return false; |
| mridup | 13:f21e4e73bbb6 | 255 | } |
| mridup | 13:f21e4e73bbb6 | 256 | |
| mridup | 3:2af9df1068a5 | 257 | //TODO:implement time-out functionality in case of no response |
| mridup | 4:042d5b9bb6e7 | 258 | //if(timeout) return false; |
| mridup | 7:551de95939e2 | 259 | //TODO: deal with errors like "ERROR: Failed to resolve name" |
| mridup | 11:643a8c0f07ea | 260 | //TODO: deal with errors like "ERROR: Data mode not available" |
| mridup | 3:2af9df1068a5 | 261 | } |
| mridup | 0:9e5d98ceea74 | 262 | |
| mridup | 3:2af9df1068a5 | 263 | return true; |
| mridup | 0:9e5d98ceea74 | 264 | } |
| mridup | 0:9e5d98ceea74 | 265 | |
| mridup | 0:9e5d98ceea74 | 266 | bool SPWFSA01::send(int id, const void *data, uint32_t amount) |
| mridup | 11:643a8c0f07ea | 267 | { |
| mridup | 11:643a8c0f07ea | 268 | char _buf[18]; |
| mridup | 11:643a8c0f07ea | 269 | |
| mridup | 11:643a8c0f07ea | 270 | setTimeout(SPWFSA01_SEND_TIMEOUT); |
| mridup | 11:643a8c0f07ea | 271 | |
| mridup | 11:643a8c0f07ea | 272 | sprintf((char*)_buf,"AT+S.SOCKW=%d,%d\r", id, amount); |
| mridup | 11:643a8c0f07ea | 273 | |
| mridup | 0:9e5d98ceea74 | 274 | //May take a second try if device is busy |
| mridup | 0:9e5d98ceea74 | 275 | for (unsigned i = 0; i < 2; i++) { |
| mridup | 11:643a8c0f07ea | 276 | if (_parser.write((char*)_buf, strlen(_buf)) >=0 |
| mridup | 7:551de95939e2 | 277 | && _parser.write((char*)data, (int)amount) >= 0 |
| mridup | 7:551de95939e2 | 278 | && _parser.recv("OK")) { |
| mridup | 0:9e5d98ceea74 | 279 | return true; |
| mridup | 0:9e5d98ceea74 | 280 | } |
| mridup | 0:9e5d98ceea74 | 281 | } |
| mridup | 0:9e5d98ceea74 | 282 | |
| mridup | 0:9e5d98ceea74 | 283 | return false; |
| mridup | 0:9e5d98ceea74 | 284 | } |
| mridup | 0:9e5d98ceea74 | 285 | |
| mansiag | 19:df8d7f70a740 | 286 | /* |
| mridup | 0:9e5d98ceea74 | 287 | int32_t SPWFSA01::recv(int id, void *data, uint32_t amount) |
| mridup | 0:9e5d98ceea74 | 288 | { |
| mansiag | 15:e56c9e744ab6 | 289 | uint32_t recv_amount; |
| mridup | 0:9e5d98ceea74 | 290 | int recv_id; |
| mansiag | 15:e56c9e744ab6 | 291 | bool wind_recv = true; |
| mansiag | 15:e56c9e744ab6 | 292 | |
| mridup | 7:551de95939e2 | 293 | if (!(_parser.recv("+WIND:55:Pending Data:%d:%u", &recv_id, &recv_amount) |
| mansiag | 15:e56c9e744ab6 | 294 | && recv_id == id |
| mansiag | 15:e56c9e744ab6 | 295 | && recv_amount <= amount |
| mansiag | 15:e56c9e744ab6 | 296 | && recv_amount%730 |
| mansiag | 15:e56c9e744ab6 | 297 | && _parser.send("AT+S.SOCKQ=%d", id) //send a query (will be required for secure sockets) |
| mansiag | 15:e56c9e744ab6 | 298 | && _parser.recv(" DATALEN: %u", &recv_amount) |
| mansiag | 15:e56c9e744ab6 | 299 | && _parser.recv("OK") |
| mansiag | 15:e56c9e744ab6 | 300 | && recv_amount > 0 |
| mansiag | 15:e56c9e744ab6 | 301 | && _parser.send("AT+S.SOCKR=%d,%d", id, recv_amount) |
| mansiag | 15:e56c9e744ab6 | 302 | && (_parser.read((char*)data, recv_amount) >0) |
| mansiag | 15:e56c9e744ab6 | 303 | && _parser.recv("OK"))) { |
| mansiag | 15:e56c9e744ab6 | 304 | if(!(recv_amount%730)) |
| mansiag | 15:e56c9e744ab6 | 305 | { |
| mansiag | 15:e56c9e744ab6 | 306 | // receive all the WIND messages |
| mansiag | 15:e56c9e744ab6 | 307 | do { |
| mansiag | 15:e56c9e744ab6 | 308 | if (!(_parser.recv("+WIND:55:Pending Data:%d:%u", &recv_id, &recv_amount) |
| mansiag | 15:e56c9e744ab6 | 309 | && recv_id == id |
| mansiag | 15:e56c9e744ab6 | 310 | && recv_amount <= amount |
| mansiag | 15:e56c9e744ab6 | 311 | && recv_amount > 0)) |
| mansiag | 15:e56c9e744ab6 | 312 | wind_recv = false; |
| mansiag | 15:e56c9e744ab6 | 313 | } while (!(recv_amount%730) && wind_recv); |
| mansiag | 15:e56c9e744ab6 | 314 | |
| mansiag | 15:e56c9e744ab6 | 315 | // Read all the data pending on a socket |
| mansiag | 15:e56c9e744ab6 | 316 | if(!( recv_amount > 0 |
| mansiag | 15:e56c9e744ab6 | 317 | && _parser.send("AT+S.SOCKR=%d,%d", id, recv_amount) |
| mansiag | 15:e56c9e744ab6 | 318 | && (_parser.read((char*)data, recv_amount) >0) |
| mansiag | 15:e56c9e744ab6 | 319 | && _parser.recv("OK"))) { |
| mansiag | 15:e56c9e744ab6 | 320 | return -1; |
| mansiag | 15:e56c9e744ab6 | 321 | } |
| mridup | 13:f21e4e73bbb6 | 322 | } |
| mansiag | 15:e56c9e744ab6 | 323 | else { |
| mansiag | 15:e56c9e744ab6 | 324 | return -2; |
| mridup | 13:f21e4e73bbb6 | 325 | } |
| mansiag | 15:e56c9e744ab6 | 326 | } |
| mridup | 0:9e5d98ceea74 | 327 | return recv_amount; |
| mridup | 0:9e5d98ceea74 | 328 | } |
| mansiag | 19:df8d7f70a740 | 329 | */ |
| mansiag | 19:df8d7f70a740 | 330 | |
| mansiag | 19:df8d7f70a740 | 331 | int32_t SPWFSA01::recv(int id, void *data, uint32_t amount) |
| mansiag | 19:df8d7f70a740 | 332 | { |
| mansiag | 19:df8d7f70a740 | 333 | uint32_t recv_amount=0; |
| mansiag | 19:df8d7f70a740 | 334 | |
| mansiag | 19:df8d7f70a740 | 335 | while(!recv_amount) { |
| mansiag | 19:df8d7f70a740 | 336 | if(!(_parser.send("AT+S.SOCKQ=%d", id) //send a query (will be required for secure sockets) |
| mansiag | 19:df8d7f70a740 | 337 | && _parser.recv(" DATALEN: %u", &recv_amount) |
| mansiag | 19:df8d7f70a740 | 338 | && _parser.recv("OK"))) { |
| mansiag | 19:df8d7f70a740 | 339 | return -2; |
| mansiag | 19:df8d7f70a740 | 340 | } |
| mansiag | 19:df8d7f70a740 | 341 | } |
| mansiag | 19:df8d7f70a740 | 342 | if(recv_amount > amount) |
| mansiag | 19:df8d7f70a740 | 343 | recv_amount = amount; |
| mansiag | 19:df8d7f70a740 | 344 | |
| mansiag | 19:df8d7f70a740 | 345 | _parser.flush(); |
| mansiag | 19:df8d7f70a740 | 346 | if(!(_parser.send("AT+S.SOCKR=%d,%d", id, recv_amount) |
| mansiag | 19:df8d7f70a740 | 347 | && (_parser.read((char*)data, recv_amount) >0) |
| mansiag | 19:df8d7f70a740 | 348 | && _parser.recv("OK"))) { |
| mansiag | 19:df8d7f70a740 | 349 | return -2; |
| mansiag | 19:df8d7f70a740 | 350 | } |
| mansiag | 19:df8d7f70a740 | 351 | |
| mansiag | 19:df8d7f70a740 | 352 | return recv_amount; |
| mansiag | 19:df8d7f70a740 | 353 | } |
| mridup | 0:9e5d98ceea74 | 354 | |
| mridup | 0:9e5d98ceea74 | 355 | bool SPWFSA01::close(int id) |
| mridup | 0:9e5d98ceea74 | 356 | { |
| mridup | 4:042d5b9bb6e7 | 357 | //May take a second try if device is busy or error is returned |
| mridup | 0:9e5d98ceea74 | 358 | for (unsigned i = 0; i < 2; i++) { |
| mridup | 4:042d5b9bb6e7 | 359 | if (_parser.send("AT+S.SOCKC=%d", id) |
| mridup | 0:9e5d98ceea74 | 360 | && _parser.recv("OK")) { |
| mridup | 0:9e5d98ceea74 | 361 | return true; |
| mridup | 0:9e5d98ceea74 | 362 | } |
| mridup | 7:551de95939e2 | 363 | else |
| mridup | 7:551de95939e2 | 364 | { |
| mridup | 7:551de95939e2 | 365 | if(_parser.recv("ERROR: Pending data")) |
| mridup | 13:f21e4e73bbb6 | 366 | debug_if(dbg_on, "SPWF> ERROR!!!!\r\n"); |
| mridup | 7:551de95939e2 | 367 | return false; |
| mridup | 7:551de95939e2 | 368 | } |
| mridup | 6:258b093eec08 | 369 | //TODO: Deal with "ERROR: Pending data" (Closing a socket with pending data) |
| mridup | 0:9e5d98ceea74 | 370 | } |
| mridup | 0:9e5d98ceea74 | 371 | |
| mridup | 0:9e5d98ceea74 | 372 | return false; |
| mridup | 0:9e5d98ceea74 | 373 | } |
| mridup | 0:9e5d98ceea74 | 374 | |
| mridup | 0:9e5d98ceea74 | 375 | void SPWFSA01::setTimeout(uint32_t timeout_ms) |
| mridup | 0:9e5d98ceea74 | 376 | { |
| mridup | 0:9e5d98ceea74 | 377 | _parser.setTimeout(timeout_ms); |
| mridup | 0:9e5d98ceea74 | 378 | } |
| mridup | 0:9e5d98ceea74 | 379 | |
| mridup | 0:9e5d98ceea74 | 380 | bool SPWFSA01::readable() |
| mridup | 0:9e5d98ceea74 | 381 | { |
| mridup | 0:9e5d98ceea74 | 382 | return _serial.readable(); |
| mridup | 0:9e5d98ceea74 | 383 | } |
| mridup | 0:9e5d98ceea74 | 384 | |
| mridup | 0:9e5d98ceea74 | 385 | bool SPWFSA01::writeable() |
| mridup | 0:9e5d98ceea74 | 386 | { |
| mridup | 0:9e5d98ceea74 | 387 | return _serial.writeable(); |
| mridup | 0:9e5d98ceea74 | 388 | } |
