Library For the Adafruit FONA 808
Diff: Adafruit_FONA.h
- Revision:
- 0:8b6028668696
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Adafruit_FONA.h Mon Oct 17 10:51:58 2016 +0000 @@ -0,0 +1,263 @@ +/*************************************************** + 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 + ****************************************************/ +#ifndef ADAFRUIT_FONA_H +#define ADAFRUIT_FONA_H + +#include "includes/FONAConfig.h" +#include "includes/FONAExtIncludes.h" +#include "includes/platform/FONAPlatform.h" + + + +#define FONA800L 1 +#define FONA800H 6 + +#define FONA808_V1 2 +#define FONA808_V2 3 + +#define FONA3G_A 4 +#define FONA3G_E 5 + +// Uncomment to changed the preferred SMS storage +//#define FONA_PREF_SMS_STORAGE "SM" + +#define FONA_HEADSETAUDIO 0 +#define FONA_EXTAUDIO 1 + +#define FONA_STTONE_DIALTONE 1 +#define FONA_STTONE_BUSY 2 +#define FONA_STTONE_CONGESTION 3 +#define FONA_STTONE_PATHACK 4 +#define FONA_STTONE_DROPPED 5 +#define FONA_STTONE_ERROR 6 +#define FONA_STTONE_CALLWAIT 7 +#define FONA_STTONE_RINGING 8 +#define FONA_STTONE_BEEP 16 +#define FONA_STTONE_POSTONE 17 +#define FONA_STTONE_ERRTONE 18 +#define FONA_STTONE_INDIANDIALTONE 19 +#define FONA_STTONE_USADIALTONE 20 + +#define FONA_DEFAULT_TIMEOUT_MS 500 + +#define FONA_HTTP_GET 0 +#define FONA_HTTP_POST 1 +#define FONA_HTTP_HEAD 2 + +#define FONA_CALL_READY 0 +#define FONA_CALL_FAILED 1 +#define FONA_CALL_UNKNOWN 2 +#define FONA_CALL_RINGING 3 +#define FONA_CALL_INPROGRESS 4 + +class Adafruit_FONA : public FONAStreamType { + public: + Adafruit_FONA(int8_t r); + boolean begin(FONAStreamType &port); + uint8_t type(); + + // Stream + int available(void); + size_t write(uint8_t x); + int read(void); + int peek(void); + void flush(); + + // FONA 3G requirements + boolean setBaudrate(uint16_t baud); + + // RTC + boolean enableRTC(uint8_t i); + boolean readRTC(uint8_t *year, uint8_t *month, uint8_t *date, uint8_t *hr, uint8_t *min, uint8_t *sec); + + // Battery and ADC + boolean getADCVoltage(uint16_t *v); + boolean getBattPercent(uint16_t *p); + boolean getBattVoltage(uint16_t *v); + + // SIM query + uint8_t unlockSIM(char *pin); + uint8_t getSIMCCID(char *ccid); + uint8_t getNetworkStatus(void); + uint8_t getRSSI(void); + + // IMEI + uint8_t getIMEI(char *imei); + + // set Audio output + boolean setAudio(uint8_t a); + boolean setVolume(uint8_t i); + uint8_t getVolume(void); + boolean playToolkitTone(uint8_t t, uint16_t len); + boolean setMicVolume(uint8_t a, uint8_t level); + boolean playDTMF(char tone); + + // FM radio functions. + boolean tuneFMradio(uint16_t station); + boolean FMradio(boolean onoff, uint8_t a = FONA_HEADSETAUDIO); + boolean setFMVolume(uint8_t i); + int8_t getFMVolume(); + int8_t getFMSignalLevel(uint16_t station); + + // SMS handling + boolean setSMSInterrupt(uint8_t i); + uint8_t getSMSInterrupt(void); + int8_t getNumSMS(void); + boolean readSMS(uint8_t i, char *smsbuff, uint16_t max, uint16_t *readsize); + boolean sendSMS(char *smsaddr, char *smsmsg); + boolean deleteSMS(uint8_t i); + boolean getSMSSender(uint8_t i, char *sender, int senderlen); + boolean sendUSSD(char *ussdmsg, char *ussdbuff, uint16_t maxlen, uint16_t *readlen); + + // Time + boolean enableNetworkTimeSync(boolean onoff); + boolean enableNTPTimeSync(boolean onoff, FONAFlashStringPtr ntpserver=0); + boolean getTime(char *buff, uint16_t maxlen); + + // GPRS handling + boolean enableGPRS(boolean onoff); + uint8_t GPRSstate(void); + boolean getGSMLoc(uint16_t *replycode, char *buff, uint16_t maxlen); + boolean getGSMLoc(float *lat, float *lon); + void setGPRSNetworkSettings(FONAFlashStringPtr apn, FONAFlashStringPtr username=0, FONAFlashStringPtr password=0); + + // GPS handling + boolean enableGPS(boolean onoff); + int8_t GPSstatus(void); + uint8_t getGPS(uint8_t arg, char *buffer, uint8_t maxbuff); + boolean getGPS(float *lat, float *lon, float *speed_kph=0, float *heading=0, float *altitude=0); + boolean enableGPSNMEA(uint8_t nmea); + + // TCP raw connections + boolean TCPconnect(char *server, uint16_t port); + boolean TCPclose(void); + boolean TCPconnected(void); + boolean TCPsend(char *packet, uint8_t len); + uint16_t TCPavailable(void); + uint16_t TCPread(uint8_t *buff, uint8_t len); + + // HTTP low level interface (maps directly to SIM800 commands). + boolean HTTP_init(); + boolean HTTP_term(); + void HTTP_para_start(FONAFlashStringPtr parameter, boolean quoted = true); + boolean HTTP_para_end(boolean quoted = true); + boolean HTTP_para(FONAFlashStringPtr parameter, const char *value); + boolean HTTP_para(FONAFlashStringPtr parameter, FONAFlashStringPtr value); + boolean HTTP_para(FONAFlashStringPtr parameter, int32_t value); + boolean HTTP_data(uint32_t size, uint32_t maxTime=10000); + boolean HTTP_action(uint8_t method, uint16_t *status, uint16_t *datalen, int32_t timeout = 10000); + boolean HTTP_readall(uint16_t *datalen); + boolean HTTP_ssl(boolean onoff); + + // HTTP high level interface (easier to use, less flexible). + boolean HTTP_GET_start(char *url, uint16_t *status, uint16_t *datalen); + void HTTP_GET_end(void); + boolean HTTP_POST_start(char *url, FONAFlashStringPtr contenttype, const uint8_t *postdata, uint16_t postdatalen, uint16_t *status, uint16_t *datalen); + void HTTP_POST_end(void); + void setUserAgent(FONAFlashStringPtr useragent); + + // HTTPS + void setHTTPSRedirect(boolean onoff); + + // PWM (buzzer) + boolean setPWM(uint16_t period, uint8_t duty = 50); + + // Phone calls + boolean callPhone(char *phonenum); + uint8_t getCallStatus(void); + boolean hangUp(void); + boolean pickUp(void); + boolean callerIdNotification(boolean enable, uint8_t interrupt = 0); + boolean incomingCallNumber(char* phonenum); + + // Helper functions to verify responses. + boolean expectReply(FONAFlashStringPtr reply, uint16_t timeout = 10000); + boolean sendCheckReply(char *send, char *reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + boolean sendCheckReply(FONAFlashStringPtr send, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + boolean sendCheckReply(char* send, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + + + protected: + int8_t _rstpin; + uint8_t _type; + + char replybuffer[255]; + FONAFlashStringPtr apn; + FONAFlashStringPtr apnusername; + FONAFlashStringPtr apnpassword; + boolean httpsredirect; + FONAFlashStringPtr useragent; + FONAFlashStringPtr ok_reply; + + // HTTP helpers + boolean HTTP_setup(char *url); + + void flushInput(); + uint16_t readRaw(uint16_t b); + uint8_t readline(uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS, boolean multiline = false); + uint8_t getReply(char *send, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + uint8_t getReply(FONAFlashStringPtr send, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + uint8_t getReply(FONAFlashStringPtr prefix, char *suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + uint8_t getReply(FONAFlashStringPtr prefix, int32_t suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + uint8_t getReply(FONAFlashStringPtr prefix, int32_t suffix1, int32_t suffix2, uint16_t timeout); // Don't set default value or else function call is ambiguous. + uint8_t getReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + + boolean sendCheckReply(FONAFlashStringPtr prefix, char *suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + boolean sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + boolean sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix, int32_t suffix2, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + boolean sendCheckReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS); + + + boolean parseReply(FONAFlashStringPtr toreply, + uint16_t *v, char divider = ',', uint8_t index=0); + boolean parseReply(FONAFlashStringPtr toreply, + char *v, char divider = ',', uint8_t index=0); + boolean parseReplyQuoted(FONAFlashStringPtr toreply, + char *v, int maxlen, char divider, uint8_t index); + + boolean sendParseReply(FONAFlashStringPtr tosend, + FONAFlashStringPtr toreply, + uint16_t *v, char divider = ',', uint8_t index=0); + + static boolean _incomingCall; + static void onIncomingCall(); + + FONAStreamType *mySerial; +}; + +class Adafruit_FONA_3G : public Adafruit_FONA { + + public: + Adafruit_FONA_3G (int8_t r) : Adafruit_FONA(r) { _type = FONA3G_A; } + + boolean getBattVoltage(uint16_t *v); + boolean playToolkitTone(uint8_t t, uint16_t len); + boolean hangUp(void); + boolean pickUp(void); + boolean enableGPRS(boolean onoff); + boolean enableGPS(boolean onoff); + + protected: + boolean parseReply(FONAFlashStringPtr toreply, + float *f, char divider, uint8_t index); + + boolean sendParseReply(FONAFlashStringPtr tosend, + FONAFlashStringPtr toreply, + float *f, char divider = ',', uint8_t index=0); +}; + +#endif