Fork with SeeedStudio Xadow GPS v2 enabled

Dependencies:   FXOS8700CQ MODSERIAL XadowGPS mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Committer:
HackTampa
Date:
Thu Dec 22 21:06:01 2016 +0000
Revision:
84:923940fe25d9
Parent:
80:d635c0eddd6e
Minor change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkellermavnet 68:6e311c747045 1 /* ===================================================================
fkellermavnet 74:3e3ee15584e5 2 Copyright c 2016, AVNET Inc.
fkellermavnet 68:6e311c747045 3
fkellermavnet 68:6e311c747045 4 Licensed under the Apache License, Version 2.0 (the "License");
fkellermavnet 68:6e311c747045 5 you may not use this file except in compliance with the License.
fkellermavnet 68:6e311c747045 6 You may obtain a copy of the License at
fkellermavnet 68:6e311c747045 7
fkellermavnet 68:6e311c747045 8 http://www.apache.org/licenses/LICENSE-2.0
fkellermavnet 68:6e311c747045 9
fkellermavnet 68:6e311c747045 10 Unless required by applicable law or agreed to in writing,
fkellermavnet 68:6e311c747045 11 software distributed under the License is distributed on an
fkellermavnet 68:6e311c747045 12 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
fkellermavnet 68:6e311c747045 13 either express or implied. See the License for the specific
fkellermavnet 68:6e311c747045 14 language governing permissions and limitations under the License.
fkellermavnet 68:6e311c747045 15
fkellermavnet 68:6e311c747045 16 ======================================================================== */
fkellermavnet 68:6e311c747045 17
JMF 2:0e2ef866af95 18 #include "mbed.h"
JMF 2:0e2ef866af95 19 #include <cctype>
JMF 2:0e2ef866af95 20 #include <string>
JMF 2:0e2ef866af95 21 #include "config_me.h"
JMF 2:0e2ef866af95 22 #include "wnc_control.h"
stefanrousseau 62:73c564e883e9 23 #include "hardware.h"
JMF 2:0e2ef866af95 24
fkellermavnet 53:dcccf2881fa0 25 // Outputs detailed WNC command info
fkellermavnet 53:dcccf2881fa0 26 #define WNC_CMD_DEBUG_ON
fkellermavnet 53:dcccf2881fa0 27
fkellermavnet 53:dcccf2881fa0 28 // Full debug output, longer cmds and extra cellular status checking
fkellermavnet 53:dcccf2881fa0 29 #undef WNC_CMD_DEBUG_ON_VERBOSE
fkellermavnet 53:dcccf2881fa0 30
JMF 2:0e2ef866af95 31 extern string MyServerIpAddress;
JMF 2:0e2ef866af95 32 extern string MySocketData;
JMF 2:0e2ef866af95 33
JMF 2:0e2ef866af95 34 int reinitialize_mdm(void);
JMF 2:0e2ef866af95 35
JMF 2:0e2ef866af95 36 enum WNC_ERR_e {
JMF 2:0e2ef866af95 37 WNC_OK =0,
JMF 2:0e2ef866af95 38 WNC_CMD_ERR = -1,
fkellermavnet 46:da9d788f5d5a 39 WNC_NO_RESPONSE = -2,
fkellermavnet 73:da723fedfdd2 40 WNC_CELL_LINK_DOWN = -3,
fkellermavnet 73:da723fedfdd2 41 WNC_EXTERR = -4
JMF 2:0e2ef866af95 42 };
JMF 2:0e2ef866af95 43
JMF 2:0e2ef866af95 44 // Contains result of last call to send_wnc_cmd(..)
JMF 2:0e2ef866af95 45 WNC_ERR_e WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 46
JMF 2:0e2ef866af95 47 // Contains the RAW WNC UART responses
JMF 2:0e2ef866af95 48 static string wncStr;
fkellermavnet 10:df54436ecd38 49 static int socketOpen = 0;
JMF 2:0e2ef866af95 50
JMF 2:0e2ef866af95 51 void software_init_mdm(void)
JMF 2:0e2ef866af95 52 {
fkellermavnet 66:b2425419b0cc 53 // Temp put here to fix new boards needing init,
fkellermavnet 66:b2425419b0cc 54 // the check for on the cellular network was preventing the PDNSET from happening!!!!
fkellermavnet 66:b2425419b0cc 55 {
JMF 67:11db02bb93e1 56 PUTS("SET APN STRING!\r\n");
fkellermavnet 66:b2425419b0cc 57 string * pRespStr;
fkellermavnet 66:b2425419b0cc 58 string cmd_str("AT%PDNSET=1,");
fkellermavnet 66:b2425419b0cc 59 cmd_str += MY_APN_STR;
fkellermavnet 66:b2425419b0cc 60 cmd_str += ",IP";
fkellermavnet 66:b2425419b0cc 61 at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, 4*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
fkellermavnet 66:b2425419b0cc 62 }
fkellermavnet 66:b2425419b0cc 63
fkellermavnet 42:be4b9ee3a615 64 static bool reportStatus = true;
JMF 2:0e2ef866af95 65 do
JMF 2:0e2ef866af95 66 {
fkellermavnet 73:da723fedfdd2 67 PUTS("------------ software_init_mdm! --------->\r\n");
fkellermavnet 42:be4b9ee3a615 68 if (check_wnc_ready() == 0)
fkellermavnet 42:be4b9ee3a615 69 {
fkellermavnet 42:be4b9ee3a615 70 if (reportStatus == false)
fkellermavnet 42:be4b9ee3a615 71 {
JMF 67:11db02bb93e1 72 PUTS("Re-connected to cellular network!\n\r");
fkellermavnet 42:be4b9ee3a615 73 reportStatus = true;
fkellermavnet 42:be4b9ee3a615 74 }
fkellermavnet 42:be4b9ee3a615 75
fkellermavnet 42:be4b9ee3a615 76 // WNC has SIM and registered on network
fkellermavnet 42:be4b9ee3a615 77 do
fkellermavnet 42:be4b9ee3a615 78 {
fkellermavnet 42:be4b9ee3a615 79 WNC_MDM_ERR = WNC_OK;
fkellermavnet 42:be4b9ee3a615 80 at_init_wnc();
fkellermavnet 42:be4b9ee3a615 81 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
fkellermavnet 42:be4b9ee3a615 82 {
fkellermavnet 42:be4b9ee3a615 83 reinitialize_mdm();
fkellermavnet 42:be4b9ee3a615 84 at_init_wnc(true); // Hard reset occurred so make it go through the software init();
fkellermavnet 42:be4b9ee3a615 85 }
fkellermavnet 42:be4b9ee3a615 86 } while (WNC_MDM_ERR != WNC_OK);
fkellermavnet 42:be4b9ee3a615 87 }
fkellermavnet 42:be4b9ee3a615 88 else
fkellermavnet 42:be4b9ee3a615 89 {
fkellermavnet 42:be4b9ee3a615 90 if (reportStatus == true)
fkellermavnet 42:be4b9ee3a615 91 {
JMF 67:11db02bb93e1 92 PUTS("Not connected to cellular network!\n\r");
fkellermavnet 42:be4b9ee3a615 93 reportStatus = false;
fkellermavnet 42:be4b9ee3a615 94 }
fkellermavnet 42:be4b9ee3a615 95 // Atempt to re-register
fkellermavnet 42:be4b9ee3a615 96 // string * pRespStr;
JMF 67:11db02bb93e1 97 // PUTS("Force re-register!\r\n");
fkellermavnet 42:be4b9ee3a615 98 // at_send_wnc_cmd("AT+CFUN=0,0", &pRespStr, WNC_TIMEOUT_MS);
fkellermavnet 42:be4b9ee3a615 99 // wait_ms(31000);
fkellermavnet 42:be4b9ee3a615 100 // at_send_wnc_cmd("AT+CFUN=1,0", &pRespStr, WNC_TIMEOUT_MS);
fkellermavnet 42:be4b9ee3a615 101 // wait_ms(31000);
fkellermavnet 46:da9d788f5d5a 102 WNC_MDM_ERR = WNC_CELL_LINK_DOWN;
fkellermavnet 42:be4b9ee3a615 103 }
fkellermavnet 42:be4b9ee3a615 104 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 105 }
JMF 2:0e2ef866af95 106
fkellermavnet 77:c65eae5b9958 107 void display_modem_firmware_version(void)
fkellermavnet 77:c65eae5b9958 108 {
fkellermavnet 77:c65eae5b9958 109 string * pRespStr;
fkellermavnet 77:c65eae5b9958 110
fkellermavnet 77:c65eae5b9958 111 PUTS("<-------- WNC Firmware Revision --------\r\n");
fkellermavnet 77:c65eae5b9958 112 at_send_wnc_cmd("ATI", &pRespStr, WNC_TIMEOUT_MS);
fkellermavnet 77:c65eae5b9958 113 PUTS(pRespStr->c_str());
fkellermavnet 77:c65eae5b9958 114 PUTS("\r\n");
fkellermavnet 77:c65eae5b9958 115 PUTS("--------------------------------------->\r\n");
fkellermavnet 77:c65eae5b9958 116 }
fkellermavnet 77:c65eae5b9958 117
JMF 2:0e2ef866af95 118 void resolve_mdm(void)
JMF 2:0e2ef866af95 119 {
JMF 2:0e2ef866af95 120 do
JMF 2:0e2ef866af95 121 {
JMF 2:0e2ef866af95 122 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 123 at_dnsresolve_wnc(MY_SERVER_URL, &MyServerIpAddress);
JMF 2:0e2ef866af95 124 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 125 {
JMF 2:0e2ef866af95 126 software_init_mdm();
JMF 2:0e2ef866af95 127 }
JMF 2:0e2ef866af95 128 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 2:0e2ef866af95 129 {
JMF 67:11db02bb93e1 130 PUTS("Bad URL!!!!!!\r\n");
JMF 2:0e2ef866af95 131 }
JMF 2:0e2ef866af95 132 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 133
stefanrousseau 64:09004cd610df 134 PRINTF("My Server IP: %s\r\n", MyServerIpAddress.c_str());
JMF 2:0e2ef866af95 135 }
JMF 2:0e2ef866af95 136
JMF 2:0e2ef866af95 137 void sockopen_mdm(void)
JMF 2:0e2ef866af95 138 {
JMF 2:0e2ef866af95 139 do
JMF 2:0e2ef866af95 140 {
JMF 2:0e2ef866af95 141 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 142 at_sockopen_wnc(MyServerIpAddress, MY_PORT_STR);
JMF 2:0e2ef866af95 143 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 144 {
JMF 2:0e2ef866af95 145 software_init_mdm();
JMF 2:0e2ef866af95 146 }
JMF 2:0e2ef866af95 147 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 67:11db02bb93e1 148 PUTS("Socket open fail!!!!\r\n");
fkellermavnet 10:df54436ecd38 149 else
fkellermavnet 10:df54436ecd38 150 socketOpen = 1;
JMF 2:0e2ef866af95 151 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 152 }
JMF 2:0e2ef866af95 153
JMF 2:0e2ef866af95 154 void sockwrite_mdm(const char * s)
JMF 2:0e2ef866af95 155 {
fkellermavnet 10:df54436ecd38 156 if (socketOpen == 1)
fkellermavnet 10:df54436ecd38 157 {
JMF 2:0e2ef866af95 158 do
JMF 2:0e2ef866af95 159 {
JMF 2:0e2ef866af95 160 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 161 at_sockwrite_wnc(s);
JMF 2:0e2ef866af95 162 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 163 {
JMF 67:11db02bb93e1 164 PUTS("Sock write no response!\r\n");
JMF 2:0e2ef866af95 165 software_init_mdm();
JMF 2:0e2ef866af95 166 }
JMF 2:0e2ef866af95 167 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 2:0e2ef866af95 168 {
JMF 67:11db02bb93e1 169 PUTS("Socket Write fail!!!\r\n");
JMF 2:0e2ef866af95 170 software_init_mdm();
fkellermavnet 74:3e3ee15584e5 171 }else if (WNC_MDM_ERR == WNC_EXTERR)
fkellermavnet 73:da723fedfdd2 172 {
fkellermavnet 74:3e3ee15584e5 173 PUTS("Socket Disconnected (broken) !!!\r\n");
fkellermavnet 73:da723fedfdd2 174 sockclose_mdm();
fkellermavnet 73:da723fedfdd2 175 sockopen_mdm();
fkellermavnet 73:da723fedfdd2 176 //software_init_mdm();
fkellermavnet 73:da723fedfdd2 177 }
JMF 2:0e2ef866af95 178 } while (WNC_MDM_ERR != WNC_OK);
fkellermavnet 10:df54436ecd38 179 }
fkellermavnet 10:df54436ecd38 180 else
JMF 67:11db02bb93e1 181 PUTS("Socket is closed for write!\r\n");
JMF 2:0e2ef866af95 182 }
JMF 2:0e2ef866af95 183
fkellermavnet 30:33be8e2992f3 184 unsigned sockread_mdm(string * sockData, int len, int retries)
JMF 2:0e2ef866af95 185 {
fkellermavnet 30:33be8e2992f3 186 unsigned n = 0;
fkellermavnet 30:33be8e2992f3 187
fkellermavnet 10:df54436ecd38 188 if (socketOpen == 1)
fkellermavnet 10:df54436ecd38 189 {
JMF 2:0e2ef866af95 190 do
JMF 2:0e2ef866af95 191 {
JMF 2:0e2ef866af95 192 WNC_MDM_ERR = WNC_OK;
fkellermavnet 30:33be8e2992f3 193 n = at_sockread_wnc(sockData, len, retries);
JMF 2:0e2ef866af95 194 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 195 {
fkellermavnet 30:33be8e2992f3 196 if (n == 0)
fkellermavnet 30:33be8e2992f3 197 software_init_mdm();
fkellermavnet 30:33be8e2992f3 198 else
JMF 67:11db02bb93e1 199 PUTS("Sock read partial data!!!\r\n");
JMF 2:0e2ef866af95 200 }
JMF 2:0e2ef866af95 201 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 67:11db02bb93e1 202 PUTS("Sock read fail!!!!\r\n");
fkellermavnet 30:33be8e2992f3 203 } while (WNC_MDM_ERR == WNC_NO_RESPONSE);
fkellermavnet 10:df54436ecd38 204 }
fkellermavnet 10:df54436ecd38 205 else
fkellermavnet 44:c95a85b5cf92 206 {
JMF 67:11db02bb93e1 207 PUTS("Socket is closed for read\r\n");
fkellermavnet 44:c95a85b5cf92 208 sockData->erase();
fkellermavnet 44:c95a85b5cf92 209 }
fkellermavnet 30:33be8e2992f3 210
fkellermavnet 30:33be8e2992f3 211 return (n);
JMF 2:0e2ef866af95 212 }
JMF 2:0e2ef866af95 213
JMF 2:0e2ef866af95 214 void sockclose_mdm(void)
JMF 2:0e2ef866af95 215 {
JMF 2:0e2ef866af95 216 do
JMF 2:0e2ef866af95 217 {
JMF 2:0e2ef866af95 218 WNC_MDM_ERR = WNC_OK;
JMF 2:0e2ef866af95 219 at_sockclose_wnc();
fkellermavnet 10:df54436ecd38 220 // Assume close happened even if it went bad
fkellermavnet 10:df54436ecd38 221 // going bad will result in a re-init anyways and if close
fkellermavnet 10:df54436ecd38 222 // fails we're pretty much in bad state and not much can do
fkellermavnet 10:df54436ecd38 223 socketOpen = 0;
JMF 2:0e2ef866af95 224 if (WNC_MDM_ERR == WNC_NO_RESPONSE)
JMF 2:0e2ef866af95 225 {
JMF 2:0e2ef866af95 226 software_init_mdm();
JMF 2:0e2ef866af95 227 }
JMF 2:0e2ef866af95 228 else if (WNC_MDM_ERR == WNC_CMD_ERR)
JMF 67:11db02bb93e1 229 PUTS("Sock close fail!!!\r\n");
JMF 2:0e2ef866af95 230 } while (WNC_MDM_ERR != WNC_OK);
JMF 2:0e2ef866af95 231 }
JMF 2:0e2ef866af95 232
JMF 2:0e2ef866af95 233 /**
JMF 2:0e2ef866af95 234 * C++ version 0.4 char* style "itoa":
fkellermavnet 74:3e3ee15584e5 235 * Written by Lukas Chmela
JMF 2:0e2ef866af95 236 * Released under GPLv3.
JMF 2:0e2ef866af95 237 */
JMF 2:0e2ef866af95 238
JMF 2:0e2ef866af95 239 char* itoa(int value, char* result, int base)
JMF 2:0e2ef866af95 240 {
JMF 2:0e2ef866af95 241 // check that the base if valid
JMF 2:0e2ef866af95 242 if ( base < 2 || base > 36 ) {
JMF 2:0e2ef866af95 243 *result = '\0';
JMF 2:0e2ef866af95 244 return result;
JMF 2:0e2ef866af95 245 }
JMF 2:0e2ef866af95 246
JMF 2:0e2ef866af95 247 char* ptr = result, *ptr1 = result, tmp_char;
JMF 2:0e2ef866af95 248 int tmp_value;
JMF 2:0e2ef866af95 249
JMF 2:0e2ef866af95 250 do {
JMF 2:0e2ef866af95 251 tmp_value = value;
JMF 2:0e2ef866af95 252 value /= base;
JMF 2:0e2ef866af95 253 *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
JMF 2:0e2ef866af95 254 } while ( value );
JMF 2:0e2ef866af95 255
JMF 2:0e2ef866af95 256 // Apply negative sign
JMF 2:0e2ef866af95 257 if ( tmp_value < 0 )
JMF 2:0e2ef866af95 258 *ptr++ = '-';
JMF 2:0e2ef866af95 259 *ptr-- = '\0';
JMF 2:0e2ef866af95 260
JMF 2:0e2ef866af95 261 while ( ptr1 < ptr ) {
JMF 2:0e2ef866af95 262 tmp_char = *ptr;
JMF 2:0e2ef866af95 263 *ptr-- = *ptr1;
JMF 2:0e2ef866af95 264 *ptr1++ = tmp_char;
JMF 2:0e2ef866af95 265 }
JMF 2:0e2ef866af95 266
JMF 2:0e2ef866af95 267 return result;
JMF 2:0e2ef866af95 268 }
JMF 2:0e2ef866af95 269
JMF 2:0e2ef866af95 270 extern int mdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len);
JMF 2:0e2ef866af95 271
fkellermavnet 42:be4b9ee3a615 272 int check_wnc_ready(void)
fkellermavnet 42:be4b9ee3a615 273 {
fkellermavnet 43:6821a9c78c4b 274 string * pRespStr;
fkellermavnet 43:6821a9c78c4b 275 size_t pos;
fkellermavnet 43:6821a9c78c4b 276 int regSts;
fkellermavnet 46:da9d788f5d5a 277 int cmdRes1, cmdRes2;
fkellermavnet 42:be4b9ee3a615 278
fkellermavnet 53:dcccf2881fa0 279 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 280 PUTS("<-------- Begin Cell Status ------------\r\n");
fkellermavnet 53:dcccf2881fa0 281 #endif
fkellermavnet 46:da9d788f5d5a 282 cmdRes1 = at_send_wnc_cmd("AT+CSQ", &pRespStr, WNC_TIMEOUT_MS); // Check RSSI,BER
fkellermavnet 46:da9d788f5d5a 283 cmdRes2 = at_send_wnc_cmd("AT+CPIN?", &pRespStr, WNC_TIMEOUT_MS); // Check if SIM locked
fkellermavnet 46:da9d788f5d5a 284
fkellermavnet 46:da9d788f5d5a 285 if ((cmdRes1 != 0) && (cmdRes2 != 0))
fkellermavnet 43:6821a9c78c4b 286 {
fkellermavnet 53:dcccf2881fa0 287 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 288 PUTS("------------ WNC No Response! --------->\r\n");
fkellermavnet 53:dcccf2881fa0 289 #endif
fkellermavnet 43:6821a9c78c4b 290 return (-2);
fkellermavnet 43:6821a9c78c4b 291 }
fkellermavnet 42:be4b9ee3a615 292
fkellermavnet 43:6821a9c78c4b 293 // If SIM Card not ready don't bother with commands!
fkellermavnet 43:6821a9c78c4b 294 if (pRespStr->find("CPIN: READY") == string::npos)
fkellermavnet 43:6821a9c78c4b 295 {
fkellermavnet 53:dcccf2881fa0 296 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 297 PUTS("------------ WNC SIM Problem! --------->\r\n");
fkellermavnet 53:dcccf2881fa0 298 #endif
fkellermavnet 43:6821a9c78c4b 299 return (-1);
fkellermavnet 43:6821a9c78c4b 300 }
fkellermavnet 43:6821a9c78c4b 301
fkellermavnet 43:6821a9c78c4b 302 // SIM card OK, now check for signal and cellular network registration
fkellermavnet 46:da9d788f5d5a 303 cmdRes1 = at_send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS); // Check if registered on network
fkellermavnet 73:da723fedfdd2 304 if (pRespStr->size() > 0)
fkellermavnet 73:da723fedfdd2 305 {
fkellermavnet 42:be4b9ee3a615 306 pos = pRespStr->find("CREG: ");
fkellermavnet 42:be4b9ee3a615 307 if (pos != string::npos)
fkellermavnet 42:be4b9ee3a615 308 {
fkellermavnet 43:6821a9c78c4b 309 // The registration is the 2nd arg in the comma separated list
fkellermavnet 43:6821a9c78c4b 310 *pRespStr = pRespStr->substr(pos+8, 1);
fkellermavnet 43:6821a9c78c4b 311 regSts = atoi(pRespStr->c_str());
fkellermavnet 43:6821a9c78c4b 312 // 1 - registered home, 5 - registered roaming
fkellermavnet 43:6821a9c78c4b 313 if ((regSts != 1) && (regSts != 5))
fkellermavnet 43:6821a9c78c4b 314 {
fkellermavnet 53:dcccf2881fa0 315 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 316 PUTS("------------ WNC Cell Link Down! ------>\r\n");
fkellermavnet 53:dcccf2881fa0 317 #endif
fkellermavnet 43:6821a9c78c4b 318 return (-2);
fkellermavnet 43:6821a9c78c4b 319 }
fkellermavnet 42:be4b9ee3a615 320 }
fkellermavnet 43:6821a9c78c4b 321
fkellermavnet 53:dcccf2881fa0 322 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 323 PUTS("------------ WNC Ready ---------------->\r\n");
fkellermavnet 53:dcccf2881fa0 324 #endif
fkellermavnet 73:da723fedfdd2 325 }
fkellermavnet 73:da723fedfdd2 326 else
fkellermavnet 73:da723fedfdd2 327 {
fkellermavnet 73:da723fedfdd2 328 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
fkellermavnet 73:da723fedfdd2 329 PUTS("------------ CREG No Reply !----------->\r\n");
fkellermavnet 73:da723fedfdd2 330 #endif
fkellermavnet 73:da723fedfdd2 331 return (-2);
fkellermavnet 73:da723fedfdd2 332 }
fkellermavnet 73:da723fedfdd2 333
fkellermavnet 43:6821a9c78c4b 334 return (0);
fkellermavnet 42:be4b9ee3a615 335 }
fkellermavnet 42:be4b9ee3a615 336
JMF 2:0e2ef866af95 337 // Sets a global with failure or success, assumes 1 thread all the time
JMF 2:0e2ef866af95 338 int send_wnc_cmd(const char * s, string ** r, int ms_timeout)
JMF 2:0e2ef866af95 339 {
fkellermavnet 46:da9d788f5d5a 340 int cmdRes;
fkellermavnet 46:da9d788f5d5a 341
fkellermavnet 42:be4b9ee3a615 342 if (check_wnc_ready() < 0)
fkellermavnet 42:be4b9ee3a615 343 {
fkellermavnet 45:a836eecd5d12 344 static string noRespStr;
fkellermavnet 53:dcccf2881fa0 345
fkellermavnet 53:dcccf2881fa0 346 #ifdef WNC_CMD_DEBUG_ON
JMF 67:11db02bb93e1 347 PUTS("FAIL send cmd: ");
fkellermavnet 53:dcccf2881fa0 348 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 349 PUTS(s);
fkellermavnet 78:00cca62e5d9f 350 PUTS("\r\n");
fkellermavnet 53:dcccf2881fa0 351 #else
fkellermavnet 53:dcccf2881fa0 352 string truncStr(s, 50);
fkellermavnet 53:dcccf2881fa0 353 truncStr += "\r\n";
JMF 67:11db02bb93e1 354 PUTS(truncStr.c_str());
fkellermavnet 53:dcccf2881fa0 355 #endif
fkellermavnet 53:dcccf2881fa0 356 #else
JMF 67:11db02bb93e1 357 PUTS("FAIL send cmd!\r\n");
fkellermavnet 53:dcccf2881fa0 358 #endif
fkellermavnet 53:dcccf2881fa0 359
fkellermavnet 46:da9d788f5d5a 360 WNC_MDM_ERR = WNC_CELL_LINK_DOWN;
fkellermavnet 45:a836eecd5d12 361 noRespStr.erase();
fkellermavnet 44:c95a85b5cf92 362 *r = &noRespStr;
fkellermavnet 46:da9d788f5d5a 363 return (-3);
fkellermavnet 42:be4b9ee3a615 364 }
fkellermavnet 53:dcccf2881fa0 365
fkellermavnet 53:dcccf2881fa0 366 #ifdef WNC_CMD_DEBUG_ON
fkellermavnet 53:dcccf2881fa0 367 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 368 PUTS("[---------- Network Status -------------\r\n");
fkellermavnet 53:dcccf2881fa0 369 #endif
fkellermavnet 53:dcccf2881fa0 370 string * pRespStr;
fkellermavnet 53:dcccf2881fa0 371 at_send_wnc_cmd("AT@SOCKDIAL?", &pRespStr, 5000);
fkellermavnet 53:dcccf2881fa0 372 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 373 PUTS("---------------------------------------]\r\n");
fkellermavnet 53:dcccf2881fa0 374 #endif
fkellermavnet 53:dcccf2881fa0 375 #endif
fkellermavnet 53:dcccf2881fa0 376
fkellermavnet 42:be4b9ee3a615 377 // If WNC ready, send user command
fkellermavnet 46:da9d788f5d5a 378 cmdRes = at_send_wnc_cmd(s, r, ms_timeout);
fkellermavnet 46:da9d788f5d5a 379
fkellermavnet 46:da9d788f5d5a 380 if (cmdRes == -1)
fkellermavnet 46:da9d788f5d5a 381 WNC_MDM_ERR = WNC_CMD_ERR;
fkellermavnet 46:da9d788f5d5a 382
fkellermavnet 46:da9d788f5d5a 383 if (cmdRes == -2)
fkellermavnet 46:da9d788f5d5a 384 WNC_MDM_ERR = WNC_NO_RESPONSE;
fkellermavnet 74:3e3ee15584e5 385
fkellermavnet 74:3e3ee15584e5 386 if (cmdRes == -3) {
fkellermavnet 73:da723fedfdd2 387 WNC_MDM_ERR = WNC_EXTERR;
fkellermavnet 80:d635c0eddd6e 388 PRINTF("[[WNC_MDM_ERR = WNC_EXTERR]] \r\n");
fkellermavnet 74:3e3ee15584e5 389 }
fkellermavnet 73:da723fedfdd2 390
fkellermavnet 73:da723fedfdd2 391 if (cmdRes == 0)
fkellermavnet 46:da9d788f5d5a 392 WNC_MDM_ERR = WNC_OK;
fkellermavnet 46:da9d788f5d5a 393
fkellermavnet 46:da9d788f5d5a 394 return (cmdRes);
fkellermavnet 42:be4b9ee3a615 395 }
fkellermavnet 42:be4b9ee3a615 396
fkellermavnet 42:be4b9ee3a615 397 int at_send_wnc_cmd(const char * s, string ** r, int ms_timeout)
fkellermavnet 42:be4b9ee3a615 398 {
fkellermavnet 74:3e3ee15584e5 399 //Eaddy
fkellermavnet 75:8cc98a3b9c62 400 static const char * rsp_lst[] = { "OK", "ERROR","@EXTERR", "+CME", NULL };
JMF 2:0e2ef866af95 401 int len;
fkellermavnet 53:dcccf2881fa0 402
fkellermavnet 53:dcccf2881fa0 403 #ifdef WNC_CMD_DEBUG_ON
fkellermavnet 53:dcccf2881fa0 404 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
fkellermavnet 53:dcccf2881fa0 405
fkellermavnet 53:dcccf2881fa0 406 #else
fkellermavnet 42:be4b9ee3a615 407 if (strlen(s) > 60)
fkellermavnet 42:be4b9ee3a615 408 {
fkellermavnet 42:be4b9ee3a615 409 string truncStr(s,57);
fkellermavnet 42:be4b9ee3a615 410 truncStr += "...";
stefanrousseau 64:09004cd610df 411 PRINTF("Send: <<%s>>\r\n",truncStr.c_str());
fkellermavnet 42:be4b9ee3a615 412 }
fkellermavnet 42:be4b9ee3a615 413 else
fkellermavnet 53:dcccf2881fa0 414 #endif
stefanrousseau 64:09004cd610df 415 PRINTF("Send: <<%s>>\r\n",s);
fkellermavnet 53:dcccf2881fa0 416 #endif
fkellermavnet 53:dcccf2881fa0 417
JMF 2:0e2ef866af95 418 int res = mdm_sendAtCmdRsp(s, rsp_lst, ms_timeout, &wncStr, &len);
JMF 2:0e2ef866af95 419 *r = &wncStr; // Return a pointer to the static string
JMF 2:0e2ef866af95 420
JMF 2:0e2ef866af95 421 if (res >= 0)
fkellermavnet 53:dcccf2881fa0 422 {
fkellermavnet 53:dcccf2881fa0 423
fkellermavnet 53:dcccf2881fa0 424 #ifdef WNC_CMD_DEBUG_ON
JMF 67:11db02bb93e1 425 PUTS("[");
fkellermavnet 53:dcccf2881fa0 426 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
JMF 67:11db02bb93e1 427 PUTS(wncStr.c_str());
JMF 67:11db02bb93e1 428 PUTS("]\r\n");
fkellermavnet 53:dcccf2881fa0 429 #else
fkellermavnet 42:be4b9ee3a615 430 if (wncStr.size() < 51)
JMF 67:11db02bb93e1 431 PUTS(wncStr.c_str());
fkellermavnet 42:be4b9ee3a615 432 else
fkellermavnet 42:be4b9ee3a615 433 {
fkellermavnet 42:be4b9ee3a615 434 string truncStr = wncStr.substr(0,50) + "...";
JMF 67:11db02bb93e1 435 PUTS(truncStr.c_str());
fkellermavnet 42:be4b9ee3a615 436 }
JMF 67:11db02bb93e1 437 PUTS("]\r\n");
fkellermavnet 53:dcccf2881fa0 438 #endif
fkellermavnet 53:dcccf2881fa0 439 #endif
fkellermavnet 42:be4b9ee3a615 440
fkellermavnet 74:3e3ee15584e5 441 #if 0
JMF 2:0e2ef866af95 442 if (res > 0)
JMF 2:0e2ef866af95 443 return -1;
JMF 2:0e2ef866af95 444 else
JMF 2:0e2ef866af95 445 return 0;
fkellermavnet 74:3e3ee15584e5 446 #else
fkellermavnet 74:3e3ee15584e5 447 //Eaddy added
fkellermavnet 74:3e3ee15584e5 448 if (res == 0) {
fkellermavnet 73:da723fedfdd2 449 /* OK */
fkellermavnet 73:da723fedfdd2 450 return 0;
fkellermavnet 73:da723fedfdd2 451 } else if (res == 2) {
fkellermavnet 73:da723fedfdd2 452 /* @EXTERR */
fkellermavnet 75:8cc98a3b9c62 453 PRINTF("@EXTERR and res = %d \r\n", res);
fkellermavnet 73:da723fedfdd2 454 return -3;
fkellermavnet 73:da723fedfdd2 455 } else
JMF 2:0e2ef866af95 456 return -1;
fkellermavnet 74:3e3ee15584e5 457 #endif
JMF 2:0e2ef866af95 458 }
JMF 2:0e2ef866af95 459 else
JMF 2:0e2ef866af95 460 {
JMF 67:11db02bb93e1 461 PUTS("No response from WNC!\n\r");
JMF 2:0e2ef866af95 462 return -2;
JMF 2:0e2ef866af95 463 }
JMF 2:0e2ef866af95 464 }
JMF 2:0e2ef866af95 465
fkellermavnet 42:be4b9ee3a615 466
fkellermavnet 19:f89baed3bd6f 467 void at_at_wnc(void)
fkellermavnet 19:f89baed3bd6f 468 {
fkellermavnet 19:f89baed3bd6f 469 string * pRespStr;
fkellermavnet 19:f89baed3bd6f 470 send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat?
fkellermavnet 19:f89baed3bd6f 471 }
fkellermavnet 19:f89baed3bd6f 472
fkellermavnet 42:be4b9ee3a615 473 void at_init_wnc(bool hardReset)
JMF 2:0e2ef866af95 474 {
fkellermavnet 36:d4782eabff43 475 static bool pdnSet = false;
fkellermavnet 42:be4b9ee3a615 476 static bool intSet = false;
fkellermavnet 42:be4b9ee3a615 477 static bool sockDialSet = false;
fkellermavnet 42:be4b9ee3a615 478 string * pRespStr;
fkellermavnet 46:da9d788f5d5a 479 int cmdRes;
fkellermavnet 36:d4782eabff43 480
fkellermavnet 42:be4b9ee3a615 481 if (hardReset == true)
fkellermavnet 42:be4b9ee3a615 482 {
JMF 67:11db02bb93e1 483 PUTS("Hard Reset!\r\n");
fkellermavnet 42:be4b9ee3a615 484 pdnSet = false;
fkellermavnet 42:be4b9ee3a615 485 intSet = false;
fkellermavnet 42:be4b9ee3a615 486 sockDialSet = false;
fkellermavnet 42:be4b9ee3a615 487 }
fkellermavnet 42:be4b9ee3a615 488
JMF 67:11db02bb93e1 489 PUTS("Start AT init of WNC:\r\n");
fkellermavnet 43:6821a9c78c4b 490 // Quick commands below do not need to check cellular connectivity
fkellermavnet 46:da9d788f5d5a 491 cmdRes = at_send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat?
fkellermavnet 46:da9d788f5d5a 492 cmdRes += at_send_wnc_cmd("ATE0", &pRespStr, WNC_TIMEOUT_MS); // Echo Off
fkellermavnet 46:da9d788f5d5a 493 cmdRes += at_send_wnc_cmd("AT+CMEE=2", &pRespStr, WNC_TIMEOUT_MS); // 2 - verbose error, 1 - numeric error, 0 - just ERROR
fkellermavnet 43:6821a9c78c4b 494
fkellermavnet 43:6821a9c78c4b 495 // If the simple commands are not working no chance of more complex.
fkellermavnet 43:6821a9c78c4b 496 // I have seen re-trying commands make it worse.
fkellermavnet 46:da9d788f5d5a 497 if (cmdRes < 0)
fkellermavnet 46:da9d788f5d5a 498 {
fkellermavnet 46:da9d788f5d5a 499 // Since I used the at_send_wnc_cmd I am setting the error state based upon
fkellermavnet 46:da9d788f5d5a 500 // the responses. And since these are simple commands, even if the WNC
fkellermavnet 46:da9d788f5d5a 501 // is saying ERROR, treat it like a no response.
fkellermavnet 46:da9d788f5d5a 502 WNC_MDM_ERR = WNC_NO_RESPONSE;
fkellermavnet 43:6821a9c78c4b 503 return ;
fkellermavnet 46:da9d788f5d5a 504 }
fkellermavnet 42:be4b9ee3a615 505
fkellermavnet 46:da9d788f5d5a 506 if (intSet == false)
fkellermavnet 46:da9d788f5d5a 507 cmdRes = send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS);
fkellermavnet 42:be4b9ee3a615 508
fkellermavnet 46:da9d788f5d5a 509 if (cmdRes == 0)
fkellermavnet 42:be4b9ee3a615 510 intSet = true;
fkellermavnet 42:be4b9ee3a615 511 else
fkellermavnet 42:be4b9ee3a615 512 return ;
fkellermavnet 42:be4b9ee3a615 513
fkellermavnet 36:d4782eabff43 514 if (pdnSet == false)
fkellermavnet 36:d4782eabff43 515 {
fkellermavnet 36:d4782eabff43 516 string cmd_str("AT%PDNSET=1,");
fkellermavnet 36:d4782eabff43 517 cmd_str += MY_APN_STR;
fkellermavnet 36:d4782eabff43 518 cmd_str += ",IP";
fkellermavnet 46:da9d788f5d5a 519 cmdRes = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 4*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
fkellermavnet 42:be4b9ee3a615 520 }
fkellermavnet 42:be4b9ee3a615 521
fkellermavnet 46:da9d788f5d5a 522 if (cmdRes == 0)
fkellermavnet 42:be4b9ee3a615 523 pdnSet = true;
fkellermavnet 42:be4b9ee3a615 524 else
fkellermavnet 42:be4b9ee3a615 525 return ;
fkellermavnet 42:be4b9ee3a615 526
fkellermavnet 42:be4b9ee3a615 527 if (sockDialSet == false)
fkellermavnet 46:da9d788f5d5a 528 cmdRes = send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, WNC_TIMEOUT_MS);
fkellermavnet 42:be4b9ee3a615 529
fkellermavnet 46:da9d788f5d5a 530 if (cmdRes == 0)
fkellermavnet 42:be4b9ee3a615 531 sockDialSet = true;
fkellermavnet 42:be4b9ee3a615 532 else
fkellermavnet 42:be4b9ee3a615 533 return ;
fkellermavnet 42:be4b9ee3a615 534
JMF 67:11db02bb93e1 535 PUTS("SUCCESS: AT init of WNC!\r\n");
JMF 2:0e2ef866af95 536 }
JMF 2:0e2ef866af95 537
JMF 2:0e2ef866af95 538 void at_sockopen_wnc(const string & ipStr, const char * port )
JMF 2:0e2ef866af95 539 {
JMF 2:0e2ef866af95 540 string * pRespStr;
JMF 2:0e2ef866af95 541 send_wnc_cmd("AT@SOCKCREAT=1", &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 542 string cmd_str("AT@SOCKCONN=1,\"");
JMF 2:0e2ef866af95 543 cmd_str += ipStr;
JMF 2:0e2ef866af95 544 cmd_str += "\",";
JMF 2:0e2ef866af95 545 cmd_str += port;
fkellermavnet 38:564b312a719f 546 cmd_str += ",30";
fkellermavnet 73:da723fedfdd2 547 int cmd = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000);
fkellermavnet 73:da723fedfdd2 548 if (cmd != WNC_OK) {
fkellermavnet 73:da723fedfdd2 549 // Per WNC: re-close even if open fails!
fkellermavnet 73:da723fedfdd2 550 at_sockclose_wnc();
fkellermavnet 73:da723fedfdd2 551 }
JMF 2:0e2ef866af95 552 }
JMF 2:0e2ef866af95 553
JMF 2:0e2ef866af95 554 void at_sockclose_wnc(void)
JMF 2:0e2ef866af95 555 {
JMF 2:0e2ef866af95 556 string * pRespStr;
JMF 2:0e2ef866af95 557 send_wnc_cmd("AT@SOCKCLOSE=1", &pRespStr, WNC_TIMEOUT_MS);
JMF 2:0e2ef866af95 558 }
JMF 2:0e2ef866af95 559
JMF 2:0e2ef866af95 560 int at_dnsresolve_wnc(const char * s, string * ipStr)
JMF 2:0e2ef866af95 561 {
JMF 2:0e2ef866af95 562 string * pRespStr;
JMF 2:0e2ef866af95 563 string str(s);
fkellermavnet 43:6821a9c78c4b 564 str = "AT@DNSRESVDON=\"" + str + "\"";
fkellermavnet 79:ff3014b3637e 565 if (send_wnc_cmd(str.c_str(), &pRespStr, 60000) == 0)
JMF 2:0e2ef866af95 566 {
JMF 2:0e2ef866af95 567 size_t pos_start = pRespStr->find(":\"") + 2;
fkellermavnet 80:d635c0eddd6e 568 size_t pos_end = pRespStr->find("\"", pos_start) - 1;
fkellermavnet 43:6821a9c78c4b 569 if ((pos_start != string::npos) && (pos_end != string::npos))
JMF 2:0e2ef866af95 570 {
JMF 2:0e2ef866af95 571 if (pos_end > pos_start)
JMF 2:0e2ef866af95 572 {
JMF 2:0e2ef866af95 573 // Make a copy for use later (the source string is re-used)
JMF 2:0e2ef866af95 574 *ipStr = pRespStr->substr(pos_start, pos_end - pos_start + 1);
JMF 2:0e2ef866af95 575 return 1;
JMF 2:0e2ef866af95 576 }
JMF 2:0e2ef866af95 577 else
JMF 67:11db02bb93e1 578 PUTS("URL Resolve fail, substr Err\r\n");
JMF 2:0e2ef866af95 579 }
JMF 2:0e2ef866af95 580 else
JMF 67:11db02bb93e1 581 PUTS("URL Resolve fail, no quotes\r\n");
JMF 2:0e2ef866af95 582 }
JMF 2:0e2ef866af95 583 else
JMF 67:11db02bb93e1 584 PUTS("URL Resolve fail, WNC cmd fail\r\n");
JMF 2:0e2ef866af95 585
fkellermavnet 43:6821a9c78c4b 586 *ipStr = "192.168.0.1";
fkellermavnet 43:6821a9c78c4b 587
JMF 2:0e2ef866af95 588 return -1;
JMF 2:0e2ef866af95 589 }
JMF 2:0e2ef866af95 590
JMF 2:0e2ef866af95 591 void at_sockwrite_wnc(const char * s)
JMF 2:0e2ef866af95 592 {
JMF 2:0e2ef866af95 593 string * pRespStr;
JMF 2:0e2ef866af95 594 char num2str[6];
JMF 2:0e2ef866af95 595 size_t sLen = strlen(s);
fkellermavnet 73:da723fedfdd2 596 int res;
fkellermavnet 39:1996eaec02d6 597 if (sLen <= 1500)
JMF 2:0e2ef866af95 598 {
JMF 2:0e2ef866af95 599 string cmd_str("AT@SOCKWRITE=1,");
JMF 2:0e2ef866af95 600 itoa(sLen, num2str, 10);
JMF 2:0e2ef866af95 601 cmd_str += num2str;
JMF 2:0e2ef866af95 602 cmd_str += ",\"";
JMF 2:0e2ef866af95 603 while(*s != '\0')
JMF 2:0e2ef866af95 604 {
JMF 2:0e2ef866af95 605 itoa((int)*s++, num2str, 16);
JMF 2:0e2ef866af95 606 // Always 2-digit ascii hex:
JMF 2:0e2ef866af95 607 if (strlen(num2str) == 1)
JMF 2:0e2ef866af95 608 {
JMF 2:0e2ef866af95 609 num2str[2] = '\0';
JMF 2:0e2ef866af95 610 num2str[1] = num2str[0];
JMF 2:0e2ef866af95 611 num2str[0] = '0';
JMF 2:0e2ef866af95 612 }
JMF 2:0e2ef866af95 613 cmd_str += num2str;
JMF 2:0e2ef866af95 614 }
JMF 2:0e2ef866af95 615 cmd_str += "\"";
fkellermavnet 73:da723fedfdd2 616 res = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000);
fkellermavnet 73:da723fedfdd2 617 if (res == -3)
fkellermavnet 73:da723fedfdd2 618 PUTS("sockwrite is disconnect \r\n");
JMF 2:0e2ef866af95 619 }
JMF 2:0e2ef866af95 620 else
JMF 67:11db02bb93e1 621 PUTS("sockwrite Err, string to long\r\n");
JMF 2:0e2ef866af95 622 }
JMF 2:0e2ef866af95 623
JMF 2:0e2ef866af95 624 unsigned at_sockread_wnc(string * pS, unsigned n, unsigned retries = 0)
JMF 2:0e2ef866af95 625 {
fkellermavnet 34:1a4498e3580e 626 unsigned i, numBytes = 0;
JMF 2:0e2ef866af95 627 string * pRespStr;
JMF 2:0e2ef866af95 628 string cmd_str("AT@SOCKREAD=1,");
fkellermavnet 30:33be8e2992f3 629
fkellermavnet 44:c95a85b5cf92 630 // Clean slate
fkellermavnet 44:c95a85b5cf92 631 pS->erase();
fkellermavnet 44:c95a85b5cf92 632
JMF 2:0e2ef866af95 633 if (n <= 1500)
JMF 2:0e2ef866af95 634 {
JMF 2:0e2ef866af95 635 char num2str[6];
fkellermavnet 22:41e6c417ace1 636
JMF 2:0e2ef866af95 637 itoa(n, num2str, 10);
JMF 2:0e2ef866af95 638 cmd_str += num2str;
JMF 2:0e2ef866af95 639 retries += 1;
JMF 2:0e2ef866af95 640 while (retries--)
JMF 2:0e2ef866af95 641 {
fkellermavnet 22:41e6c417ace1 642 // Assuming someone is sending then calling this to receive response, invoke
fkellermavnet 22:41e6c417ace1 643 // a pause to give the response some time to come back and then also
fkellermavnet 22:41e6c417ace1 644 // between each retry.
fkellermavnet 22:41e6c417ace1 645 wait_ms(10);
fkellermavnet 22:41e6c417ace1 646
fkellermavnet 73:da723fedfdd2 647 if (send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0)
fkellermavnet 73:da723fedfdd2 648 {
fkellermavnet 73:da723fedfdd2 649 size_t pos_start = pRespStr->find("\"") + 1;
fkellermavnet 73:da723fedfdd2 650 size_t pos_end = pRespStr->rfind("\"") - 1;
fkellermavnet 43:6821a9c78c4b 651
fkellermavnet 73:da723fedfdd2 652 // Make sure search finds what it's looking for!
fkellermavnet 73:da723fedfdd2 653 if (pos_start != string::npos && pos_end != string::npos)
fkellermavnet 43:6821a9c78c4b 654 i = (pos_end - pos_start + 1); // Num hex chars, 2 per byte
fkellermavnet 73:da723fedfdd2 655 else
fkellermavnet 43:6821a9c78c4b 656 i = 0;
fkellermavnet 43:6821a9c78c4b 657
fkellermavnet 73:da723fedfdd2 658 if (i > 0)
fkellermavnet 73:da723fedfdd2 659 {
fkellermavnet 73:da723fedfdd2 660 retries = 1; // If any data found retry 1 more time to catch data that might be in another
fkellermavnet 73:da723fedfdd2 661 // WNC payload
fkellermavnet 73:da723fedfdd2 662 string byte;
fkellermavnet 73:da723fedfdd2 663 while (pos_start < pos_end)
fkellermavnet 73:da723fedfdd2 664 {
fkellermavnet 73:da723fedfdd2 665 byte = pRespStr->substr(pos_start, 2);
fkellermavnet 73:da723fedfdd2 666 *pS += (char)strtol(byte.c_str(), NULL, 16);
fkellermavnet 73:da723fedfdd2 667 pos_start += 2;
fkellermavnet 73:da723fedfdd2 668 }
fkellermavnet 73:da723fedfdd2 669 numBytes += i/2;
fkellermavnet 73:da723fedfdd2 670 }
fkellermavnet 73:da723fedfdd2 671 }
fkellermavnet 73:da723fedfdd2 672 else
JMF 2:0e2ef866af95 673 {
fkellermavnet 73:da723fedfdd2 674 PUTS("no readsock reply!\r\n");
fkellermavnet 73:da723fedfdd2 675 return (0);
JMF 2:0e2ef866af95 676 }
JMF 2:0e2ef866af95 677 }
JMF 2:0e2ef866af95 678 }
JMF 2:0e2ef866af95 679 else
JMF 67:11db02bb93e1 680 PUTS("sockread Err, to many to read\r\n");
JMF 2:0e2ef866af95 681
fkellermavnet 43:6821a9c78c4b 682 return (numBytes);
JMF 2:0e2ef866af95 683 }