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 #ifndef ADAFRUIT_FONA_H
lewisdaw3 0:8b6028668696 18 #define ADAFRUIT_FONA_H
lewisdaw3 0:8b6028668696 19
lewisdaw3 0:8b6028668696 20 #include "includes/FONAConfig.h"
lewisdaw3 0:8b6028668696 21 #include "includes/FONAExtIncludes.h"
lewisdaw3 0:8b6028668696 22 #include "includes/platform/FONAPlatform.h"
lewisdaw3 0:8b6028668696 23
lewisdaw3 0:8b6028668696 24
lewisdaw3 0:8b6028668696 25
lewisdaw3 0:8b6028668696 26 #define FONA800L 1
lewisdaw3 0:8b6028668696 27 #define FONA800H 6
lewisdaw3 0:8b6028668696 28
lewisdaw3 0:8b6028668696 29 #define FONA808_V1 2
lewisdaw3 0:8b6028668696 30 #define FONA808_V2 3
lewisdaw3 0:8b6028668696 31
lewisdaw3 0:8b6028668696 32 #define FONA3G_A 4
lewisdaw3 0:8b6028668696 33 #define FONA3G_E 5
lewisdaw3 0:8b6028668696 34
lewisdaw3 0:8b6028668696 35 // Uncomment to changed the preferred SMS storage
lewisdaw3 0:8b6028668696 36 //#define FONA_PREF_SMS_STORAGE "SM"
lewisdaw3 0:8b6028668696 37
lewisdaw3 0:8b6028668696 38 #define FONA_HEADSETAUDIO 0
lewisdaw3 0:8b6028668696 39 #define FONA_EXTAUDIO 1
lewisdaw3 0:8b6028668696 40
lewisdaw3 0:8b6028668696 41 #define FONA_STTONE_DIALTONE 1
lewisdaw3 0:8b6028668696 42 #define FONA_STTONE_BUSY 2
lewisdaw3 0:8b6028668696 43 #define FONA_STTONE_CONGESTION 3
lewisdaw3 0:8b6028668696 44 #define FONA_STTONE_PATHACK 4
lewisdaw3 0:8b6028668696 45 #define FONA_STTONE_DROPPED 5
lewisdaw3 0:8b6028668696 46 #define FONA_STTONE_ERROR 6
lewisdaw3 0:8b6028668696 47 #define FONA_STTONE_CALLWAIT 7
lewisdaw3 0:8b6028668696 48 #define FONA_STTONE_RINGING 8
lewisdaw3 0:8b6028668696 49 #define FONA_STTONE_BEEP 16
lewisdaw3 0:8b6028668696 50 #define FONA_STTONE_POSTONE 17
lewisdaw3 0:8b6028668696 51 #define FONA_STTONE_ERRTONE 18
lewisdaw3 0:8b6028668696 52 #define FONA_STTONE_INDIANDIALTONE 19
lewisdaw3 0:8b6028668696 53 #define FONA_STTONE_USADIALTONE 20
lewisdaw3 0:8b6028668696 54
lewisdaw3 0:8b6028668696 55 #define FONA_DEFAULT_TIMEOUT_MS 500
lewisdaw3 0:8b6028668696 56
lewisdaw3 0:8b6028668696 57 #define FONA_HTTP_GET 0
lewisdaw3 0:8b6028668696 58 #define FONA_HTTP_POST 1
lewisdaw3 0:8b6028668696 59 #define FONA_HTTP_HEAD 2
lewisdaw3 0:8b6028668696 60
lewisdaw3 0:8b6028668696 61 #define FONA_CALL_READY 0
lewisdaw3 0:8b6028668696 62 #define FONA_CALL_FAILED 1
lewisdaw3 0:8b6028668696 63 #define FONA_CALL_UNKNOWN 2
lewisdaw3 0:8b6028668696 64 #define FONA_CALL_RINGING 3
lewisdaw3 0:8b6028668696 65 #define FONA_CALL_INPROGRESS 4
lewisdaw3 0:8b6028668696 66
lewisdaw3 0:8b6028668696 67 class Adafruit_FONA : public FONAStreamType {
lewisdaw3 0:8b6028668696 68 public:
lewisdaw3 0:8b6028668696 69 Adafruit_FONA(int8_t r);
lewisdaw3 0:8b6028668696 70 boolean begin(FONAStreamType &port);
lewisdaw3 0:8b6028668696 71 uint8_t type();
lewisdaw3 0:8b6028668696 72
lewisdaw3 0:8b6028668696 73 // Stream
lewisdaw3 0:8b6028668696 74 int available(void);
lewisdaw3 0:8b6028668696 75 size_t write(uint8_t x);
lewisdaw3 0:8b6028668696 76 int read(void);
lewisdaw3 0:8b6028668696 77 int peek(void);
lewisdaw3 0:8b6028668696 78 void flush();
lewisdaw3 0:8b6028668696 79
lewisdaw3 0:8b6028668696 80 // FONA 3G requirements
lewisdaw3 0:8b6028668696 81 boolean setBaudrate(uint16_t baud);
lewisdaw3 0:8b6028668696 82
lewisdaw3 0:8b6028668696 83 // RTC
lewisdaw3 0:8b6028668696 84 boolean enableRTC(uint8_t i);
lewisdaw3 0:8b6028668696 85 boolean readRTC(uint8_t *year, uint8_t *month, uint8_t *date, uint8_t *hr, uint8_t *min, uint8_t *sec);
lewisdaw3 0:8b6028668696 86
lewisdaw3 0:8b6028668696 87 // Battery and ADC
lewisdaw3 0:8b6028668696 88 boolean getADCVoltage(uint16_t *v);
lewisdaw3 0:8b6028668696 89 boolean getBattPercent(uint16_t *p);
lewisdaw3 0:8b6028668696 90 boolean getBattVoltage(uint16_t *v);
lewisdaw3 0:8b6028668696 91
lewisdaw3 0:8b6028668696 92 // SIM query
lewisdaw3 0:8b6028668696 93 uint8_t unlockSIM(char *pin);
lewisdaw3 0:8b6028668696 94 uint8_t getSIMCCID(char *ccid);
lewisdaw3 0:8b6028668696 95 uint8_t getNetworkStatus(void);
lewisdaw3 0:8b6028668696 96 uint8_t getRSSI(void);
lewisdaw3 0:8b6028668696 97
lewisdaw3 0:8b6028668696 98 // IMEI
lewisdaw3 0:8b6028668696 99 uint8_t getIMEI(char *imei);
lewisdaw3 0:8b6028668696 100
lewisdaw3 0:8b6028668696 101 // set Audio output
lewisdaw3 0:8b6028668696 102 boolean setAudio(uint8_t a);
lewisdaw3 0:8b6028668696 103 boolean setVolume(uint8_t i);
lewisdaw3 0:8b6028668696 104 uint8_t getVolume(void);
lewisdaw3 0:8b6028668696 105 boolean playToolkitTone(uint8_t t, uint16_t len);
lewisdaw3 0:8b6028668696 106 boolean setMicVolume(uint8_t a, uint8_t level);
lewisdaw3 0:8b6028668696 107 boolean playDTMF(char tone);
lewisdaw3 0:8b6028668696 108
lewisdaw3 0:8b6028668696 109 // FM radio functions.
lewisdaw3 0:8b6028668696 110 boolean tuneFMradio(uint16_t station);
lewisdaw3 0:8b6028668696 111 boolean FMradio(boolean onoff, uint8_t a = FONA_HEADSETAUDIO);
lewisdaw3 0:8b6028668696 112 boolean setFMVolume(uint8_t i);
lewisdaw3 0:8b6028668696 113 int8_t getFMVolume();
lewisdaw3 0:8b6028668696 114 int8_t getFMSignalLevel(uint16_t station);
lewisdaw3 0:8b6028668696 115
lewisdaw3 0:8b6028668696 116 // SMS handling
lewisdaw3 0:8b6028668696 117 boolean setSMSInterrupt(uint8_t i);
lewisdaw3 0:8b6028668696 118 uint8_t getSMSInterrupt(void);
lewisdaw3 0:8b6028668696 119 int8_t getNumSMS(void);
lewisdaw3 0:8b6028668696 120 boolean readSMS(uint8_t i, char *smsbuff, uint16_t max, uint16_t *readsize);
lewisdaw3 0:8b6028668696 121 boolean sendSMS(char *smsaddr, char *smsmsg);
lewisdaw3 0:8b6028668696 122 boolean deleteSMS(uint8_t i);
lewisdaw3 0:8b6028668696 123 boolean getSMSSender(uint8_t i, char *sender, int senderlen);
lewisdaw3 0:8b6028668696 124 boolean sendUSSD(char *ussdmsg, char *ussdbuff, uint16_t maxlen, uint16_t *readlen);
lewisdaw3 0:8b6028668696 125
lewisdaw3 0:8b6028668696 126 // Time
lewisdaw3 0:8b6028668696 127 boolean enableNetworkTimeSync(boolean onoff);
lewisdaw3 0:8b6028668696 128 boolean enableNTPTimeSync(boolean onoff, FONAFlashStringPtr ntpserver=0);
lewisdaw3 0:8b6028668696 129 boolean getTime(char *buff, uint16_t maxlen);
lewisdaw3 0:8b6028668696 130
lewisdaw3 0:8b6028668696 131 // GPRS handling
lewisdaw3 0:8b6028668696 132 boolean enableGPRS(boolean onoff);
lewisdaw3 0:8b6028668696 133 uint8_t GPRSstate(void);
lewisdaw3 0:8b6028668696 134 boolean getGSMLoc(uint16_t *replycode, char *buff, uint16_t maxlen);
lewisdaw3 0:8b6028668696 135 boolean getGSMLoc(float *lat, float *lon);
lewisdaw3 0:8b6028668696 136 void setGPRSNetworkSettings(FONAFlashStringPtr apn, FONAFlashStringPtr username=0, FONAFlashStringPtr password=0);
lewisdaw3 0:8b6028668696 137
lewisdaw3 0:8b6028668696 138 // GPS handling
lewisdaw3 0:8b6028668696 139 boolean enableGPS(boolean onoff);
lewisdaw3 0:8b6028668696 140 int8_t GPSstatus(void);
lewisdaw3 0:8b6028668696 141 uint8_t getGPS(uint8_t arg, char *buffer, uint8_t maxbuff);
lewisdaw3 0:8b6028668696 142 boolean getGPS(float *lat, float *lon, float *speed_kph=0, float *heading=0, float *altitude=0);
lewisdaw3 0:8b6028668696 143 boolean enableGPSNMEA(uint8_t nmea);
lewisdaw3 0:8b6028668696 144
lewisdaw3 0:8b6028668696 145 // TCP raw connections
lewisdaw3 0:8b6028668696 146 boolean TCPconnect(char *server, uint16_t port);
lewisdaw3 0:8b6028668696 147 boolean TCPclose(void);
lewisdaw3 0:8b6028668696 148 boolean TCPconnected(void);
lewisdaw3 0:8b6028668696 149 boolean TCPsend(char *packet, uint8_t len);
lewisdaw3 0:8b6028668696 150 uint16_t TCPavailable(void);
lewisdaw3 0:8b6028668696 151 uint16_t TCPread(uint8_t *buff, uint8_t len);
lewisdaw3 0:8b6028668696 152
lewisdaw3 0:8b6028668696 153 // HTTP low level interface (maps directly to SIM800 commands).
lewisdaw3 0:8b6028668696 154 boolean HTTP_init();
lewisdaw3 0:8b6028668696 155 boolean HTTP_term();
lewisdaw3 0:8b6028668696 156 void HTTP_para_start(FONAFlashStringPtr parameter, boolean quoted = true);
lewisdaw3 0:8b6028668696 157 boolean HTTP_para_end(boolean quoted = true);
lewisdaw3 0:8b6028668696 158 boolean HTTP_para(FONAFlashStringPtr parameter, const char *value);
lewisdaw3 0:8b6028668696 159 boolean HTTP_para(FONAFlashStringPtr parameter, FONAFlashStringPtr value);
lewisdaw3 0:8b6028668696 160 boolean HTTP_para(FONAFlashStringPtr parameter, int32_t value);
lewisdaw3 0:8b6028668696 161 boolean HTTP_data(uint32_t size, uint32_t maxTime=10000);
lewisdaw3 0:8b6028668696 162 boolean HTTP_action(uint8_t method, uint16_t *status, uint16_t *datalen, int32_t timeout = 10000);
lewisdaw3 0:8b6028668696 163 boolean HTTP_readall(uint16_t *datalen);
lewisdaw3 0:8b6028668696 164 boolean HTTP_ssl(boolean onoff);
lewisdaw3 0:8b6028668696 165
lewisdaw3 0:8b6028668696 166 // HTTP high level interface (easier to use, less flexible).
lewisdaw3 0:8b6028668696 167 boolean HTTP_GET_start(char *url, uint16_t *status, uint16_t *datalen);
lewisdaw3 0:8b6028668696 168 void HTTP_GET_end(void);
lewisdaw3 0:8b6028668696 169 boolean HTTP_POST_start(char *url, FONAFlashStringPtr contenttype, const uint8_t *postdata, uint16_t postdatalen, uint16_t *status, uint16_t *datalen);
lewisdaw3 0:8b6028668696 170 void HTTP_POST_end(void);
lewisdaw3 0:8b6028668696 171 void setUserAgent(FONAFlashStringPtr useragent);
lewisdaw3 0:8b6028668696 172
lewisdaw3 0:8b6028668696 173 // HTTPS
lewisdaw3 0:8b6028668696 174 void setHTTPSRedirect(boolean onoff);
lewisdaw3 0:8b6028668696 175
lewisdaw3 0:8b6028668696 176 // PWM (buzzer)
lewisdaw3 0:8b6028668696 177 boolean setPWM(uint16_t period, uint8_t duty = 50);
lewisdaw3 0:8b6028668696 178
lewisdaw3 0:8b6028668696 179 // Phone calls
lewisdaw3 0:8b6028668696 180 boolean callPhone(char *phonenum);
lewisdaw3 0:8b6028668696 181 uint8_t getCallStatus(void);
lewisdaw3 0:8b6028668696 182 boolean hangUp(void);
lewisdaw3 0:8b6028668696 183 boolean pickUp(void);
lewisdaw3 0:8b6028668696 184 boolean callerIdNotification(boolean enable, uint8_t interrupt = 0);
lewisdaw3 0:8b6028668696 185 boolean incomingCallNumber(char* phonenum);
lewisdaw3 0:8b6028668696 186
lewisdaw3 0:8b6028668696 187 // Helper functions to verify responses.
lewisdaw3 0:8b6028668696 188 boolean expectReply(FONAFlashStringPtr reply, uint16_t timeout = 10000);
lewisdaw3 0:8b6028668696 189 boolean sendCheckReply(char *send, char *reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 190 boolean sendCheckReply(FONAFlashStringPtr send, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 191 boolean sendCheckReply(char* send, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 192
lewisdaw3 0:8b6028668696 193
lewisdaw3 0:8b6028668696 194 protected:
lewisdaw3 0:8b6028668696 195 int8_t _rstpin;
lewisdaw3 0:8b6028668696 196 uint8_t _type;
lewisdaw3 0:8b6028668696 197
lewisdaw3 0:8b6028668696 198 char replybuffer[255];
lewisdaw3 0:8b6028668696 199 FONAFlashStringPtr apn;
lewisdaw3 0:8b6028668696 200 FONAFlashStringPtr apnusername;
lewisdaw3 0:8b6028668696 201 FONAFlashStringPtr apnpassword;
lewisdaw3 0:8b6028668696 202 boolean httpsredirect;
lewisdaw3 0:8b6028668696 203 FONAFlashStringPtr useragent;
lewisdaw3 0:8b6028668696 204 FONAFlashStringPtr ok_reply;
lewisdaw3 0:8b6028668696 205
lewisdaw3 0:8b6028668696 206 // HTTP helpers
lewisdaw3 0:8b6028668696 207 boolean HTTP_setup(char *url);
lewisdaw3 0:8b6028668696 208
lewisdaw3 0:8b6028668696 209 void flushInput();
lewisdaw3 0:8b6028668696 210 uint16_t readRaw(uint16_t b);
lewisdaw3 0:8b6028668696 211 uint8_t readline(uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS, boolean multiline = false);
lewisdaw3 0:8b6028668696 212 uint8_t getReply(char *send, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 213 uint8_t getReply(FONAFlashStringPtr send, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 214 uint8_t getReply(FONAFlashStringPtr prefix, char *suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 215 uint8_t getReply(FONAFlashStringPtr prefix, int32_t suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 216 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.
lewisdaw3 0:8b6028668696 217 uint8_t getReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 218
lewisdaw3 0:8b6028668696 219 boolean sendCheckReply(FONAFlashStringPtr prefix, char *suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 220 boolean sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 221 boolean sendCheckReply(FONAFlashStringPtr prefix, int32_t suffix, int32_t suffix2, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 222 boolean sendCheckReplyQuoted(FONAFlashStringPtr prefix, FONAFlashStringPtr suffix, FONAFlashStringPtr reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
lewisdaw3 0:8b6028668696 223
lewisdaw3 0:8b6028668696 224
lewisdaw3 0:8b6028668696 225 boolean parseReply(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 226 uint16_t *v, char divider = ',', uint8_t index=0);
lewisdaw3 0:8b6028668696 227 boolean parseReply(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 228 char *v, char divider = ',', uint8_t index=0);
lewisdaw3 0:8b6028668696 229 boolean parseReplyQuoted(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 230 char *v, int maxlen, char divider, uint8_t index);
lewisdaw3 0:8b6028668696 231
lewisdaw3 0:8b6028668696 232 boolean sendParseReply(FONAFlashStringPtr tosend,
lewisdaw3 0:8b6028668696 233 FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 234 uint16_t *v, char divider = ',', uint8_t index=0);
lewisdaw3 0:8b6028668696 235
lewisdaw3 0:8b6028668696 236 static boolean _incomingCall;
lewisdaw3 0:8b6028668696 237 static void onIncomingCall();
lewisdaw3 0:8b6028668696 238
lewisdaw3 0:8b6028668696 239 FONAStreamType *mySerial;
lewisdaw3 0:8b6028668696 240 };
lewisdaw3 0:8b6028668696 241
lewisdaw3 0:8b6028668696 242 class Adafruit_FONA_3G : public Adafruit_FONA {
lewisdaw3 0:8b6028668696 243
lewisdaw3 0:8b6028668696 244 public:
lewisdaw3 0:8b6028668696 245 Adafruit_FONA_3G (int8_t r) : Adafruit_FONA(r) { _type = FONA3G_A; }
lewisdaw3 0:8b6028668696 246
lewisdaw3 0:8b6028668696 247 boolean getBattVoltage(uint16_t *v);
lewisdaw3 0:8b6028668696 248 boolean playToolkitTone(uint8_t t, uint16_t len);
lewisdaw3 0:8b6028668696 249 boolean hangUp(void);
lewisdaw3 0:8b6028668696 250 boolean pickUp(void);
lewisdaw3 0:8b6028668696 251 boolean enableGPRS(boolean onoff);
lewisdaw3 0:8b6028668696 252 boolean enableGPS(boolean onoff);
lewisdaw3 0:8b6028668696 253
lewisdaw3 0:8b6028668696 254 protected:
lewisdaw3 0:8b6028668696 255 boolean parseReply(FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 256 float *f, char divider, uint8_t index);
lewisdaw3 0:8b6028668696 257
lewisdaw3 0:8b6028668696 258 boolean sendParseReply(FONAFlashStringPtr tosend,
lewisdaw3 0:8b6028668696 259 FONAFlashStringPtr toreply,
lewisdaw3 0:8b6028668696 260 float *f, char divider = ',', uint8_t index=0);
lewisdaw3 0:8b6028668696 261 };
lewisdaw3 0:8b6028668696 262
lewisdaw3 0:8b6028668696 263 #endif