Version working with mbed-os

Dependents:  

Fork of Adafruit_FONA_Library by Jesse van Rhijn

Revision:
8:aacbc647caee
Parent:
6:b675eab1c47a
--- a/Adafruit_FONA.cpp	Fri Feb 17 10:40:30 2017 +0000
+++ b/Adafruit_FONA.cpp	Wed May 24 09:19:56 2017 +0000
@@ -1,16 +1,16 @@
 /***************************************************
   This is a library for our Adafruit FONA Cellular Module
-
+ 
   Designed specifically to work with the Adafruit FONA
   ----> http://www.adafruit.com/products/1946
   ----> http://www.adafruit.com/products/1963
-
+ 
   These displays use TTL Serial to communicate, 2 pins are required to
   interface
   Adafruit invests time and resources providing this open source code,
   please support Adafruit and open-source hardware by purchasing
   products from Adafruit!
-
+ 
   Written by Limor Fried/Ladyada for Adafruit Industries.
   BSD license, all text above must be included in any redistribution
  ****************************************************/
@@ -20,10 +20,10 @@
   */
 #include <algorithm>
 #include "Adafruit_FONA.h"
-
+ 
 #define HIGH 1
 #define LOW 0
-
+ 
 bool Adafruit_FONA::begin(int baudrate) {
     mySerial.baud(baudrate);
     mySerial.attach(this, &Adafruit_FONA::onSerialDataReceived, Serial::RxIrq);
@@ -56,17 +56,17 @@
     
     return true;
 }
-
+ 
 void Adafruit_FONA::setEventListener(EventListener *eventListener) {
     this->eventListener = eventListener;
 }
-
+ 
 /********* Stream ********************************************/
-
+ 
 int Adafruit_FONA::_putc(int value) {
     return mySerial.putc(value);
 }
-
+ 
 int Adafruit_FONA::_getc() {
     __disable_irq(); // Start Critical Section - don't interrupt while changing global buffer variables
     
@@ -86,11 +86,11 @@
     
     return data;
 }
-
+ 
 int Adafruit_FONA::readable() {
     return !isRxBufferEmpty();
 }
-
+ 
 void Adafruit_FONA::onSerialDataReceived() {
     while (mySerial.readable() && !isRxBufferFull()) {
         int data = mySerial.getc();
@@ -125,33 +125,33 @@
         incrementRxBufferInIndex();
     }
 }
-
+ 
 /********* Real Time Clock ********************************************/
-
+ 
 bool Adafruit_FONA::enableRTC(uint8_t i) {
     if (! sendCheckReply("AT+CLTS=", i, "OK")) 
         return false;
     return sendCheckReply("AT&W", "OK");
 }
-
+ 
 /********* BATTERY & ADC ********************************************/
-
+ 
 /* returns value in mV (uint16_t) */
 bool Adafruit_FONA::getBattVoltage(uint16_t *v) {
     return sendParseReply("AT+CBC", "+CBC: ", v, ',', 2);
 }
-
+ 
 /* returns the percentage charge of battery as reported by sim800 */
 bool Adafruit_FONA::getBattPercent(uint16_t *p) {
     return sendParseReply("AT+CBC", "+CBC: ", p, ',', 1);
 }
-
+ 
 bool Adafruit_FONA::getADCVoltage(uint16_t *v) {
     return sendParseReply("AT+CADC?", "+CADC: 1,", v);
 }
-
+ 
 /********* SIM ***********************************************************/
-
+ 
 bool Adafruit_FONA::unlockSIM(char *pin)
 {
     char sendbuff[14] = "AT+CPIN=";
@@ -163,7 +163,7 @@
     
     return sendCheckReply(sendbuff, "OK");
 }
-
+ 
 uint8_t Adafruit_FONA::getSIMCCID(char *ccid) {
     getReply("AT+CCID");
     // up to 20 chars
@@ -174,9 +174,9 @@
     
     return strlen(ccid);
 }
-
+ 
 /********* IMEI **********************************************************/
-
+ 
 uint8_t Adafruit_FONA::getIMEI(char *imei) {
     getReply("AT+GSN");
     
@@ -188,9 +188,9 @@
     
     return strlen(imei);
 }
