screen display for roommate tracker

Dependencies:   mbed-rtos mbed uLCD_4D_Picaso

Dependents:   RoommateTracker

Committer:
jbaker66
Date:
Mon Apr 25 14:07:25 2016 +0000
Revision:
0:831eff5e20cb
screen display complete

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jbaker66 0:831eff5e20cb 1 /***************************************************
jbaker66 0:831eff5e20cb 2 This is a library for our Adafruit FONA Cellular Module
jbaker66 0:831eff5e20cb 3
jbaker66 0:831eff5e20cb 4 Designed specifically to work with the Adafruit FONA
jbaker66 0:831eff5e20cb 5 ----> http://www.adafruit.com/products/1946
jbaker66 0:831eff5e20cb 6 ----> http://www.adafruit.com/products/1963
jbaker66 0:831eff5e20cb 7
jbaker66 0:831eff5e20cb 8 These displays use TTL Serial to communicate, 2 pins are required to
jbaker66 0:831eff5e20cb 9 interface
jbaker66 0:831eff5e20cb 10 Adafruit invests time and resources providing this open source code,
jbaker66 0:831eff5e20cb 11 please support Adafruit and open-source hardware by purchasing
jbaker66 0:831eff5e20cb 12 products from Adafruit!
jbaker66 0:831eff5e20cb 13
jbaker66 0:831eff5e20cb 14 Written by Limor Fried/Ladyada for Adafruit Industries.
jbaker66 0:831eff5e20cb 15 BSD license, all text above must be included in any redistribution
jbaker66 0:831eff5e20cb 16 ****************************************************/
jbaker66 0:831eff5e20cb 17
jbaker66 0:831eff5e20cb 18 /*
jbaker66 0:831eff5e20cb 19 * Modified by George Tzintzarov & Jesse Baker 03/14/2016 for use in mbed LPC1768
jbaker66 0:831eff5e20cb 20 */
jbaker66 0:831eff5e20cb 21
jbaker66 0:831eff5e20cb 22 #ifndef ADAFRUIT_FONA_H
jbaker66 0:831eff5e20cb 23 #define ADAFRUIT_FONA_H
jbaker66 0:831eff5e20cb 24
jbaker66 0:831eff5e20cb 25 #include "mbed.h"
jbaker66 0:831eff5e20cb 26
jbaker66 0:831eff5e20cb 27 //#define ADAFRUIT_FONA_DEBUG
jbaker66 0:831eff5e20cb 28
jbaker66 0:831eff5e20cb 29 #define FONA_HEADSETAUDIO 0
jbaker66 0:831eff5e20cb 30 #define FONA_EXTAUDIO 1
jbaker66 0:831eff5e20cb 31
jbaker66 0:831eff5e20cb 32 #define FONA_STTONE_DIALTONE 1
jbaker66 0:831eff5e20cb 33 #define FONA_STTONE_BUSY 2
jbaker66 0:831eff5e20cb 34 #define FONA_STTONE_CONGESTION 3
jbaker66 0:831eff5e20cb 35 #define FONA_STTONE_PATHACK 4
jbaker66 0:831eff5e20cb 36 #define FONA_STTONE_DROPPED 5
jbaker66 0:831eff5e20cb 37 #define FONA_STTONE_ERROR 6
jbaker66 0:831eff5e20cb 38 #define FONA_STTONE_CALLWAIT 7
jbaker66 0:831eff5e20cb 39 #define FONA_STTONE_RINGING 8
jbaker66 0:831eff5e20cb 40 #define FONA_STTONE_BEEP 16
jbaker66 0:831eff5e20cb 41 #define FONA_STTONE_POSTONE 17
jbaker66 0:831eff5e20cb 42 #define FONA_STTONE_ERRTONE 18
jbaker66 0:831eff5e20cb 43 #define FONA_STTONE_INDIANDIALTONE 19
jbaker66 0:831eff5e20cb 44 #define FONA_STTONE_USADIALTONE 20
jbaker66 0:831eff5e20cb 45
jbaker66 0:831eff5e20cb 46 #define FONA_DEFAULT_TIMEOUT_MS 500 //timeout between send AT and reply from FONA
jbaker66 0:831eff5e20cb 47
jbaker66 0:831eff5e20cb 48 #define FONA_HTTP_GET 0
jbaker66 0:831eff5e20cb 49 #define FONA_HTTP_POST 1
jbaker66 0:831eff5e20cb 50 #define FONA_HTTP_HEAD 2
jbaker66 0:831eff5e20cb 51
jbaker66 0:831eff5e20cb 52 #define RX_BUFFER_SIZE 255
jbaker66 0:831eff5e20cb 53
jbaker66 0:831eff5e20cb 54 /** Adafruit FONA 800H Class
jbaker66 0:831eff5e20cb 55 * Modified by George Tzintzarov & Jesse Baker 03/14/2016 for use in mbed LPC1768
jbaker66 0:831eff5e20cb 56 */
jbaker66 0:831eff5e20cb 57
jbaker66 0:831eff5e20cb 58 class Adafruit_FONA : public Stream {
jbaker66 0:831eff5e20cb 59 public:
jbaker66 0:831eff5e20cb 60 /**
jbaker66 0:831eff5e20cb 61 Listener for FONA events. Inherit this class to customize.
jbaker66 0:831eff5e20cb 62 @code
jbaker66 0:831eff5e20cb 63 #define FONA_RST p12
jbaker66 0:831eff5e20cb 64 #define FONA_TX p13
jbaker66 0:831eff5e20cb 65 #define FONA_RX p14
jbaker66 0:831eff5e20cb 66 #define FONA_RI p11
jbaker66 0:831eff5e20cb 67
jbaker66 0:831eff5e20cb 68 Adafruit_FONA my_fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
jbaker66 0:831eff5e20cb 69 DigitalOut led1(LED1);
jbaker66 0:831eff5e20cb 70 class FonaEventListener : public Adafruit_FONA::EventListener {
jbaker66 0:831eff5e20cb 71 virtual void onRing() {
jbaker66 0:831eff5e20cb 72 led1 = 1;
jbaker66 0:831eff5e20cb 73 }
jbaker66 0:831eff5e20cb 74
jbaker66 0:831eff5e20cb 75 virtual void onNoCarrier() {
jbaker66 0:831eff5e20cb 76 led1 = 0;
jbaker66 0:831eff5e20cb 77 }
jbaker66 0:831eff5e20cb 78 };
jbaker66 0:831eff5e20cb 79 FonaEventListener fonaEventListener;
jbaker66 0:831eff5e20cb 80 my_fona.setEventListener(&fonaEventListener);
jbaker66 0:831eff5e20cb 81 @endcode
jbaker66 0:831eff5e20cb 82 */
jbaker66 0:831eff5e20cb 83
jbaker66 0:831eff5e20cb 84 class EventListener {
jbaker66 0:831eff5e20cb 85 public:
jbaker66 0:831eff5e20cb 86 /**
jbaker66 0:831eff5e20cb 87 * Method called when somebody call the FONA.
jbaker66 0:831eff5e20cb 88 */
jbaker66 0:831eff5e20cb 89 virtual void onRing() = 0;
jbaker66 0:831eff5e20cb 90
jbaker66 0:831eff5e20cb 91 /**
jbaker66 0:831eff5e20cb 92 * Method called when the calling person stop his call.
jbaker66 0:831eff5e20cb 93 */
jbaker66 0:831eff5e20cb 94 virtual void onNoCarrier() = 0;
jbaker66 0:831eff5e20cb 95 };
jbaker66 0:831eff5e20cb 96
jbaker66 0:831eff5e20cb 97 public:
jbaker66 0:831eff5e20cb 98 /** Create instance of the Adafruit_FONA
jbaker66 0:831eff5e20cb 99 @param tx Set mbed TX
jbaker66 0:831eff5e20cb 100 @param rx Set mbed RX
jbaker66 0:831eff5e20cb 101 @param rst Set reset pin
jbaker66 0:831eff5e20cb 102 @param ringIndicator Set ring indicator pin. This is to let mbed know if there is an incoming call
jbaker66 0:831eff5e20cb 103 */
jbaker66 0:831eff5e20cb 104
jbaker66 0:831eff5e20cb 105 Adafruit_FONA(PinName tx, PinName rx, PinName rst, PinName ringIndicator) :
jbaker66 0:831eff5e20cb 106 _rstpin(rst, false), _ringIndicatorInterruptIn(ringIndicator),
jbaker66 0:831eff5e20cb 107 apn("FONAnet"), apnusername(NULL), apnpassword(NULL), httpsredirect(false), useragent("FONA"),
jbaker66 0:831eff5e20cb 108 _incomingCall(false), eventListener(NULL), mySerial(tx, rx), rxBufferInIndex(0), rxBufferOutIndex(0),
jbaker66 0:831eff5e20cb 109 currentReceivedLineSize(0) {}
jbaker66 0:831eff5e20cb 110
jbaker66 0:831eff5e20cb 111 /** Built-in Test to see if FONA is connected
jbaker66 0:831eff5e20cb 112 @param baudrate test and set at baudrate
jbaker66 0:831eff5e20cb 113 @return true upon success
jbaker66 0:831eff5e20cb 114 @return false upon failure. Most likely something is not hooked up.
jbaker66 0:831eff5e20cb 115
jbaker66 0:831eff5e20cb 116 EXAMPLE CODE:
jbaker66 0:831eff5e20cb 117 @code
jbaker66 0:831eff5e20cb 118 // See if the FONA is responding
jbaker66 0:831eff5e20cb 119 // fona is an instance of Adafruit_FONA
jbaker66 0:831eff5e20cb 120 if (! fona.begin(9600)) {
jbaker66 0:831eff5e20cb 121 printf("Couldn't find FONA\r\n");
jbaker66 0:831eff5e20cb 122 while (1);
jbaker66 0:831eff5e20cb 123 }
jbaker66 0:831eff5e20cb 124 @endcode
jbaker66 0:831eff5e20cb 125 */
jbaker66 0:831eff5e20cb 126 bool begin(int baudrate);
jbaker66 0:831eff5e20cb 127
jbaker66 0:831eff5e20cb 128 /** Set the event listener for incoming calls
jbaker66 0:831eff5e20cb 129 @param eventListener A pointer to the event listener
jbaker66 0:831eff5e20cb 130 @see Adafruit_FONA::EventListener for specific example
jbaker66 0:831eff5e20cb 131 */
jbaker66 0:831eff5e20cb 132
jbaker66 0:831eff5e20cb 133 void setEventListener(EventListener *eventListener);
jbaker66 0:831eff5e20cb 134
jbaker66 0:831eff5e20cb 135 // Stream----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 136 virtual int _putc(int value);
jbaker66 0:831eff5e20cb 137 virtual int _getc();
jbaker66 0:831eff5e20cb 138
jbaker66 0:831eff5e20cb 139 /** Check if FONA has anything in its output buffer
jbaker66 0:831eff5e20cb 140 @return 0 if nothing
jbaker66 0:831eff5e20cb 141 */
jbaker66 0:831eff5e20cb 142 int readable(void);
jbaker66 0:831eff5e20cb 143
jbaker66 0:831eff5e20cb 144 // RTC----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 145 bool enableRTC(uint8_t i); // i = 0 <=> disable, i = 1 <=> enable
jbaker66 0:831eff5e20cb 146
jbaker66 0:831eff5e20cb 147 // Battery and ADC----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 148 /** Get ADC voltage from external pin
jbaker66 0:831eff5e20cb 149 @param v uint16_t pointer to insert ADC voltage data
jbaker66 0:831eff5e20cb 150 @return TRUE if successful
jbaker66 0:831eff5e20cb 151
jbaker66 0:831eff5e20cb 152 EXAMPLE CODE:
jbaker66 0:831eff5e20cb 153 @code
jbaker66 0:831eff5e20cb 154 // read the ADC
jbaker66 0:831eff5e20cb 155 // fona is an instance of Adafruit_FONA
jbaker66 0:831eff5e20cb 156 uint16_t adc;
jbaker66 0:831eff5e20cb 157 if (! fona.getADCVoltage(&adc)) {
jbaker66 0:831eff5e20cb 158 printf("Failed to read ADC\r\n");
jbaker66 0:831eff5e20cb 159 }
jbaker66 0:831eff5e20cb 160 else {
jbaker66 0:831eff5e20cb 161 printf("ADC = %d mV\r\n", adc);
jbaker66 0:831eff5e20cb 162 }
jbaker66 0:831eff5e20cb 163 @endcode
jbaker66 0:831eff5e20cb 164 */
jbaker66 0:831eff5e20cb 165 bool getADCVoltage(uint16_t *v);
jbaker66 0:831eff5e20cb 166
jbaker66 0:831eff5e20cb 167 /** Get battery percentage level
jbaker66 0:831eff5e20cb 168 @param p uint16_t pointer to insert battery percent data
jbaker66 0:831eff5e20cb 169 @return TRUE if successful
jbaker66 0:831eff5e20cb 170
jbaker66 0:831eff5e20cb 171 EXAMPLE CODE:
jbaker66 0:831eff5e20cb 172 @code
jbaker66 0:831eff5e20cb 173 // read the battery percent level
jbaker66 0:831eff5e20cb 174 // fona is an instance of Adafruit_FONA
jbaker66 0:831eff5e20cb 175 uint16_t vbatPer;
jbaker66 0:831eff5e20cb 176 if (! fona.getBattPercent(&vbatPer)) {
jbaker66 0:831eff5e20cb 177 printf("Failed to read Batt\r\n");
jbaker66 0:831eff5e20cb 178 }
jbaker66 0:831eff5e20cb 179 else {
jbaker66 0:831eff5e20cb 180 printf("VPct = %d%%\r\n", vbatPer);
jbaker66 0:831eff5e20cb 181 }
jbaker66 0:831eff5e20cb 182 @endcode
jbaker66 0:831eff5e20cb 183 */
jbaker66 0:831eff5e20cb 184
jbaker66 0:831eff5e20cb 185 bool getBattPercent(uint16_t *p);
jbaker66 0:831eff5e20cb 186
jbaker66 0:831eff5e20cb 187 /** Get battery voltage level
jbaker66 0:831eff5e20cb 188 @param v uint16_t pointer to insert battery voltage data
jbaker66 0:831eff5e20cb 189 @return TRUE if successful
jbaker66 0:831eff5e20cb 190
jbaker66 0:831eff5e20cb 191 EXAMPLE CODE:
jbaker66 0:831eff5e20cb 192 @code
jbaker66 0:831eff5e20cb 193 // read the battery voltage
jbaker66 0:831eff5e20cb 194 // fona is an instance of Adafruit_FONA
jbaker66 0:831eff5e20cb 195 uint16_t vbat;
jbaker66 0:831eff5e20cb 196 if (! fona.getBattPercent(&vbat)) {
jbaker66 0:831eff5e20cb 197 printf("Failed to read Batt\r\n");
jbaker66 0:831eff5e20cb 198 }
jbaker66 0:831eff5e20cb 199 else {
jbaker66 0:831eff5e20cb 200 printf("Vbat = %d%%\r\n", vbat);
jbaker66 0:831eff5e20cb 201 }
jbaker66 0:831eff5e20cb 202 @endcode
jbaker66 0:831eff5e20cb 203 */
jbaker66 0:831eff5e20cb 204 bool getBattVoltage(uint16_t *v);
jbaker66 0:831eff5e20cb 205
jbaker66 0:831eff5e20cb 206 // SIM query----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 207 /** Unlock SIM if needed
jbaker66 0:831eff5e20cb 208 @param pin 4 digit char arrary
jbaker66 0:831eff5e20cb 209 @return TRUE if successful
jbaker66 0:831eff5e20cb 210 */
jbaker66 0:831eff5e20cb 211 bool unlockSIM(char *pin);
jbaker66 0:831eff5e20cb 212 /** Get the SIM chip card interface device (CCID)
jbaker66 0:831eff5e20cb 213 @param ccid make sure it is at least 21 bytes long
jbaker66 0:831eff5e20cb 214 @return length of CCID
jbaker66 0:831eff5e20cb 215 */
jbaker66 0:831eff5e20cb 216
jbaker66 0:831eff5e20cb 217 uint8_t getSIMCCID(char *ccid);
jbaker66 0:831eff5e20cb 218 /** Get the Network Status of FONA
jbaker66 0:831eff5e20cb 219 @return Code 0-5
jbaker66 0:831eff5e20cb 220 @see https://www.adafruit.com/datasheets/sim800_series_at_command_manual_v1.01.pdf page 80
jbaker66 0:831eff5e20cb 221 */
jbaker66 0:831eff5e20cb 222 uint8_t getNetworkStatus(void);
jbaker66 0:831eff5e20cb 223
jbaker66 0:831eff5e20cb 224 /** Get the RSSI of the network signal
jbaker66 0:831eff5e20cb 225 @return RSSI value in dBm per below reference
jbaker66 0:831eff5e20cb 226
jbaker66 0:831eff5e20cb 227 EXAMPLE
jbaker66 0:831eff5e20cb 228 @code
jbaker66 0:831eff5e20cb 229 // read the RSSI
jbaker66 0:831eff5e20cb 230 uint8_t n = fona.getRSSI();
jbaker66 0:831eff5e20cb 231 int8_t r = 0;
jbaker66 0:831eff5e20cb 232
jbaker66 0:831eff5e20cb 233 pcSerial.printf("RSSI = %d: ", n);
jbaker66 0:831eff5e20cb 234 if (n == 0) r = -115;
jbaker66 0:831eff5e20cb 235 if (n == 1) r = -111;
jbaker66 0:831eff5e20cb 236 if (n == 31) r = -52;
jbaker66 0:831eff5e20cb 237 if ((n >= 2) && (n <= 30)) {
jbaker66 0:831eff5e20cb 238 r = map(n, 2, 30, -110, -54);
jbaker66 0:831eff5e20cb 239 }
jbaker66 0:831eff5e20cb 240 printf("%d dBm\r\n", r);
jbaker66 0:831eff5e20cb 241
jbaker66 0:831eff5e20cb 242 // helper function MAP to do calculations
jbaker66 0:831eff5e20cb 243 long MAP(long x, long in_min, long in_max, long out_min, long out_max)
jbaker66 0:831eff5e20cb 244 {
jbaker66 0:831eff5e20cb 245 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
jbaker66 0:831eff5e20cb 246 }
jbaker66 0:831eff5e20cb 247 @endcode
jbaker66 0:831eff5e20cb 248 @see https://www.adafruit.com/datasheets/sim800_series_at_command_manual_v1.01.pdf page 82
jbaker66 0:831eff5e20cb 249 */
jbaker66 0:831eff5e20cb 250 uint8_t getRSSI(void);
jbaker66 0:831eff5e20cb 251
jbaker66 0:831eff5e20cb 252 // IMEI----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 253 /** Get the International Mobile Station Equipment Identity (IMEI)
jbaker66 0:831eff5e20cb 254 @param imei A char array with minimum length 16
jbaker66 0:831eff5e20cb 255 @return The IMEI of the device
jbaker66 0:831eff5e20cb 256
jbaker66 0:831eff5e20cb 257 EXAMPLE CODE:
jbaker66 0:831eff5e20cb 258 @code
jbaker66 0:831eff5e20cb 259 // Print SIM card IMEI number.
jbaker66 0:831eff5e20cb 260 char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
jbaker66 0:831eff5e20cb 261 uint8_t imeiLen = fona.getIMEI(imei); //fona is an instance of Adafruit_FONA
jbaker66 0:831eff5e20cb 262 if (imeiLen > 0) {
jbaker66 0:831eff5e20cb 263 pcSerial.printf("SIM card IMEI: %s\r\n", imei);
jbaker66 0:831eff5e20cb 264 }
jbaker66 0:831eff5e20cb 265 @endcode
jbaker66 0:831eff5e20cb 266 */
jbaker66 0:831eff5e20cb 267 uint8_t getIMEI(char *imei);
jbaker66 0:831eff5e20cb 268
jbaker66 0:831eff5e20cb 269 // set Audio output----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 270 /** Set the Audio Output interface
jbaker66 0:831eff5e20cb 271 @param a 0 is headset, 1 is external audio
jbaker66 0:831eff5e20cb 272 @return TRUE if successful
jbaker66 0:831eff5e20cb 273 */
jbaker66 0:831eff5e20cb 274 bool setAudio(uint8_t a);
jbaker66 0:831eff5e20cb 275
jbaker66 0:831eff5e20cb 276 /** Set the Audio Volume
jbaker66 0:831eff5e20cb 277 @param i a unit8_t volume number
jbaker66 0:831eff5e20cb 278 @return TRUE if successful
jbaker66 0:831eff5e20cb 279 */
jbaker66 0:831eff5e20cb 280 bool setVolume(uint8_t i);
jbaker66 0:831eff5e20cb 281
jbaker66 0:831eff5e20cb 282 /** Get the Audio Volume
jbaker66 0:831eff5e20cb 283 @return the current volume
jbaker66 0:831eff5e20cb 284 */
jbaker66 0:831eff5e20cb 285 uint8_t getVolume(void);
jbaker66 0:831eff5e20cb 286 bool playToolkitTone(uint8_t t, uint16_t len);
jbaker66 0:831eff5e20cb 287 bool setMicVolume(uint8_t a, uint8_t level);
jbaker66 0:831eff5e20cb 288 bool playDTMF(char tone);
jbaker66 0:831eff5e20cb 289
jbaker66 0:831eff5e20cb 290 // FM radio functions----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 291 /** Tune the FM radio
jbaker66 0:831eff5e20cb 292 @param station frequency, for example 107.9 MHz -> 1079
jbaker66 0:831eff5e20cb 293 @return TRUE if successful
jbaker66 0:831eff5e20cb 294 */
jbaker66 0:831eff5e20cb 295 bool tuneFMradio(uint16_t station);
jbaker66 0:831eff5e20cb 296
jbaker66 0:831eff5e20cb 297 /** FM radio set output
jbaker66 0:831eff5e20cb 298 @param onoff bool to turn on if TRUE
jbaker66 0:831eff5e20cb 299 @param a 0 (default) is headset, 1 is external audio
jbaker66 0:831eff5e20cb 300 @return TRUE if successful
jbaker66 0:831eff5e20cb 301 */
jbaker66 0:831eff5e20cb 302 bool FMradio(bool onoff, uint8_t a = FONA_HEADSETAUDIO);
jbaker66 0:831eff5e20cb 303
jbaker66 0:831eff5e20cb 304 /** Set the FM Radio Volume
jbaker66 0:831eff5e20cb 305 @param i a unit8_t volume number
jbaker66 0:831eff5e20cb 306 @return TRUE if successful
jbaker66 0:831eff5e20cb 307 */
jbaker66 0:831eff5e20cb 308 bool setFMVolume(uint8_t i);
jbaker66 0:831eff5e20cb 309
jbaker66 0:831eff5e20cb 310 /** Get the FM Volume
jbaker66 0:831eff5e20cb 311 @return the current FM volume
jbaker66 0:831eff5e20cb 312 */
jbaker66 0:831eff5e20cb 313 int8_t getFMVolume();
jbaker66 0:831eff5e20cb 314
jbaker66 0:831eff5e20cb 315 /** Get the FM signal strength
jbaker66 0:831eff5e20cb 316 @param station a unit8_t volume number
jbaker66 0:831eff5e20cb 317 @return TRUE if successful
jbaker66 0:831eff5e20cb 318 */
jbaker66 0:831eff5e20cb 319 int8_t getFMSignalLevel(uint16_t station);
jbaker66 0:831eff5e20cb 320
jbaker66 0:831eff5e20cb 321 // SMS handling----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 322 /** Set the SMS Interrupt
jbaker66 0:831eff5e20cb 323 @param i 0 = OFF, 1 = ON with TCPIP, FTP, and URC control Ring Indicator Pin, 2 = ON with only TCPIP control
jbaker66 0:831eff5e20cb 324 @return TRUE if successful
jbaker66 0:831eff5e20cb 325 @see https://www.adafruit.com/datasheets/sim800_series_at_command_manual_v1.01.pdf page 152
jbaker66 0:831eff5e20cb 326 */
jbaker66 0:831eff5e20cb 327 bool setSMSInterrupt(uint8_t i);
jbaker66 0:831eff5e20cb 328
jbaker66 0:831eff5e20cb 329 /** Get SMS Interrupt Setting
jbaker66 0:831eff5e20cb 330 @return setting
jbaker66 0:831eff5e20cb 331 @see https://www.adafruit.com/datasheets/sim800_series_at_command_manual_v1.01.pdf page 152
jbaker66 0:831eff5e20cb 332 */
jbaker66 0:831eff5e20cb 333 uint8_t getSMSInterrupt(void);
jbaker66 0:831eff5e20cb 334
jbaker66 0:831eff5e20cb 335 /** Set the SMS Interrupt
jbaker66 0:831eff5e20cb 336 @return number of SMS messages in inbox
jbaker66 0:831eff5e20cb 337 */
jbaker66 0:831eff5e20cb 338 int8_t getNumSMS(void);
jbaker66 0:831eff5e20cb 339
jbaker66 0:831eff5e20cb 340 /** Read SMS
jbaker66 0:831eff5e20cb 341 @param i sms number in memory
jbaker66 0:831eff5e20cb 342 @param smsbuff char pointer to char array
jbaker66 0:831eff5e20cb 343 @param max Maximum length of smsbuff
jbaker66 0:831eff5e20cb 344 @param readsize the size in bytes of the SMS
jbaker66 0:831eff5e20cb 345 @return TRUE if successful
jbaker66 0:831eff5e20cb 346 */
jbaker66 0:831eff5e20cb 347 bool readSMS(uint8_t i, char *smsbuff, uint16_t max, uint16_t *readsize);
jbaker66 0:831eff5e20cb 348
jbaker66 0:831eff5e20cb 349 /** Send SMS
jbaker66 0:831eff5e20cb 350 @param smsaddr Phone number to send out
jbaker66 0:831eff5e20cb 351 @param smsmsg Char array containing message
jbaker66 0:831eff5e20cb 352 @return TRUE if successful
jbaker66 0:831eff5e20cb 353 */
jbaker66 0:831eff5e20cb 354 bool sendSMS(char *smsaddr, char *smsmsg);
jbaker66 0:831eff5e20cb 355
jbaker66 0:831eff5e20cb 356 /** Delete SMS
jbaker66 0:831eff5e20cb 357 @param i number of SMS in memory
jbaker66 0:831eff5e20cb 358 @return TRUE if successful
jbaker66 0:831eff5e20cb 359 */
jbaker66 0:831eff5e20cb 360 bool deleteSMS(uint8_t i);
jbaker66 0:831eff5e20cb 361
jbaker66 0:831eff5e20cb 362 /** Send SMS
jbaker66 0:831eff5e20cb 363 @param i Number of SMS in memory
jbaker66 0:831eff5e20cb 364 @param sender Char array to store the sender number
jbaker66 0:831eff5e20cb 365 @param senderlen length of sender
jbaker66 0:831eff5e20cb 366 @return TRUE if successful
jbaker66 0:831eff5e20cb 367 */
jbaker66 0:831eff5e20cb 368 bool getSMSSender(uint8_t i, char *sender, int senderlen);
jbaker66 0:831eff5e20cb 369
jbaker66 0:831eff5e20cb 370 // Time----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 371 /** Enable FONA to sync time with the cellular network
jbaker66 0:831eff5e20cb 372 @param onoff on = true, off = false
jbaker66 0:831eff5e20cb 373 @return TRUE if successful
jbaker66 0:831eff5e20cb 374 */
jbaker66 0:831eff5e20cb 375 bool enableNetworkTimeSync(bool onoff);
jbaker66 0:831eff5e20cb 376
jbaker66 0:831eff5e20cb 377 /** Enable FONA to sync time with the time server
jbaker66 0:831eff5e20cb 378 @param onoff true = on, false = off
jbaker66 0:831eff5e20cb 379 @return TRUE if successful
jbaker66 0:831eff5e20cb 380 */
jbaker66 0:831eff5e20cb 381 bool enableNTPTimeSync(bool onoff, const char* ntpserver=0);
jbaker66 0:831eff5e20cb 382
jbaker66 0:831eff5e20cb 383 /** Retrieve the current time from the enabled server
jbaker66 0:831eff5e20cb 384 @param buff char array to store time value. Given as "yy/MM/dd,hh:mm:ss+zz"
jbaker66 0:831eff5e20cb 385 @param maxlen Maximum length of the char array
jbaker66 0:831eff5e20cb 386 @return TRUE if successful
jbaker66 0:831eff5e20cb 387 */
jbaker66 0:831eff5e20cb 388 bool getTime(char* buff, uint16_t maxlen);
jbaker66 0:831eff5e20cb 389
jbaker66 0:831eff5e20cb 390 // GPRS handling----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 391 bool enableGPRS(bool onoff);
jbaker66 0:831eff5e20cb 392 uint8_t GPRSstate(void);
jbaker66 0:831eff5e20cb 393 bool getGSMLoc(uint16_t *replycode, char *buff, uint16_t maxlen);
jbaker66 0:831eff5e20cb 394 bool getGSMLoc(float *lat, float *lon);
jbaker66 0:831eff5e20cb 395 void setGPRSNetworkSettings(const char* apn, const char* username=0, const char* password=0);
jbaker66 0:831eff5e20cb 396
jbaker66 0:831eff5e20cb 397 // GPS handling----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 398 bool enableGPS(bool onoff);
jbaker66 0:831eff5e20cb 399 int8_t GPSstatus(void);
jbaker66 0:831eff5e20cb 400 uint8_t getGPS(uint8_t arg, char *buffer, uint8_t maxbuff);
jbaker66 0:831eff5e20cb 401 bool getGPS(float *lat, float *lon, float *speed_kph=0, float *heading=0, float *altitude=0);
jbaker66 0:831eff5e20cb 402 bool enableGPSNMEA(uint8_t nmea);
jbaker66 0:831eff5e20cb 403
jbaker66 0:831eff5e20cb 404 // TCP raw connections----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 405 bool TCPconnect(char *server, uint16_t port);
jbaker66 0:831eff5e20cb 406 bool TCPclose(void);
jbaker66 0:831eff5e20cb 407 bool TCPconnected(void);
jbaker66 0:831eff5e20cb 408 bool TCPsend(char *packet, uint8_t len);
jbaker66 0:831eff5e20cb 409 uint16_t TCPavailable(void);
jbaker66 0:831eff5e20cb 410 uint16_t TCPread(uint8_t *buff, uint8_t len);
jbaker66 0:831eff5e20cb 411
jbaker66 0:831eff5e20cb 412 // HTTP low level interface (maps directly to SIM800 commands).----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 413 bool HTTP_init();
jbaker66 0:831eff5e20cb 414 bool HTTP_term();
jbaker66 0:831eff5e20cb 415 void HTTP_para_start(const char* parameter, bool quoted = true);
jbaker66 0:831eff5e20cb 416 bool HTTP_para_end(bool quoted = true);
jbaker66 0:831eff5e20cb 417 bool HTTP_para(const char* parameter, const char *value);
jbaker66 0:831eff5e20cb 418 bool HTTP_para(const char* parameter, int32_t value);
jbaker66 0:831eff5e20cb 419 bool HTTP_data(uint32_t size, uint32_t maxTime=10000);
jbaker66 0:831eff5e20cb 420 bool HTTP_action(uint8_t method, uint16_t *status, uint16_t *datalen, int32_t timeout = 10000);
jbaker66 0:831eff5e20cb 421 bool HTTP_readall(uint16_t *datalen);
jbaker66 0:831eff5e20cb 422 bool HTTP_ssl(bool onoff);
jbaker66 0:831eff5e20cb 423
jbaker66 0:831eff5e20cb 424 // HTTP high level interface (easier to use, less flexible).----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 425 bool HTTP_GET_start(char *url, uint16_t *status, uint16_t *datalen);
jbaker66 0:831eff5e20cb 426 void HTTP_GET_end(void);
jbaker66 0:831eff5e20cb 427 bool HTTP_POST_start(char *url, const char* contenttype, const uint8_t *postdata, uint16_t postdatalen, uint16_t *status, uint16_t *datalen);
jbaker66 0:831eff5e20cb 428 void HTTP_POST_end(void);
jbaker66 0:831eff5e20cb 429 void setUserAgent(const char* useragent);
jbaker66 0:831eff5e20cb 430
jbaker66 0:831eff5e20cb 431 // HTTPS----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 432 void setHTTPSRedirect(bool onoff);
jbaker66 0:831eff5e20cb 433
jbaker66 0:831eff5e20cb 434 // PWM (buzzer)----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 435 /** Control the buzzer capability of the PWM out on the FONA
jbaker66 0:831eff5e20cb 436 @param period of the buzzing cycle (max 2000)
jbaker66 0:831eff5e20cb 437 @param duty the duty cycle of the buzzer (0 to 100)
jbaker66 0:831eff5e20cb 438 @return TRUE if successful
jbaker66 0:831eff5e20cb 439 */
jbaker66 0:831eff5e20cb 440 bool setPWM(uint16_t period, uint8_t duty = 50);
jbaker66 0:831eff5e20cb 441
jbaker66 0:831eff5e20cb 442 // Phone calls----------------------------------------------------------------------
jbaker66 0:831eff5e20cb 443 /** Call a phone
jbaker66 0:831eff5e20cb 444 @param phonenum a character array of the phone number
jbaker66 0:831eff5e20cb 445 @return TRUE if successful
jbaker66 0:831eff5e20cb 446 */
jbaker66 0:831eff5e20cb 447 bool callPhone(char *phonenum);
jbaker66 0:831eff5e20cb 448
jbaker66 0:831eff5e20cb 449 /** Hang up a phone call
jbaker66 0:831eff5e20cb 450 */
jbaker66 0:831eff5e20cb 451 bool hangUp(void);
jbaker66 0:831eff5e20cb 452
jbaker66 0:831eff5e20cb 453 /** Answer a phone call
jbaker66 0:831eff5e20cb 454 */
jbaker66 0:831eff5e20cb 455 bool pickUp(void);
jbaker66 0:831eff5e20cb 456
jbaker66 0:831eff5e20cb 457 /** Enable/disable caller ID
jbaker66 0:831eff5e20cb 458 @param enable true to enable, false to disable
jbaker66 0:831eff5e20cb 459 @return TRUE if successful
jbaker66 0:831eff5e20cb 460 */
jbaker66 0:831eff5e20cb 461 bool callerIdNotification(bool enable);
jbaker66 0:831eff5e20cb 462
jbaker66 0:831eff5e20cb 463 /** Retrieve the incoming call number
jbaker66 0:831eff5e20cb 464 @param phonenum a character array of the phone number calling
jbaker66 0:831eff5e20cb 465 @return TRUE if successful
jbaker66 0:831eff5e20cb 466 */
jbaker66 0:831eff5e20cb 467 bool incomingCallNumber(char* phonenum);
jbaker66 0:831eff5e20cb 468
jbaker66 0:831eff5e20cb 469 // Helper functions to verify responses.
jbaker66 0:831eff5e20cb 470 bool expectReply(const char* reply, uint16_t timeout = 10000);
jbaker66 0:831eff5e20cb 471
jbaker66 0:831eff5e20cb 472 private:
jbaker66 0:831eff5e20cb 473 DigitalOut _rstpin;
jbaker66 0:831eff5e20cb 474 InterruptIn _ringIndicatorInterruptIn;
jbaker66 0:831eff5e20cb 475
jbaker66 0:831eff5e20cb 476 char replybuffer[255]; // the output of getreply(), readline() is the function that changes the replybuffer
jbaker66 0:831eff5e20cb 477 char* apn;
jbaker66 0:831eff5e20cb 478 char* apnusername;
jbaker66 0:831eff5e20cb 479 char* apnpassword;
jbaker66 0:831eff5e20cb 480 bool httpsredirect;
jbaker66 0:831eff5e20cb 481 char* useragent;
jbaker66 0:831eff5e20cb 482
jbaker66 0:831eff5e20cb 483 volatile bool _incomingCall;
jbaker66 0:831eff5e20cb 484 EventListener *eventListener;
jbaker66 0:831eff5e20cb 485 Serial mySerial;
jbaker66 0:831eff5e20cb 486
jbaker66 0:831eff5e20cb 487 // Circular buffer used to receive serial data from an interruption
jbaker66 0:831eff5e20cb 488 int rxBuffer[RX_BUFFER_SIZE + 1];
jbaker66 0:831eff5e20cb 489 volatile int rxBufferInIndex; // Index where new data is added to the buffer
jbaker66 0:831eff5e20cb 490 volatile int rxBufferOutIndex; // Index where data is removed from the buffer
jbaker66 0:831eff5e20cb 491 char currentReceivedLine[RX_BUFFER_SIZE]; // Array containing the current received line
jbaker66 0:831eff5e20cb 492 int currentReceivedLineSize;
jbaker66 0:831eff5e20cb 493
jbaker66 0:831eff5e20cb 494 inline bool isRxBufferFull() {
jbaker66 0:831eff5e20cb 495 return ((rxBufferInIndex + 1) % RX_BUFFER_SIZE) == rxBufferOutIndex;
jbaker66 0:831eff5e20cb 496 }
jbaker66 0:831eff5e20cb 497
jbaker66 0:831eff5e20cb 498 inline bool isRxBufferEmpty() {
jbaker66 0:831eff5e20cb 499 return rxBufferInIndex == rxBufferOutIndex;
jbaker66 0:831eff5e20cb 500 }
jbaker66 0:831eff5e20cb 501
jbaker66 0:831eff5e20cb 502 inline void incrementRxBufferInIndex() {
jbaker66 0:831eff5e20cb 503 rxBufferInIndex = (rxBufferInIndex + 1) % RX_BUFFER_SIZE;
jbaker66 0:831eff5e20cb 504 }
jbaker66 0:831eff5e20cb 505
jbaker66 0:831eff5e20cb 506 inline void incrementRxBufferOutIndex() {
jbaker66 0:831eff5e20cb 507 rxBufferOutIndex = (rxBufferOutIndex + 1) % RX_BUFFER_SIZE;
jbaker66 0:831eff5e20cb 508 }
jbaker66 0:831eff5e20cb 509
jbaker66 0:831eff5e20cb 510 /**
jbaker66 0:831eff5e20cb 511 * Method called when Serial data is received (interrupt routine).
jbaker66 0:831eff5e20cb 512 */
jbaker66 0:831eff5e20cb 513 void onSerialDataReceived();
jbaker66 0:831eff5e20cb 514
jbaker66 0:831eff5e20cb 515 // HTTP helpers
jbaker66 0:831eff5e20cb 516 bool HTTP_setup(char *url);
jbaker66 0:831eff5e20cb 517
jbaker66 0:831eff5e20cb 518 void flushInput();
jbaker66 0:831eff5e20cb 519 uint16_t readRaw(uint16_t b);
jbaker66 0:831eff5e20cb 520 uint8_t readline(uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS, bool multiline = false);
jbaker66 0:831eff5e20cb 521 uint8_t getReply(const char* send, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 522 uint8_t getReply(const char* prefix, char *suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 523 uint8_t getReply(const char* prefix, int32_t suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 524 uint8_t getReply(const char* prefix, int32_t suffix1, int32_t suffix2, uint16_t timeout); // Don't set default value or else function call is ambiguous.
jbaker66 0:831eff5e20cb 525 uint8_t getReplyQuoted(const char* prefix, const char* suffix, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 526
jbaker66 0:831eff5e20cb 527 bool sendCheckReply(const char* send, const char* reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 528 bool sendCheckReply(const char* prefix, char *suffix, const char* reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 529 bool sendCheckReply(const char* prefix, int32_t suffix, const char* reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 530 bool sendCheckReply(const char* prefix, int32_t suffix, int32_t suffix2, const char* reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 531 bool sendCheckReplyQuoted(const char* prefix, const char* suffix, const char* reply, uint16_t timeout = FONA_DEFAULT_TIMEOUT_MS);
jbaker66 0:831eff5e20cb 532
jbaker66 0:831eff5e20cb 533 bool parseReply(const char* toreply, uint16_t *v, char divider = ',', uint8_t index=0);
jbaker66 0:831eff5e20cb 534 bool parseReply(const char* toreply, char *v, char divider = ',', uint8_t index=0);
jbaker66 0:831eff5e20cb 535 bool parseReplyQuoted(const char* toreply, char* v, int maxlen, char divider, uint8_t index);
jbaker66 0:831eff5e20cb 536
jbaker66 0:831eff5e20cb 537 bool sendParseReply(const char* tosend, const char* toreply, uint16_t *v, char divider = ',', uint8_t index = 0);
jbaker66 0:831eff5e20cb 538
jbaker66 0:831eff5e20cb 539 void onIncomingCall();
jbaker66 0:831eff5e20cb 540 };
jbaker66 0:831eff5e20cb 541
jbaker66 0:831eff5e20cb 542 #endif