/*************************************************** 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 // Set the preferred SMS storage. // Use "SM" for storage on the SIM. // Use "ME" for internal storage on the FONA chip #define FONA_PREF_SMS_STORAGE "\"SM\"" //#define FONA_PREF_SMS_STORAGE "\"ME\"" #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