The Hiking Pal tracking device firmware. See full description on the detail page: https://www.hackster.io/bowenfeng/hiking-pal-v1-07c02d

Dependencies:   FXOS8700CQ MODSERIAL mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Committer:
fkellermavnet
Date:
Fri Jul 22 18:01:07 2016 +0000
Revision:
34:1a4498e3580e
Parent:
32:1e052a3e73fe
Child:
36:d4782eabff43
Potential solution for missing characters at end of socket read payload.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 2:0e2ef866af95 1 #include "mbed.h"
JMF 2:0e2ef866af95 2 #include <cctype>
JMF 2:0e2ef866af95 3 #include <string>
JMF 2:0e2ef866af95 4 #include "config_me.h"
JMF 2:0e2ef866af95 5 #include "SerialBuffered.h"
JMF 2:0e2ef866af95 6 #include "wnc_control.h"
JMF 2:0e2ef866af95 7
JMF 2:0e2ef866af95 8 extern Serial pc;
JMF 2:0e2ef866af95 9 extern Serial mdm;
JMF 2:0e2ef866af95 10 extern string MyServerIpAddress;
JMF 2:0e2ef866af95 11 extern string MySocketData;
JMF 2:0e2ef866af95 12
JMF 2:0e2ef866af95 13 int reinitialize_mdm(void);
JMF 2:0e2ef866af95 14
JMF 2:0e2ef866af95 15 enum WNC_ERR_e {
JMF 2:0e2ef866af95 16 WNC_OK =0,
JMF 2:0e2ef866af95 17 WNC_CMD_ERR = -1,
JMF 2:0e2ef866af95 18 WNC_NO_RESPONSE = -2
JMF 2:0e2ef866af95 19 };
JMF 2:0e2ef866af95 20
JMF 2:0e2ef866af95 21 // Contains result of last call to send_wnc_cmd(..)
JMF 2:0e2ef866af95 22 WNC_ERR_e WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 23
JMF 2:0e2ef866af95 24 // Contains the RAW WNC UART responses
JMF 2:0e2ef866af95 25 static string wncStr;
fkellermavnet 10:df54436ecd38 26 static int socketOpen = 0;
JMF 2:0e2ef866af95 27
JMF 2:0e2ef866af95 28 void software_init_mdm(void)
JMF 2:0e2ef866af95 29 {
JMF 2:0e2ef866af95 30 do
JMF 2:0e2ef866af95 31 {
JMF 2:0e2ef866af95 32 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 33 at_init_wnc();
fkellermavnet 30:33be8e2992f3 34 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 35 reinitialize_mdm();
JMF 2:0e2ef866af95 36 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 37 }
JMF 2:0e2ef866af95 38
JMF 2:0e2ef866af95 39 void resolve_mdm(void)
JMF 2:0e2ef866af95 40 {
JMF 2:0e2ef866af95 41 do
JMF 2:0e2ef866af95 42 {
JMF 2:0e2ef866af95 43 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 44 at_dnsresolve_wnc(MY_SERVER_URL, &MyServerIpAddress);
JMF 2:0e2ef866af95 45 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 46 {
JMF 2:0e2ef866af95 47 reinitialize_mdm();
JMF 2:0e2ef866af95 48 software_init_mdm();
JMF 2:0e2ef866af95 49 }
JMF 2:0e2ef866af95 50 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 2:0e2ef866af95 51 {
JMF 2:0e2ef866af95 52 pc.puts("Bad URL!!!!!!\r\n");
JMF 2:0e2ef866af95 53 MyServerIpAddress = "192.168.0.1";
JMF 2:0e2ef866af95 54 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 55 }
JMF 2:0e2ef866af95 56 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 57
fkellermavnet 30:33be8e2992f3 58 pc.printf("My Server IP: %s\r\n", MyServerIpAddress.c_str());
JMF 2:0e2ef866af95 59 }
JMF 2:0e2ef866af95 60
JMF 2:0e2ef866af95 61 void sockopen_mdm(void)
JMF 2:0e2ef866af95 62 {
JMF 2:0e2ef866af95 63 do
JMF 2:0e2ef866af95 64 {
fkellermavnet 19:f89baed3bd6f 65 at_at_wnc();
fkellermavnet 19:f89baed3bd6f 66 at_at_wnc();
JMF 2:0e2ef866af95 67 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 68 at_sockopen_wnc(MyServerIpAddress, MY_PORT_STR);
JMF 2:0e2ef866af95 69 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 70 {
JMF 2:0e2ef866af95 71 reinitialize_mdm();
JMF 2:0e2ef866af95 72 software_init_mdm();
JMF 2:0e2ef866af95 73 }
JMF 2:0e2ef866af95 74 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 2:0e2ef866af95 75 pc.puts("Socket open fail!!!!\r\n");
fkellermavnet 10:df54436ecd38 76 else
fkellermavnet 10:df54436ecd38 77 socketOpen = 1;
JMF 2:0e2ef866af95 78 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 79 }
JMF 2:0e2ef866af95 80
JMF 2:0e2ef866af95 81 void sockwrite_mdm(const char * s)
JMF 2:0e2ef866af95 82 {
fkellermavnet 10:df54436ecd38 83 if (socketOpen == 1)
fkellermavnet 10:df54436ecd38 84 {
JMF 2:0e2ef866af95 85 do
JMF 2:0e2ef866af95 86 {
JMF 2:0e2ef866af95 87 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 88 at_sockwrite_wnc(s);
JMF 2:0e2ef866af95 89 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 90 {
JMF 2:0e2ef866af95 91 reinitialize_mdm();
JMF 2:0e2ef866af95 92 software_init_mdm();
JMF 2:0e2ef866af95 93 }
JMF 2:0e2ef866af95 94 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 2:0e2ef866af95 95 {
JMF 2:0e2ef866af95 96 pc.puts("Socket Write fail!!!\r\n");
JMF 2:0e2ef866af95 97 // Have seen when write fails modem gets stuck in bad state, try to recover
JMF 2:0e2ef866af95 98 reinitialize_mdm();
JMF 2:0e2ef866af95 99 software_init_mdm();
JMF 2:0e2ef866af95 100 }
JMF 2:0e2ef866af95 101 } while (WNC_MDM_ERR != WNC_OK);
fkellermavnet 10:df54436ecd38 102 }
fkellermavnet 10:df54436ecd38 103 else
fkellermavnet 10:df54436ecd38 104 puts("Socket is closed for write!\r\n");
JMF 2:0e2ef866af95 105 }
JMF 2:0e2ef866af95 106
fkellermavnet 30:33be8e2992f3 107 unsigned sockread_mdm(string * sockData, int len, int retries)
JMF 2:0e2ef866af95 108 {
fkellermavnet 30:33be8e2992f3 109 unsigned n = 0;
fkellermavnet 30:33be8e2992f3 110
fkellermavnet 30:33be8e2992f3 111 // Clean slate:
fkellermavnet 30:33be8e2992f3 112 sockData->erase();
fkellermavnet 30:33be8e2992f3 113
fkellermavnet 10:df54436ecd38 114 if (socketOpen == 1)
fkellermavnet 10:df54436ecd38 115 {
JMF 2:0e2ef866af95 116 do
JMF 2:0e2ef866af95 117 {
JMF 2:0e2ef866af95 118 WNC_MDM_ERR = WNC_OK;
fkellermavnet 30:33be8e2992f3 119 n = at_sockread_wnc(sockData, len, retries);
JMF 2:0e2ef866af95 120 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 121 {
fkellermavnet 30:33be8e2992f3 122 if (n == 0)
fkellermavnet 30:33be8e2992f3 123 {
fkellermavnet 30:33be8e2992f3 124 reinitialize_mdm();
fkellermavnet 30:33be8e2992f3 125 software_init_mdm();
fkellermavnet 30:33be8e2992f3 126 }
fkellermavnet 30:33be8e2992f3 127 else
fkellermavnet 30:33be8e2992f3 128 puts("Sock read partial data!!!\r\n");
JMF 2:0e2ef866af95 129 }
JMF 2:0e2ef866af95 130 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 2:0e2ef866af95 131 puts("Sock read fail!!!!\r\n");
fkellermavnet 30:33be8e2992f3 132 } while (WNC_MDM_ERR == WNC_NO_RESPONSE);
fkellermavnet 10:df54436ecd38 133 }
fkellermavnet 10:df54436ecd38 134 else
fkellermavnet 10:df54436ecd38 135 puts("Socket is closed for read\r\n");
fkellermavnet 30:33be8e2992f3 136
fkellermavnet 30:33be8e2992f3 137 return (n);
JMF 2:0e2ef866af95 138 }
JMF 2:0e2ef866af95 139
JMF 2:0e2ef866af95 140 void sockclose_mdm(void)
JMF 2:0e2ef866af95 141 {
JMF 2:0e2ef866af95 142 do
JMF 2:0e2ef866af95 143 {
JMF 2:0e2ef866af95 144 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 145 at_sockclose_wnc();
fkellermavnet 10:df54436ecd38 146 // Assume close happened even if it went bad
fkellermavnet 10:df54436ecd38 147 // going bad will result in a re-init anyways and if close
fkellermavnet 10:df54436ecd38 148 // fails we're pretty much in bad state and not much can do
fkellermavnet 10:df54436ecd38 149 socketOpen = 0;
JMF 2:0e2ef866af95 150 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 151 {
JMF 2:0e2ef866af95 152 reinitialize_mdm();
JMF 2:0e2ef866af95 153 software_init_mdm();
JMF 2:0e2ef866af95 154 }
JMF 2:0e2ef866af95 155 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 2:0e2ef866af95 156 puts("Sock close fail!!!\r\n");
JMF 2:0e2ef866af95 157 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 158 }
JMF 2:0e2ef866af95 159
JMF 2:0e2ef866af95 160 /**
JMF 2:0e2ef866af95 161 * C++ version 0.4 char* style "itoa":
JMF 2:0e2ef866af95 162 * Written by Lukás Chmela
JMF 2:0e2ef866af95 163 * Released under GPLv3.
JMF 2:0e2ef866af95 164 */
JMF 2:0e2ef866af95 165
JMF 2:0e2ef866af95 166 char* itoa(int value, char* result, int base)
JMF 2:0e2ef866af95 167 {
JMF 2:0e2ef866af95 168 // check that the base if valid
JMF 2:0e2ef866af95 169 if ( base < 2 || base > 36 ) {
JMF 2:0e2ef866af95 170 *result = '\0';
JMF 2:0e2ef866af95 171 return result;
JMF 2:0e2ef866af95 172 }
JMF 2:0e2ef866af95 173
JMF 2:0e2ef866af95 174 char* ptr = result, *ptr1 = result, tmp_char;
JMF 2:0e2ef866af95 175 int tmp_value;
JMF 2:0e2ef866af95 176
JMF 2:0e2ef866af95 177 do {
JMF 2:0e2ef866af95 178 tmp_value = value;
JMF 2:0e2ef866af95 179 value /= base;
JMF 2:0e2ef866af95 180 *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
JMF 2:0e2ef866af95 181 } while ( value );
JMF 2:0e2ef866af95 182
JMF 2:0e2ef866af95 183 // Apply negative sign
JMF 2:0e2ef866af95 184 if ( tmp_value < 0 )
JMF 2:0e2ef866af95 185 *ptr++ = '-';
JMF 2:0e2ef866af95 186 *ptr-- = '\0';
JMF 2:0e2ef866af95 187
JMF 2:0e2ef866af95 188 while ( ptr1 < ptr ) {
JMF 2:0e2ef866af95 189 tmp_char = *ptr;
JMF 2:0e2ef866af95 190 *ptr-- = *ptr1;
JMF 2:0e2ef866af95 191 *ptr1++ = tmp_char;
JMF 2:0e2ef866af95 192 }
JMF 2:0e2ef866af95 193
JMF 2:0e2ef866af95 194 return result;
JMF 2:0e2ef866af95 195 }
JMF 2:0e2ef866af95 196
JMF 2:0e2ef866af95 197 extern int mdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len);
JMF 2:0e2ef866af95 198
JMF 2:0e2ef866af95 199 // Sets a global with failure or success, assumes 1 thread all the time
JMF 2:0e2ef866af95 200 int send_wnc_cmd(const char * s, string ** r, int ms_timeout)
JMF 2:0e2ef866af95 201 {
JMF 2:0e2ef866af95 202 static const char * rsp_lst[] = { "OK", "ERROR", NULL };
JMF 2:0e2ef866af95 203 int len;
JMF 2:0e2ef866af95 204
JMF 2:0e2ef866af95 205 pc.printf("Send: %s\r\n",s);
JMF 2:0e2ef866af95 206 int res = mdm_sendAtCmdRsp(s, rsp_lst, ms_timeout, &wncStr, &len);
JMF 2:0e2ef866af95 207 *r = &wncStr; // Return a pointer to the static string
JMF 2:0e2ef866af95 208
JMF 2:0e2ef866af95 209 if (res >= 0)
JMF 2:0e2ef866af95 210 {
JMF 2:0e2ef866af95 211 pc.puts("[");
fkellermavnet 30:33be8e2992f3 212 pc.puts(wncStr.c_str());
JMF 2:0e2ef866af95 213 pc.puts("]\n\r");
JMF 2:0e2ef866af95 214 if (res > 0)
JMF 2:0e2ef866af95 215 {
JMF 2:0e2ef866af95 216 if (WNC_MDM_ERR != WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 217 WNC_MDM_ERR = WNC_CMD_ERR;
JMF 2:0e2ef866af95 218 return -1;
JMF 2:0e2ef866af95 219 }
JMF 2:0e2ef866af95 220 else
JMF 2:0e2ef866af95 221 return 0;
JMF 2:0e2ef866af95 222 }
JMF 2:0e2ef866af95 223 else
JMF 2:0e2ef866af95 224 {
JMF 2:0e2ef866af95 225 WNC_MDM_ERR = WNC_NO_RESPONSE;
JMF 2:0e2ef866af95 226 pc.puts("No response from WNC!\n\r");
JMF 2:0e2ef866af95 227 return -2;
JMF 2:0e2ef866af95 228 }
JMF 2:0e2ef866af95 229 }
JMF 2:0e2ef866af95 230
fkellermavnet 19:f89baed3bd6f 231 void at_at_wnc(void)
fkellermavnet 19:f89baed3bd6f 232 {
fkellermavnet 19:f89baed3bd6f 233 string * pRespStr;
fkellermavnet 19:f89baed3bd6f 234 send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat?
fkellermavnet 19:f89baed3bd6f 235 }
fkellermavnet 19:f89baed3bd6f 236
JMF 2:0e2ef866af95 237 void at_init_wnc(void)
JMF 2:0e2ef866af95 238 {
JMF 2:0e2ef866af95 239 string * pRespStr;
JMF 2:0e2ef866af95 240 send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat?
JMF 2:0e2ef866af95 241 send_wnc_cmd("ATE1", &pRespStr, WNC_TIMEOUT_MS); // Echo ON
JMF 2:0e2ef866af95 242 string cmd_str("AT%PDNSET=1,");
JMF 2:0e2ef866af95 243 cmd_str += MY_APN_STR;
JMF 2:0e2ef866af95 244 cmd_str += ",IP";
fkellermavnet 30:33be8e2992f3 245 send_wnc_cmd(cmd_str.c_str(), &pRespStr, 2*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
JMF 2:0e2ef866af95 246 send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS); // Internet services enabled
JMF 2:0e2ef866af95 247 send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 248 }
JMF 2:0e2ef866af95 249
JMF 2:0e2ef866af95 250 void at_sockopen_wnc(const string & ipStr, const char * port )
JMF 2:0e2ef866af95 251 {
JMF 2:0e2ef866af95 252 string * pRespStr;
JMF 2:0e2ef866af95 253 send_wnc_cmd("AT@SOCKCREAT=1", &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 254 string cmd_str("AT@SOCKCONN=1,\"");
JMF 2:0e2ef866af95 255 cmd_str += ipStr;
JMF 2:0e2ef866af95 256 cmd_str += "\",";
JMF 2:0e2ef866af95 257 cmd_str += port;
fkellermavnet 30:33be8e2992f3 258 send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 259 }
JMF 2:0e2ef866af95 260
JMF 2:0e2ef866af95 261 void at_sockclose_wnc(void)
JMF 2:0e2ef866af95 262 {
JMF 2:0e2ef866af95 263 string * pRespStr;
JMF 2:0e2ef866af95 264 send_wnc_cmd("AT@SOCKCLOSE=1", &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 265 }
JMF 2:0e2ef866af95 266
JMF 2:0e2ef866af95 267 int at_dnsresolve_wnc(const char * s, string * ipStr)
JMF 2:0e2ef866af95 268 {
JMF 2:0e2ef866af95 269 string * pRespStr;
JMF 2:0e2ef866af95 270 string str(s);
JMF 2:0e2ef866af95 271 str = "AT@DNSRESVDON=\"" + str;
JMF 2:0e2ef866af95 272 str += "\"\r\n";
fkellermavnet 30:33be8e2992f3 273 if (send_wnc_cmd(str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0)
JMF 2:0e2ef866af95 274 {
JMF 2:0e2ef866af95 275 size_t pos_start = pRespStr->find(":\"") + 2;
JMF 2:0e2ef866af95 276 if (pos_start != string::npos)
JMF 2:0e2ef866af95 277 {
JMF 2:0e2ef866af95 278 size_t pos_end = pRespStr->rfind("\"") - 1;
JMF 2:0e2ef866af95 279 if (pos_end != string::npos)
JMF 2:0e2ef866af95 280 {
JMF 2:0e2ef866af95 281 if (pos_end > pos_start)
JMF 2:0e2ef866af95 282 {
JMF 2:0e2ef866af95 283 // Make a copy for use later (the source string is re-used)
JMF 2:0e2ef866af95 284 *ipStr = pRespStr->substr(pos_start, pos_end - pos_start + 1);
JMF 2:0e2ef866af95 285 return 1;
JMF 2:0e2ef866af95 286 }
JMF 2:0e2ef866af95 287 else
JMF 2:0e2ef866af95 288 pc.puts("URL Resolve fail, substr Err\r\n");
JMF 2:0e2ef866af95 289 }
JMF 2:0e2ef866af95 290 else
JMF 2:0e2ef866af95 291 pc.puts("URL Resolve fail, no 2nd quote\r\n");
JMF 2:0e2ef866af95 292 }
JMF 2:0e2ef866af95 293 else
JMF 2:0e2ef866af95 294 pc.puts("URL Resolve fail, no quotes\r\n");
JMF 2:0e2ef866af95 295 }
JMF 2:0e2ef866af95 296 else
JMF 2:0e2ef866af95 297 pc.puts("URL Resolve fail, WNC cmd fail\r\n");
JMF 2:0e2ef866af95 298
JMF 2:0e2ef866af95 299 return -1;
JMF 2:0e2ef866af95 300 }
JMF 2:0e2ef866af95 301
JMF 2:0e2ef866af95 302 void at_sockwrite_wnc(const char * s)
JMF 2:0e2ef866af95 303 {
JMF 2:0e2ef866af95 304 string * pRespStr;
JMF 2:0e2ef866af95 305 char num2str[6];
JMF 2:0e2ef866af95 306 size_t sLen = strlen(s);
JMF 2:0e2ef866af95 307 if (sLen <= 99999)
JMF 2:0e2ef866af95 308 {
JMF 2:0e2ef866af95 309 string cmd_str("AT@SOCKWRITE=1,");
JMF 2:0e2ef866af95 310 itoa(sLen, num2str, 10);
JMF 2:0e2ef866af95 311 cmd_str += num2str;
JMF 2:0e2ef866af95 312 cmd_str += ",\"";
JMF 2:0e2ef866af95 313 while(*s != '\0')
JMF 2:0e2ef866af95 314 {
JMF 2:0e2ef866af95 315 itoa((int)*s++, num2str, 16);
JMF 2:0e2ef866af95 316 // Always 2-digit ascii hex:
JMF 2:0e2ef866af95 317 if (strlen(num2str) == 1)
JMF 2:0e2ef866af95 318 {
JMF 2:0e2ef866af95 319 num2str[2] = '\0';
JMF 2:0e2ef866af95 320 num2str[1] = num2str[0];
JMF 2:0e2ef866af95 321 num2str[0] = '0';
JMF 2:0e2ef866af95 322 }
JMF 2:0e2ef866af95 323 cmd_str += num2str;
JMF 2:0e2ef866af95 324 }
JMF 2:0e2ef866af95 325 cmd_str += "\"";
fkellermavnet 30:33be8e2992f3 326 send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 327 }
JMF 2:0e2ef866af95 328 else
JMF 2:0e2ef866af95 329 pc.puts("sockwrite Err, string to long\r\n");
JMF 2:0e2ef866af95 330 }
JMF 2:0e2ef866af95 331
JMF 2:0e2ef866af95 332 unsigned at_sockread_wnc(string * pS, unsigned n, unsigned retries = 0)
JMF 2:0e2ef866af95 333 {
fkellermavnet 34:1a4498e3580e 334 unsigned i, numBytes = 0;
JMF 2:0e2ef866af95 335 string * pRespStr;
JMF 2:0e2ef866af95 336 string cmd_str("AT@SOCKREAD=1,");
fkellermavnet 30:33be8e2992f3 337
JMF 2:0e2ef866af95 338 if (n <= 1500)
JMF 2:0e2ef866af95 339 {
JMF 2:0e2ef866af95 340 char num2str[6];
fkellermavnet 22:41e6c417ace1 341
JMF 2:0e2ef866af95 342 itoa(n, num2str, 10);
JMF 2:0e2ef866af95 343 cmd_str += num2str;
JMF 2:0e2ef866af95 344 retries += 1;
JMF 2:0e2ef866af95 345 while (retries--)
JMF 2:0e2ef866af95 346 {
fkellermavnet 22:41e6c417ace1 347 // Assuming someone is sending then calling this to receive response, invoke
fkellermavnet 22:41e6c417ace1 348 // a pause to give the response some time to come back and then also
fkellermavnet 22:41e6c417ace1 349 // between each retry.
fkellermavnet 22:41e6c417ace1 350 wait_ms(10);
fkellermavnet 22:41e6c417ace1 351
fkellermavnet 30:33be8e2992f3 352 send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 353 size_t pos_start = pRespStr->find("\"") + 1;
JMF 2:0e2ef866af95 354 size_t pos_end = pRespStr->rfind("\"") - 1;
fkellermavnet 34:1a4498e3580e 355 i = (pos_end - pos_start + 1); // Num hex chars, 2 per byte
JMF 2:0e2ef866af95 356 if (i > 0)
JMF 2:0e2ef866af95 357 {
fkellermavnet 34:1a4498e3580e 358 retries = 1; // If any data found retry 1 more time to catch data that might be in another
fkellermavnet 34:1a4498e3580e 359 // WNC payload
JMF 2:0e2ef866af95 360 string byte;
JMF 2:0e2ef866af95 361 while (pos_start < pos_end)
JMF 2:0e2ef866af95 362 {
JMF 2:0e2ef866af95 363 byte = pRespStr->substr(pos_start, 2);
fkellermavnet 30:33be8e2992f3 364 *pS += (char)strtol(byte.c_str(), NULL, 16);
JMF 2:0e2ef866af95 365 pos_start += 2;
JMF 2:0e2ef866af95 366 }
fkellermavnet 34:1a4498e3580e 367 numBytes += i/2;
JMF 2:0e2ef866af95 368 }
JMF 2:0e2ef866af95 369 }
fkellermavnet 34:1a4498e3580e 370 return numBytes;
JMF 2:0e2ef866af95 371 }
JMF 2:0e2ef866af95 372 else
JMF 2:0e2ef866af95 373 pc.puts("sockread Err, to many to read\r\n");
JMF 2:0e2ef866af95 374
JMF 2:0e2ef866af95 375 return 0;
JMF 2:0e2ef866af95 376 }