Version working with mbed-os
Fork of Adafruit_FONA_Library by
Diff: Adafruit_FONA.cpp
- Revision:
- 8:aacbc647caee
- Parent:
- 6:b675eab1c47a
diff -r cb4c50c42edb -r aacbc647caee Adafruit_FONA.cpp --- 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);