-
+ 
 /********* NETWORK *******************************************************/
-
+ 
 uint8_t Adafruit_FONA::getNetworkStatus(void) {
     uint16_t status;
     
@@ -198,8 +198,8 @@
     
     return status;
 }
-
-
+ 
+ 
 uint8_t Adafruit_FONA::getRSSI(void) {
     uint16_t reply;
     
@@ -207,16 +207,16 @@
     
     return reply;
 }
-
+ 
 /********* AUDIO *******************************************************/
-
+ 
 bool Adafruit_FONA::setAudio(uint8_t a) {
     // 0 is headset, 1 is external audio
     if (a > 1) return false;
     
     return sendCheckReply("AT+CHFA=", a, "OK");
 }
-
+ 
 uint8_t Adafruit_FONA::getVolume(void) {
     uint16_t reply;
     
@@ -224,12 +224,12 @@
     
     return reply;
 }
-
+ 
 bool Adafruit_FONA::setVolume(uint8_t i) {
     return sendCheckReply("AT+CLVL=", i, "OK");
 }
-
-
+ 
+ 
 bool Adafruit_FONA::playDTMF(char dtmf) {
     char str[4];
     str[0] = '\"';
@@ -238,21 +238,21 @@
     str[3] = 0;
     return sendCheckReply("AT+CLDTMF=3,", str, "OK");
 }
-
+ 
 bool Adafruit_FONA::playToolkitTone(uint8_t t, uint16_t len) {
     return sendCheckReply("AT+STTONE=1,", t, len, "OK");
 }
-
+ 
 bool Adafruit_FONA::setMicVolume(uint8_t a, uint8_t level) {
     // 0 is headset, 1 is external audio
     if (a > 1) return false;
     
     return sendCheckReply("AT+CMIC=", a, level, "OK");
 }
-
+ 
 /********* FM RADIO *******************************************************/
