Library For the Adafruit FONA 808

Committer:
lewisdaw3
Date:
Mon Oct 17 10:51:58 2016 +0000
Revision:
0:8b6028668696
publish library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lewisdaw3 0:8b6028668696 1 /***************************************************
lewisdaw3 0:8b6028668696 2 This is a library for our Adafruit FONA Cellular Module
lewisdaw3 0:8b6028668696 3
lewisdaw3 0:8b6028668696 4 Designed specifically to work with the Adafruit FONA
lewisdaw3 0:8b6028668696 5 ----> http://www.adafruit.com/products/1946
lewisdaw3 0:8b6028668696 6 ----> http://www.adafruit.com/products/1963
lewisdaw3 0:8b6028668696 7
lewisdaw3 0:8b6028668696 8 These displays use TTL Serial to communicate, 2 pins are required to
lewisdaw3 0:8b6028668696 9 interface
lewisdaw3 0:8b6028668696 10 Adafruit invests time and resources providing this open source code,
lewisdaw3 0:8b6028668696 11 please support Adafruit and open-source hardware by purchasing
lewisdaw3 0:8b6028668696 12 products from Adafruit!
lewisdaw3 0:8b6028668696 13
lewisdaw3 0:8b6028668696 14 Written by Limor Fried/Ladyada for Adafruit Industries.
lewisdaw3 0:8b6028668696 15 BSD license, all text above must be included in any redistribution
lewisdaw3 0:8b6028668696 16 ****************************************************/
lewisdaw3 0:8b6028668696 17 // next line per http://postwarrior.com/arduino-ethershield-error-prog_char-does-not-name-a-type/
lewisdaw3 0:8b6028668696 18
lewisdaw3 0:8b6028668696 19 #include "Adafruit_FONA.h"
lewisdaw3 0:8b6028668696 20
lewisdaw3 0:8b6028668696 21
lewisdaw3 0:8b6028668696 22
lewisdaw3 0:8b6028668696 23
lewisdaw3 0:8b6028668696 24 Adafruit_FONA::Adafruit_FONA(int8_t rst)
lewisdaw3 0:8b6028668696 25 {
lewisdaw3 0:8b6028668696 26 _rstpin = rst;
lewisdaw3 0:8b6028668696 27
lewisdaw3 0:8b6028668696 28 apn = F("FONAnet");
lewisdaw3 0:8b6028668696 29 apnusername = 0;
lewisdaw3 0:8b6028668696 30 apnpassword = 0;
lewisdaw3 0:8b6028668696 31 mySerial = 0;
lewisdaw3 0:8b6028668696 32 httpsredirect = false;
lewisdaw3 0:8b6028668696 33 useragent = F("FONA");
lewisdaw3 0:8b6028668696 34 ok_reply = F("OK");
lewisdaw3 0:8b6028668696 35 }
lewisdaw3 0:8b6028668696 36
lewisdaw3 0:8b6028668696 37 uint8_t Adafruit_FONA::type(void) {
lewisdaw3 0:8b6028668696 38 return _type;
lewisdaw3 0:8b6028668696 39 }
lewisdaw3 0:8b6028668696 40
lewisdaw3 0:8b6028668696 41 boolean Adafruit_FONA::begin(Stream &port) {
lewisdaw3 0:8b6028668696 42 mySerial = &port;
lewisdaw3 0:8b6028668696 43
lewisdaw3 0:8b6028668696 44 pinMode(_rstpin, OUTPUT);
lewisdaw3 0:8b6028668696 45 digitalWrite(_rstpin, HIGH);
lewisdaw3 0:8b6028668696 46 delay(10);
lewisdaw3 0:8b6028668696 47 digitalWrite(_rstpin, LOW);
lewisdaw3 0:8b6028668696 48 delay(100);
lewisdaw3 0:8b6028668696 49 digitalWrite(_rstpin, HIGH);
lewisdaw3 0:8b6028668696 50
lewisdaw3 0:8b6028668696 51 DEBUG_PRINTLN(F("Attempting to open comm with ATs"));
lewisdaw3 0:8b6028668696 52 // give 7 seconds to reboot
lewisdaw3 0:8b6028668696 53 int16_t timeout = 7000;
lewisdaw3 0:8b6028668696 54
lewisdaw3 0:8b6028668696 55 while (timeout > 0) {
lewisdaw3 0:8b6028668696 56 while (mySerial->available()) mySerial->read();
lewisdaw3 0:8b6028668696 57 if (sendCheckReply(F("AT"), ok_reply))
lewisdaw3 0:8b6028668696 58 break;
lewisdaw3 0:8b6028668696 59 while (mySerial->available()) mySerial->read();
lewisdaw3 0:8b6028668696 60 if (sendCheckReply(F("AT"), F("AT")))
lewisdaw3 0:8b6028668696 61 break;
lewisdaw3 0:8b6028668696 62 delay(500);
lewisdaw3 0:8b6028668696 63 timeout-=500;
lewisdaw3 0:8b6028668696 64 }
lewisdaw3 0:8b6028668696 65
lewisdaw3 0:8b6028668696 66 if (timeout <= 0) {
lewisdaw3 0:8b6028668696 67 #ifdef ADAFRUIT_FONA_DEBUG
lewisdaw3 0:8b6028668696 68 DEBUG_PRINTLN(F("Timeout: No response to AT... last ditch attempt."));
lewisdaw3 0:8b6028668696 69 #endif
lewisdaw3 0:8b6028668696 70 sendCheckReply(F("AT"), ok_reply);
lewisdaw3 0:8b6028668696 71 delay(100);
lewisdaw3 0:8b6028668696 72 sendCheckReply(F("AT"), ok_reply);
lewisdaw3 0:8b6028668696 73 delay(100);
lewisdaw3 0:8b6028668696 74 sendCheckReply(F("AT"), ok_reply);
lewisdaw3 0:8b6028668696 75 delay(100);
lewisdaw3 0:8b6028668696 76 }
lewisdaw3 0:8b6028668696 77
lewisdaw3 0:8b6028668696 78 // turn off Echo!
lewisdaw3 0:8b6028668696 79 sendCheckReply(F("ATE0"), ok_reply);
lewisdaw3 0:8b6028668696 80 delay(100);
lewisdaw3 0:8b6028668696 81
lewisdaw3 0:8b6028668696 82 if (! sendCheckReply(F("ATE0"), ok_reply)) {
lewisdaw3 0:8b6028668696 83 return false;
lewisdaw3 0:8b6028668696 84 }
lewisdaw3 0:8b6028668696 85
lewisdaw3 0:8b6028668696 86 // turn on hangupitude
lewisdaw3 0:8b6028668696 87 sendCheckReply(F("AT+CVHU=0"), ok_reply);
lewisdaw3 0:8b6028668696 88
lewisdaw3 0:8b6028668696 89 delay(100);
lewisdaw3 0:8b6028668696 90 flushInput();
lewisdaw3 0:8b6028668696 91
lewisdaw3 0:8b6028668696 92
lewisdaw3 0:8b6028668696 93 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINTLN("ATI");
lewisdaw3 0:8b6028668696 94
lewisdaw3 0:8b6028668696 95 mySerial->println("ATI");
lewisdaw3 0:8b6028668696 96 readline(500, true);
lewisdaw3 0:8b6028668696 97
lewisdaw3 0:8b6028668696 98 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 99
lewisdaw3 0:8b6028668696 100
lewisdaw3 0:8b6028668696 101
lewisdaw3 0:8b6028668696 102 if (prog_char_strstr(replybuffer, (prog_char *)F("SIM808 R14")) != 0) {
lewisdaw3 0:8b6028668696 103 _type = FONA808_V2;
lewisdaw3 0:8b6028668696 104 } else if (prog_char_strstr(replybuffer, (prog_char *)F("SIM808 R13")) != 0) {
lewisdaw3 0:8b6028668696 105 _type = FONA808_V1;
lewisdaw3 0:8b6028668696 106 } else if (prog_char_strstr(replybuffer, (prog_char *)F("SIM800 R13")) != 0) {
lewisdaw3 0:8b6028668696 107 _type = FONA800L;
lewisdaw3 0:8b6028668696 108 } else if (prog_char_strstr(replybuffer, (prog_char *)F("SIMCOM_SIM5320A")) != 0) {
lewisdaw3 0:8b6028668696 109 _type = FONA3G_A;
lewisdaw3 0:8b6028668696 110 } else if (prog_char_strstr(replybuffer, (prog_char *)F("SIMCOM_SIM5320E")) != 0) {
lewisdaw3 0:8b6028668696 111 _type = FONA3G_E;
lewisdaw3 0:8b6028668696 112 }
lewisdaw3 0:8b6028668696 113
lewisdaw3 0:8b6028668696 114 if (_type == FONA800L) {
lewisdaw3 0:8b6028668696 115 // determine if L or H
lewisdaw3 0:8b6028668696 116
lewisdaw3 0:8b6028668696 117 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINTLN("AT+GMM");
lewisdaw3 0:8b6028668696 118
lewisdaw3 0:8b6028668696 119 mySerial->println("AT+GMM");
lewisdaw3 0:8b6028668696 120 readline(500, true);
lewisdaw3 0:8b6028668696 121
lewisdaw3 0:8b6028668696 122 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 123
lewisdaw3 0:8b6028668696 124
lewisdaw3 0:8b6028668696 125 if (prog_char_strstr(replybuffer, (prog_char *)F("SIM800H")) != 0) {
lewisdaw3 0:8b6028668696 126 _type = FONA800H;
lewisdaw3 0:8b6028668696 127 }
lewisdaw3 0:8b6028668696 128 }
lewisdaw3 0:8b6028668696 129
lewisdaw3 0:8b6028668696 130 #if defined(FONA_PREF_SMS_STORAGE)
lewisdaw3 0:8b6028668696 131 sendCheckReply(F("AT+CPMS=\"" FONA_PREF_SMS_STORAGE "\""), ok_reply);
lewisdaw3 0:8b6028668696 132 #endif
lewisdaw3 0:8b6028668696 133
lewisdaw3 0:8b6028668696 134 return true;
lewisdaw3 0:8b6028668696 135 }
lewisdaw3 0:8b6028668696 136
lewisdaw3 0:8b6028668696 137
lewisdaw3 0:8b6028668696 138 /********* Serial port ********************************************/
lewisdaw3 0:8b6028668696 139 boolean Adafruit_FONA::setBaudrate(uint16_t baud) {
lewisdaw3 0:8b6028668696 140 return sendCheckReply(F("AT+IPREX="), baud, ok_reply);
lewisdaw3 0:8b6028668696 141 }
lewisdaw3 0:8b6028668696 142
lewisdaw3 0:8b6028668696 143 /********* Real Time Clock ********************************************/
lewisdaw3 0:8b6028668696 144
lewisdaw3 0:8b6028668696 145 boolean Adafruit_FONA::readRTC(uint8_t *year, uint8_t *month, uint8_t *date, uint8_t *hr, uint8_t *min, uint8_t *sec) {
lewisdaw3 0:8b6028668696 146 uint16_t v;
lewisdaw3 0:8b6028668696 147 sendParseReply(F("AT+CCLK?"), F("+CCLK: "), &v, '/', 0);
lewisdaw3 0:8b6028668696 148 *year = v;
lewisdaw3 0:8b6028668696 149
lewisdaw3 0:8b6028668696 150 DEBUG_PRINTLN(*year);
lewisdaw3 0:8b6028668696 151 }
lewisdaw3 0:8b6028668696 152
lewisdaw3 0:8b6028668696 153 boolean Adafruit_FONA::enableRTC(uint8_t i) {
lewisdaw3 0:8b6028668696 154 if (! sendCheckReply(F("AT+CLTS="), i, ok_reply))
lewisdaw3 0:8b6028668696 155 return false;
lewisdaw3 0:8b6028668696 156 return sendCheckReply(F("AT&W"), ok_reply);
lewisdaw3 0:8b6028668696 157 }
lewisdaw3 0:8b6028668696 158
lewisdaw3 0:8b6028668696 159
lewisdaw3 0:8b6028668696 160 /********* BATTERY & ADC ********************************************/
lewisdaw3 0:8b6028668696 161
lewisdaw3 0:8b6028668696 162 /* returns value in mV (uint16_t) */
lewisdaw3 0:8b6028668696 163 boolean Adafruit_FONA::getBattVoltage(uint16_t *v) {
lewisdaw3 0:8b6028668696 164 return sendParseReply(F("AT+CBC"), F("+CBC: "), v, ',', 2);
lewisdaw3 0:8b6028668696 165 }
lewisdaw3 0:8b6028668696 166
lewisdaw3 0:8b6028668696 167 /* returns value in mV (uint16_t) */
lewisdaw3 0:8b6028668696 168 boolean Adafruit_FONA_3G::getBattVoltage(uint16_t *v) {
lewisdaw3 0:8b6028668696 169 float f;
lewisdaw3 0:8b6028668696 170 boolean b = sendParseReply(F("AT+CBC"), F("+CBC: "), &f, ',', 2);
lewisdaw3 0:8b6028668696 171 *v = f*1000;
lewisdaw3 0:8b6028668696 172 return b;
lewisdaw3 0:8b6028668696 173 }
lewisdaw3 0:8b6028668696 174
lewisdaw3 0:8b6028668696 175
lewisdaw3 0:8b6028668696 176 /* returns the percentage charge of battery as reported by sim800 */
lewisdaw3 0:8b6028668696 177 boolean Adafruit_FONA::getBattPercent(uint16_t *p) {
lewisdaw3 0:8b6028668696 178 return sendParseReply(F("AT+CBC"), F("+CBC: "), p, ',', 1);
lewisdaw3 0:8b6028668696 179 }
lewisdaw3 0:8b6028668696 180
lewisdaw3 0:8b6028668696 181 boolean Adafruit_FONA::getADCVoltage(uint16_t *v) {
lewisdaw3 0:8b6028668696 182 return sendParseReply(F("AT+CADC?"), F("+CADC: 1,"), v);
lewisdaw3 0:8b6028668696 183 }
lewisdaw3 0:8b6028668696 184
lewisdaw3 0:8b6028668696 185 /********* SIM ***********************************************************/
lewisdaw3 0:8b6028668696 186
lewisdaw3 0:8b6028668696 187 uint8_t Adafruit_FONA::unlockSIM(char *pin)
lewisdaw3 0:8b6028668696 188 {
lewisdaw3 0:8b6028668696 189 char sendbuff[14] = "AT+CPIN=";
lewisdaw3 0:8b6028668696 190 sendbuff[8] = pin[0];
lewisdaw3 0:8b6028668696 191 sendbuff[9] = pin[1];
lewisdaw3 0:8b6028668696 192 sendbuff[10] = pin[2];
lewisdaw3 0:8b6028668696 193 sendbuff[11] = pin[3];
lewisdaw3 0:8b6028668696 194 sendbuff[12] = '\0';
lewisdaw3 0:8b6028668696 195
lewisdaw3 0:8b6028668696 196 return sendCheckReply(sendbuff, ok_reply);
lewisdaw3 0:8b6028668696 197 }
lewisdaw3 0:8b6028668696 198
lewisdaw3 0:8b6028668696 199 uint8_t Adafruit_FONA::getSIMCCID(char *ccid) {
lewisdaw3 0:8b6028668696 200 getReply(F("AT+CCID"));
lewisdaw3 0:8b6028668696 201 // up to 28 chars for reply, 20 char total ccid
lewisdaw3 0:8b6028668696 202 if (replybuffer[0] == '+') {
lewisdaw3 0:8b6028668696 203 // fona 3g?
lewisdaw3 0:8b6028668696 204 strncpy(ccid, replybuffer+8, 20);
lewisdaw3 0:8b6028668696 205 } else {
lewisdaw3 0:8b6028668696 206 // fona 800 or 800
lewisdaw3 0:8b6028668696 207 strncpy(ccid, replybuffer, 20);
lewisdaw3 0:8b6028668696 208 }
lewisdaw3 0:8b6028668696 209 ccid[20] = 0;
lewisdaw3 0:8b6028668696 210
lewisdaw3 0:8b6028668696 211 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 212
lewisdaw3 0:8b6028668696 213 return strlen(ccid);
lewisdaw3 0:8b6028668696 214 }
lewisdaw3 0:8b6028668696 215
lewisdaw3 0:8b6028668696 216 /********* IMEI **********************************************************/
lewisdaw3 0:8b6028668696 217
lewisdaw3 0:8b6028668696 218 uint8_t Adafruit_FONA::getIMEI(char *imei) {
lewisdaw3 0:8b6028668696 219 getReply(F("AT+GSN"));
lewisdaw3 0:8b6028668696 220
lewisdaw3 0:8b6028668696 221 // up to 15 chars
lewisdaw3 0:8b6028668696 222 strncpy(imei, replybuffer, 15);
lewisdaw3 0:8b6028668696 223 imei[15] = 0;
lewisdaw3 0:8b6028668696 224
lewisdaw3 0:8b6028668696 225 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 226
lewisdaw3 0:8b6028668696 227 return strlen(imei);
lewisdaw3 0:8b6028668696 228 }
lewisdaw3 0:8b6028668696 229
lewisdaw3 0:8b6028668696 230 /********* NETWORK *******************************************************/
lewisdaw3 0:8b6028668696 231
lewisdaw3 0:8b6028668696 232 uint8_t Adafruit_FONA::getNetworkStatus(void) {
lewisdaw3 0:8b6028668696 233 uint16_t status;
lewisdaw3 0:8b6028668696 234
lewisdaw3 0:8b6028668696 235 if (! sendParseReply(F("AT+CREG?"), F("+CREG: "), &status, ',', 1)) return 0;
lewisdaw3 0:8b6028668696 236
lewisdaw3 0:8b6028668696 237 return status;
lewisdaw3 0:8b6028668696 238 }
lewisdaw3 0:8b6028668696 239
lewisdaw3 0:8b6028668696 240
lewisdaw3 0:8b6028668696 241 uint8_t Adafruit_FONA::getRSSI(void) {
lewisdaw3 0:8b6028668696 242 uint16_t reply;
lewisdaw3 0:8b6028668696 243
lewisdaw3 0:8b6028668696 244 if (! sendParseReply(F("AT+CSQ"), F("+CSQ: "), &reply) ) return 0;
lewisdaw3 0:8b6028668696 245
lewisdaw3 0:8b6028668696 246 return reply;
lewisdaw3 0:8b6028668696 247 }
lewisdaw3 0:8b6028668696 248
lewisdaw3 0:8b6028668696 249 /********* AUDIO *******************************************************/
lewisdaw3 0:8b6028668696 250
lewisdaw3 0:8b6028668696 251 boolean Adafruit_FONA::setAudio(uint8_t a) {
lewisdaw3 0:8b6028668696 252 // 0 is headset, 1 is external audio
lewisdaw3 0:8b6028668696 253 if (a > 1) return false;
lewisdaw3 0:8b6028668696 254
lewisdaw3 0:8b6028668696 255 return sendCheckReply(F("AT+CHFA="), a, ok_reply);
lewisdaw3 0:8b6028668696 256 }
lewisdaw3 0:8b6028668696 257
lewisdaw3 0:8b6028668696 258 uint8_t Adafruit_FONA::getVolume(void) {
lewisdaw3 0:8b6028668696 259 uint16_t reply;
lewisdaw3 0:8b6028668696 260
lewisdaw3 0:8b6028668696 261 if (! sendParseReply(F("AT+CLVL?"), F("+CLVL: "), &reply) ) return 0;
lewisdaw3 0:8b6028668696 262
lewisdaw3 0:8b6028668696 263 return reply;
lewisdaw3 0:8b6028668696 264 }
lewisdaw3 0:8b6028668696 265
lewisdaw3 0:8b6028668696 266 boolean Adafruit_FONA::setVolume(uint8_t i) {
lewisdaw3 0:8b6028668696 267 return sendCheckReply(F("AT+CLVL="), i, ok_reply);
lewisdaw3 0:8b6028668696 268 }
lewisdaw3 0:8b6028668696 269
lewisdaw3 0:8b6028668696 270
lewisdaw3 0:8b6028668696 271 boolean Adafruit_FONA::playDTMF(char dtmf) {
lewisdaw3 0:8b6028668696 272 char str[4];
lewisdaw3 0:8b6028668696 273 str[0] = '\"';
lewisdaw3 0:8b6028668696 274 str[1] = dtmf;
lewisdaw3 0:8b6028668696 275 str[2] = '\"';
lewisdaw3 0:8b6028668696 276 str[3] = 0;
lewisdaw3 0:8b6028668696 277 return sendCheckReply(F("AT+CLDTMF=3,"), str, ok_reply);
lewisdaw3 0:8b6028668696 278 }
lewisdaw3 0:8b6028668696 279
lewisdaw3 0:8b6028668696 280 boolean Adafruit_FONA::playToolkitTone(uint8_t t, uint16_t len) {
lewisdaw3 0:8b6028668696 281 return sendCheckReply(F("AT+STTONE=1,"), t, len, ok_reply);
lewisdaw3 0:8b6028668696 282 }
lewisdaw3 0:8b6028668696 283
lewisdaw3 0:8b6028668696 284 boolean Adafruit_FONA_3G::playToolkitTone(uint8_t t, uint16_t len) {
lewisdaw3 0:8b6028668696 285 if (! sendCheckReply(F("AT+CPTONE="), t, ok_reply))
lewisdaw3 0:8b6028668696 286 return false;
lewisdaw3 0:8b6028668696 287 delay(len);
lewisdaw3 0:8b6028668696 288 return sendCheckReply(F("AT+CPTONE=0"), ok_reply);
lewisdaw3 0:8b6028668696 289 }
lewisdaw3 0:8b6028668696 290
lewisdaw3 0:8b6028668696 291 boolean Adafruit_FONA::setMicVolume(uint8_t a, uint8_t level) {
lewisdaw3 0:8b6028668696 292 // 0 is headset, 1 is external audio
lewisdaw3 0:8b6028668696 293 if (a > 1) return false;
lewisdaw3 0:8b6028668696 294
lewisdaw3 0:8b6028668696 295 return sendCheckReply(F("AT+CMIC="), a, level, ok_reply);
lewisdaw3 0:8b6028668696 296 }
lewisdaw3 0:8b6028668696 297
lewisdaw3 0:8b6028668696 298 /********* FM RADIO *******************************************************/
lewisdaw3 0:8b6028668696 299
lewisdaw3 0:8b6028668696 300
lewisdaw3 0:8b6028668696 301 boolean Adafruit_FONA::FMradio(boolean onoff, uint8_t a) {
lewisdaw3 0:8b6028668696 302 if (! onoff) {
lewisdaw3 0:8b6028668696 303 return sendCheckReply(F("AT+FMCLOSE"), ok_reply);
lewisdaw3 0:8b6028668696 304 }
lewisdaw3 0:8b6028668696 305
lewisdaw3 0:8b6028668696 306 // 0 is headset, 1 is external audio
lewisdaw3 0:8b6028668696 307 if (a > 1) return false;
lewisdaw3 0:8b6028668696 308
lewisdaw3 0:8b6028668696 309 return sendCheckReply(F("AT+FMOPEN="), a, ok_reply);
lewisdaw3 0:8b6028668696 310 }
lewisdaw3 0:8b6028668696 311
lewisdaw3 0:8b6028668696 312 boolean Adafruit_FONA::tuneFMradio(uint16_t station) {
lewisdaw3 0:8b6028668696 313 // Fail if FM station is outside allowed range.
lewisdaw3 0:8b6028668696 314 if ((station < 870) || (station > 1090))
lewisdaw3 0:8b6028668696 315 return false;
lewisdaw3 0:8b6028668696 316
lewisdaw3 0:8b6028668696 317 return sendCheckReply(F("AT+FMFREQ="), station, ok_reply);
lewisdaw3 0:8b6028668696 318 }
lewisdaw3 0:8b6028668696 319
lewisdaw3 0:8b6028668696 320 boolean Adafruit_FONA::setFMVolume(uint8_t i) {
lewisdaw3 0:8b6028668696 321 // Fail if volume is outside allowed range (0-6).
lewisdaw3 0:8b6028668696 322 if (i > 6) {
lewisdaw3 0:8b6028668696 323 return false;
lewisdaw3 0:8b6028668696 324 }
lewisdaw3 0:8b6028668696 325 // Send FM volume command and verify response.
lewisdaw3 0:8b6028668696 326 return sendCheckReply(F("AT+FMVOLUME="), i, ok_reply);
lewisdaw3 0:8b6028668696 327 }
lewisdaw3 0:8b6028668696 328
lewisdaw3 0:8b6028668696 329 int8_t Adafruit_FONA::getFMVolume() {
lewisdaw3 0:8b6028668696 330 uint16_t level;
lewisdaw3 0:8b6028668696 331
lewisdaw3 0:8b6028668696 332 if (! sendParseReply(F("AT+FMVOLUME?"), F("+FMVOLUME: "), &level) ) return 0;
lewisdaw3 0:8b6028668696 333
lewisdaw3 0:8b6028668696 334 return level;
lewisdaw3 0:8b6028668696 335 }
lewisdaw3 0:8b6028668696 336
lewisdaw3 0:8b6028668696 337 int8_t Adafruit_FONA::getFMSignalLevel(uint16_t station) {
lewisdaw3 0:8b6028668696 338 // Fail if FM station is outside allowed range.
lewisdaw3 0:8b6028668696 339 if ((station < 875) || (station > 1080)) {
lewisdaw3 0:8b6028668696 340 return -1;
lewisdaw3 0:8b6028668696 341 }
lewisdaw3 0:8b6028668696 342
lewisdaw3 0:8b6028668696 343 // Send FM signal level query command.
lewisdaw3 0:8b6028668696 344 // Note, need to explicitly send timeout so right overload is chosen.
lewisdaw3 0:8b6028668696 345 getReply(F("AT+FMSIGNAL="), station, FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 346 // Check response starts with expected value.
lewisdaw3 0:8b6028668696 347 char *p = prog_char_strstr(replybuffer, PSTR("+FMSIGNAL: "));
lewisdaw3 0:8b6028668696 348 if (p == 0) return -1;
lewisdaw3 0:8b6028668696 349 p+=11;
lewisdaw3 0:8b6028668696 350 // Find second colon to get start of signal quality.
lewisdaw3 0:8b6028668696 351 p = strchr(p, ':');
lewisdaw3 0:8b6028668696 352 if (p == 0) return -1;
lewisdaw3 0:8b6028668696 353 p+=1;
lewisdaw3 0:8b6028668696 354 // Parse signal quality.
lewisdaw3 0:8b6028668696 355 int8_t level = atoi(p);
lewisdaw3 0:8b6028668696 356 readline(); // eat the "OK"
lewisdaw3 0:8b6028668696 357 return level;
lewisdaw3 0:8b6028668696 358 }
lewisdaw3 0:8b6028668696 359
lewisdaw3 0:8b6028668696 360 /********* PWM/BUZZER **************************************************/
lewisdaw3 0:8b6028668696 361
lewisdaw3 0:8b6028668696 362 boolean Adafruit_FONA::setPWM(uint16_t period, uint8_t duty) {
lewisdaw3 0:8b6028668696 363 if (period > 2000) return false;
lewisdaw3 0:8b6028668696 364 if (duty > 100) return false;
lewisdaw3 0:8b6028668696 365
lewisdaw3 0:8b6028668696 366 return sendCheckReply(F("AT+SPWM=0,"), period, duty, ok_reply);
lewisdaw3 0:8b6028668696 367 }
lewisdaw3 0:8b6028668696 368
lewisdaw3 0:8b6028668696 369 /********* CALL PHONES **************************************************/
lewisdaw3 0:8b6028668696 370 boolean Adafruit_FONA::callPhone(char *number) {
lewisdaw3 0:8b6028668696 371 char sendbuff[35] = "ATD";
lewisdaw3 0:8b6028668696 372 strncpy(sendbuff+3, number, min(30, strlen(number)));
lewisdaw3 0:8b6028668696 373 uint8_t x = strlen(sendbuff);
lewisdaw3 0:8b6028668696 374 sendbuff[x] = ';';
lewisdaw3 0:8b6028668696 375 sendbuff[x+1] = 0;
lewisdaw3 0:8b6028668696 376 //DEBUG_PRINTLN(sendbuff);
lewisdaw3 0:8b6028668696 377
lewisdaw3 0:8b6028668696 378 return sendCheckReply(sendbuff, ok_reply);
lewisdaw3 0:8b6028668696 379 }
lewisdaw3 0:8b6028668696 380
lewisdaw3 0:8b6028668696 381
lewisdaw3 0:8b6028668696 382 uint8_t Adafruit_FONA::getCallStatus(void) {
lewisdaw3 0:8b6028668696 383 uint16_t phoneStatus;
lewisdaw3 0:8b6028668696 384
lewisdaw3 0:8b6028668696 385 if (! sendParseReply(F("AT+CPAS"), F("+CPAS: "), &phoneStatus))
lewisdaw3 0:8b6028668696 386 return FONA_CALL_FAILED; // 1, since 0 is actually a known, good reply
lewisdaw3 0:8b6028668696 387
lewisdaw3 0:8b6028668696 388 return phoneStatus; // 0 ready, 2 unkown, 3 ringing, 4 call in progress
lewisdaw3 0:8b6028668696 389 }
lewisdaw3 0:8b6028668696 390
lewisdaw3 0:8b6028668696 391 boolean Adafruit_FONA::hangUp(void) {
lewisdaw3 0:8b6028668696 392 return sendCheckReply(F("ATH0"), ok_reply);
lewisdaw3 0:8b6028668696 393 }
lewisdaw3 0:8b6028668696 394
lewisdaw3 0:8b6028668696 395 boolean Adafruit_FONA_3G::hangUp(void) {
lewisdaw3 0:8b6028668696 396 getReply(F("ATH"));
lewisdaw3 0:8b6028668696 397
lewisdaw3 0:8b6028668696 398 return (prog_char_strstr(replybuffer, (prog_char *)F("VOICE CALL: END")) != 0);
lewisdaw3 0:8b6028668696 399 }
lewisdaw3 0:8b6028668696 400
lewisdaw3 0:8b6028668696 401 boolean Adafruit_FONA::pickUp(void) {
lewisdaw3 0:8b6028668696 402 return sendCheckReply(F("ATA"), ok_reply);
lewisdaw3 0:8b6028668696 403 }
lewisdaw3 0:8b6028668696 404
lewisdaw3 0:8b6028668696 405 boolean Adafruit_FONA_3G::pickUp(void) {
lewisdaw3 0:8b6028668696 406 return sendCheckReply(F("ATA"), F("VOICE CALL: BEGIN"));
lewisdaw3 0:8b6028668696 407 }
lewisdaw3 0:8b6028668696 408
lewisdaw3 0:8b6028668696 409
lewisdaw3 0:8b6028668696 410 void Adafruit_FONA::onIncomingCall() {
lewisdaw3 0:8b6028668696 411
lewisdaw3 0:8b6028668696 412 DEBUG_PRINT(F("> ")); DEBUG_PRINTLN(F("Incoming call..."));
lewisdaw3 0:8b6028668696 413
lewisdaw3 0:8b6028668696 414 Adafruit_FONA::_incomingCall = true;
lewisdaw3 0:8b6028668696 415 }
lewisdaw3 0:8b6028668696 416
lewisdaw3 0:8b6028668696 417 boolean Adafruit_FONA::_incomingCall = false;
lewisdaw3 0:8b6028668696 418
lewisdaw3 0:8b6028668696 419 boolean Adafruit_FONA::callerIdNotification(boolean enable, uint8_t interrupt) {
lewisdaw3 0:8b6028668696 420 if(enable){
lewisdaw3 0:8b6028668696 421 attachInterrupt(interrupt, onIncomingCall, FALLING);
lewisdaw3 0:8b6028668696 422 return sendCheckReply(F("AT+CLIP=1"), ok_reply);
lewisdaw3 0:8b6028668696 423 }
lewisdaw3 0:8b6028668696 424
lewisdaw3 0:8b6028668696 425 detachInterrupt(interrupt);
lewisdaw3 0:8b6028668696 426 return sendCheckReply(F("AT+CLIP=0"), ok_reply);
lewisdaw3 0:8b6028668696 427 }
lewisdaw3 0:8b6028668696 428
lewisdaw3 0:8b6028668696 429 boolean Adafruit_FONA::incomingCallNumber(char* phonenum) {
lewisdaw3 0:8b6028668696 430 //+CLIP: "<incoming phone number>",145,"",0,"",0
lewisdaw3 0:8b6028668696 431 if(!Adafruit_FONA::_incomingCall)
lewisdaw3 0:8b6028668696 432 return false;
lewisdaw3 0:8b6028668696 433
lewisdaw3 0:8b6028668696 434 readline();
lewisdaw3 0:8b6028668696 435 while(!prog_char_strcmp(replybuffer, (prog_char*)F("RING")) == 0) {
lewisdaw3 0:8b6028668696 436 flushInput();
lewisdaw3 0:8b6028668696 437 readline();
lewisdaw3 0:8b6028668696 438 }
lewisdaw3 0:8b6028668696 439
lewisdaw3 0:8b6028668696 440 readline(); //reads incoming phone number line
lewisdaw3 0:8b6028668696 441
lewisdaw3 0:8b6028668696 442 parseReply(F("+CLIP: \""), phonenum, '"');
lewisdaw3 0:8b6028668696 443
lewisdaw3 0:8b6028668696 444
lewisdaw3 0:8b6028668696 445 DEBUG_PRINT(F("Phone Number: "));
lewisdaw3 0:8b6028668696 446 DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 447
lewisdaw3 0:8b6028668696 448
lewisdaw3 0:8b6028668696 449 Adafruit_FONA::_incomingCall = false;
lewisdaw3 0:8b6028668696 450 return true;
lewisdaw3 0:8b6028668696 451 }
lewisdaw3 0:8b6028668696 452
lewisdaw3 0:8b6028668696 453 /********* SMS **********************************************************/
lewisdaw3 0:8b6028668696 454
lewisdaw3 0:8b6028668696 455 uint8_t Adafruit_FONA::getSMSInterrupt(void) {
lewisdaw3 0:8b6028668696 456 uint16_t reply;
lewisdaw3 0:8b6028668696 457
lewisdaw3 0:8b6028668696 458 if (! sendParseReply(F("AT+CFGRI?"), F("+CFGRI: "), &reply) ) return 0;
lewisdaw3 0:8b6028668696 459
lewisdaw3 0:8b6028668696 460 return reply;
lewisdaw3 0:8b6028668696 461 }
lewisdaw3 0:8b6028668696 462
lewisdaw3 0:8b6028668696 463 boolean Adafruit_FONA::setSMSInterrupt(uint8_t i) {
lewisdaw3 0:8b6028668696 464 return sendCheckReply(F("AT+CFGRI="), i, ok_reply);
lewisdaw3 0:8b6028668696 465 }
lewisdaw3 0:8b6028668696 466
lewisdaw3 0:8b6028668696 467 int8_t Adafruit_FONA::getNumSMS(void) {
lewisdaw3 0:8b6028668696 468 uint16_t numsms;
lewisdaw3 0:8b6028668696 469
lewisdaw3 0:8b6028668696 470 // get into text mode
lewisdaw3 0:8b6028668696 471 if (! sendCheckReply(F("AT+CMGF=1"), ok_reply)) return -1;
lewisdaw3 0:8b6028668696 472
lewisdaw3 0:8b6028668696 473 // ask how many sms are stored
lewisdaw3 0:8b6028668696 474 if (sendParseReply(F("AT+CPMS?"), F("\"SM\","), &numsms))
lewisdaw3 0:8b6028668696 475 return numsms;
lewisdaw3 0:8b6028668696 476 if (sendParseReply(F("AT+CPMS?"), F("\"SM_P\","), &numsms))
lewisdaw3 0:8b6028668696 477 return numsms;
lewisdaw3 0:8b6028668696 478 return -1;
lewisdaw3 0:8b6028668696 479 }
lewisdaw3 0:8b6028668696 480
lewisdaw3 0:8b6028668696 481 // Reading SMS's is a bit involved so we don't use helpers that may cause delays or debug
lewisdaw3 0:8b6028668696 482 // printouts!
lewisdaw3 0:8b6028668696 483 boolean Adafruit_FONA::readSMS(uint8_t i, char *smsbuff,
lewisdaw3 0:8b6028668696 484 uint16_t maxlen, uint16_t *readlen) {
lewisdaw3 0:8b6028668696 485 // text mode
lewisdaw3 0:8b6028668696 486 if (! sendCheckReply(F("AT+CMGF=1"), ok_reply)) return false;
lewisdaw3 0:8b6028668696 487
lewisdaw3 0:8b6028668696 488 // show all text mode parameters
lewisdaw3 0:8b6028668696 489 if (! sendCheckReply(F("AT+CSDH=1"), ok_reply)) return false;
lewisdaw3 0:8b6028668696 490
lewisdaw3 0:8b6028668696 491 // parse out the SMS len
lewisdaw3 0:8b6028668696 492 uint16_t thesmslen = 0;
lewisdaw3 0:8b6028668696 493
lewisdaw3 0:8b6028668696 494
lewisdaw3 0:8b6028668696 495 DEBUG_PRINT(F("AT+CMGR="));
lewisdaw3 0:8b6028668696 496 DEBUG_PRINTLN(i);
lewisdaw3 0:8b6028668696 497
lewisdaw3 0:8b6028668696 498
lewisdaw3 0:8b6028668696 499 //getReply(F("AT+CMGR="), i, 1000); // do not print debug!
lewisdaw3 0:8b6028668696 500 mySerial->print(F("AT+CMGR="));
lewisdaw3 0:8b6028668696 501 mySerial->println(i);
lewisdaw3 0:8b6028668696 502 readline(1000); // timeout
lewisdaw3 0:8b6028668696 503
lewisdaw3 0:8b6028668696 504 //DEBUG_PRINT(F("Reply: ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 505 // parse it out...
lewisdaw3 0:8b6028668696 506
lewisdaw3 0:8b6028668696 507
lewisdaw3 0:8b6028668696 508 DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 509
lewisdaw3 0:8b6028668696 510
lewisdaw3 0:8b6028668696 511 if (! parseReply(F("+CMGR:"), &thesmslen, ',', 11)) {
lewisdaw3 0:8b6028668696 512 *readlen = 0;
lewisdaw3 0:8b6028668696 513 return false;
lewisdaw3 0:8b6028668696 514 }
lewisdaw3 0:8b6028668696 515
lewisdaw3 0:8b6028668696 516 readRaw(thesmslen);
lewisdaw3 0:8b6028668696 517
lewisdaw3 0:8b6028668696 518 flushInput();
lewisdaw3 0:8b6028668696 519
lewisdaw3 0:8b6028668696 520 uint16_t thelen = min(maxlen, strlen(replybuffer));
lewisdaw3 0:8b6028668696 521 strncpy(smsbuff, replybuffer, thelen);
lewisdaw3 0:8b6028668696 522 smsbuff[thelen] = 0; // end the string
lewisdaw3 0:8b6028668696 523
lewisdaw3 0:8b6028668696 524
lewisdaw3 0:8b6028668696 525 DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 526
lewisdaw3 0:8b6028668696 527 *readlen = thelen;
lewisdaw3 0:8b6028668696 528 return true;
lewisdaw3 0:8b6028668696 529 }
lewisdaw3 0:8b6028668696 530
lewisdaw3 0:8b6028668696 531 // Retrieve the sender of the specified SMS message and copy it as a string to
lewisdaw3 0:8b6028668696 532 // the sender buffer. Up to senderlen characters of the sender will be copied
lewisdaw3 0:8b6028668696 533 // and a null terminator will be added if less than senderlen charactesr are
lewisdaw3 0:8b6028668696 534 // copied to the result. Returns true if a result was successfully retrieved,
lewisdaw3 0:8b6028668696 535 // otherwise false.
lewisdaw3 0:8b6028668696 536 boolean Adafruit_FONA::getSMSSender(uint8_t i, char *sender, int senderlen) {
lewisdaw3 0:8b6028668696 537 // Ensure text mode and all text mode parameters are sent.
lewisdaw3 0:8b6028668696 538 if (! sendCheckReply(F("AT+CMGF=1"), ok_reply)) return false;
lewisdaw3 0:8b6028668696 539 if (! sendCheckReply(F("AT+CSDH=1"), ok_reply)) return false;
lewisdaw3 0:8b6028668696 540
lewisdaw3 0:8b6028668696 541
lewisdaw3 0:8b6028668696 542 DEBUG_PRINT(F("AT+CMGR="));
lewisdaw3 0:8b6028668696 543 DEBUG_PRINTLN(i);
lewisdaw3 0:8b6028668696 544
lewisdaw3 0:8b6028668696 545
lewisdaw3 0:8b6028668696 546 // Send command to retrieve SMS message and parse a line of response.
lewisdaw3 0:8b6028668696 547 mySerial->print(F("AT+CMGR="));
lewisdaw3 0:8b6028668696 548 mySerial->println(i);
lewisdaw3 0:8b6028668696 549 readline(1000);
lewisdaw3 0:8b6028668696 550
lewisdaw3 0:8b6028668696 551
lewisdaw3 0:8b6028668696 552 DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 553
lewisdaw3 0:8b6028668696 554
lewisdaw3 0:8b6028668696 555 // Parse the second field in the response.
lewisdaw3 0:8b6028668696 556 boolean result = parseReplyQuoted(F("+CMGR:"), sender, senderlen, ',', 1);
lewisdaw3 0:8b6028668696 557 // Drop any remaining data from the response.
lewisdaw3 0:8b6028668696 558 flushInput();
lewisdaw3 0:8b6028668696 559 return result;
lewisdaw3 0:8b6028668696 560 }
lewisdaw3 0:8b6028668696 561
lewisdaw3 0:8b6028668696 562 boolean Adafruit_FONA::sendSMS(char *smsaddr, char *smsmsg) {
lewisdaw3 0:8b6028668696 563 if (! sendCheckReply(F("AT+CMGF=1"), ok_reply)) return false;
lewisdaw3 0:8b6028668696 564
lewisdaw3 0:8b6028668696 565 char sendcmd[30] = "AT+CMGS=\"";
lewisdaw3 0:8b6028668696 566 strncpy(sendcmd+9, smsaddr, 30-9-2); // 9 bytes beginning, 2 bytes for close quote + null
lewisdaw3 0:8b6028668696 567 sendcmd[strlen(sendcmd)] = '\"';
lewisdaw3 0:8b6028668696 568
lewisdaw3 0:8b6028668696 569 if (! sendCheckReply(sendcmd, F("> "))) return false;
lewisdaw3 0:8b6028668696 570
lewisdaw3 0:8b6028668696 571 DEBUG_PRINT(F("> ")); DEBUG_PRINTLN(smsmsg);
lewisdaw3 0:8b6028668696 572
lewisdaw3 0:8b6028668696 573 mySerial->println(smsmsg);
lewisdaw3 0:8b6028668696 574 mySerial->println();
lewisdaw3 0:8b6028668696 575 mySerial->write(0x1A);
lewisdaw3 0:8b6028668696 576
lewisdaw3 0:8b6028668696 577 DEBUG_PRINTLN("^Z");
lewisdaw3 0:8b6028668696 578
lewisdaw3 0:8b6028668696 579 if ( (_type == FONA3G_A) || (_type == FONA3G_E) ) {
lewisdaw3 0:8b6028668696 580 // Eat two sets of CRLF
lewisdaw3 0:8b6028668696 581 readline(200);
lewisdaw3 0:8b6028668696 582 //DEBUG_PRINT("Line 1: "); DEBUG_PRINTLN(strlen(replybuffer));
lewisdaw3 0:8b6028668696 583 readline(200);
lewisdaw3 0:8b6028668696 584 //DEBUG_PRINT("Line 2: "); DEBUG_PRINTLN(strlen(replybuffer));
lewisdaw3 0:8b6028668696 585 }
lewisdaw3 0:8b6028668696 586 readline(10000); // read the +CMGS reply, wait up to 10 seconds!!!
lewisdaw3 0:8b6028668696 587 //DEBUG_PRINT("Line 3: "); DEBUG_PRINTLN(strlen(replybuffer));
lewisdaw3 0:8b6028668696 588 if (strstr(replybuffer, "+CMGS") == 0) {
lewisdaw3 0:8b6028668696 589 return false;
lewisdaw3 0:8b6028668696 590 }
lewisdaw3 0:8b6028668696 591 readline(1000); // read OK
lewisdaw3 0:8b6028668696 592 //DEBUG_PRINT("* "); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 593
lewisdaw3 0:8b6028668696 594 if (strcmp(replybuffer, "OK") != 0) {
lewisdaw3 0:8b6028668696 595 return false;
lewisdaw3 0:8b6028668696 596 }
lewisdaw3 0:8b6028668696 597
lewisdaw3 0:8b6028668696 598 return true;
lewisdaw3 0:8b6028668696 599 }
lewisdaw3 0:8b6028668696 600
lewisdaw3 0:8b6028668696 601
lewisdaw3 0:8b6028668696 602 boolean Adafruit_FONA::deleteSMS(uint8_t i) {
lewisdaw3 0:8b6028668696 603 if (! sendCheckReply(F("AT+CMGF=1"), ok_reply)) return false;
lewisdaw3 0:8b6028668696 604 // read an sms
lewisdaw3 0:8b6028668696 605 char sendbuff[12] = "AT+CMGD=000";
lewisdaw3 0:8b6028668696 606 sendbuff[8] = (i / 100) + '0';
lewisdaw3 0:8b6028668696 607 i %= 100;
lewisdaw3 0:8b6028668696 608 sendbuff[9] = (i / 10) + '0';
lewisdaw3 0:8b6028668696 609 i %= 10;
lewisdaw3 0:8b6028668696 610 sendbuff[10] = i + '0';
lewisdaw3 0:8b6028668696 611
lewisdaw3 0:8b6028668696 612 return sendCheckReply(sendbuff, ok_reply, 2000);
lewisdaw3 0:8b6028668696 613 }
lewisdaw3 0:8b6028668696 614
lewisdaw3 0:8b6028668696 615 /********* USSD *********************************************************/
lewisdaw3 0:8b6028668696 616
lewisdaw3 0:8b6028668696 617 boolean Adafruit_FONA::sendUSSD(char *ussdmsg, char *ussdbuff, uint16_t maxlen, uint16_t *readlen) {
lewisdaw3 0:8b6028668696 618 if (! sendCheckReply(F("AT+CUSD=1"), ok_reply)) return false;
lewisdaw3 0:8b6028668696 619
lewisdaw3 0:8b6028668696 620 char sendcmd[30] = "AT+CUSD=1,\"";
lewisdaw3 0:8b6028668696 621 strncpy(sendcmd+11, ussdmsg, 30-11-2); // 11 bytes beginning, 2 bytes for close quote + null
lewisdaw3 0:8b6028668696 622 sendcmd[strlen(sendcmd)] = '\"';
lewisdaw3 0:8b6028668696 623
lewisdaw3 0:8b6028668696 624 if (! sendCheckReply(sendcmd, ok_reply)) {
lewisdaw3 0:8b6028668696 625 *readlen = 0;
lewisdaw3 0:8b6028668696 626 return false;
lewisdaw3 0:8b6028668696 627 } else {
lewisdaw3 0:8b6028668696 628 readline(10000); // read the +CUSD reply, wait up to 10 seconds!!!
lewisdaw3 0:8b6028668696 629 //DEBUG_PRINT("* "); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 630 char *p = prog_char_strstr(replybuffer, PSTR("+CUSD: "));
lewisdaw3 0:8b6028668696 631 if (p == 0) {
lewisdaw3 0:8b6028668696 632 *readlen = 0;
lewisdaw3 0:8b6028668696 633 return false;
lewisdaw3 0:8b6028668696 634 }
lewisdaw3 0:8b6028668696 635 p+=7; //+CUSD
lewisdaw3 0:8b6028668696 636 // Find " to get start of ussd message.
lewisdaw3 0:8b6028668696 637 p = strchr(p, '\"');
lewisdaw3 0:8b6028668696 638 if (p == 0) {
lewisdaw3 0:8b6028668696 639 *readlen = 0;
lewisdaw3 0:8b6028668696 640 return false;
lewisdaw3 0:8b6028668696 641 }
lewisdaw3 0:8b6028668696 642 p+=1; //"
lewisdaw3 0:8b6028668696 643 // Find " to get end of ussd message.
lewisdaw3 0:8b6028668696 644 char *strend = strchr(p, '\"');
lewisdaw3 0:8b6028668696 645
lewisdaw3 0:8b6028668696 646 uint16_t lentocopy = min(maxlen-1, strend - p);
lewisdaw3 0:8b6028668696 647 strncpy(ussdbuff, p, lentocopy+1);
lewisdaw3 0:8b6028668696 648 ussdbuff[lentocopy] = 0;
lewisdaw3 0:8b6028668696 649 *readlen = lentocopy;
lewisdaw3 0:8b6028668696 650 }
lewisdaw3 0:8b6028668696 651 return true;
lewisdaw3 0:8b6028668696 652 }
lewisdaw3 0:8b6028668696 653
lewisdaw3 0:8b6028668696 654
lewisdaw3 0:8b6028668696 655 /********* TIME **********************************************************/
lewisdaw3 0:8b6028668696 656
lewisdaw3 0:8b6028668696 657 boolean Adafruit_FONA::enableNetworkTimeSync(boolean onoff) {
lewisdaw3 0:8b6028668696 658 if (onoff) {
lewisdaw3 0:8b6028668696 659 if (! sendCheckReply(F("AT+CLTS=1"), ok_reply))
lewisdaw3 0:8b6028668696 660 return false;
lewisdaw3 0:8b6028668696 661 } else {
lewisdaw3 0:8b6028668696 662 if (! sendCheckReply(F("AT+CLTS=0"), ok_reply))
lewisdaw3 0:8b6028668696 663 return false;
lewisdaw3 0:8b6028668696 664 }
lewisdaw3 0:8b6028668696 665
lewisdaw3 0:8b6028668696 666 flushInput(); // eat any 'Unsolicted Result Code'
lewisdaw3 0:8b6028668696 667
lewisdaw3 0:8b6028668696 668 return true;
lewisdaw3 0:8b6028668696 669 }
lewisdaw3 0:8b6028668696 670
lewisdaw3 0:8b6028668696 671 boolean Adafruit_FONA::enableNTPTimeSync(boolean onoff, FONAFlashStringPtr ntpserver) {
lewisdaw3 0:8b6028668696 672 if (onoff) {
lewisdaw3 0:8b6028668696 673 if (! sendCheckReply(F("AT+CNTPCID=1"), ok_reply))
lewisdaw3 0:8b6028668696 674 return false;
lewisdaw3 0:8b6028668696 675
lewisdaw3 0:8b6028668696 676 mySerial->print(F("AT+CNTP=\""));
lewisdaw3 0:8b6028668696 677 if (ntpserver != 0) {
lewisdaw3 0:8b6028668696 678 mySerial->print(ntpserver);
lewisdaw3 0:8b6028668696 679 } else {
lewisdaw3 0:8b6028668696 680 mySerial->print(F("pool.ntp.org"));
lewisdaw3 0:8b6028668696 681 }
lewisdaw3 0:8b6028668696 682 mySerial->println(F("\",0"));
lewisdaw3 0:8b6028668696 683 readline(FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 684 if (strcmp(replybuffer, "OK") != 0)
lewisdaw3 0:8b6028668696 685 return false;
lewisdaw3 0:8b6028668696 686
lewisdaw3 0:8b6028668696 687 if (! sendCheckReply(F("AT+CNTP"), ok_reply, 10000))
lewisdaw3 0:8b6028668696 688 return false;
lewisdaw3 0:8b6028668696 689
lewisdaw3 0:8b6028668696 690 uint16_t status;
lewisdaw3 0:8b6028668696 691 readline(10000);
lewisdaw3 0:8b6028668696 692 if (! parseReply(F("+CNTP:"), &status))
lewisdaw3 0:8b6028668696 693 return false;
lewisdaw3 0:8b6028668696 694 } else {
lewisdaw3 0:8b6028668696 695 if (! sendCheckReply(F("AT+CNTPCID=0"), ok_reply))
lewisdaw3 0:8b6028668696 696 return false;
lewisdaw3 0:8b6028668696 697 }
lewisdaw3 0:8b6028668696 698
lewisdaw3 0:8b6028668696 699 return true;
lewisdaw3 0:8b6028668696 700 }
lewisdaw3 0:8b6028668696 701
lewisdaw3 0:8b6028668696 702 boolean Adafruit_FONA::getTime(char *buff, uint16_t maxlen) {
lewisdaw3 0:8b6028668696 703 getReply(F("AT+CCLK?"), (uint16_t) 10000);
lewisdaw3 0:8b6028668696 704 if (strncmp(replybuffer, "+CCLK: ", 7) != 0)
lewisdaw3 0:8b6028668696 705 return false;
lewisdaw3 0:8b6028668696 706
lewisdaw3 0:8b6028668696 707 char *p = replybuffer+7;
lewisdaw3 0:8b6028668696 708 uint16_t lentocopy = min(maxlen-1, strlen(p));
lewisdaw3 0:8b6028668696 709 strncpy(buff, p, lentocopy+1);
lewisdaw3 0:8b6028668696 710 buff[lentocopy] = 0;
lewisdaw3 0:8b6028668696 711
lewisdaw3 0:8b6028668696 712 readline(); // eat OK
lewisdaw3 0:8b6028668696 713
lewisdaw3 0:8b6028668696 714 return true;
lewisdaw3 0:8b6028668696 715 }
lewisdaw3 0:8b6028668696 716
lewisdaw3 0:8b6028668696 717 /********* GPS **********************************************************/
lewisdaw3 0:8b6028668696 718
lewisdaw3 0:8b6028668696 719
lewisdaw3 0:8b6028668696 720 boolean Adafruit_FONA::enableGPS(boolean onoff) {
lewisdaw3 0:8b6028668696 721 uint16_t state;
lewisdaw3 0:8b6028668696 722
lewisdaw3 0:8b6028668696 723 // first check if its already on or off
lewisdaw3 0:8b6028668696 724
lewisdaw3 0:8b6028668696 725 if (_type == FONA808_V2) {
lewisdaw3 0:8b6028668696 726 if (! sendParseReply(F("AT+CGNSPWR?"), F("+CGNSPWR: "), &state) )
lewisdaw3 0:8b6028668696 727 return false;
lewisdaw3 0:8b6028668696 728 } else {
lewisdaw3 0:8b6028668696 729 if (! sendParseReply(F("AT+CGPSPWR?"), F("+CGPSPWR: "), &state))
lewisdaw3 0:8b6028668696 730 return false;
lewisdaw3 0:8b6028668696 731 }
lewisdaw3 0:8b6028668696 732
lewisdaw3 0:8b6028668696 733 if (onoff && !state) {
lewisdaw3 0:8b6028668696 734 if (_type == FONA808_V2) {
lewisdaw3 0:8b6028668696 735 if (! sendCheckReply(F("AT+CGNSPWR=1"), ok_reply)) // try GNS command
lewisdaw3 0:8b6028668696 736 return false;
lewisdaw3 0:8b6028668696 737 } else {
lewisdaw3 0:8b6028668696 738 if (! sendCheckReply(F("AT+CGPSPWR=1"), ok_reply))
lewisdaw3 0:8b6028668696 739 return false;
lewisdaw3 0:8b6028668696 740 }
lewisdaw3 0:8b6028668696 741 } else if (!onoff && state) {
lewisdaw3 0:8b6028668696 742 if (_type == FONA808_V2) {
lewisdaw3 0:8b6028668696 743 if (! sendCheckReply(F("AT+CGNSPWR=0"), ok_reply)) // try GNS command
lewisdaw3 0:8b6028668696 744 return false;
lewisdaw3 0:8b6028668696 745 } else {
lewisdaw3 0:8b6028668696 746 if (! sendCheckReply(F("AT+CGPSPWR=0"), ok_reply))
lewisdaw3 0:8b6028668696 747 return false;
lewisdaw3 0:8b6028668696 748 }
lewisdaw3 0:8b6028668696 749 }
lewisdaw3 0:8b6028668696 750 return true;
lewisdaw3 0:8b6028668696 751 }
lewisdaw3 0:8b6028668696 752
lewisdaw3 0:8b6028668696 753
lewisdaw3 0:8b6028668696 754
lewisdaw3 0:8b6028668696 755 boolean Adafruit_FONA_3G::enableGPS(boolean onoff) {
lewisdaw3 0:8b6028668696 756 uint16_t state;
lewisdaw3 0:8b6028668696 757
lewisdaw3 0:8b6028668696 758 // first check if its already on or off
lewisdaw3 0:8b6028668696 759 if (! Adafruit_FONA::sendParseReply(F("AT+CGPS?"), F("+CGPS: "), &state) )
lewisdaw3 0:8b6028668696 760 return false;
lewisdaw3 0:8b6028668696 761
lewisdaw3 0:8b6028668696 762 if (onoff && !state) {
lewisdaw3 0:8b6028668696 763 if (! sendCheckReply(F("AT+CGPS=1"), ok_reply))
lewisdaw3 0:8b6028668696 764 return false;
lewisdaw3 0:8b6028668696 765 } else if (!onoff && state) {
lewisdaw3 0:8b6028668696 766 if (! sendCheckReply(F("AT+CGPS=0"), ok_reply))
lewisdaw3 0:8b6028668696 767 return false;
lewisdaw3 0:8b6028668696 768 // this takes a little time
lewisdaw3 0:8b6028668696 769 readline(2000); // eat '+CGPS: 0'
lewisdaw3 0:8b6028668696 770 }
lewisdaw3 0:8b6028668696 771 return true;
lewisdaw3 0:8b6028668696 772 }
lewisdaw3 0:8b6028668696 773
lewisdaw3 0:8b6028668696 774 int8_t Adafruit_FONA::GPSstatus(void) {
lewisdaw3 0:8b6028668696 775 if (_type == FONA808_V2) {
lewisdaw3 0:8b6028668696 776 // 808 V2 uses GNS commands and doesn't have an explicit 2D/3D fix status.
lewisdaw3 0:8b6028668696 777 // Instead just look for a fix and if found assume it's a 3D fix.
lewisdaw3 0:8b6028668696 778 getReply(F("AT+CGNSINF"));
lewisdaw3 0:8b6028668696 779 char *p = prog_char_strstr(replybuffer, (prog_char*)F("+CGNSINF: "));
lewisdaw3 0:8b6028668696 780 if (p == 0) return -1;
lewisdaw3 0:8b6028668696 781 p+=10;
lewisdaw3 0:8b6028668696 782 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 783 if (p[0] == '0') return 0; // GPS is not even on!
lewisdaw3 0:8b6028668696 784
lewisdaw3 0:8b6028668696 785 p+=2; // Skip to second value, fix status.
lewisdaw3 0:8b6028668696 786 //DEBUG_PRINTLN(p);
lewisdaw3 0:8b6028668696 787 // Assume if the fix status is '1' then we have a 3D fix, otherwise no fix.
lewisdaw3 0:8b6028668696 788 if (p[0] == '1') return 3;
lewisdaw3 0:8b6028668696 789 else return 1;
lewisdaw3 0:8b6028668696 790 }
lewisdaw3 0:8b6028668696 791 if (_type == FONA3G_A || _type == FONA3G_E) {
lewisdaw3 0:8b6028668696 792 // FONA 3G doesn't have an explicit 2D/3D fix status.
lewisdaw3 0:8b6028668696 793 // Instead just look for a fix and if found assume it's a 3D fix.
lewisdaw3 0:8b6028668696 794 getReply(F("AT+CGPSINFO"));
lewisdaw3 0:8b6028668696 795 char *p = prog_char_strstr(replybuffer, (prog_char*)F("+CGPSINFO:"));
lewisdaw3 0:8b6028668696 796 if (p == 0) return -1;
lewisdaw3 0:8b6028668696 797 if (p[10] != ',') return 3; // if you get anything, its 3D fix
lewisdaw3 0:8b6028668696 798 return 0;
lewisdaw3 0:8b6028668696 799 }
lewisdaw3 0:8b6028668696 800 else {
lewisdaw3 0:8b6028668696 801 // 808 V1 looks for specific 2D or 3D fix state.
lewisdaw3 0:8b6028668696 802 getReply(F("AT+CGPSSTATUS?"));
lewisdaw3 0:8b6028668696 803 char *p = prog_char_strstr(replybuffer, (prog_char*)F("SSTATUS: Location "));
lewisdaw3 0:8b6028668696 804 if (p == 0) return -1;
lewisdaw3 0:8b6028668696 805 p+=18;
lewisdaw3 0:8b6028668696 806 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 807 //DEBUG_PRINTLN(p);
lewisdaw3 0:8b6028668696 808 if (p[0] == 'U') return 0;
lewisdaw3 0:8b6028668696 809 if (p[0] == 'N') return 1;
lewisdaw3 0:8b6028668696 810 if (p[0] == '2') return 2;
lewisdaw3 0:8b6028668696 811 if (p[0] == '3') return 3;
lewisdaw3 0:8b6028668696 812 }
lewisdaw3 0:8b6028668696 813 // else
lewisdaw3 0:8b6028668696 814 return 0;
lewisdaw3 0:8b6028668696 815 }
lewisdaw3 0:8b6028668696 816
lewisdaw3 0:8b6028668696 817 uint8_t Adafruit_FONA::getGPS(uint8_t arg, char *buffer, uint8_t maxbuff) {
lewisdaw3 0:8b6028668696 818 int32_t x = arg;
lewisdaw3 0:8b6028668696 819
lewisdaw3 0:8b6028668696 820 if ( (_type == FONA3G_A) || (_type == FONA3G_E) ) {
lewisdaw3 0:8b6028668696 821 getReply(F("AT+CGPSINFO"));
lewisdaw3 0:8b6028668696 822 } else if (_type == FONA808_V1) {
lewisdaw3 0:8b6028668696 823 getReply(F("AT+CGPSINF="), x);
lewisdaw3 0:8b6028668696 824 } else {
lewisdaw3 0:8b6028668696 825 getReply(F("AT+CGNSINF"));
lewisdaw3 0:8b6028668696 826 }
lewisdaw3 0:8b6028668696 827
lewisdaw3 0:8b6028668696 828 char *p = prog_char_strstr(replybuffer, (prog_char*)F("SINF"));
lewisdaw3 0:8b6028668696 829 if (p == 0) {
lewisdaw3 0:8b6028668696 830 buffer[0] = 0;
lewisdaw3 0:8b6028668696 831 return 0;
lewisdaw3 0:8b6028668696 832 }
lewisdaw3 0:8b6028668696 833
lewisdaw3 0:8b6028668696 834 p+=6;
lewisdaw3 0:8b6028668696 835
lewisdaw3 0:8b6028668696 836 uint8_t len = max(maxbuff-1, strlen(p));
lewisdaw3 0:8b6028668696 837 strncpy(buffer, p, len);
lewisdaw3 0:8b6028668696 838 buffer[len] = 0;
lewisdaw3 0:8b6028668696 839
lewisdaw3 0:8b6028668696 840 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 841 return len;
lewisdaw3 0:8b6028668696 842 }
lewisdaw3 0:8b6028668696 843
lewisdaw3 0:8b6028668696 844 boolean Adafruit_FONA::getGPS(float *lat, float *lon, float *speed_kph, float *heading, float *altitude) {
lewisdaw3 0:8b6028668696 845
lewisdaw3 0:8b6028668696 846 char gpsbuffer[120];
lewisdaw3 0:8b6028668696 847
lewisdaw3 0:8b6028668696 848 // we need at least a 2D fix
lewisdaw3 0:8b6028668696 849 if (GPSstatus() < 2)
lewisdaw3 0:8b6028668696 850 return false;
lewisdaw3 0:8b6028668696 851
lewisdaw3 0:8b6028668696 852 // grab the mode 2^5 gps csv from the sim808
lewisdaw3 0:8b6028668696 853 uint8_t res_len = getGPS(32, gpsbuffer, 120);
lewisdaw3 0:8b6028668696 854
lewisdaw3 0:8b6028668696 855 // make sure we have a response
lewisdaw3 0:8b6028668696 856 if (res_len == 0)
lewisdaw3 0:8b6028668696 857 return false;
lewisdaw3 0:8b6028668696 858
lewisdaw3 0:8b6028668696 859 if (_type == FONA3G_A || _type == FONA3G_E) {
lewisdaw3 0:8b6028668696 860 // Parse 3G respose
lewisdaw3 0:8b6028668696 861 // +CGPSINFO:4043.000000,N,07400.000000,W,151015,203802.1,-12.0,0.0,0
lewisdaw3 0:8b6028668696 862 // skip beginning
lewisdaw3 0:8b6028668696 863 char *tok;
lewisdaw3 0:8b6028668696 864
lewisdaw3 0:8b6028668696 865 // grab the latitude
lewisdaw3 0:8b6028668696 866 char *latp = strtok(gpsbuffer, ",");
lewisdaw3 0:8b6028668696 867 if (! latp) return false;
lewisdaw3 0:8b6028668696 868
lewisdaw3 0:8b6028668696 869 // grab latitude direction
lewisdaw3 0:8b6028668696 870 char *latdir = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 871 if (! latdir) return false;
lewisdaw3 0:8b6028668696 872
lewisdaw3 0:8b6028668696 873 // grab longitude
lewisdaw3 0:8b6028668696 874 char *longp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 875 if (! longp) return false;
lewisdaw3 0:8b6028668696 876
lewisdaw3 0:8b6028668696 877 // grab longitude direction
lewisdaw3 0:8b6028668696 878 char *longdir = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 879 if (! longdir) return false;
lewisdaw3 0:8b6028668696 880
lewisdaw3 0:8b6028668696 881 // skip date & time
lewisdaw3 0:8b6028668696 882 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 883 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 884
lewisdaw3 0:8b6028668696 885 // only grab altitude if needed
lewisdaw3 0:8b6028668696 886 if (altitude != NULL) {
lewisdaw3 0:8b6028668696 887 // grab altitude
lewisdaw3 0:8b6028668696 888 char *altp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 889 if (! altp) return false;
lewisdaw3 0:8b6028668696 890 *altitude = atof(altp);
lewisdaw3 0:8b6028668696 891 }
lewisdaw3 0:8b6028668696 892
lewisdaw3 0:8b6028668696 893 // only grab speed if needed
lewisdaw3 0:8b6028668696 894 if (speed_kph != NULL) {
lewisdaw3 0:8b6028668696 895 // grab the speed in km/h
lewisdaw3 0:8b6028668696 896 char *speedp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 897 if (! speedp) return false;
lewisdaw3 0:8b6028668696 898
lewisdaw3 0:8b6028668696 899 *speed_kph = atof(speedp);
lewisdaw3 0:8b6028668696 900 }
lewisdaw3 0:8b6028668696 901
lewisdaw3 0:8b6028668696 902 // only grab heading if needed
lewisdaw3 0:8b6028668696 903 if (heading != NULL) {
lewisdaw3 0:8b6028668696 904
lewisdaw3 0:8b6028668696 905 // grab the speed in knots
lewisdaw3 0:8b6028668696 906 char *coursep = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 907 if (! coursep) return false;
lewisdaw3 0:8b6028668696 908
lewisdaw3 0:8b6028668696 909 *heading = atof(coursep);
lewisdaw3 0:8b6028668696 910 }
lewisdaw3 0:8b6028668696 911
lewisdaw3 0:8b6028668696 912 double latitude = atof(latp);
lewisdaw3 0:8b6028668696 913 double longitude = atof(longp);
lewisdaw3 0:8b6028668696 914
lewisdaw3 0:8b6028668696 915 // convert latitude from minutes to decimal
lewisdaw3 0:8b6028668696 916 float degrees = floor(latitude / 100);
lewisdaw3 0:8b6028668696 917 double minutes = latitude - (100 * degrees);
lewisdaw3 0:8b6028668696 918 minutes /= 60;
lewisdaw3 0:8b6028668696 919 degrees += minutes;
lewisdaw3 0:8b6028668696 920
lewisdaw3 0:8b6028668696 921 // turn direction into + or -
lewisdaw3 0:8b6028668696 922 if (latdir[0] == 'S') degrees *= -1;
lewisdaw3 0:8b6028668696 923
lewisdaw3 0:8b6028668696 924 *lat = degrees;
lewisdaw3 0:8b6028668696 925
lewisdaw3 0:8b6028668696 926 // convert longitude from minutes to decimal
lewisdaw3 0:8b6028668696 927 degrees = floor(longitude / 100);
lewisdaw3 0:8b6028668696 928 minutes = longitude - (100 * degrees);
lewisdaw3 0:8b6028668696 929 minutes /= 60;
lewisdaw3 0:8b6028668696 930 degrees += minutes;
lewisdaw3 0:8b6028668696 931
lewisdaw3 0:8b6028668696 932 // turn direction into + or -
lewisdaw3 0:8b6028668696 933 if (longdir[0] == 'W') degrees *= -1;
lewisdaw3 0:8b6028668696 934
lewisdaw3 0:8b6028668696 935 *lon = degrees;
lewisdaw3 0:8b6028668696 936
lewisdaw3 0:8b6028668696 937 } else if (_type == FONA808_V2) {
lewisdaw3 0:8b6028668696 938 // Parse 808 V2 response. See table 2-3 from here for format:
lewisdaw3 0:8b6028668696 939 // http://www.adafruit.com/datasheets/SIM800%20Series_GNSS_Application%20Note%20V1.00.pdf
lewisdaw3 0:8b6028668696 940
lewisdaw3 0:8b6028668696 941 // skip GPS run status
lewisdaw3 0:8b6028668696 942 char *tok = strtok(gpsbuffer, ",");
lewisdaw3 0:8b6028668696 943 if (! tok) return false;
lewisdaw3 0:8b6028668696 944
lewisdaw3 0:8b6028668696 945 // skip fix status
lewisdaw3 0:8b6028668696 946 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 947 if (! tok) return false;
lewisdaw3 0:8b6028668696 948
lewisdaw3 0:8b6028668696 949 // skip date
lewisdaw3 0:8b6028668696 950 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 951 if (! tok) return false;
lewisdaw3 0:8b6028668696 952
lewisdaw3 0:8b6028668696 953 // grab the latitude
lewisdaw3 0:8b6028668696 954 char *latp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 955 if (! latp) return false;
lewisdaw3 0:8b6028668696 956
lewisdaw3 0:8b6028668696 957 // grab longitude
lewisdaw3 0:8b6028668696 958 char *longp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 959 if (! longp) return false;
lewisdaw3 0:8b6028668696 960
lewisdaw3 0:8b6028668696 961 *lat = atof(latp);
lewisdaw3 0:8b6028668696 962 *lon = atof(longp);
lewisdaw3 0:8b6028668696 963
lewisdaw3 0:8b6028668696 964 // only grab altitude if needed
lewisdaw3 0:8b6028668696 965 if (altitude != NULL) {
lewisdaw3 0:8b6028668696 966 // grab altitude
lewisdaw3 0:8b6028668696 967 char *altp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 968 if (! altp) return false;
lewisdaw3 0:8b6028668696 969
lewisdaw3 0:8b6028668696 970 *altitude = atof(altp);
lewisdaw3 0:8b6028668696 971 }
lewisdaw3 0:8b6028668696 972
lewisdaw3 0:8b6028668696 973 // only grab speed if needed
lewisdaw3 0:8b6028668696 974 if (speed_kph != NULL) {
lewisdaw3 0:8b6028668696 975 // grab the speed in km/h
lewisdaw3 0:8b6028668696 976 char *speedp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 977 if (! speedp) return false;
lewisdaw3 0:8b6028668696 978
lewisdaw3 0:8b6028668696 979 *speed_kph = atof(speedp);
lewisdaw3 0:8b6028668696 980 }
lewisdaw3 0:8b6028668696 981
lewisdaw3 0:8b6028668696 982 // only grab heading if needed
lewisdaw3 0:8b6028668696 983 if (heading != NULL) {
lewisdaw3 0:8b6028668696 984
lewisdaw3 0:8b6028668696 985 // grab the speed in knots
lewisdaw3 0:8b6028668696 986 char *coursep = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 987 if (! coursep) return false;
lewisdaw3 0:8b6028668696 988
lewisdaw3 0:8b6028668696 989 *heading = atof(coursep);
lewisdaw3 0:8b6028668696 990 }
lewisdaw3 0:8b6028668696 991 }
lewisdaw3 0:8b6028668696 992 else {
lewisdaw3 0:8b6028668696 993 // Parse 808 V1 response.
lewisdaw3 0:8b6028668696 994
lewisdaw3 0:8b6028668696 995 // skip mode
lewisdaw3 0:8b6028668696 996 char *tok = strtok(gpsbuffer, ",");
lewisdaw3 0:8b6028668696 997 if (! tok) return false;
lewisdaw3 0:8b6028668696 998
lewisdaw3 0:8b6028668696 999 // skip date
lewisdaw3 0:8b6028668696 1000 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1001 if (! tok) return false;
lewisdaw3 0:8b6028668696 1002
lewisdaw3 0:8b6028668696 1003 // skip fix
lewisdaw3 0:8b6028668696 1004 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1005 if (! tok) return false;
lewisdaw3 0:8b6028668696 1006
lewisdaw3 0:8b6028668696 1007 // grab the latitude
lewisdaw3 0:8b6028668696 1008 char *latp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1009 if (! latp) return false;
lewisdaw3 0:8b6028668696 1010
lewisdaw3 0:8b6028668696 1011 // grab latitude direction
lewisdaw3 0:8b6028668696 1012 char *latdir = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1013 if (! latdir) return false;
lewisdaw3 0:8b6028668696 1014
lewisdaw3 0:8b6028668696 1015 // grab longitude
lewisdaw3 0:8b6028668696 1016 char *longp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1017 if (! longp) return false;
lewisdaw3 0:8b6028668696 1018
lewisdaw3 0:8b6028668696 1019 // grab longitude direction
lewisdaw3 0:8b6028668696 1020 char *longdir = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1021 if (! longdir) return false;
lewisdaw3 0:8b6028668696 1022
lewisdaw3 0:8b6028668696 1023 double latitude = atof(latp);
lewisdaw3 0:8b6028668696 1024 double longitude = atof(longp);
lewisdaw3 0:8b6028668696 1025
lewisdaw3 0:8b6028668696 1026 // convert latitude from minutes to decimal
lewisdaw3 0:8b6028668696 1027 float degrees = floor(latitude / 100);
lewisdaw3 0:8b6028668696 1028 double minutes = latitude - (100 * degrees);
lewisdaw3 0:8b6028668696 1029 minutes /= 60;
lewisdaw3 0:8b6028668696 1030 degrees += minutes;
lewisdaw3 0:8b6028668696 1031
lewisdaw3 0:8b6028668696 1032 // turn direction into + or -
lewisdaw3 0:8b6028668696 1033 if (latdir[0] == 'S') degrees *= -1;
lewisdaw3 0:8b6028668696 1034
lewisdaw3 0:8b6028668696 1035 *lat = degrees;
lewisdaw3 0:8b6028668696 1036
lewisdaw3 0:8b6028668696 1037 // convert longitude from minutes to decimal
lewisdaw3 0:8b6028668696 1038 degrees = floor(longitude / 100);
lewisdaw3 0:8b6028668696 1039 minutes = longitude - (100 * degrees);
lewisdaw3 0:8b6028668696 1040 minutes /= 60;
lewisdaw3 0:8b6028668696 1041 degrees += minutes;
lewisdaw3 0:8b6028668696 1042
lewisdaw3 0:8b6028668696 1043 // turn direction into + or -
lewisdaw3 0:8b6028668696 1044 if (longdir[0] == 'W') degrees *= -1;
lewisdaw3 0:8b6028668696 1045
lewisdaw3 0:8b6028668696 1046 *lon = degrees;
lewisdaw3 0:8b6028668696 1047
lewisdaw3 0:8b6028668696 1048 // only grab speed if needed
lewisdaw3 0:8b6028668696 1049 if (speed_kph != NULL) {
lewisdaw3 0:8b6028668696 1050
lewisdaw3 0:8b6028668696 1051 // grab the speed in knots
lewisdaw3 0:8b6028668696 1052 char *speedp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1053 if (! speedp) return false;
lewisdaw3 0:8b6028668696 1054
lewisdaw3 0:8b6028668696 1055 // convert to kph
lewisdaw3 0:8b6028668696 1056 *speed_kph = atof(speedp) * 1.852;
lewisdaw3 0:8b6028668696 1057
lewisdaw3 0:8b6028668696 1058 }
lewisdaw3 0:8b6028668696 1059
lewisdaw3 0:8b6028668696 1060 // only grab heading if needed
lewisdaw3 0:8b6028668696 1061 if (heading != NULL) {
lewisdaw3 0:8b6028668696 1062
lewisdaw3 0:8b6028668696 1063 // grab the speed in knots
lewisdaw3 0:8b6028668696 1064 char *coursep = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1065 if (! coursep) return false;
lewisdaw3 0:8b6028668696 1066
lewisdaw3 0:8b6028668696 1067 *heading = atof(coursep);
lewisdaw3 0:8b6028668696 1068
lewisdaw3 0:8b6028668696 1069 }
lewisdaw3 0:8b6028668696 1070
lewisdaw3 0:8b6028668696 1071 // no need to continue
lewisdaw3 0:8b6028668696 1072 if (altitude == NULL)
lewisdaw3 0:8b6028668696 1073 return true;
lewisdaw3 0:8b6028668696 1074
lewisdaw3 0:8b6028668696 1075 // we need at least a 3D fix for altitude
lewisdaw3 0:8b6028668696 1076 if (GPSstatus() < 3)
lewisdaw3 0:8b6028668696 1077 return false;
lewisdaw3 0:8b6028668696 1078
lewisdaw3 0:8b6028668696 1079 // grab the mode 0 gps csv from the sim808
lewisdaw3 0:8b6028668696 1080 res_len = getGPS(0, gpsbuffer, 120);
lewisdaw3 0:8b6028668696 1081
lewisdaw3 0:8b6028668696 1082 // make sure we have a response
lewisdaw3 0:8b6028668696 1083 if (res_len == 0)
lewisdaw3 0:8b6028668696 1084 return false;
lewisdaw3 0:8b6028668696 1085
lewisdaw3 0:8b6028668696 1086 // skip mode
lewisdaw3 0:8b6028668696 1087 tok = strtok(gpsbuffer, ",");
lewisdaw3 0:8b6028668696 1088 if (! tok) return false;
lewisdaw3 0:8b6028668696 1089
lewisdaw3 0:8b6028668696 1090 // skip lat
lewisdaw3 0:8b6028668696 1091 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1092 if (! tok) return false;
lewisdaw3 0:8b6028668696 1093
lewisdaw3 0:8b6028668696 1094 // skip long
lewisdaw3 0:8b6028668696 1095 tok = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1096 if (! tok) return false;
lewisdaw3 0:8b6028668696 1097
lewisdaw3 0:8b6028668696 1098 // grab altitude
lewisdaw3 0:8b6028668696 1099 char *altp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1100 if (! altp) return false;
lewisdaw3 0:8b6028668696 1101
lewisdaw3 0:8b6028668696 1102 *altitude = atof(altp);
lewisdaw3 0:8b6028668696 1103 }
lewisdaw3 0:8b6028668696 1104
lewisdaw3 0:8b6028668696 1105 return true;
lewisdaw3 0:8b6028668696 1106
lewisdaw3 0:8b6028668696 1107 }
lewisdaw3 0:8b6028668696 1108
lewisdaw3 0:8b6028668696 1109 boolean Adafruit_FONA::enableGPSNMEA(uint8_t i) {
lewisdaw3 0:8b6028668696 1110
lewisdaw3 0:8b6028668696 1111 char sendbuff[15] = "AT+CGPSOUT=000";
lewisdaw3 0:8b6028668696 1112 sendbuff[11] = (i / 100) + '0';
lewisdaw3 0:8b6028668696 1113 i %= 100;
lewisdaw3 0:8b6028668696 1114 sendbuff[12] = (i / 10) + '0';
lewisdaw3 0:8b6028668696 1115 i %= 10;
lewisdaw3 0:8b6028668696 1116 sendbuff[13] = i + '0';
lewisdaw3 0:8b6028668696 1117
lewisdaw3 0:8b6028668696 1118 if (_type == FONA808_V2) {
lewisdaw3 0:8b6028668696 1119 if (i)
lewisdaw3 0:8b6028668696 1120 return sendCheckReply(F("AT+CGNSTST=1"), ok_reply);
lewisdaw3 0:8b6028668696 1121 else
lewisdaw3 0:8b6028668696 1122 return sendCheckReply(F("AT+CGNSTST=0"), ok_reply);
lewisdaw3 0:8b6028668696 1123 } else {
lewisdaw3 0:8b6028668696 1124 return sendCheckReply(sendbuff, ok_reply, 2000);
lewisdaw3 0:8b6028668696 1125 }
lewisdaw3 0:8b6028668696 1126 }
lewisdaw3 0:8b6028668696 1127
lewisdaw3 0:8b6028668696 1128
lewisdaw3 0:8b6028668696 1129 /********* GPRS **********************************************************/
lewisdaw3 0:8b6028668696 1130
lewisdaw3 0:8b6028668696 1131
lewisdaw3 0:8b6028668696 1132 boolean Adafruit_FONA::enableGPRS(boolean onoff) {
lewisdaw3 0:8b6028668696 1133
lewisdaw3 0:8b6028668696 1134 if (onoff) {
lewisdaw3 0:8b6028668696 1135 // disconnect all sockets
lewisdaw3 0:8b6028668696 1136 sendCheckReply(F("AT+CIPSHUT"), F("SHUT OK"), 20000);
lewisdaw3 0:8b6028668696 1137
lewisdaw3 0:8b6028668696 1138 if (! sendCheckReply(F("AT+CGATT=1"), ok_reply, 10000))
lewisdaw3 0:8b6028668696 1139 return false;
lewisdaw3 0:8b6028668696 1140
lewisdaw3 0:8b6028668696 1141 // set bearer profile! connection type GPRS
lewisdaw3 0:8b6028668696 1142 if (! sendCheckReply(F("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""),
lewisdaw3 0:8b6028668696 1143 ok_reply, 10000))
lewisdaw3 0:8b6028668696 1144 return false;
lewisdaw3 0:8b6028668696 1145
lewisdaw3 0:8b6028668696 1146 // set bearer profile access point name
lewisdaw3 0:8b6028668696 1147 if (apn) {
lewisdaw3 0:8b6028668696 1148 // Send command AT+SAPBR=3,1,"APN","<apn value>" where <apn value> is the configured APN value.
lewisdaw3 0:8b6028668696 1149 if (! sendCheckReplyQuoted(F("AT+SAPBR=3,1,\"APN\","), apn, ok_reply, 10000))
lewisdaw3 0:8b6028668696 1150 return false;
lewisdaw3 0:8b6028668696 1151
lewisdaw3 0:8b6028668696 1152 // send AT+CSTT,"apn","user","pass"
lewisdaw3 0:8b6028668696 1153 flushInput();
lewisdaw3 0:8b6028668696 1154
lewisdaw3 0:8b6028668696 1155 mySerial->print(F("AT+CSTT=\""));
lewisdaw3 0:8b6028668696 1156 mySerial->print(apn);
lewisdaw3 0:8b6028668696 1157 if (apnusername) {
lewisdaw3 0:8b6028668696 1158 mySerial->print("\",\"");
lewisdaw3 0:8b6028668696 1159 mySerial->print(apnusername);
lewisdaw3 0:8b6028668696 1160 }
lewisdaw3 0:8b6028668696 1161 if (apnpassword) {
lewisdaw3 0:8b6028668696 1162 mySerial->print("\",\"");
lewisdaw3 0:8b6028668696 1163 mySerial->print(apnpassword);
lewisdaw3 0:8b6028668696 1164 }
lewisdaw3 0:8b6028668696 1165 mySerial->println("\"");
lewisdaw3 0:8b6028668696 1166
lewisdaw3 0:8b6028668696 1167 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINT(F("AT+CSTT=\""));
lewisdaw3 0:8b6028668696 1168 DEBUG_PRINT(apn);
lewisdaw3 0:8b6028668696 1169
lewisdaw3 0:8b6028668696 1170 if (apnusername) {
lewisdaw3 0:8b6028668696 1171 DEBUG_PRINT("\",\"");
lewisdaw3 0:8b6028668696 1172 DEBUG_PRINT(apnusername);
lewisdaw3 0:8b6028668696 1173 }
lewisdaw3 0:8b6028668696 1174 if (apnpassword) {
lewisdaw3 0:8b6028668696 1175 DEBUG_PRINT("\",\"");
lewisdaw3 0:8b6028668696 1176 DEBUG_PRINT(apnpassword);
lewisdaw3 0:8b6028668696 1177 }
lewisdaw3 0:8b6028668696 1178 DEBUG_PRINTLN("\"");
lewisdaw3 0:8b6028668696 1179
lewisdaw3 0:8b6028668696 1180 if (! expectReply(ok_reply)) return false;
lewisdaw3 0:8b6028668696 1181
lewisdaw3 0:8b6028668696 1182 // set username/password
lewisdaw3 0:8b6028668696 1183 if (apnusername) {
lewisdaw3 0:8b6028668696 1184 // Send command AT+SAPBR=3,1,"USER","<user>" where <user> is the configured APN username.
lewisdaw3 0:8b6028668696 1185 if (! sendCheckReplyQuoted(F("AT+SAPBR=3,1,\"USER\","), apnusername, ok_reply, 10000))
lewisdaw3 0:8b6028668696 1186 return false;
lewisdaw3 0:8b6028668696 1187 }
lewisdaw3 0:8b6028668696 1188 if (apnpassword) {
lewisdaw3 0:8b6028668696 1189 // Send command AT+SAPBR=3,1,"PWD","<password>" where <password> is the configured APN password.
lewisdaw3 0:8b6028668696 1190 if (! sendCheckReplyQuoted(F("AT+SAPBR=3,1,\"PWD\","), apnpassword, ok_reply, 10000))
lewisdaw3 0:8b6028668696 1191 return false;
lewisdaw3 0:8b6028668696 1192 }
lewisdaw3 0:8b6028668696 1193 }
lewisdaw3 0:8b6028668696 1194
lewisdaw3 0:8b6028668696 1195 // open GPRS context
lewisdaw3 0:8b6028668696 1196 if (! sendCheckReply(F("AT+SAPBR=1,1"), ok_reply, 30000))
lewisdaw3 0:8b6028668696 1197 return false;
lewisdaw3 0:8b6028668696 1198
lewisdaw3 0:8b6028668696 1199 // bring up wireless connection
lewisdaw3 0:8b6028668696 1200 if (! sendCheckReply(F("AT+CIICR"), ok_reply, 10000))
lewisdaw3 0:8b6028668696 1201 return false;
lewisdaw3 0:8b6028668696 1202
lewisdaw3 0:8b6028668696 1203 } else {
lewisdaw3 0:8b6028668696 1204 // disconnect all sockets
lewisdaw3 0:8b6028668696 1205 if (! sendCheckReply(F("AT+CIPSHUT"), F("SHUT OK"), 20000))
lewisdaw3 0:8b6028668696 1206 return false;
lewisdaw3 0:8b6028668696 1207
lewisdaw3 0:8b6028668696 1208 // close GPRS context
lewisdaw3 0:8b6028668696 1209 if (! sendCheckReply(F("AT+SAPBR=0,1"), ok_reply, 10000))
lewisdaw3 0:8b6028668696 1210 return false;
lewisdaw3 0:8b6028668696 1211
lewisdaw3 0:8b6028668696 1212 if (! sendCheckReply(F("AT+CGATT=0"), ok_reply, 10000))
lewisdaw3 0:8b6028668696 1213 return false;
lewisdaw3 0:8b6028668696 1214
lewisdaw3 0:8b6028668696 1215 }
lewisdaw3 0:8b6028668696 1216 return true;
lewisdaw3 0:8b6028668696 1217 }
lewisdaw3 0:8b6028668696 1218
lewisdaw3 0:8b6028668696 1219 boolean Adafruit_FONA_3G::enableGPRS(boolean onoff) {
lewisdaw3 0:8b6028668696 1220
lewisdaw3 0:8b6028668696 1221 if (onoff) {
lewisdaw3 0:8b6028668696 1222 // disconnect all sockets
lewisdaw3 0:8b6028668696 1223 //sendCheckReply(F("AT+CIPSHUT"), F("SHUT OK"), 5000);
lewisdaw3 0:8b6028668696 1224
lewisdaw3 0:8b6028668696 1225 if (! sendCheckReply(F("AT+CGATT=1"), ok_reply, 10000))
lewisdaw3 0:8b6028668696 1226 return false;
lewisdaw3 0:8b6028668696 1227
lewisdaw3 0:8b6028668696 1228
lewisdaw3 0:8b6028668696 1229 // set bearer profile access point name
lewisdaw3 0:8b6028668696 1230 if (apn) {
lewisdaw3 0:8b6028668696 1231 // Send command AT+CGSOCKCONT=1,"IP","<apn value>" where <apn value> is the configured APN name.
lewisdaw3 0:8b6028668696 1232 if (! sendCheckReplyQuoted(F("AT+CGSOCKCONT=1,\"IP\","), apn, ok_reply, 10000))
lewisdaw3 0:8b6028668696 1233 return false;
lewisdaw3 0:8b6028668696 1234
lewisdaw3 0:8b6028668696 1235 // set username/password
lewisdaw3 0:8b6028668696 1236 if (apnusername) {
lewisdaw3 0:8b6028668696 1237 char authstring[100] = "AT+CGAUTH=1,1,\"";
lewisdaw3 0:8b6028668696 1238 char *strp = authstring + strlen(authstring);
lewisdaw3 0:8b6028668696 1239 prog_char_strcpy(strp, (prog_char *)apnusername);
lewisdaw3 0:8b6028668696 1240 strp+=prog_char_strlen((prog_char *)apnusername);
lewisdaw3 0:8b6028668696 1241 strp[0] = '\"';
lewisdaw3 0:8b6028668696 1242 strp++;
lewisdaw3 0:8b6028668696 1243 strp[0] = 0;
lewisdaw3 0:8b6028668696 1244
lewisdaw3 0:8b6028668696 1245 if (apnpassword) {
lewisdaw3 0:8b6028668696 1246 strp[0] = ','; strp++;
lewisdaw3 0:8b6028668696 1247 strp[0] = '\"'; strp++;
lewisdaw3 0:8b6028668696 1248 prog_char_strcpy(strp, (prog_char *)apnpassword);
lewisdaw3 0:8b6028668696 1249 strp+=prog_char_strlen((prog_char *)apnpassword);
lewisdaw3 0:8b6028668696 1250 strp[0] = '\"';
lewisdaw3 0:8b6028668696 1251 strp++;
lewisdaw3 0:8b6028668696 1252 strp[0] = 0;
lewisdaw3 0:8b6028668696 1253 }
lewisdaw3 0:8b6028668696 1254
lewisdaw3 0:8b6028668696 1255 if (! sendCheckReply(authstring, ok_reply, 10000))
lewisdaw3 0:8b6028668696 1256 return false;
lewisdaw3 0:8b6028668696 1257 }
lewisdaw3 0:8b6028668696 1258 }
lewisdaw3 0:8b6028668696 1259
lewisdaw3 0:8b6028668696 1260 // connect in transparent
lewisdaw3 0:8b6028668696 1261 if (! sendCheckReply(F("AT+CIPMODE=1"), ok_reply, 10000))
lewisdaw3 0:8b6028668696 1262 return false;
lewisdaw3 0:8b6028668696 1263 // open network (?)
lewisdaw3 0:8b6028668696 1264 if (! sendCheckReply(F("AT+NETOPEN=,,1"), F("Network opened"), 10000))
lewisdaw3 0:8b6028668696 1265 return false;
lewisdaw3 0:8b6028668696 1266
lewisdaw3 0:8b6028668696 1267 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 1268 } else {
lewisdaw3 0:8b6028668696 1269 // close GPRS context
lewisdaw3 0:8b6028668696 1270 if (! sendCheckReply(F("AT+NETCLOSE"), F("Network closed"), 10000))
lewisdaw3 0:8b6028668696 1271 return false;
lewisdaw3 0:8b6028668696 1272
lewisdaw3 0:8b6028668696 1273 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 1274 }
lewisdaw3 0:8b6028668696 1275
lewisdaw3 0:8b6028668696 1276 return true;
lewisdaw3 0:8b6028668696 1277 }
lewisdaw3 0:8b6028668696 1278
lewisdaw3 0:8b6028668696 1279 uint8_t Adafruit_FONA::GPRSstate(void) {
lewisdaw3 0:8b6028668696 1280 uint16_t state;
lewisdaw3 0:8b6028668696 1281
lewisdaw3 0:8b6028668696 1282 if (! sendParseReply(F("AT+CGATT?"), F("+CGATT: "), &state) )
lewisdaw3 0:8b6028668696 1283 return -1;
lewisdaw3 0:8b6028668696 1284
lewisdaw3 0:8b6028668696 1285 return state;
lewisdaw3 0:8b6028668696 1286 }
lewisdaw3 0:8b6028668696 1287
lewisdaw3 0:8b6028668696 1288 void Adafruit_FONA::setGPRSNetworkSettings(FONAFlashStringPtr apn,
lewisdaw3 0:8b6028668696 1289 FONAFlashStringPtr username, FONAFlashStringPtr password) {
lewisdaw3 0:8b6028668696 1290 this->apn = apn;
lewisdaw3 0:8b6028668696 1291 this->apnusername = username;
lewisdaw3 0:8b6028668696 1292 this->apnpassword = password;
lewisdaw3 0:8b6028668696 1293 }
lewisdaw3 0:8b6028668696 1294
lewisdaw3 0:8b6028668696 1295 boolean Adafruit_FONA::getGSMLoc(uint16_t *errorcode, char *buff, uint16_t maxlen) {
lewisdaw3 0:8b6028668696 1296
lewisdaw3 0:8b6028668696 1297 getReply(F("AT+CIPGSMLOC=1,1"), (uint16_t)10000);
lewisdaw3 0:8b6028668696 1298
lewisdaw3 0:8b6028668696 1299 if (! parseReply(F("+CIPGSMLOC: "), errorcode))
lewisdaw3 0:8b6028668696 1300 return false;
lewisdaw3 0:8b6028668696 1301
lewisdaw3 0:8b6028668696 1302 char *p = replybuffer+14;
lewisdaw3 0:8b6028668696 1303 uint16_t lentocopy = min(maxlen-1, strlen(p));
lewisdaw3 0:8b6028668696 1304 strncpy(buff, p, lentocopy+1);
lewisdaw3 0:8b6028668696 1305
lewisdaw3 0:8b6028668696 1306 readline(); // eat OK
lewisdaw3 0:8b6028668696 1307
lewisdaw3 0:8b6028668696 1308 return true;
lewisdaw3 0:8b6028668696 1309 }
lewisdaw3 0:8b6028668696 1310
lewisdaw3 0:8b6028668696 1311 boolean Adafruit_FONA::getGSMLoc(float *lat, float *lon) {
lewisdaw3 0:8b6028668696 1312
lewisdaw3 0:8b6028668696 1313 uint16_t returncode;
lewisdaw3 0:8b6028668696 1314 char gpsbuffer[120];
lewisdaw3 0:8b6028668696 1315
lewisdaw3 0:8b6028668696 1316 // make sure we could get a response
lewisdaw3 0:8b6028668696 1317 if (! getGSMLoc(&returncode, gpsbuffer, 120))
lewisdaw3 0:8b6028668696 1318 return false;
lewisdaw3 0:8b6028668696 1319
lewisdaw3 0:8b6028668696 1320 // make sure we have a valid return code
lewisdaw3 0:8b6028668696 1321 if (returncode != 0)
lewisdaw3 0:8b6028668696 1322 return false;
lewisdaw3 0:8b6028668696 1323
lewisdaw3 0:8b6028668696 1324 // +CIPGSMLOC: 0,-74.007729,40.730160,2015/10/15,19:24:55
lewisdaw3 0:8b6028668696 1325 // tokenize the gps buffer to locate the lat & long
lewisdaw3 0:8b6028668696 1326 char *longp = strtok(gpsbuffer, ",");
lewisdaw3 0:8b6028668696 1327 if (! longp) return false;
lewisdaw3 0:8b6028668696 1328
lewisdaw3 0:8b6028668696 1329 char *latp = strtok(NULL, ",");
lewisdaw3 0:8b6028668696 1330 if (! latp) return false;
lewisdaw3 0:8b6028668696 1331
lewisdaw3 0:8b6028668696 1332 *lat = atof(latp);
lewisdaw3 0:8b6028668696 1333 *lon = atof(longp);
lewisdaw3 0:8b6028668696 1334
lewisdaw3 0:8b6028668696 1335 return true;
lewisdaw3 0:8b6028668696 1336
lewisdaw3 0:8b6028668696 1337 }
lewisdaw3 0:8b6028668696 1338 /********* TCP FUNCTIONS ************************************/
lewisdaw3 0:8b6028668696 1339
lewisdaw3 0:8b6028668696 1340
lewisdaw3 0:8b6028668696 1341 boolean Adafruit_FONA::TCPconnect(char *server, uint16_t port) {
lewisdaw3 0:8b6028668696 1342 flushInput();
lewisdaw3 0:8b6028668696 1343
lewisdaw3 0:8b6028668696 1344 // close all old connections
lewisdaw3 0:8b6028668696 1345 if (! sendCheckReply(F("AT+CIPSHUT"), F("SHUT OK"), 20000) ) return false;
lewisdaw3 0:8b6028668696 1346
lewisdaw3 0:8b6028668696 1347 // single connection at a time
lewisdaw3 0:8b6028668696 1348 if (! sendCheckReply(F("AT+CIPMUX=0"), ok_reply) ) return false;
lewisdaw3 0:8b6028668696 1349
lewisdaw3 0:8b6028668696 1350 // manually read data
lewisdaw3 0:8b6028668696 1351 if (! sendCheckReply(F("AT+CIPRXGET=1"), ok_reply) ) return false;
lewisdaw3 0:8b6028668696 1352
lewisdaw3 0:8b6028668696 1353
lewisdaw3 0:8b6028668696 1354 DEBUG_PRINT(F("AT+CIPSTART=\"TCP\",\""));
lewisdaw3 0:8b6028668696 1355 DEBUG_PRINT(server);
lewisdaw3 0:8b6028668696 1356 DEBUG_PRINT(F("\",\""));
lewisdaw3 0:8b6028668696 1357 DEBUG_PRINT(port);
lewisdaw3 0:8b6028668696 1358 DEBUG_PRINTLN(F("\""));
lewisdaw3 0:8b6028668696 1359
lewisdaw3 0:8b6028668696 1360
lewisdaw3 0:8b6028668696 1361 mySerial->print(F("AT+CIPSTART=\"TCP\",\""));
lewisdaw3 0:8b6028668696 1362 mySerial->print(server);
lewisdaw3 0:8b6028668696 1363 mySerial->print(F("\",\""));
lewisdaw3 0:8b6028668696 1364 mySerial->print(port);
lewisdaw3 0:8b6028668696 1365 mySerial->println(F("\""));
lewisdaw3 0:8b6028668696 1366
lewisdaw3 0:8b6028668696 1367 if (! expectReply(ok_reply)) return false;
lewisdaw3 0:8b6028668696 1368 if (! expectReply(F("CONNECT OK"))) return false;
lewisdaw3 0:8b6028668696 1369
lewisdaw3 0:8b6028668696 1370 // looks like it was a success (?)
lewisdaw3 0:8b6028668696 1371 return true;
lewisdaw3 0:8b6028668696 1372 }
lewisdaw3 0:8b6028668696 1373
lewisdaw3 0:8b6028668696 1374 boolean Adafruit_FONA::TCPclose(void) {
lewisdaw3 0:8b6028668696 1375 return sendCheckReply(F("AT+CIPCLOSE"), ok_reply);
lewisdaw3 0:8b6028668696 1376 }
lewisdaw3 0:8b6028668696 1377
lewisdaw3 0:8b6028668696 1378 boolean Adafruit_FONA::TCPconnected(void) {
lewisdaw3 0:8b6028668696 1379 if (! sendCheckReply(F("AT+CIPSTATUS"), ok_reply, 100) ) return false;
lewisdaw3 0:8b6028668696 1380 readline(100);
lewisdaw3 0:8b6028668696 1381
lewisdaw3 0:8b6028668696 1382 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1383
lewisdaw3 0:8b6028668696 1384 return (strcmp(replybuffer, "STATE: CONNECT OK") == 0);
lewisdaw3 0:8b6028668696 1385 }
lewisdaw3 0:8b6028668696 1386
lewisdaw3 0:8b6028668696 1387 boolean Adafruit_FONA::TCPsend(char *packet, uint8_t len) {
lewisdaw3 0:8b6028668696 1388
lewisdaw3 0:8b6028668696 1389 DEBUG_PRINT(F("AT+CIPSEND="));
lewisdaw3 0:8b6028668696 1390 DEBUG_PRINTLN(len);
lewisdaw3 0:8b6028668696 1391 #ifdef ADAFRUIT_FONA_DEBUG
lewisdaw3 0:8b6028668696 1392 for (uint16_t i=0; i<len; i++) {
lewisdaw3 0:8b6028668696 1393 DEBUG_PRINT(F(" 0x"));
lewisdaw3 0:8b6028668696 1394 DEBUG_PRINT(packet[i], HEX);
lewisdaw3 0:8b6028668696 1395 }
lewisdaw3 0:8b6028668696 1396 #endif
lewisdaw3 0:8b6028668696 1397 DEBUG_PRINTLN();
lewisdaw3 0:8b6028668696 1398
lewisdaw3 0:8b6028668696 1399
lewisdaw3 0:8b6028668696 1400 mySerial->print(F("AT+CIPSEND="));
lewisdaw3 0:8b6028668696 1401 mySerial->println(len);
lewisdaw3 0:8b6028668696 1402 readline();
lewisdaw3 0:8b6028668696 1403
lewisdaw3 0:8b6028668696 1404 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1405
lewisdaw3 0:8b6028668696 1406 if (replybuffer[0] != '>') return false;
lewisdaw3 0:8b6028668696 1407
lewisdaw3 0:8b6028668696 1408 mySerial->write(packet, len);
lewisdaw3 0:8b6028668696 1409 readline(3000); // wait up to 3 seconds to send the data
lewisdaw3 0:8b6028668696 1410
lewisdaw3 0:8b6028668696 1411 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1412
lewisdaw3 0:8b6028668696 1413
lewisdaw3 0:8b6028668696 1414 return (strcmp(replybuffer, "SEND OK") == 0);
lewisdaw3 0:8b6028668696 1415 }
lewisdaw3 0:8b6028668696 1416
lewisdaw3 0:8b6028668696 1417 uint16_t Adafruit_FONA::TCPavailable(void) {
lewisdaw3 0:8b6028668696 1418 uint16_t avail;
lewisdaw3 0:8b6028668696 1419
lewisdaw3 0:8b6028668696 1420 if (! sendParseReply(F("AT+CIPRXGET=4"), F("+CIPRXGET: 4,"), &avail, ',', 0) ) return false;
lewisdaw3 0:8b6028668696 1421
lewisdaw3 0:8b6028668696 1422
lewisdaw3 0:8b6028668696 1423 DEBUG_PRINT (avail); DEBUG_PRINTLN(F(" bytes available"));
lewisdaw3 0:8b6028668696 1424
lewisdaw3 0:8b6028668696 1425
lewisdaw3 0:8b6028668696 1426 return avail;
lewisdaw3 0:8b6028668696 1427 }
lewisdaw3 0:8b6028668696 1428
lewisdaw3 0:8b6028668696 1429
lewisdaw3 0:8b6028668696 1430 uint16_t Adafruit_FONA::TCPread(uint8_t *buff, uint8_t len) {
lewisdaw3 0:8b6028668696 1431 uint16_t avail;
lewisdaw3 0:8b6028668696 1432
lewisdaw3 0:8b6028668696 1433 mySerial->print(F("AT+CIPRXGET=2,"));
lewisdaw3 0:8b6028668696 1434 mySerial->println(len);
lewisdaw3 0:8b6028668696 1435 readline();
lewisdaw3 0:8b6028668696 1436 if (! parseReply(F("+CIPRXGET: 2,"), &avail, ',', 0)) return false;
lewisdaw3 0:8b6028668696 1437
lewisdaw3 0:8b6028668696 1438 readRaw(avail);
lewisdaw3 0:8b6028668696 1439
lewisdaw3 0:8b6028668696 1440 #ifdef ADAFRUIT_FONA_DEBUG
lewisdaw3 0:8b6028668696 1441 DEBUG_PRINT (avail); DEBUG_PRINTLN(F(" bytes read"));
lewisdaw3 0:8b6028668696 1442 for (uint8_t i=0;i<avail;i++) {
lewisdaw3 0:8b6028668696 1443 DEBUG_PRINT(F(" 0x")); DEBUG_PRINT(replybuffer[i], HEX);
lewisdaw3 0:8b6028668696 1444 }
lewisdaw3 0:8b6028668696 1445 DEBUG_PRINTLN();
lewisdaw3 0:8b6028668696 1446 #endif
lewisdaw3 0:8b6028668696 1447
lewisdaw3 0:8b6028668696 1448 memcpy(buff, replybuffer, avail);
lewisdaw3 0:8b6028668696 1449
lewisdaw3 0:8b6028668696 1450 return avail;
lewisdaw3 0:8b6028668696 1451 }
lewisdaw3 0:8b6028668696 1452
lewisdaw3 0:8b6028668696 1453
lewisdaw3 0:8b6028668696 1454
lewisdaw3 0:8b6028668696 1455 /********* HTTP LOW LEVEL FUNCTIONS ************************************/
lewisdaw3 0:8b6028668696 1456
lewisdaw3 0:8b6028668696 1457 boolean Adafruit_FONA::HTTP_init() {
lewisdaw3 0:8b6028668696 1458 return sendCheckReply(F("AT+HTTPINIT"), ok_reply);
lewisdaw3 0:8b6028668696 1459 }
lewisdaw3 0:8b6028668696 1460
lewisdaw3 0:8b6028668696 1461 boolean Adafruit_FONA::HTTP_term() {
lewisdaw3 0:8b6028668696 1462 return sendCheckReply(F("AT+HTTPTERM"), ok_reply);
lewisdaw3 0:8b6028668696 1463 }
lewisdaw3 0:8b6028668696 1464
lewisdaw3 0:8b6028668696 1465 void Adafruit_FONA::HTTP_para_start(FONAFlashStringPtr parameter,
lewisdaw3 0:8b6028668696 1466 boolean quoted) {
lewisdaw3 0:8b6028668696 1467 flushInput();
lewisdaw3 0:8b6028668696 1468
lewisdaw3 0:8b6028668696 1469
lewisdaw3 0:8b6028668696 1470 DEBUG_PRINT(F("\t---> "));
lewisdaw3 0:8b6028668696 1471 DEBUG_PRINT(F("AT+HTTPPARA=\""));
lewisdaw3 0:8b6028668696 1472 DEBUG_PRINT(parameter);
lewisdaw3 0:8b6028668696 1473 DEBUG_PRINTLN('"');
lewisdaw3 0:8b6028668696 1474
lewisdaw3 0:8b6028668696 1475
lewisdaw3 0:8b6028668696 1476 mySerial->print(F("AT+HTTPPARA=\""));
lewisdaw3 0:8b6028668696 1477 mySerial->print(parameter);
lewisdaw3 0:8b6028668696 1478 if (quoted)
lewisdaw3 0:8b6028668696 1479 mySerial->print(F("\",\""));
lewisdaw3 0:8b6028668696 1480 else
lewisdaw3 0:8b6028668696 1481 mySerial->print(F("\","));
lewisdaw3 0:8b6028668696 1482 }
lewisdaw3 0:8b6028668696 1483
lewisdaw3 0:8b6028668696 1484 boolean Adafruit_FONA::HTTP_para_end(boolean quoted) {
lewisdaw3 0:8b6028668696 1485 if (quoted)
lewisdaw3 0:8b6028668696 1486 mySerial->println('"');
lewisdaw3 0:8b6028668696 1487 else
lewisdaw3 0:8b6028668696 1488 mySerial->println();
lewisdaw3 0:8b6028668696 1489
lewisdaw3 0:8b6028668696 1490 return expectReply(ok_reply);
lewisdaw3 0:8b6028668696 1491 }
lewisdaw3 0:8b6028668696 1492
lewisdaw3 0:8b6028668696 1493 boolean Adafruit_FONA::HTTP_para(FONAFlashStringPtr parameter,
lewisdaw3 0:8b6028668696 1494 const char *value) {
lewisdaw3 0:8b6028668696 1495 HTTP_para_start(parameter, true);
lewisdaw3 0:8b6028668696 1496 mySerial->print(value);
lewisdaw3 0:8b6028668696 1497 return HTTP_para_end(true);
lewisdaw3 0:8b6028668696 1498 }
lewisdaw3 0:8b6028668696 1499
lewisdaw3 0:8b6028668696 1500 boolean Adafruit_FONA::HTTP_para(FONAFlashStringPtr parameter,
lewisdaw3 0:8b6028668696 1501 FONAFlashStringPtr value) {
lewisdaw3 0:8b6028668696 1502 HTTP_para_start(parameter, true);
lewisdaw3 0:8b6028668696 1503 mySerial->print(value);
lewisdaw3 0:8b6028668696 1504 return HTTP_para_end(true);
lewisdaw3 0:8b6028668696 1505 }
lewisdaw3 0:8b6028668696 1506
lewisdaw3 0:8b6028668696 1507 boolean Adafruit_FONA::HTTP_para(FONAFlashStringPtr parameter,
lewisdaw3 0:8b6028668696 1508 int32_t value) {
lewisdaw3 0:8b6028668696 1509 HTTP_para_start(parameter, false);
lewisdaw3 0:8b6028668696 1510 mySerial->print(value);
lewisdaw3 0:8b6028668696 1511 return HTTP_para_end(false);
lewisdaw3 0:8b6028668696 1512 }
lewisdaw3 0:8b6028668696 1513
lewisdaw3 0:8b6028668696 1514 boolean Adafruit_FONA::HTTP_data(uint32_t size, uint32_t maxTime) {
lewisdaw3 0:8b6028668696 1515 flushInput();
lewisdaw3 0:8b6028668696 1516
lewisdaw3 0:8b6028668696 1517
lewisdaw3 0:8b6028668696 1518 DEBUG_PRINT(F("\t---> "));
lewisdaw3 0:8b6028668696 1519 DEBUG_PRINT(F("AT+HTTPDATA="));
lewisdaw3 0:8b6028668696 1520 DEBUG_PRINT(size);
lewisdaw3 0:8b6028668696 1521 DEBUG_PRINT(',');
lewisdaw3 0:8b6028668696 1522 DEBUG_PRINTLN(maxTime);
lewisdaw3 0:8b6028668696 1523
lewisdaw3 0:8b6028668696 1524
lewisdaw3 0:8b6028668696 1525 mySerial->print(F("AT+HTTPDATA="));
lewisdaw3 0:8b6028668696 1526 mySerial->print(size);
lewisdaw3 0:8b6028668696 1527 mySerial->print(",");
lewisdaw3 0:8b6028668696 1528 mySerial->println(maxTime);
lewisdaw3 0:8b6028668696 1529
lewisdaw3 0:8b6028668696 1530 return expectReply(F("DOWNLOAD"));
lewisdaw3 0:8b6028668696 1531 }
lewisdaw3 0:8b6028668696 1532
lewisdaw3 0:8b6028668696 1533 boolean Adafruit_FONA::HTTP_action(uint8_t method, uint16_t *status,
lewisdaw3 0:8b6028668696 1534 uint16_t *datalen, int32_t timeout) {
lewisdaw3 0:8b6028668696 1535 // Send request.
lewisdaw3 0:8b6028668696 1536 if (! sendCheckReply(F("AT+HTTPACTION="), method, ok_reply))
lewisdaw3 0:8b6028668696 1537 return false;
lewisdaw3 0:8b6028668696 1538
lewisdaw3 0:8b6028668696 1539 // Parse response status and size.
lewisdaw3 0:8b6028668696 1540 readline(timeout);
lewisdaw3 0:8b6028668696 1541 if (! parseReply(F("+HTTPACTION:"), status, ',', 1))
lewisdaw3 0:8b6028668696 1542 return false;
lewisdaw3 0:8b6028668696 1543 if (! parseReply(F("+HTTPACTION:"), datalen, ',', 2))
lewisdaw3 0:8b6028668696 1544 return false;
lewisdaw3 0:8b6028668696 1545
lewisdaw3 0:8b6028668696 1546 return true;
lewisdaw3 0:8b6028668696 1547 }
lewisdaw3 0:8b6028668696 1548
lewisdaw3 0:8b6028668696 1549 boolean Adafruit_FONA::HTTP_readall(uint16_t *datalen) {
lewisdaw3 0:8b6028668696 1550 getReply(F("AT+HTTPREAD"));
lewisdaw3 0:8b6028668696 1551 if (! parseReply(F("+HTTPREAD:"), datalen, ',', 0))
lewisdaw3 0:8b6028668696 1552 return false;
lewisdaw3 0:8b6028668696 1553
lewisdaw3 0:8b6028668696 1554 return true;
lewisdaw3 0:8b6028668696 1555 }
lewisdaw3 0:8b6028668696 1556
lewisdaw3 0:8b6028668696 1557 boolean Adafruit_FONA::HTTP_ssl(boolean onoff) {
lewisdaw3 0:8b6028668696 1558 return sendCheckReply(F("AT+HTTPSSL="), onoff ? 1 : 0, ok_reply);
lewisdaw3 0:8b6028668696 1559 }
lewisdaw3 0:8b6028668696 1560
lewisdaw3 0:8b6028668696 1561 /********* HTTP HIGH LEVEL FUNCTIONS ***************************/
lewisdaw3 0:8b6028668696 1562
lewisdaw3 0:8b6028668696 1563 boolean Adafruit_FONA::HTTP_GET_start(char *url,
lewisdaw3 0:8b6028668696 1564 uint16_t *status, uint16_t *datalen){
lewisdaw3 0:8b6028668696 1565 if (! HTTP_setup(url))
lewisdaw3 0:8b6028668696 1566 return false;
lewisdaw3 0:8b6028668696 1567
lewisdaw3 0:8b6028668696 1568 // HTTP GET
lewisdaw3 0:8b6028668696 1569 if (! HTTP_action(FONA_HTTP_GET, status, datalen, 30000))
lewisdaw3 0:8b6028668696 1570 return false;
lewisdaw3 0:8b6028668696 1571
lewisdaw3 0:8b6028668696 1572 DEBUG_PRINT(F("Status: ")); DEBUG_PRINTLN(*status);
lewisdaw3 0:8b6028668696 1573 DEBUG_PRINT(F("Len: ")); DEBUG_PRINTLN(*datalen);
lewisdaw3 0:8b6028668696 1574
lewisdaw3 0:8b6028668696 1575 // HTTP response data
lewisdaw3 0:8b6028668696 1576 if (! HTTP_readall(datalen))
lewisdaw3 0:8b6028668696 1577 return false;
lewisdaw3 0:8b6028668696 1578
lewisdaw3 0:8b6028668696 1579 return true;
lewisdaw3 0:8b6028668696 1580 }
lewisdaw3 0:8b6028668696 1581
lewisdaw3 0:8b6028668696 1582 /*
lewisdaw3 0:8b6028668696 1583 boolean Adafruit_FONA_3G::HTTP_GET_start(char *ipaddr, char *path, uint16_t port
lewisdaw3 0:8b6028668696 1584 uint16_t *status, uint16_t *datalen){
lewisdaw3 0:8b6028668696 1585 char send[100] = "AT+CHTTPACT=\"";
lewisdaw3 0:8b6028668696 1586 char *sendp = send + strlen(send);
lewisdaw3 0:8b6028668696 1587 memset(sendp, 0, 100 - strlen(send));
lewisdaw3 0:8b6028668696 1588
lewisdaw3 0:8b6028668696 1589 strcpy(sendp, ipaddr);
lewisdaw3 0:8b6028668696 1590 sendp+=strlen(ipaddr);
lewisdaw3 0:8b6028668696 1591 sendp[0] = '\"';
lewisdaw3 0:8b6028668696 1592 sendp++;
lewisdaw3 0:8b6028668696 1593 sendp[0] = ',';
lewisdaw3 0:8b6028668696 1594 itoa(sendp, port);
lewisdaw3 0:8b6028668696 1595 getReply(send, 500);
lewisdaw3 0:8b6028668696 1596
lewisdaw3 0:8b6028668696 1597 return;
lewisdaw3 0:8b6028668696 1598
lewisdaw3 0:8b6028668696 1599 if (! HTTP_setup(url))
lewisdaw3 0:8b6028668696 1600
lewisdaw3 0:8b6028668696 1601 return false;
lewisdaw3 0:8b6028668696 1602
lewisdaw3 0:8b6028668696 1603 // HTTP GET
lewisdaw3 0:8b6028668696 1604 if (! HTTP_action(FONA_HTTP_GET, status, datalen))
lewisdaw3 0:8b6028668696 1605 return false;
lewisdaw3 0:8b6028668696 1606
lewisdaw3 0:8b6028668696 1607 DEBUG_PRINT("Status: "); DEBUG_PRINTLN(*status);
lewisdaw3 0:8b6028668696 1608 DEBUG_PRINT("Len: "); DEBUG_PRINTLN(*datalen);
lewisdaw3 0:8b6028668696 1609
lewisdaw3 0:8b6028668696 1610 // HTTP response data
lewisdaw3 0:8b6028668696 1611 if (! HTTP_readall(datalen))
lewisdaw3 0:8b6028668696 1612 return false;
lewisdaw3 0:8b6028668696 1613
lewisdaw3 0:8b6028668696 1614 return true;
lewisdaw3 0:8b6028668696 1615 }
lewisdaw3 0:8b6028668696 1616 */
lewisdaw3 0:8b6028668696 1617
lewisdaw3 0:8b6028668696 1618 void Adafruit_FONA::HTTP_GET_end(void) {
lewisdaw3 0:8b6028668696 1619 HTTP_term();
lewisdaw3 0:8b6028668696 1620 }
lewisdaw3 0:8b6028668696 1621
lewisdaw3 0:8b6028668696 1622 boolean Adafruit_FONA::HTTP_POST_start(char *url,
lewisdaw3 0:8b6028668696 1623 FONAFlashStringPtr contenttype,
lewisdaw3 0:8b6028668696 1624 const uint8_t *postdata, uint16_t postdatalen,
lewisdaw3 0:8b6028668696 1625 uint16_t *status, uint16_t *datalen){
lewisdaw3 0:8b6028668696 1626 if (! HTTP_setup(url))
lewisdaw3 0:8b6028668696 1627 return false;
lewisdaw3 0:8b6028668696 1628
lewisdaw3 0:8b6028668696 1629 if (! HTTP_para(F("CONTENT"), contenttype)) {
lewisdaw3 0:8b6028668696 1630 return false;
lewisdaw3 0:8b6028668696 1631 }
lewisdaw3 0:8b6028668696 1632
lewisdaw3 0:8b6028668696 1633 // HTTP POST data
lewisdaw3 0:8b6028668696 1634 if (! HTTP_data(postdatalen, 10000))
lewisdaw3 0:8b6028668696 1635 return false;
lewisdaw3 0:8b6028668696 1636 mySerial->write(postdata, postdatalen);
lewisdaw3 0:8b6028668696 1637 if (! expectReply(ok_reply))
lewisdaw3 0:8b6028668696 1638 return false;
lewisdaw3 0:8b6028668696 1639
lewisdaw3 0:8b6028668696 1640 // HTTP POST
lewisdaw3 0:8b6028668696 1641 if (! HTTP_action(FONA_HTTP_POST, status, datalen))
lewisdaw3 0:8b6028668696 1642 return false;
lewisdaw3 0:8b6028668696 1643
lewisdaw3 0:8b6028668696 1644 DEBUG_PRINT(F("Status: ")); DEBUG_PRINTLN(*status);
lewisdaw3 0:8b6028668696 1645 DEBUG_PRINT(F("Len: ")); DEBUG_PRINTLN(*datalen);
lewisdaw3 0:8b6028668696 1646
lewisdaw3 0:8b6028668696 1647 // HTTP response data
lewisdaw3 0:8b6028668696 1648 if (! HTTP_readall(datalen))
lewisdaw3 0:8b6028668696 1649 return false;
lewisdaw3 0:8b6028668696 1650
lewisdaw3 0:8b6028668696 1651 return true;
lewisdaw3 0:8b6028668696 1652 }
lewisdaw3 0:8b6028668696 1653
lewisdaw3 0:8b6028668696 1654 void Adafruit_FONA::HTTP_POST_end(void) {
lewisdaw3 0:8b6028668696 1655 HTTP_term();
lewisdaw3 0:8b6028668696 1656 }
lewisdaw3 0:8b6028668696 1657
lewisdaw3 0:8b6028668696 1658 void Adafruit_FONA::setUserAgent(FONAFlashStringPtr useragent) {
lewisdaw3 0:8b6028668696 1659 this->useragent = useragent;
lewisdaw3 0:8b6028668696 1660 }
lewisdaw3 0:8b6028668696 1661
lewisdaw3 0:8b6028668696 1662 void Adafruit_FONA::setHTTPSRedirect(boolean onoff) {
lewisdaw3 0:8b6028668696 1663 httpsredirect = onoff;
lewisdaw3 0:8b6028668696 1664 }
lewisdaw3 0:8b6028668696 1665
lewisdaw3 0:8b6028668696 1666 /********* HTTP HELPERS ****************************************/
lewisdaw3 0:8b6028668696 1667
lewisdaw3 0:8b6028668696 1668 boolean Adafruit_FONA::HTTP_setup(char *url) {
lewisdaw3 0:8b6028668696 1669 // Handle any pending
lewisdaw3 0:8b6028668696 1670 HTTP_term();
lewisdaw3 0:8b6028668696 1671
lewisdaw3 0:8b6028668696 1672 // Initialize and set parameters
lewisdaw3 0:8b6028668696 1673 if (! HTTP_init())
lewisdaw3 0:8b6028668696 1674 return false;
lewisdaw3 0:8b6028668696 1675 if (! HTTP_para(F("CID"), 1))
lewisdaw3 0:8b6028668696 1676 return false;
lewisdaw3 0:8b6028668696 1677 if (! HTTP_para(F("UA"), useragent))
lewisdaw3 0:8b6028668696 1678 return false;
lewisdaw3 0:8b6028668696 1679 if (! HTTP_para(F("URL"), url))
lewisdaw3 0:8b6028668696 1680 return false;
lewisdaw3 0:8b6028668696 1681
lewisdaw3 0:8b6028668696 1682 // HTTPS redirect
lewisdaw3 0:8b6028668696 1683 if (httpsredirect) {
lewisdaw3 0:8b6028668696 1684 if (! HTTP_para(F("REDIR"),1))
lewisdaw3 0:8b6028668696 1685 return false;
lewisdaw3 0:8b6028668696 1686
lewisdaw3 0:8b6028668696 1687 if (! HTTP_ssl(true))
lewisdaw3 0:8b6028668696 1688 return false;
lewisdaw3 0:8b6028668696 1689 }
lewisdaw3 0:8b6028668696 1690
lewisdaw3 0:8b6028668696 1691 return true;
lewisdaw3 0:8b6028668696 1692 }
lewisdaw3 0:8b6028668696 1693
lewisdaw3 0:8b6028668696 1694 /********* HELPERS *********************************************/
lewisdaw3 0:8b6028668696 1695
lewisdaw3 0:8b6028668696 1696 boolean Adafruit_FONA::expectReply(FONAFlashStringPtr reply,
lewisdaw3 0:8b6028668696 1697 uint16_t timeout) {
lewisdaw3 0:8b6028668696 1698 readline(timeout);
lewisdaw3 0:8b6028668696 1699
lewisdaw3 0:8b6028668696 1700 DEBUG_PRINT(F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1701
lewisdaw3 0:8b6028668696 1702 return (prog_char_strcmp(replybuffer, (prog_char*)reply) == 0);
lewisdaw3 0:8b6028668696 1703 }
lewisdaw3 0:8b6028668696 1704
lewisdaw3 0:8b6028668696 1705 /********* LOW LEVEL *******************************************/
lewisdaw3 0:8b6028668696 1706
lewisdaw3 0:8b6028668696 1707 inline int Adafruit_FONA::available(void) {
lewisdaw3 0:8b6028668696 1708 return mySerial->available();
lewisdaw3 0:8b6028668696 1709 }
lewisdaw3 0:8b6028668696 1710
lewisdaw3 0:8b6028668696 1711 inline size_t Adafruit_FONA::write(uint8_t x) {
lewisdaw3 0:8b6028668696 1712 return mySerial->write(x);
lewisdaw3 0:8b6028668696 1713 }
lewisdaw3 0:8b6028668696 1714
lewisdaw3 0:8b6028668696 1715 inline int Adafruit_FONA::read(void) {
lewisdaw3 0:8b6028668696 1716 return mySerial->read();
lewisdaw3 0:8b6028668696 1717 }
lewisdaw3 0:8b6028668696 1718
lewisdaw3 0:8b6028668696 1719 inline int Adafruit_FONA::peek(void) {
lewisdaw3 0:8b6028668696 1720 return mySerial->peek();
lewisdaw3 0:8b6028668696 1721 }
lewisdaw3 0:8b6028668696 1722
lewisdaw3 0:8b6028668696 1723 inline void Adafruit_FONA::flush() {
lewisdaw3 0:8b6028668696 1724 mySerial->flush();
lewisdaw3 0:8b6028668696 1725 }
lewisdaw3 0:8b6028668696 1726
lewisdaw3 0:8b6028668696 1727 void Adafruit_FONA::flushInput() {
lewisdaw3 0:8b6028668696 1728 // Read all available serial input to flush pending data.
lewisdaw3 0:8b6028668696 1729 uint16_t timeoutloop = 0;
lewisdaw3 0:8b6028668696 1730 while (timeoutloop++ < 40) {
lewisdaw3 0:8b6028668696 1731 while(available()) {
lewisdaw3 0:8b6028668696 1732 read();
lewisdaw3 0:8b6028668696 1733 timeoutloop = 0; // If char was received reset the timer
lewisdaw3 0:8b6028668696 1734 }
lewisdaw3 0:8b6028668696 1735 delay(1);
lewisdaw3 0:8b6028668696 1736 }
lewisdaw3 0:8b6028668696 1737 }
lewisdaw3 0:8b6028668696 1738
lewisdaw3 0:8b6028668696 1739 uint16_t Adafruit_FONA::readRaw(uint16_t b) {
lewisdaw3 0:8b6028668696 1740 uint16_t idx = 0;
lewisdaw3 0:8b6028668696 1741
lewisdaw3 0:8b6028668696 1742 while (b && (idx < sizeof(replybuffer)-1)) {
lewisdaw3 0:8b6028668696 1743 if (mySerial->available()) {
lewisdaw3 0:8b6028668696 1744 replybuffer[idx] = mySerial->read();
lewisdaw3 0:8b6028668696 1745 idx++;
lewisdaw3 0:8b6028668696 1746 b--;
lewisdaw3 0:8b6028668696 1747 }
lewisdaw3 0:8b6028668696 1748 }
lewisdaw3 0:8b6028668696 1749 replybuffer[idx] = 0;
lewisdaw3 0:8b6028668696 1750
lewisdaw3 0:8b6028668696 1751 return idx;
lewisdaw3 0:8b6028668696 1752 }
lewisdaw3 0:8b6028668696 1753
lewisdaw3 0:8b6028668696 1754 uint8_t Adafruit_FONA::readline(uint16_t timeout, boolean multiline) {
lewisdaw3 0:8b6028668696 1755 uint16_t replyidx = 0;
lewisdaw3 0:8b6028668696 1756
lewisdaw3 0:8b6028668696 1757 while (timeout--) {
lewisdaw3 0:8b6028668696 1758 if (replyidx >= 254) {
lewisdaw3 0:8b6028668696 1759 //DEBUG_PRINTLN(F("SPACE"));
lewisdaw3 0:8b6028668696 1760 break;
lewisdaw3 0:8b6028668696 1761 }
lewisdaw3 0:8b6028668696 1762
lewisdaw3 0:8b6028668696 1763 while(mySerial->available()) {
lewisdaw3 0:8b6028668696 1764 char c = mySerial->read();
lewisdaw3 0:8b6028668696 1765 if (c == '\r') continue;
lewisdaw3 0:8b6028668696 1766 if (c == 0xA) {
lewisdaw3 0:8b6028668696 1767 if (replyidx == 0) // the first 0x0A is ignored
lewisdaw3 0:8b6028668696 1768 continue;
lewisdaw3 0:8b6028668696 1769
lewisdaw3 0:8b6028668696 1770 if (!multiline) {
lewisdaw3 0:8b6028668696 1771 timeout = 0; // the second 0x0A is the end of the line
lewisdaw3 0:8b6028668696 1772 break;
lewisdaw3 0:8b6028668696 1773 }
lewisdaw3 0:8b6028668696 1774 }
lewisdaw3 0:8b6028668696 1775 replybuffer[replyidx] = c;
lewisdaw3 0:8b6028668696 1776 //DEBUG_PRINT(c, HEX); DEBUG_PRINT("#"); DEBUG_PRINTLN(c);
lewisdaw3 0:8b6028668696 1777 replyidx++;
lewisdaw3 0:8b6028668696 1778 }
lewisdaw3 0:8b6028668696 1779
lewisdaw3 0:8b6028668696 1780 if (timeout == 0) {
lewisdaw3 0:8b6028668696 1781 //DEBUG_PRINTLN(F("TIMEOUT"));
lewisdaw3 0:8b6028668696 1782 break;
lewisdaw3 0:8b6028668696 1783 }
lewisdaw3 0:8b6028668696 1784 delay(1);
lewisdaw3 0:8b6028668696 1785 }
lewisdaw3 0:8b6028668696 1786 replybuffer[replyidx] = 0; // null term
lewisdaw3 0:8b6028668696 1787 return replyidx;
lewisdaw3 0:8b6028668696 1788 }
lewisdaw3 0:8b6028668696 1789
lewisdaw3 0:8b6028668696 1790 uint8_t Adafruit_FONA::getReply(char *send, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1791 flushInput();
lewisdaw3 0:8b6028668696 1792
lewisdaw3 0:8b6028668696 1793
lewisdaw3 0:8b6028668696 1794 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINTLN(send);
lewisdaw3 0:8b6028668696 1795
lewisdaw3 0:8b6028668696 1796
lewisdaw3 0:8b6028668696 1797 mySerial->println(send);
lewisdaw3 0:8b6028668696 1798
lewisdaw3 0:8b6028668696 1799 uint8_t l = readline(timeout);
lewisdaw3 0:8b6028668696 1800
lewisdaw3 0:8b6028668696 1801 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1802
lewisdaw3 0:8b6028668696 1803 return l;
lewisdaw3 0:8b6028668696 1804 }
lewisdaw3 0:8b6028668696 1805
lewisdaw3 0:8b6028668696 1806 uint8_t Adafruit_FONA::getReply(FONAFlashStringPtr send, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1807 flushInput();
lewisdaw3 0:8b6028668696 1808
lewisdaw3 0:8b6028668696 1809
lewisdaw3 0:8b6028668696 1810 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINTLN(send);
lewisdaw3 0:8b6028668696 1811
lewisdaw3 0:8b6028668696 1812
lewisdaw3 0:8b6028668696 1813 mySerial->println(send);
lewisdaw3 0:8b6028668696 1814
lewisdaw3 0:8b6028668696 1815 uint8_t l = readline(timeout);
lewisdaw3 0:8b6028668696 1816
lewisdaw3 0:8b6028668696 1817 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1818
lewisdaw3 0:8b6028668696 1819 return l;
lewisdaw3 0:8b6028668696 1820 }
lewisdaw3 0:8b6028668696 1821
lewisdaw3 0:8b6028668696 1822 // Send prefix, suffix, and newline. Return response (and also set replybuffer with response).
lewisdaw3 0:8b6028668696 1823 uint8_t Adafruit_FONA::getReply(FONAFlashStringPtr prefix, char *suffix, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1824 flushInput();
lewisdaw3 0:8b6028668696 1825
lewisdaw3 0:8b6028668696 1826
lewisdaw3 0:8b6028668696 1827 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINT(prefix); DEBUG_PRINTLN(suffix);
lewisdaw3 0:8b6028668696 1828
lewisdaw3 0:8b6028668696 1829
lewisdaw3 0:8b6028668696 1830 mySerial->print(prefix);
lewisdaw3 0:8b6028668696 1831 mySerial->println(suffix);
lewisdaw3 0:8b6028668696 1832
lewisdaw3 0:8b6028668696 1833 uint8_t l = readline(timeout);
lewisdaw3 0:8b6028668696 1834
lewisdaw3 0:8b6028668696 1835 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1836
lewisdaw3 0:8b6028668696 1837 return l;
lewisdaw3 0:8b6028668696 1838 }
lewisdaw3 0:8b6028668696 1839
lewisdaw3 0:8b6028668696 1840 // Send prefix, suffix, and newline. Return response (and also set replybuffer with response).
lewisdaw3 0:8b6028668696 1841 uint8_t Adafruit_FONA::getReply(FONAFlashStringPtr prefix, int32_t suffix, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1842 flushInput();
lewisdaw3 0:8b6028668696 1843
lewisdaw3 0:8b6028668696 1844
lewisdaw3 0:8b6028668696 1845 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINT(prefix); DEBUG_PRINTLN(suffix, DEC);
lewisdaw3 0:8b6028668696 1846
lewisdaw3 0:8b6028668696 1847
lewisdaw3 0:8b6028668696 1848 mySerial->print(prefix);
lewisdaw3 0:8b6028668696 1849 mySerial->println(suffix, DEC);
lewisdaw3 0:8b6028668696 1850
lewisdaw3 0:8b6028668696 1851 uint8_t l = readline(timeout);
lewisdaw3 0:8b6028668696 1852
lewisdaw3 0:8b6028668696 1853 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1854
lewisdaw3 0:8b6028668696 1855 return l;
lewisdaw3 0:8b6028668696 1856 }
lewisdaw3 0:8b6028668696 1857
lewisdaw3 0:8b6028668696 1858 // Send prefix, suffix, suffix2, and newline. Return response (and also set replybuffer with response).
lewisdaw3 0:8b6028668696 1859 uint8_t Adafruit_FONA::getReply(FONAFlashStringPtr prefix, int32_t suffix1, int32_t suffix2, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1860 flushInput();
lewisdaw3 0:8b6028668696 1861
lewisdaw3 0:8b6028668696 1862
lewisdaw3 0:8b6028668696 1863 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINT(prefix);
lewisdaw3 0:8b6028668696 1864 DEBUG_PRINT(suffix1, DEC); DEBUG_PRINT(','); DEBUG_PRINTLN(suffix2, DEC);
lewisdaw3 0:8b6028668696 1865
lewisdaw3 0:8b6028668696 1866
lewisdaw3 0:8b6028668696 1867 mySerial->print(prefix);
lewisdaw3 0:8b6028668696 1868 mySerial->print(suffix1);
lewisdaw3 0:8b6028668696 1869 mySerial->print(',');
lewisdaw3 0:8b6028668696 1870 mySerial->println(suffix2, DEC);
lewisdaw3 0:8b6028668696 1871
lewisdaw3 0:8b6028668696 1872 uint8_t l = readline(timeout);
lewisdaw3 0:8b6028668696 1873
lewisdaw3 0:8b6028668696 1874 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1875
lewisdaw3 0:8b6028668696 1876 return l;
lewisdaw3 0:8b6028668696 1877 }
lewisdaw3 0:8b6028668696 1878
lewisdaw3 0:8b6028668696 1879 // Send prefix, ", suffix, ", and newline. Return response (and also set replybuffer with response).
lewisdaw3 0:8b6028668696 1880 uint8_t Adafruit_FONA::getReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1881 flushInput();
lewisdaw3 0:8b6028668696 1882
lewisdaw3 0:8b6028668696 1883
lewisdaw3 0:8b6028668696 1884 DEBUG_PRINT(F("\t---> ")); DEBUG_PRINT(prefix);
lewisdaw3 0:8b6028668696 1885 DEBUG_PRINT('"'); DEBUG_PRINT(suffix); DEBUG_PRINTLN('"');
lewisdaw3 0:8b6028668696 1886
lewisdaw3 0:8b6028668696 1887
lewisdaw3 0:8b6028668696 1888 mySerial->print(prefix);
lewisdaw3 0:8b6028668696 1889 mySerial->print('"');
lewisdaw3 0:8b6028668696 1890 mySerial->print(suffix);
lewisdaw3 0:8b6028668696 1891 mySerial->println('"');
lewisdaw3 0:8b6028668696 1892
lewisdaw3 0:8b6028668696 1893 uint8_t l = readline(timeout);
lewisdaw3 0:8b6028668696 1894
lewisdaw3 0:8b6028668696 1895 DEBUG_PRINT (F("\t<--- ")); DEBUG_PRINTLN(replybuffer);
lewisdaw3 0:8b6028668696 1896
lewisdaw3 0:8b6028668696 1897 return l;
lewisdaw3 0:8b6028668696 1898 }
lewisdaw3 0:8b6028668696 1899
lewisdaw3 0:8b6028668696 1900 boolean Adafruit_FONA::sendCheckReply(char *send, char *reply, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1901 if (! getReply(send, timeout) )
lewisdaw3 0:8b6028668696 1902 return false;
lewisdaw3 0:8b6028668696 1903 /*
lewisdaw3 0:8b6028668696 1904 for (uint8_t i=0; i<strlen(replybuffer); i++) {
lewisdaw3 0:8b6028668696 1905 DEBUG_PRINT(replybuffer[i], HEX); DEBUG_PRINT(" ");
lewisdaw3 0:8b6028668696 1906 }
lewisdaw3 0:8b6028668696 1907 DEBUG_PRINTLN();
lewisdaw3 0:8b6028668696 1908 for (uint8_t i=0; i<strlen(reply); i++) {
lewisdaw3 0:8b6028668696 1909 DEBUG_PRINT(reply[i], HEX); DEBUG_PRINT(" ");
lewisdaw3 0:8b6028668696 1910 }
lewisdaw3 0:8b6028668696 1911 DEBUG_PRINTLN();
lewisdaw3 0:8b6028668696 1912 */
lewisdaw3 0:8b6028668696 1913 return (strcmp(replybuffer, reply) == 0);
lewisdaw3 0:8b6028668696 1914 }
lewisdaw3 0:8b6028668696 1915
lewisdaw3 0:8b6028668696 1916 boolean Adafruit_FONA::sendCheckReply(FONAFlashStringPtr send, FONAFlashStringPtr reply, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1917 if (! getReply(send, timeout) )
lewisdaw3 0:8b6028668696 1918 return false;
lewisdaw3 0:8b6028668696 1919
lewisdaw3 0:8b6028668696 1920 return (prog_char_strcmp(replybuffer, (prog_char*)reply) == 0);
lewisdaw3 0:8b6028668696 1921 }
lewisdaw3 0:8b6028668696 1922
lewisdaw3 0:8b6028668696 1923 boolean Adafruit_FONA::sendCheckReply(char* send, FONAFlashStringPtr reply, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1924 if (! getReply(send, timeout) )
lewisdaw3 0:8b6028668696 1925 return false;
lewisdaw3 0:8b6028668696 1926 return (prog_char_strcmp(replybuffer, (prog_char*)reply) == 0);
lewisdaw3 0:8b6028668696 1927 }
lewisdaw3 0:8b6028668696 1928
lewisdaw3 0:8b6028668696 1929
lewisdaw3 0:8b6028668696 1930 // Send prefix, suffix, and newline. Verify FONA response matches reply parameter.
lewisdaw3 0:8b6028668696 1931 boolean Adafruit_FONA::sendCheckReply(FONAFlashStringPtr prefix, char *suffix, FONAFlashStringPtr reply, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1932 getReply(prefix, suffix, timeout);
lewisdaw3 0:8b6028668696 1933 return (prog_char_strcmp(replybuffer, (prog_char*)reply) == 0);
lewisdaw3 0:8b6028668696 1934 }
lewisdaw3 0:8b6028668696 1935
lewisdaw3 0:8b6028668696 1936 // Send prefix, suffix, and newline. Verify FONA response matches reply parameter.
lewisdaw3 0:8b6028668696 1937 boolean Adafruit_FONA::sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix, FONAFlashStringPtr reply, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1938 getReply(prefix, suffix, timeout);
lewisdaw3 0:8b6028668696 1939 return (prog_char_strcmp(replybuffer, (prog_char*)reply) == 0);
lewisdaw3 0:8b6028668696 1940 }
lewisdaw3 0:8b6028668696 1941
lewisdaw3 0:8b6028668696 1942 // Send prefix, suffix, suffix2, and newline. Verify FONA response matches reply parameter.
lewisdaw3 0:8b6028668696 1943 boolean Adafruit_FONA::sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix1, int32_t suffix2, FONAFlashStringPtr reply, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1944 getReply(prefix, suffix1, suffix2, timeout);
lewisdaw3 0:8b6028668696 1945 return (prog_char_strcmp(replybuffer, (prog_char*)reply) == 0);
lewisdaw3 0:8b6028668696 1946 }
lewisdaw3 0:8b6028668696 1947
lewisdaw3 0:8b6028668696 1948 // Send prefix, ", suffix, ", and newline. Verify FONA response matches reply parameter.
lewisdaw3 0:8b6028668696 1949 boolean Adafruit_FONA::sendCheckReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, FONAFlashStringPtr reply, uint16_t timeout) {
lewisdaw3 0:8b6028668696 1950 getReplyQuoted(prefix, suffix, timeout);
lewisdaw3 0:8b6028668696 1951 return (prog_char_strcmp(replybuffer, (prog_char*)reply) == 0);
lewisdaw3 0:8b6028668696 1952 }
lewisdaw3 0:8b6028668696 1953
lewisdaw3 0:8b6028668696 1954
lewisdaw3 0:8b6028668696 1955 boolean Adafruit_FONA::parseReply(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 1956 uint16_t *v, char divider, uint8_t index) {
lewisdaw3 0:8b6028668696 1957 char *p = prog_char_strstr(replybuffer, (prog_char*)toreply); // get the pointer to the voltage
lewisdaw3 0:8b6028668696 1958 if (p == 0) return false;
lewisdaw3 0:8b6028668696 1959 p+=prog_char_strlen((prog_char*)toreply);
lewisdaw3 0:8b6028668696 1960 //DEBUG_PRINTLN(p);
lewisdaw3 0:8b6028668696 1961 for (uint8_t i=0; i<index;i++) {
lewisdaw3 0:8b6028668696 1962 // increment dividers
lewisdaw3 0:8b6028668696 1963 p = strchr(p, divider);
lewisdaw3 0:8b6028668696 1964 if (!p) return false;
lewisdaw3 0:8b6028668696 1965 p++;
lewisdaw3 0:8b6028668696 1966 //DEBUG_PRINTLN(p);
lewisdaw3 0:8b6028668696 1967
lewisdaw3 0:8b6028668696 1968 }
lewisdaw3 0:8b6028668696 1969 *v = atoi(p);
lewisdaw3 0:8b6028668696 1970
lewisdaw3 0:8b6028668696 1971 return true;
lewisdaw3 0:8b6028668696 1972 }
lewisdaw3 0:8b6028668696 1973
lewisdaw3 0:8b6028668696 1974 boolean Adafruit_FONA::parseReply(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 1975 char *v, char divider, uint8_t index) {
lewisdaw3 0:8b6028668696 1976 uint8_t i=0;
lewisdaw3 0:8b6028668696 1977 char *p = prog_char_strstr(replybuffer, (prog_char*)toreply);
lewisdaw3 0:8b6028668696 1978 if (p == 0) return false;
lewisdaw3 0:8b6028668696 1979 p+=prog_char_strlen((prog_char*)toreply);
lewisdaw3 0:8b6028668696 1980
lewisdaw3 0:8b6028668696 1981 for (i=0; i<index;i++) {
lewisdaw3 0:8b6028668696 1982 // increment dividers
lewisdaw3 0:8b6028668696 1983 p = strchr(p, divider);
lewisdaw3 0:8b6028668696 1984 if (!p) return false;
lewisdaw3 0:8b6028668696 1985 p++;
lewisdaw3 0:8b6028668696 1986 }
lewisdaw3 0:8b6028668696 1987
lewisdaw3 0:8b6028668696 1988 for(i=0; i<strlen(p);i++) {
lewisdaw3 0:8b6028668696 1989 if(p[i] == divider)
lewisdaw3 0:8b6028668696 1990 break;
lewisdaw3 0:8b6028668696 1991 v[i] = p[i];
lewisdaw3 0:8b6028668696 1992 }
lewisdaw3 0:8b6028668696 1993
lewisdaw3 0:8b6028668696 1994 v[i] = '\0';
lewisdaw3 0:8b6028668696 1995
lewisdaw3 0:8b6028668696 1996 return true;
lewisdaw3 0:8b6028668696 1997 }
lewisdaw3 0:8b6028668696 1998
lewisdaw3 0:8b6028668696 1999 // Parse a quoted string in the response fields and copy its value (without quotes)
lewisdaw3 0:8b6028668696 2000 // to the specified character array (v). Only up to maxlen characters are copied
lewisdaw3 0:8b6028668696 2001 // into the result buffer, so make sure to pass a large enough buffer to handle the
lewisdaw3 0:8b6028668696 2002 // response.
lewisdaw3 0:8b6028668696 2003 boolean Adafruit_FONA::parseReplyQuoted(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 2004 char *v, int maxlen, char divider, uint8_t index) {
lewisdaw3 0:8b6028668696 2005 uint8_t i=0, j;
lewisdaw3 0:8b6028668696 2006 // Verify response starts with toreply.
lewisdaw3 0:8b6028668696 2007 char *p = prog_char_strstr(replybuffer, (prog_char*)toreply);
lewisdaw3 0:8b6028668696 2008 if (p == 0) return false;
lewisdaw3 0:8b6028668696 2009 p+=prog_char_strlen((prog_char*)toreply);
lewisdaw3 0:8b6028668696 2010
lewisdaw3 0:8b6028668696 2011 // Find location of desired response field.
lewisdaw3 0:8b6028668696 2012 for (i=0; i<index;i++) {
lewisdaw3 0:8b6028668696 2013 // increment dividers
lewisdaw3 0:8b6028668696 2014 p = strchr(p, divider);
lewisdaw3 0:8b6028668696 2015 if (!p) return false;
lewisdaw3 0:8b6028668696 2016 p++;
lewisdaw3 0:8b6028668696 2017 }
lewisdaw3 0:8b6028668696 2018
lewisdaw3 0:8b6028668696 2019 // Copy characters from response field into result string.
lewisdaw3 0:8b6028668696 2020 for(i=0, j=0; j<maxlen && i<strlen(p); ++i) {
lewisdaw3 0:8b6028668696 2021 // Stop if a divier is found.
lewisdaw3 0:8b6028668696 2022 if(p[i] == divider)
lewisdaw3 0:8b6028668696 2023 break;
lewisdaw3 0:8b6028668696 2024 // Skip any quotation marks.
lewisdaw3 0:8b6028668696 2025 else if(p[i] == '"')
lewisdaw3 0:8b6028668696 2026 continue;
lewisdaw3 0:8b6028668696 2027 v[j++] = p[i];
lewisdaw3 0:8b6028668696 2028 }
lewisdaw3 0:8b6028668696 2029
lewisdaw3 0:8b6028668696 2030 // Add a null terminator if result string buffer was not filled.
lewisdaw3 0:8b6028668696 2031 if (j < maxlen)
lewisdaw3 0:8b6028668696 2032 v[j] = '\0';
lewisdaw3 0:8b6028668696 2033
lewisdaw3 0:8b6028668696 2034 return true;
lewisdaw3 0:8b6028668696 2035 }
lewisdaw3 0:8b6028668696 2036
lewisdaw3 0:8b6028668696 2037 boolean Adafruit_FONA::sendParseReply(FONAFlashStringPtr tosend,
lewisdaw3 0:8b6028668696 2038 FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 2039 uint16_t *v, char divider, uint8_t index) {
lewisdaw3 0:8b6028668696 2040 getReply(tosend);
lewisdaw3 0:8b6028668696 2041
lewisdaw3 0:8b6028668696 2042 if (! parseReply(toreply, v, divider, index)) return false;
lewisdaw3 0:8b6028668696 2043
lewisdaw3 0:8b6028668696 2044 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 2045
lewisdaw3 0:8b6028668696 2046 return true;
lewisdaw3 0:8b6028668696 2047 }
lewisdaw3 0:8b6028668696 2048
lewisdaw3 0:8b6028668696 2049
lewisdaw3 0:8b6028668696 2050 // needed for CBC and others
lewisdaw3 0:8b6028668696 2051
lewisdaw3 0:8b6028668696 2052 boolean Adafruit_FONA_3G::sendParseReply(FONAFlashStringPtr tosend,
lewisdaw3 0:8b6028668696 2053 FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 2054 float *f, char divider, uint8_t index) {
lewisdaw3 0:8b6028668696 2055 getReply(tosend);
lewisdaw3 0:8b6028668696 2056
lewisdaw3 0:8b6028668696 2057 if (! parseReply(toreply, f, divider, index)) return false;
lewisdaw3 0:8b6028668696 2058
lewisdaw3 0:8b6028668696 2059 readline(); // eat 'OK'
lewisdaw3 0:8b6028668696 2060
lewisdaw3 0:8b6028668696 2061 return true;
lewisdaw3 0:8b6028668696 2062 }
lewisdaw3 0:8b6028668696 2063
lewisdaw3 0:8b6028668696 2064
lewisdaw3 0:8b6028668696 2065 boolean Adafruit_FONA_3G::parseReply(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 2066 float *f, char divider, uint8_t index) {
lewisdaw3 0:8b6028668696 2067 char *p = prog_char_strstr(replybuffer, (prog_char*)toreply); // get the pointer to the voltage
lewisdaw3 0:8b6028668696 2068 if (p == 0) return false;
lewisdaw3 0:8b6028668696 2069 p+=prog_char_strlen((prog_char*)toreply);
lewisdaw3 0:8b6028668696 2070 //DEBUG_PRINTLN(p);
lewisdaw3 0:8b6028668696 2071 for (uint8_t i=0; i<index;i++) {
lewisdaw3 0:8b6028668696 2072 // increment dividers
lewisdaw3 0:8b6028668696 2073 p = strchr(p, divider);
lewisdaw3 0:8b6028668696 2074 if (!p) return false;
lewisdaw3 0:8b6028668696 2075 p++;
lewisdaw3 0:8b6028668696 2076 //DEBUG_PRINTLN(p);
lewisdaw3 0:8b6028668696 2077
lewisdaw3 0:8b6028668696 2078 }
lewisdaw3 0:8b6028668696 2079 *f = atof(p);
lewisdaw3 0:8b6028668696 2080
lewisdaw3 0:8b6028668696 2081 return true;
lewisdaw3 0:8b6028668696 2082 }