-
-
+ 
+ 
 bool Adafruit_FONA::FMradio(bool onoff, uint8_t a) {
     if (! onoff) {
         return sendCheckReply("AT+FMCLOSE", "OK");
@@ -263,7 +263,7 @@
     
     return sendCheckReply("AT+FMOPEN=", a, "OK");
 }
-
+ 
 bool Adafruit_FONA::tuneFMradio(uint16_t station) {
     // Fail if FM station is outside allowed range.
     if ((station < 870) || (station > 1090))
@@ -271,7 +271,7 @@
     
     return sendCheckReply("AT+FMFREQ=", station, "OK");
 }
-
+ 
 bool Adafruit_FONA::setFMVolume(uint8_t i) {
     // Fail if volume is outside allowed range (0-6).
     if (i > 6) {
@@ -280,7 +280,7 @@
     // Send FM volume command and verify response.
     return sendCheckReply("AT+FMVOLUME=", i, "OK");
 }
-
+ 
 int8_t Adafruit_FONA::getFMVolume() {
     uint16_t level;
     
@@ -288,7 +288,7 @@
     
     return level;
 }
-
+ 
 int8_t Adafruit_FONA::getFMSignalLevel(uint16_t station) {
     // Fail if FM station is outside allowed range.
     if ((station < 875) || (station > 1080)) {
@@ -311,16 +311,16 @@
     readline();  // eat the "OK"
     return level;
 }
-
+ 
 /********* PWM/BUZZER **************************************************/
-
+ 
 bool Adafruit_FONA::setPWM(uint16_t period, uint8_t duty) {
     if (period > 2000) return false;
     if (duty > 100) return false;
     
     return sendCheckReply("AT+SPWM=0,", period, duty, "OK");
 }
-
+ 
 /********* CALL PHONES **************************************************/
 bool Adafruit_FONA::callPhone(char *number) {
     char sendbuff[35] = "ATD";
@@ -331,22 +331,22 @@
     
     return sendCheckReply(sendbuff, "OK");
 }
-
+ 
 bool Adafruit_FONA::hangUp(void) {
     return sendCheckReply("ATH0", "OK");
 }
-
+ 
 bool Adafruit_FONA::pickUp(void) {
     return sendCheckReply("ATA", "OK");
 }
-
+ 
 void Adafruit_FONA::onIncomingCall() {
 #ifdef ADAFRUIT_FONA_DEBUG
     printf("> Incoming call...\r\n");
 #endif
     _incomingCall = true;
 }
-
+ 
 bool Adafruit_FONA::callerIdNotification(bool enable) {
     if(enable){
         _ringIndicatorInterruptIn.fall(this, &Adafruit_FONA::onIncomingCall);
@@ -356,7 +356,7 @@
     _ringIndicatorInterruptIn.fall(NULL);
     return sendCheckReply("AT+CLIP=0", "OK");
 }
-
+ 
 bool Adafruit_FONA::incomingCallNumber(char* phonenum) {
     //+CLIP: "<incoming phone number>",145,"",0,"",0
     if(!_incomingCall)
@@ -379,9 +379,9 @@
     _incomingCall = false;
     return true;
 }
-
+ 
 /********* SMS **********************************************************/
-
+ 
 uint8_t Adafruit_FONA::getSMSInterrupt(void) {
     uint16_t reply;
     
@@ -389,11 +389,11 @@
     
     return reply;
 }
-
+ 
 bool Adafruit_FONA::setSMSInterrupt(uint8_t i) {
     return sendCheckReply("AT+CFGRI=", i, "OK");
 }
-
+ 
 int8_t Adafruit_FONA::getNumSMS(void) {
     uint16_t numsms;
     
@@ -404,7 +404,7 @@
     
     return numsms;
 }
-
+ 
 // Reading SMS's is a bit involved so we don't use helpers that may cause delays or debug
 // printouts!
 bool Adafruit_FONA::readSMS(uint8_t i, char *smsbuff, uint16_t maxlen, uint16_t *readlen) {
@@ -441,7 +441,7 @@
     *readlen = thelen;
     return true;
 }
-
+ 
 // Retrieve the sender of the specified SMS message and copy it as a string to
 // the sender buffer.  Up to senderlen characters of the sender will be copied
 // and a null terminator will be added if less than senderlen charactesr are
@@ -460,7 +460,7 @@
     flushInput();
     return result;
 }
-
+ 
 bool Adafruit_FONA::sendSMS(char *smsaddr, char *smsmsg) {
     if (! sendCheckReply("AT+CMGF=1", "OK")) return -1;
     
@@ -491,8 +491,8 @@
     
     return true;
 }
-
-
+ 
+ 
 bool Adafruit_FONA::deleteSMS(uint8_t i) {
     if (! sendCheckReply("AT+CMGF=1", "OK")) return -1;
     // read an sms
@@ -505,9 +505,9 @@
     
     return sendCheckReply(sendbuff, "OK", 2000);
 }
-
+ 
 /********* TIME **********************************************************/
-
+ 
 bool Adafruit_FONA::enableNetworkTimeSync(bool onoff) {
     if (onoff) {
         if (! sendCheckReply("AT+CLTS=1", "OK"))
@@ -521,7 +521,7 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::enableNTPTimeSync(bool onoff, const char* ntpserver) {
     if (onoff) {
         if (! sendCheckReply("AT+CNTPCID=1", "OK"))
@@ -552,7 +552,7 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::getTime(char* buff, uint16_t maxlen) {
     getReply("AT+CCLK?", (uint16_t) 10000);
     if (strncmp(replybuffer, "+CCLK: ", 7) != 0)
@@ -567,10 +567,10 @@
     
     return true;
 }
-
+ 
 /********* GPS **********************************************************/
-
-
+ 
+ 
 bool Adafruit_FONA::enableGPS(bool onoff) {
     uint16_t state;
     
@@ -587,17 +587,17 @@
     }
     return true;
 }
-
+ 
 uint16_t Adafruit_FONA::checkGPSstate(void) {
-
+ 
     uint16_t state;
-
+ 
     sendParseReply("AT+CGNSPWR?", "+CGNSPWR: ", &state);
     
     return state;
-
+ 
 }
-
+ 
 int8_t Adafruit_FONA::GPSstatus(void) {
     getReply("AT+CGNSSTATUS?");
     
@@ -617,7 +617,7 @@
     // else
     return 0;
 }
-
+ 
 uint8_t Adafruit_FONA::getGPS(uint8_t arg, char *buffer, uint8_t maxbuff) {
     int32_t x = arg;
     
@@ -636,7 +636,7 @@
     readline(); // eat 'OK'
     return len;
 }
-
+ 
 bool Adafruit_FONA::getGPS(float *lat, float *lon, float *speed_kph, float *heading, float *altitude) {
     char gpsbuffer[120];
     
@@ -762,7 +762,7 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::enableGPSNMEA(uint8_t i) {
     char sendbuff[15] = "AT+CGNSOUT=000";
     sendbuff[11] = (i / 100) + '0';
@@ -773,11 +773,11 @@
     
     return sendCheckReply(sendbuff, "OK", 2000);
 }
-
-
+ 
+ 
 /********* GPRS **********************************************************/
-
-
+ 
+ 
 bool Adafruit_FONA::enableGPRS(bool onoff) {
     if (onoff) {
         // disconnect all sockets
@@ -826,7 +826,7 @@
     }
     return true;
 }
-
+ 
 uint8_t Adafruit_FONA::GPRSstate(void) {
     uint16_t state;
     
@@ -835,13 +835,13 @@
     
     return state;
 }
-
+ 
 void Adafruit_FONA::setGPRSNetworkSettings(const char* apn, const char* ausername, const char* apassword) {
     this->apn = (char*) apn;
     this->apnusername = (char*) ausername;
     this->apnpassword = (char*) apassword;
 }
-
+ 
 bool Adafruit_FONA::getGSMLoc(uint16_t *errorcode, char *buff, uint16_t maxlen) {
     getReply("AT+CIPGSMLOC=1,1", (uint16_t)10000);
     
@@ -856,7 +856,7 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::getGSMLoc(float *lat, float *lon) {
     uint16_t returncode;
     char gpsbuffer[120];
@@ -881,10 +881,10 @@
     
     return true;
 }
-
+ 
 /********* TCP FUNCTIONS  ************************************/
-
-
+ 
+ 
 bool Adafruit_FONA::TCPconnect(char *server, uint16_t port) {
     flushInput();
     
@@ -907,11 +907,11 @@
     if (! expectReply("CONNECT OK")) return false;
     return true;
 }
-
+ 
 bool Adafruit_FONA::TCPclose(void) {
     return sendCheckReply("AT+CIPCLOSE", "OK");
 }
-
+ 
 bool Adafruit_FONA::TCPconnected(void) {
     if (! sendCheckReply("AT+CIPSTATUS", "OK", 100) ) return false;
     readline(100);
@@ -920,7 +920,7 @@
 #endif
     return (strcmp(replybuffer, "STATE: CONNECT OK") == 0);
 }
-
+ 
 bool Adafruit_FONA::TCPsend(char *packet, uint8_t len) {
 #ifdef ADAFRUIT_FONA_DEBUG
     printf("AT+CIPSEND=%d\r\n", len);
@@ -949,7 +949,7 @@
     
     return (strcmp(replybuffer, "SEND OK") == 0);
 }
-
+ 
 uint16_t Adafruit_FONA::TCPavailable(void) {
     uint16_t avail;
     
@@ -961,8 +961,8 @@
     
     return avail;
 }
-
-
+ 
+ 
 uint16_t Adafruit_FONA::TCPread(uint8_t *buff, uint8_t len) {
     uint16_t avail;
     
@@ -984,17 +984,17 @@
     
     return avail;
 }
-
+ 
 /********* HTTP LOW LEVEL FUNCTIONS  ************************************/
-
+ 
 bool Adafruit_FONA::HTTP_init() {
     return sendCheckReply("AT+HTTPINIT", "OK");
 }
-
+ 
 bool Adafruit_FONA::HTTP_term() {
     return sendCheckReply("AT+HTTPTERM", "OK");
 }
-
+ 
 void Adafruit_FONA::HTTP_para_start(const char* parameter, bool quoted) {
     flushInput();
     
@@ -1008,7 +1008,7 @@
     else
         mySerial.printf("\",");
 }
-
+ 
 bool Adafruit_FONA::HTTP_para_end(bool quoted) {
     if (quoted)
         mySerial.printf("\"\r\n");
@@ -1017,19 +1017,19 @@
     
     return expectReply("OK");
 }
-
+ 
 bool Adafruit_FONA::HTTP_para(const char* parameter, const char* value) {
     HTTP_para_start(parameter, true);
     mySerial.printf(value);
     return HTTP_para_end(true);
 }
-
+ 
 bool Adafruit_FONA::HTTP_para(const char* parameter, int32_t value) {
     HTTP_para_start(parameter, false);
     mySerial.printf("%d", value);
     return HTTP_para_end(false);
 }
-
+ 
 bool Adafruit_FONA::HTTP_data(uint32_t size, uint32_t maxTime) {
     flushInput();
     
@@ -1041,7 +1041,7 @@
     
     return expectReply("DOWNLOAD");
 }
-
+ 
 bool Adafruit_FONA::HTTP_action(uint8_t method, uint16_t *status, uint16_t *datalen, int32_t timeout) {
     // Send request.
     if (! sendCheckReply("AT+HTTPACTION=", method, "OK"))
@@ -1056,7 +1056,7 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::HTTP_readall(uint16_t *datalen) {
     getReply("AT+HTTPREAD");
     if (! parseReply("+HTTPREAD:", datalen, ',', 0))
@@ -1064,13 +1064,13 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::HTTP_ssl(bool onoff) {
     return sendCheckReply("AT+HTTPSSL=", onoff ? 1 : 0, "OK");
 }
-
+ 
 /********* HTTP HIGH LEVEL FUNCTIONS ***************************/
-
+ 
 bool Adafruit_FONA::HTTP_GET_start(char *url, uint16_t *status, uint16_t *datalen){
     if (! HTTP_setup(url))
         return false;
@@ -1090,11 +1090,11 @@
     
     return true;
 }
-
+ 
 void Adafruit_FONA::HTTP_GET_end(void) {
     HTTP_term();
 }
-
+ 
 bool Adafruit_FONA::HTTP_POST_start(char *url, const char* contenttype, const uint8_t *postdata, uint16_t postdatalen, uint16_t *status, uint16_t *datalen) {
     if (! HTTP_setup(url))
         return false;
@@ -1127,21 +1127,21 @@
     
     return true;
 }
-
+ 
 void Adafruit_FONA::HTTP_POST_end(void) {
     HTTP_term();
 }
-
+ 
 void Adafruit_FONA::setUserAgent(const char* useragent) {
     this->useragent = (char*) useragent;
 }
-
+ 
 void Adafruit_FONA::setHTTPSRedirect(bool onoff) {
     httpsredirect = onoff;
 }
-
+ 
 /********* HTTP HELPERS ****************************************/
-
+ 
 bool Adafruit_FONA::HTTP_setup(char *url) {
     // Handle any pending
     HTTP_term();
@@ -1167,10 +1167,10 @@
     
     return true;
 }
-
-
+ 
+ 
 /********* HELPERS *********************************************/
-
+ 
 bool Adafruit_FONA::expectReply(const char* reply, uint16_t timeout) {
     readline(timeout);
 #ifdef ADAFRUIT_FONA_DEBUG
@@ -1178,9 +1178,9 @@
 #endif
     return (strcmp(replybuffer, reply) == 0);
 }
-
+ 
 /********* LOW LEVEL *******************************************/
-
+ 
 void Adafruit_FONA::flushInput() {
     // Read all available serial input to flush pending data.
     uint16_t timeoutloop = 0;
@@ -1192,7 +1192,7 @@
         wait_ms(1);
     }
 }
-
+ 
 uint16_t Adafruit_FONA::readRaw(uint16_t b) {
     uint16_t idx = 0;
     
@@ -1207,7 +1207,7 @@
     
     return idx;
 }
-
+ 
 uint8_t Adafruit_FONA::readline(uint16_t timeout, bool multiline) {
     uint16_t replyidx = 0;
     
@@ -1240,23 +1240,23 @@
     replybuffer[replyidx] = 0;  // null term
     return replyidx;
 }
-
+ 
 uint8_t Adafruit_FONA::getReply(const char* send, uint16_t timeout) {
     flushInput();
-
+ 
 #ifdef ADAFRUIT_FONA_DEBUG
     printf("\t---> %s\r\n", send);
 #endif
-
+ 
     mySerial.printf("%s\r\n",send);
-
+ 
     uint8_t l = readline(timeout);
 #ifdef ADAFRUIT_FONA_DEBUG
     printf("\t<--- %s\r\n", replybuffer);
 #endif
     return l;
 }
-
+ 
 // Send prefix, suffix, and newline. Return response (and also set replybuffer with response).
 uint8_t Adafruit_FONA::getReply(const char* prefix, char* suffix, uint16_t timeout) {
     flushInput();
@@ -1273,7 +1273,7 @@
 #endif
     return l;
 }
-
+ 
 // Send prefix, suffix, and newline. Return response (and also set replybuffer with response).
 uint8_t Adafruit_FONA::getReply(const char* prefix, int32_t suffix, uint16_t timeout) {
     flushInput();
@@ -1290,7 +1290,7 @@
 #endif
     return l;
 }
-
+ 
 // Send prefix, suffix, suffix2, and newline. Return response (and also set replybuffer with response).
 uint8_t Adafruit_FONA::getReply(const char* prefix, int32_t suffix1, int32_t suffix2, uint16_t timeout) {
     flushInput();
@@ -1307,7 +1307,7 @@
 #endif
     return l;
 }
-
+ 
 // Send prefix, ", suffix, ", and newline. Return response (and also set replybuffer with response).
 uint8_t Adafruit_FONA::getReplyQuoted(const char* prefix, const char* suffix, uint16_t timeout) {
     flushInput();
@@ -1324,38 +1324,38 @@
 #endif
     return l;
 }
-
-
+ 
+ 
 bool Adafruit_FONA::sendCheckReply(const char *send, const char *reply, uint16_t timeout) {
     getReply(send, timeout);
     
     return (strcmp(replybuffer, reply) == 0);
 }
-
+ 
 // Send prefix, suffix, and newline.  Verify FONA response matches reply parameter.
 bool Adafruit_FONA::sendCheckReply(const char* prefix, char *suffix, const char* reply, uint16_t timeout) {
     getReply(prefix, suffix, timeout);
     return (strcmp(replybuffer, reply) == 0);
 }
-
+ 
 // Send prefix, suffix, and newline.  Verify FONA response matches reply parameter.
 bool Adafruit_FONA::sendCheckReply(const char* prefix, int32_t suffix, const char* reply, uint16_t timeout) {
     getReply(prefix, suffix, timeout);
     return (strcmp(replybuffer, reply) == 0);
 }
-
+ 
 // Send prefix, suffix, suffix2, and newline.  Verify FONA response matches reply parameter.
 bool Adafruit_FONA::sendCheckReply(const char* prefix, int32_t suffix1, int32_t suffix2, const char* reply, uint16_t timeout) {
     getReply(prefix, suffix1, suffix2, timeout);
     return (strcmp(replybuffer, reply) == 0);
 }
-
+ 
 // Send prefix, ", suffix, ", and newline.  Verify FONA response matches reply parameter.
 bool Adafruit_FONA::sendCheckReplyQuoted(const char* prefix, const char* suffix, const char* reply, uint16_t timeout) {
   getReplyQuoted(prefix, suffix, timeout);
   return (strcmp(replybuffer, reply) == 0);
 }
-
+ 
 bool Adafruit_FONA::parseReply(const char* toreply, uint16_t *v, char divider, uint8_t index) {
     char *p = strstr(replybuffer, toreply);  // get the pointer to the voltage
     if (p == 0) return false;
@@ -1372,7 +1372,7 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::parseReply(const char* toreply, char *v, char divider, uint8_t index) {
     uint8_t i=0;
     char *p = strstr(replybuffer, toreply);
@@ -1396,7 +1396,7 @@
     
     return true;
 }
-
+ 
 // Parse a quoted string in the response fields and copy its value (without quotes)
 // to the specified character array (v).  Only up to maxlen characters are copied
 // into the result buffer, so make sure to pass a large enough buffer to handle the
@@ -1433,7 +1433,7 @@
     
     return true;
 }
-
+ 
 bool Adafruit_FONA::sendParseReply(const char* tosend, const char* toreply, uint16_t *v, char divider, uint8_t index) {
     getReply(tosend);