Allows SMS to be sent to query Alexa. Also allows HTTP requests to be sent to Alexa via an ESP8266-hosted web server.

Dependencies:   emic2 mbed

Committer:
itatchi42
Date:
Tue May 02 03:13:27 2017 +0000
Revision:
0:1271d15b4d4b
Allows SMS communication with Amazon Dot's Alexa.; Also allows URL queries to be sent to ESP8266-hosted HTTP server to communicate with Alexa.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
itatchi42 0:1271d15b4d4b 1 /***************************************************
itatchi42 0:1271d15b4d4b 2 This is an example for our Adafruit FONA Cellular Module
itatchi42 0:1271d15b4d4b 3
itatchi42 0:1271d15b4d4b 4 Designed specifically to work with the Adafruit FONA
itatchi42 0:1271d15b4d4b 5 ----> http://www.adafruit.com/products/1946
itatchi42 0:1271d15b4d4b 6 ----> http://www.adafruit.com/products/1963
itatchi42 0:1271d15b4d4b 7 ----> http://www.adafruit.com/products/2468
itatchi42 0:1271d15b4d4b 8 ----> http://www.adafruit.com/products/2542
itatchi42 0:1271d15b4d4b 9
itatchi42 0:1271d15b4d4b 10 These cellular modules use TTL Serial to communicate, 2 pins are
itatchi42 0:1271d15b4d4b 11 required to interface
itatchi42 0:1271d15b4d4b 12 Adafruit invests time and resources providing this open source code,
itatchi42 0:1271d15b4d4b 13 please support Adafruit and open-source hardware by purchasing
itatchi42 0:1271d15b4d4b 14 products from Adafruit!
itatchi42 0:1271d15b4d4b 15
itatchi42 0:1271d15b4d4b 16 Written by Limor Fried/Ladyada for Adafruit Industries.
itatchi42 0:1271d15b4d4b 17 BSD license, all text above must be included in any redistribution
itatchi42 0:1271d15b4d4b 18 ****************************************************/
itatchi42 0:1271d15b4d4b 19
itatchi42 0:1271d15b4d4b 20 /*
itatchi42 0:1271d15b4d4b 21 * Modified by Jesse Baker & George Tzintzarov 03/30/2016 for use in mbed LPC1768
itatchi42 0:1271d15b4d4b 22 */
itatchi42 0:1271d15b4d4b 23
itatchi42 0:1271d15b4d4b 24 /*
itatchi42 0:1271d15b4d4b 25 THIS CODE IS STILL IN PROGRESS!
itatchi42 0:1271d15b4d4b 26
itatchi42 0:1271d15b4d4b 27 Open up the serial console on the Arduino at 4800 baud to interact with FONA
itatchi42 0:1271d15b4d4b 28
itatchi42 0:1271d15b4d4b 29 Note that if you need to set a GPRS APN, username, and password scroll down to
itatchi42 0:1271d15b4d4b 30 the commented section below just before the main "while (true)" loop.
itatchi42 0:1271d15b4d4b 31 */
itatchi42 0:1271d15b4d4b 32
itatchi42 0:1271d15b4d4b 33 #include <string.h> //// BY JONATHAN: For strcpy()
itatchi42 0:1271d15b4d4b 34 #include <ctype.h>
itatchi42 0:1271d15b4d4b 35 //#include "SoftSerial.h" I dont think we need this
itatchi42 0:1271d15b4d4b 36 #include "Adafruit_FONA.h"
itatchi42 0:1271d15b4d4b 37 #include "emic2.h"
itatchi42 0:1271d15b4d4b 38
itatchi42 0:1271d15b4d4b 39 #define FONA_RST p12
itatchi42 0:1271d15b4d4b 40 #define FONA_TX p13
itatchi42 0:1271d15b4d4b 41 #define FONA_RX p14
itatchi42 0:1271d15b4d4b 42 #define FONA_RI p11
itatchi42 0:1271d15b4d4b 43
itatchi42 0:1271d15b4d4b 44 // this is a large buffer for replies
itatchi42 0:1271d15b4d4b 45 char replybuffer[255];
itatchi42 0:1271d15b4d4b 46 char smsText[255], smsPhoneNo[11]; ///// By Jonathan: Text to send to Text -> Speech chip & phone # to send to
itatchi42 0:1271d15b4d4b 47
itatchi42 0:1271d15b4d4b 48 int count; // by Jonathan
itatchi42 0:1271d15b4d4b 49
itatchi42 0:1271d15b4d4b 50
itatchi42 0:1271d15b4d4b 51 Serial pcSerial(USBTX, USBRX);
itatchi42 0:1271d15b4d4b 52 Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
itatchi42 0:1271d15b4d4b 53 //uLCD_4DGL uLCD(p28,p27,p30);
itatchi42 0:1271d15b4d4b 54
itatchi42 0:1271d15b4d4b 55 // Turn on a LED when somebody call the FONA
itatchi42 0:1271d15b4d4b 56 DigitalOut led1(LED1);
itatchi42 0:1271d15b4d4b 57 emic2 myTTS(p9, p10);
itatchi42 0:1271d15b4d4b 58
itatchi42 0:1271d15b4d4b 59 class FonaEventListener : public Adafruit_FONA::EventListener {
itatchi42 0:1271d15b4d4b 60 virtual void onRing() {
itatchi42 0:1271d15b4d4b 61 led1 = 1;
itatchi42 0:1271d15b4d4b 62 }
itatchi42 0:1271d15b4d4b 63
itatchi42 0:1271d15b4d4b 64 virtual void onNoCarrier() {
itatchi42 0:1271d15b4d4b 65 led1 = 0;
itatchi42 0:1271d15b4d4b 66 }
itatchi42 0:1271d15b4d4b 67 };
itatchi42 0:1271d15b4d4b 68 FonaEventListener fonaEventListener;
itatchi42 0:1271d15b4d4b 69
itatchi42 0:1271d15b4d4b 70 // Functions defined after main()
itatchi42 0:1271d15b4d4b 71 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
itatchi42 0:1271d15b4d4b 72 void printMenu(void);
itatchi42 0:1271d15b4d4b 73 void flushSerial();
itatchi42 0:1271d15b4d4b 74 char readBlocking();
itatchi42 0:1271d15b4d4b 75 uint16_t readnumber();
itatchi42 0:1271d15b4d4b 76 long map(long x, long in_min, long in_max, long out_min, long out_max);
itatchi42 0:1271d15b4d4b 77
itatchi42 0:1271d15b4d4b 78 int main() {
itatchi42 0:1271d15b4d4b 79 myTTS.volume(5);
itatchi42 0:1271d15b4d4b 80 myTTS.voice(0);
itatchi42 0:1271d15b4d4b 81 pcSerial.baud(9600);
itatchi42 0:1271d15b4d4b 82 wait(1);
itatchi42 0:1271d15b4d4b 83 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 84
itatchi42 0:1271d15b4d4b 85 pcSerial.printf("FONA basic test\r\n");
itatchi42 0:1271d15b4d4b 86 pcSerial.printf("Initializing....(May take 3 seconds)\r\n");
itatchi42 0:1271d15b4d4b 87
itatchi42 0:1271d15b4d4b 88 // See if the FONA is responding
itatchi42 0:1271d15b4d4b 89 if (! fona.begin(9600)) {
itatchi42 0:1271d15b4d4b 90 pcSerial.printf("Couldn't find FONA\r\n");
itatchi42 0:1271d15b4d4b 91 while (1);
itatchi42 0:1271d15b4d4b 92 }
itatchi42 0:1271d15b4d4b 93 fona.setEventListener(&fonaEventListener);
itatchi42 0:1271d15b4d4b 94 pcSerial.printf("FONA is OK\r\n");
itatchi42 0:1271d15b4d4b 95
itatchi42 0:1271d15b4d4b 96 // Print SIM card IMEI number.
itatchi42 0:1271d15b4d4b 97 char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
itatchi42 0:1271d15b4d4b 98 uint8_t imeiLen = fona.getIMEI(imei);
itatchi42 0:1271d15b4d4b 99 if (imeiLen > 0) {
itatchi42 0:1271d15b4d4b 100 pcSerial.printf("SIM card IMEI: %s\r\n", imei);
itatchi42 0:1271d15b4d4b 101 }
itatchi42 0:1271d15b4d4b 102
itatchi42 0:1271d15b4d4b 103 // Optionally configure a GPRS APN, username, and password.
itatchi42 0:1271d15b4d4b 104 // You might need to do this to access your network's GPRS/data
itatchi42 0:1271d15b4d4b 105 // network. Contact your provider for the exact APN, username,
itatchi42 0:1271d15b4d4b 106 // and password values. Username and password are optional and
itatchi42 0:1271d15b4d4b 107 // can be removed, but APN is required.
itatchi42 0:1271d15b4d4b 108 //fona.setGPRSNetworkSettings("your APN", "your username", "your password");
itatchi42 0:1271d15b4d4b 109 //fona.setGPRSNetworkSettings("web.pt.lu", "", "");
itatchi42 0:1271d15b4d4b 110
itatchi42 0:1271d15b4d4b 111 // Optionally configure HTTP gets to follow redirects over SSL.
itatchi42 0:1271d15b4d4b 112 // Default is not to follow SSL redirects, however if you uncomment
itatchi42 0:1271d15b4d4b 113 // the following line then redirects over SSL will be followed.
itatchi42 0:1271d15b4d4b 114 //fona.setHTTPSRedirect(true);
itatchi42 0:1271d15b4d4b 115
itatchi42 0:1271d15b4d4b 116 printMenu();
itatchi42 0:1271d15b4d4b 117
itatchi42 0:1271d15b4d4b 118
itatchi42 0:1271d15b4d4b 119 while (true) {
itatchi42 0:1271d15b4d4b 120
itatchi42 0:1271d15b4d4b 121 pcSerial.printf("FONA> ");
itatchi42 0:1271d15b4d4b 122 // if nothing is available on the pcSearial port but there is something on the fona serial, then print it (flush it) to the pc Serial
itatchi42 0:1271d15b4d4b 123
itatchi42 0:1271d15b4d4b 124 /*
itatchi42 0:1271d15b4d4b 125 while (! pcSerial.readable() ) {
itatchi42 0:1271d15b4d4b 126 if (fona.readable()) {
itatchi42 0:1271d15b4d4b 127 pcSerial.putc(fona.getc()); /////// RESPONSIBLE FOR DETECTING RECV'D TXT///////
itatchi42 0:1271d15b4d4b 128 }
itatchi42 0:1271d15b4d4b 129 } */
itatchi42 0:1271d15b4d4b 130
itatchi42 0:1271d15b4d4b 131 //////////////////// By Jonathan: Edited version of while() above
itatchi42 0:1271d15b4d4b 132 while (! pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 133 if (fona.readable()) {
itatchi42 0:1271d15b4d4b 134
itatchi42 0:1271d15b4d4b 135 //// Printf that incoming SMS detected
itatchi42 0:1271d15b4d4b 136 pcSerial.putc(fona.getc());
itatchi42 0:1271d15b4d4b 137
itatchi42 0:1271d15b4d4b 138
itatchi42 0:1271d15b4d4b 139 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 140
itatchi42 0:1271d15b4d4b 141 // read an SMS + send -> TTS chip
itatchi42 0:1271d15b4d4b 142 flushSerial();
itatchi42 0:1271d15b4d4b 143 pcSerial.printf("\r\nReading SMS #1\r\n");
itatchi42 0:1271d15b4d4b 144
itatchi42 0:1271d15b4d4b 145 // Retrieve SMS sender address/phone number.
itatchi42 0:1271d15b4d4b 146 if (! fona.getSMSSender(1, replybuffer, 250)) {
itatchi42 0:1271d15b4d4b 147 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 148 break;
itatchi42 0:1271d15b4d4b 149 }
itatchi42 0:1271d15b4d4b 150 pcSerial.printf("FROM: %s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 151 for (int i = 0; i < 10; i++) { /////// BY JONATHAN to store phone # to respond to
itatchi42 0:1271d15b4d4b 152 smsPhoneNo[i] = replybuffer[i + 2]; // chop off the "+1" from phone # returned by replybuffer
itatchi42 0:1271d15b4d4b 153 }
itatchi42 0:1271d15b4d4b 154 smsPhoneNo[10] = '\0'; // null terminate.... NECESSARY??
itatchi42 0:1271d15b4d4b 155 pcSerial.printf("FROM: %s\r\n", smsPhoneNo);
itatchi42 0:1271d15b4d4b 156
itatchi42 0:1271d15b4d4b 157 // Retrieve SMS value.
itatchi42 0:1271d15b4d4b 158 uint16_t smslen;
itatchi42 0:1271d15b4d4b 159 if (! fona.readSMS(1, replybuffer, 250, &smslen)) { // pass in buffer and max len!
itatchi42 0:1271d15b4d4b 160 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 161 break;
itatchi42 0:1271d15b4d4b 162 }
itatchi42 0:1271d15b4d4b 163 pcSerial.printf("***** SMS #1 (%d) bytes *****\r\n", smslen);
itatchi42 0:1271d15b4d4b 164 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 165 pcSerial.printf("*****\r\n");
itatchi42 0:1271d15b4d4b 166
itatchi42 0:1271d15b4d4b 167
itatchi42 0:1271d15b4d4b 168
itatchi42 0:1271d15b4d4b 169 //char message[255]; // CHANGED BY JONATHAN. 141 -> 255
itatchi42 0:1271d15b4d4b 170 char myString[255];
itatchi42 0:1271d15b4d4b 171
itatchi42 0:1271d15b4d4b 172 for (int i = 0; i < 255; i++) {
itatchi42 0:1271d15b4d4b 173 myString[i] = replybuffer[i + 5]; // chop of the "Alexa string"
itatchi42 0:1271d15b4d4b 174 }
itatchi42 0:1271d15b4d4b 175
itatchi42 0:1271d15b4d4b 176 strcpy(smsText, "Uh lex uh "); //Pronunciation Correction.
itatchi42 0:1271d15b4d4b 177 strcat(smsText, myString);
itatchi42 0:1271d15b4d4b 178 myTTS.speakf("S%s\r", smsText); // Send text message to the text to speech module.
itatchi42 0:1271d15b4d4b 179
itatchi42 0:1271d15b4d4b 180
itatchi42 0:1271d15b4d4b 181 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 182
itatchi42 0:1271d15b4d4b 183 // send an SMS back!
itatchi42 0:1271d15b4d4b 184 char message[255];
itatchi42 0:1271d15b4d4b 185
itatchi42 0:1271d15b4d4b 186 strcpy(message, "");
itatchi42 0:1271d15b4d4b 187
itatchi42 0:1271d15b4d4b 188 flushSerial();
itatchi42 0:1271d15b4d4b 189
itatchi42 0:1271d15b4d4b 190 pcSerial.printf("Replying to %s\r\n", smsPhoneNo);
itatchi42 0:1271d15b4d4b 191
itatchi42 0:1271d15b4d4b 192
itatchi42 0:1271d15b4d4b 193 if(strstr(replybuffer, "how old are you")) { // if reply buffer contains that string
itatchi42 0:1271d15b4d4b 194 strcpy(message, "I'm 2 in human years, 14 in dog years, and 25 in cat years. I think AI years are marked in nanoseconds, so that makes me, like, a scrillion!");
itatchi42 0:1271d15b4d4b 195 }
itatchi42 0:1271d15b4d4b 196 else if(strstr(replybuffer, "what is the world population")) {
itatchi42 0:1271d15b4d4b 197 strcpy(message, "The population of the world is about 7 Billion 400 Million.");
itatchi42 0:1271d15b4d4b 198 }
itatchi42 0:1271d15b4d4b 199 else if(strstr(replybuffer, "integral of x squared")) {
itatchi42 0:1271d15b4d4b 200 strcpy(message, "The integral of x squared is one third x cubed plus a constant.");
itatchi42 0:1271d15b4d4b 201 }
itatchi42 0:1271d15b4d4b 202 else if(strstr(replybuffer, "discrete co sine transform")) {
itatchi42 0:1271d15b4d4b 203 strcpy(message, "The discrete cosine transform expresses a finite sequence of data points in terms of a sum of cosine function oscillating at different frequencies.");
itatchi42 0:1271d15b4d4b 204 }
itatchi42 0:1271d15b4d4b 205 else {
itatchi42 0:1271d15b4d4b 206 strcpy(message, "Sorry, command not recognized.");
itatchi42 0:1271d15b4d4b 207 }
itatchi42 0:1271d15b4d4b 208
itatchi42 0:1271d15b4d4b 209
itatchi42 0:1271d15b4d4b 210
itatchi42 0:1271d15b4d4b 211 // message[255] = '\0';
itatchi42 0:1271d15b4d4b 212
itatchi42 0:1271d15b4d4b 213 pcSerial.printf("%s\r\n", message);
itatchi42 0:1271d15b4d4b 214 if (!fona.sendSMS(smsPhoneNo, message))
itatchi42 0:1271d15b4d4b 215 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 216 else
itatchi42 0:1271d15b4d4b 217 pcSerial.printf("Sent!\r\n");
itatchi42 0:1271d15b4d4b 218
itatchi42 0:1271d15b4d4b 219 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 220
itatchi42 0:1271d15b4d4b 221 // delete an SMS after response sent back
itatchi42 0:1271d15b4d4b 222 flushSerial();
itatchi42 0:1271d15b4d4b 223 pcSerial.printf("\r\nDeleting SMS #1\r\n");
itatchi42 0:1271d15b4d4b 224 if (fona.deleteSMS(1)) // delete SMS #1
itatchi42 0:1271d15b4d4b 225 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 226 else
itatchi42 0:1271d15b4d4b 227 pcSerial.printf("Couldn't delete\r\n");
itatchi42 0:1271d15b4d4b 228
itatchi42 0:1271d15b4d4b 229 } // end if
itatchi42 0:1271d15b4d4b 230 } // end while
itatchi42 0:1271d15b4d4b 231
itatchi42 0:1271d15b4d4b 232
itatchi42 0:1271d15b4d4b 233
itatchi42 0:1271d15b4d4b 234 // Above while() by Jonathan //
itatchi42 0:1271d15b4d4b 235
itatchi42 0:1271d15b4d4b 236
itatchi42 0:1271d15b4d4b 237
itatchi42 0:1271d15b4d4b 238 // get the input command from the terminal
itatchi42 0:1271d15b4d4b 239 char command = pcSerial.getc();
itatchi42 0:1271d15b4d4b 240 pcSerial.printf("%c\r\n", command); //loops back to COM port
itatchi42 0:1271d15b4d4b 241
itatchi42 0:1271d15b4d4b 242
itatchi42 0:1271d15b4d4b 243 switch (command) {
itatchi42 0:1271d15b4d4b 244 case '?': {
itatchi42 0:1271d15b4d4b 245 printMenu();
itatchi42 0:1271d15b4d4b 246 break;
itatchi42 0:1271d15b4d4b 247 }
itatchi42 0:1271d15b4d4b 248
itatchi42 0:1271d15b4d4b 249 case 'a': {
itatchi42 0:1271d15b4d4b 250 // read the ADC
itatchi42 0:1271d15b4d4b 251 uint16_t adc;
itatchi42 0:1271d15b4d4b 252 if (! fona.getADCVoltage(&adc)) {
itatchi42 0:1271d15b4d4b 253 pcSerial.printf("Failed to read ADC\r\n");
itatchi42 0:1271d15b4d4b 254 } else {
itatchi42 0:1271d15b4d4b 255 pcSerial.printf("ADC = %d mV\r\n", adc);
itatchi42 0:1271d15b4d4b 256 }
itatchi42 0:1271d15b4d4b 257 break;
itatchi42 0:1271d15b4d4b 258 }
itatchi42 0:1271d15b4d4b 259
itatchi42 0:1271d15b4d4b 260 case 'b': {
itatchi42 0:1271d15b4d4b 261 // read the battery voltage and percentage
itatchi42 0:1271d15b4d4b 262 uint16_t vbat;
itatchi42 0:1271d15b4d4b 263 if (! fona.getBattVoltage(&vbat)) {
itatchi42 0:1271d15b4d4b 264 pcSerial.printf("Failed to read Batt\r\n");
itatchi42 0:1271d15b4d4b 265 } else {
itatchi42 0:1271d15b4d4b 266 pcSerial.printf("VBat = %d mV\r\n", vbat);
itatchi42 0:1271d15b4d4b 267 }
itatchi42 0:1271d15b4d4b 268
itatchi42 0:1271d15b4d4b 269 if (! fona.getBattPercent(&vbat)) {
itatchi42 0:1271d15b4d4b 270 pcSerial.printf("Failed to read Batt\r\n");
itatchi42 0:1271d15b4d4b 271 } else {
itatchi42 0:1271d15b4d4b 272 pcSerial.printf("VPct = %d%%\r\n", vbat);
itatchi42 0:1271d15b4d4b 273 }
itatchi42 0:1271d15b4d4b 274
itatchi42 0:1271d15b4d4b 275 break;
itatchi42 0:1271d15b4d4b 276 }
itatchi42 0:1271d15b4d4b 277
itatchi42 0:1271d15b4d4b 278 case 'U': {
itatchi42 0:1271d15b4d4b 279 // Unlock the SIM with a PIN code
itatchi42 0:1271d15b4d4b 280 char PIN[5];
itatchi42 0:1271d15b4d4b 281 flushSerial();
itatchi42 0:1271d15b4d4b 282 pcSerial.printf("Enter 4-digit PIN\r\n");
itatchi42 0:1271d15b4d4b 283 readline(PIN, 3);
itatchi42 0:1271d15b4d4b 284 pcSerial.printf("%s\r\n", PIN);
itatchi42 0:1271d15b4d4b 285 pcSerial.printf("Unlocking SIM card: ");
itatchi42 0:1271d15b4d4b 286 if (! fona.unlockSIM(PIN)) {
itatchi42 0:1271d15b4d4b 287 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 288 } else {
itatchi42 0:1271d15b4d4b 289 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 290 }
itatchi42 0:1271d15b4d4b 291 break;
itatchi42 0:1271d15b4d4b 292 }
itatchi42 0:1271d15b4d4b 293
itatchi42 0:1271d15b4d4b 294 case 'C': {
itatchi42 0:1271d15b4d4b 295 // read the CCID
itatchi42 0:1271d15b4d4b 296 fona.getSIMCCID(replybuffer); // make sure replybuffer is at least 21 bytes!
itatchi42 0:1271d15b4d4b 297 pcSerial.printf("SIM CCID = %s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 298 break;
itatchi42 0:1271d15b4d4b 299 }
itatchi42 0:1271d15b4d4b 300
itatchi42 0:1271d15b4d4b 301 case 'i': {
itatchi42 0:1271d15b4d4b 302 // read the RSSI
itatchi42 0:1271d15b4d4b 303 uint8_t n = fona.getRSSI();
itatchi42 0:1271d15b4d4b 304 int8_t r = 0;
itatchi42 0:1271d15b4d4b 305
itatchi42 0:1271d15b4d4b 306 pcSerial.printf("RSSI = %d: ", n);
itatchi42 0:1271d15b4d4b 307 if (n == 0) r = -115;
itatchi42 0:1271d15b4d4b 308 if (n == 1) r = -111;
itatchi42 0:1271d15b4d4b 309 if (n == 31) r = -52;
itatchi42 0:1271d15b4d4b 310 if ((n >= 2) && (n <= 30)) {
itatchi42 0:1271d15b4d4b 311 r = map(n, 2, 30, -110, -54);
itatchi42 0:1271d15b4d4b 312 }
itatchi42 0:1271d15b4d4b 313 pcSerial.printf("%d dBm\r\n", r);
itatchi42 0:1271d15b4d4b 314
itatchi42 0:1271d15b4d4b 315 break;
itatchi42 0:1271d15b4d4b 316 }
itatchi42 0:1271d15b4d4b 317
itatchi42 0:1271d15b4d4b 318 case 'n': {
itatchi42 0:1271d15b4d4b 319 // read the network/cellular status
itatchi42 0:1271d15b4d4b 320 uint8_t n = fona.getNetworkStatus();
itatchi42 0:1271d15b4d4b 321 pcSerial.printf("Network status %d: ", n);
itatchi42 0:1271d15b4d4b 322 if (n == 0) pcSerial.printf("Not registered\r\n");
itatchi42 0:1271d15b4d4b 323 if (n == 1) pcSerial.printf("Registered (home)\r\n");
itatchi42 0:1271d15b4d4b 324 if (n == 2) pcSerial.printf("Not registered (searching)\r\n");
itatchi42 0:1271d15b4d4b 325 if (n == 3) pcSerial.printf("Denied\r\n");
itatchi42 0:1271d15b4d4b 326 if (n == 4) pcSerial.printf("Unknown\r\n");
itatchi42 0:1271d15b4d4b 327 if (n == 5) pcSerial.printf("Registered roaming\r\n");
itatchi42 0:1271d15b4d4b 328 break;
itatchi42 0:1271d15b4d4b 329 }
itatchi42 0:1271d15b4d4b 330
itatchi42 0:1271d15b4d4b 331 /*** Audio ***/
itatchi42 0:1271d15b4d4b 332 case 'v': {
itatchi42 0:1271d15b4d4b 333 // set volume
itatchi42 0:1271d15b4d4b 334 flushSerial();
itatchi42 0:1271d15b4d4b 335 pcSerial.printf("Set Vol %%");
itatchi42 0:1271d15b4d4b 336 uint8_t vol = readnumber();
itatchi42 0:1271d15b4d4b 337 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 338 if (! fona.setVolume(vol)) {
itatchi42 0:1271d15b4d4b 339 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 340 } else {
itatchi42 0:1271d15b4d4b 341 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 342 }
itatchi42 0:1271d15b4d4b 343 break;
itatchi42 0:1271d15b4d4b 344 }
itatchi42 0:1271d15b4d4b 345
itatchi42 0:1271d15b4d4b 346 case 'V': {
itatchi42 0:1271d15b4d4b 347 uint8_t v = fona.getVolume();
itatchi42 0:1271d15b4d4b 348 pcSerial.printf("%d%%\r\n", v);
itatchi42 0:1271d15b4d4b 349
itatchi42 0:1271d15b4d4b 350 break;
itatchi42 0:1271d15b4d4b 351 }
itatchi42 0:1271d15b4d4b 352
itatchi42 0:1271d15b4d4b 353 case 'H': {
itatchi42 0:1271d15b4d4b 354 // Set Headphone output
itatchi42 0:1271d15b4d4b 355 if (! fona.setAudio(FONA_HEADSETAUDIO)) {
itatchi42 0:1271d15b4d4b 356 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 357 } else {
itatchi42 0:1271d15b4d4b 358 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 359 }
itatchi42 0:1271d15b4d4b 360 fona.setMicVolume(FONA_HEADSETAUDIO, 15);
itatchi42 0:1271d15b4d4b 361 break;
itatchi42 0:1271d15b4d4b 362 }
itatchi42 0:1271d15b4d4b 363 case 'e': {
itatchi42 0:1271d15b4d4b 364 // Set External output
itatchi42 0:1271d15b4d4b 365 if (! fona.setAudio(FONA_EXTAUDIO)) {
itatchi42 0:1271d15b4d4b 366 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 367 } else {
itatchi42 0:1271d15b4d4b 368 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 369 }
itatchi42 0:1271d15b4d4b 370
itatchi42 0:1271d15b4d4b 371 fona.setMicVolume(FONA_EXTAUDIO, 10);
itatchi42 0:1271d15b4d4b 372 break;
itatchi42 0:1271d15b4d4b 373 }
itatchi42 0:1271d15b4d4b 374
itatchi42 0:1271d15b4d4b 375 case 'T': {
itatchi42 0:1271d15b4d4b 376 // play tone
itatchi42 0:1271d15b4d4b 377 flushSerial();
itatchi42 0:1271d15b4d4b 378 pcSerial.printf("Play tone #");
itatchi42 0:1271d15b4d4b 379 uint8_t kittone = readnumber();
itatchi42 0:1271d15b4d4b 380 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 381 // play for 1 second (1000 ms)
itatchi42 0:1271d15b4d4b 382 if (! fona.playToolkitTone(kittone, 1000)) {
itatchi42 0:1271d15b4d4b 383 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 384 } else {
itatchi42 0:1271d15b4d4b 385 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 386 }
itatchi42 0:1271d15b4d4b 387 break;
itatchi42 0:1271d15b4d4b 388 }
itatchi42 0:1271d15b4d4b 389
itatchi42 0:1271d15b4d4b 390 /*** FM Radio ***/
itatchi42 0:1271d15b4d4b 391
itatchi42 0:1271d15b4d4b 392 case 'f': {
itatchi42 0:1271d15b4d4b 393 // get freq
itatchi42 0:1271d15b4d4b 394 flushSerial();
itatchi42 0:1271d15b4d4b 395 pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): ");
itatchi42 0:1271d15b4d4b 396 uint16_t station = readnumber();
itatchi42 0:1271d15b4d4b 397 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 398 // FM radio ON using headset
itatchi42 0:1271d15b4d4b 399 if (fona.FMradio(true, FONA_HEADSETAUDIO)) {
itatchi42 0:1271d15b4d4b 400 pcSerial.printf("Opened\r\n");
itatchi42 0:1271d15b4d4b 401 }
itatchi42 0:1271d15b4d4b 402 if (! fona.tuneFMradio(station)) {
itatchi42 0:1271d15b4d4b 403 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 404 } else {
itatchi42 0:1271d15b4d4b 405 pcSerial.printf("Tuned\r\n");
itatchi42 0:1271d15b4d4b 406 }
itatchi42 0:1271d15b4d4b 407 break;
itatchi42 0:1271d15b4d4b 408 }
itatchi42 0:1271d15b4d4b 409 case 'F': {
itatchi42 0:1271d15b4d4b 410 // FM radio off
itatchi42 0:1271d15b4d4b 411 if (! fona.FMradio(false)) {
itatchi42 0:1271d15b4d4b 412 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 413 } else {
itatchi42 0:1271d15b4d4b 414 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 415 }
itatchi42 0:1271d15b4d4b 416 break;
itatchi42 0:1271d15b4d4b 417 }
itatchi42 0:1271d15b4d4b 418 case 'm': {
itatchi42 0:1271d15b4d4b 419 // Set FM volume.
itatchi42 0:1271d15b4d4b 420 flushSerial();
itatchi42 0:1271d15b4d4b 421 pcSerial.printf("Set FM Vol [0-6]:");
itatchi42 0:1271d15b4d4b 422 uint8_t vol = readnumber();
itatchi42 0:1271d15b4d4b 423 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 424 if (!fona.setFMVolume(vol)) {
itatchi42 0:1271d15b4d4b 425 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 426 } else {
itatchi42 0:1271d15b4d4b 427 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 428 }
itatchi42 0:1271d15b4d4b 429 break;
itatchi42 0:1271d15b4d4b 430 }
itatchi42 0:1271d15b4d4b 431 case 'M': {
itatchi42 0:1271d15b4d4b 432 // Get FM volume.
itatchi42 0:1271d15b4d4b 433 int8_t fmvol = fona.getFMVolume();
itatchi42 0:1271d15b4d4b 434 if (fmvol < 0) {
itatchi42 0:1271d15b4d4b 435 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 436 } else {
itatchi42 0:1271d15b4d4b 437 pcSerial.printf("FM volume: %d\r\n", fmvol);
itatchi42 0:1271d15b4d4b 438 }
itatchi42 0:1271d15b4d4b 439 break;
itatchi42 0:1271d15b4d4b 440 }
itatchi42 0:1271d15b4d4b 441 case 'q': {
itatchi42 0:1271d15b4d4b 442 // Get FM station signal level (in decibels).
itatchi42 0:1271d15b4d4b 443 flushSerial();
itatchi42 0:1271d15b4d4b 444 pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): ");
itatchi42 0:1271d15b4d4b 445 uint16_t station = readnumber();
itatchi42 0:1271d15b4d4b 446 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 447 int8_t level = fona.getFMSignalLevel(station);
itatchi42 0:1271d15b4d4b 448 if (level < 0) {
itatchi42 0:1271d15b4d4b 449 pcSerial.printf("Failed! Make sure FM radio is on (tuned to station).\r\n");
itatchi42 0:1271d15b4d4b 450 } else {
itatchi42 0:1271d15b4d4b 451 pcSerial.printf("Signal level (dB): %d\r\n", level);
itatchi42 0:1271d15b4d4b 452 }
itatchi42 0:1271d15b4d4b 453 break;
itatchi42 0:1271d15b4d4b 454 }
itatchi42 0:1271d15b4d4b 455
itatchi42 0:1271d15b4d4b 456 /*** PWM ***/
itatchi42 0:1271d15b4d4b 457
itatchi42 0:1271d15b4d4b 458 case 'P': {
itatchi42 0:1271d15b4d4b 459 // PWM Buzzer output @ 2KHz max
itatchi42 0:1271d15b4d4b 460 flushSerial();
itatchi42 0:1271d15b4d4b 461 pcSerial.printf("PWM Freq, 0 = Off, (1-2000): ");
itatchi42 0:1271d15b4d4b 462 uint16_t freq = readnumber();
itatchi42 0:1271d15b4d4b 463 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 464 if (! fona.setPWM(freq)) {
itatchi42 0:1271d15b4d4b 465 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 466 } else {
itatchi42 0:1271d15b4d4b 467 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 468 }
itatchi42 0:1271d15b4d4b 469 break;
itatchi42 0:1271d15b4d4b 470 }
itatchi42 0:1271d15b4d4b 471
itatchi42 0:1271d15b4d4b 472 /*** Call ***/
itatchi42 0:1271d15b4d4b 473 case 'c': {
itatchi42 0:1271d15b4d4b 474 // call a phone!
itatchi42 0:1271d15b4d4b 475 char number[10];
itatchi42 0:1271d15b4d4b 476 flushSerial();
itatchi42 0:1271d15b4d4b 477 pcSerial.printf("Call #");
itatchi42 0:1271d15b4d4b 478 readline(number, 9);
itatchi42 0:1271d15b4d4b 479 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 480 pcSerial.printf("Calling %s\r\n", number);
itatchi42 0:1271d15b4d4b 481 if (!fona.callPhone(number)) {
itatchi42 0:1271d15b4d4b 482 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 483 } else {
itatchi42 0:1271d15b4d4b 484 pcSerial.printf("Sent!\r\n");
itatchi42 0:1271d15b4d4b 485 }
itatchi42 0:1271d15b4d4b 486
itatchi42 0:1271d15b4d4b 487 break;
itatchi42 0:1271d15b4d4b 488 }
itatchi42 0:1271d15b4d4b 489 case 'h': {
itatchi42 0:1271d15b4d4b 490 // hang up!
itatchi42 0:1271d15b4d4b 491 if (! fona.hangUp()) {
itatchi42 0:1271d15b4d4b 492 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 493 } else {
itatchi42 0:1271d15b4d4b 494 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 495 }
itatchi42 0:1271d15b4d4b 496 break;
itatchi42 0:1271d15b4d4b 497 }
itatchi42 0:1271d15b4d4b 498
itatchi42 0:1271d15b4d4b 499 case 'p': {
itatchi42 0:1271d15b4d4b 500 // pick up!
itatchi42 0:1271d15b4d4b 501 if (! fona.pickUp()) {
itatchi42 0:1271d15b4d4b 502 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 503 } else {
itatchi42 0:1271d15b4d4b 504 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 505 }
itatchi42 0:1271d15b4d4b 506 break;
itatchi42 0:1271d15b4d4b 507 }
itatchi42 0:1271d15b4d4b 508
itatchi42 0:1271d15b4d4b 509 /*** SMS ***/
itatchi42 0:1271d15b4d4b 510
itatchi42 0:1271d15b4d4b 511 case 'N': {
itatchi42 0:1271d15b4d4b 512 // read the number of SMS's!
itatchi42 0:1271d15b4d4b 513 int8_t smsnum = fona.getNumSMS();
itatchi42 0:1271d15b4d4b 514 if (smsnum < 0) {
itatchi42 0:1271d15b4d4b 515 pcSerial.printf("Could not read # SMS\r\n");
itatchi42 0:1271d15b4d4b 516 } else {
itatchi42 0:1271d15b4d4b 517 pcSerial.printf("%d SMS's on SIM card!\r\n", smsnum);
itatchi42 0:1271d15b4d4b 518 }
itatchi42 0:1271d15b4d4b 519 break;
itatchi42 0:1271d15b4d4b 520 }
itatchi42 0:1271d15b4d4b 521 case 'r': {
itatchi42 0:1271d15b4d4b 522 // read an SMS
itatchi42 0:1271d15b4d4b 523 flushSerial();
itatchi42 0:1271d15b4d4b 524 pcSerial.printf("Read #");
itatchi42 0:1271d15b4d4b 525 uint8_t smsn = readnumber();
itatchi42 0:1271d15b4d4b 526 pcSerial.printf("\r\nReading SMS #%d\r\n", smsn);
itatchi42 0:1271d15b4d4b 527
itatchi42 0:1271d15b4d4b 528 // Retrieve SMS sender address/phone number.
itatchi42 0:1271d15b4d4b 529 if (! fona.getSMSSender(smsn, replybuffer, 250)) {
itatchi42 0:1271d15b4d4b 530 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 531 break;
itatchi42 0:1271d15b4d4b 532 }
itatchi42 0:1271d15b4d4b 533 pcSerial.printf("FROM: %s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 534
itatchi42 0:1271d15b4d4b 535 // Retrieve SMS value.
itatchi42 0:1271d15b4d4b 536 uint16_t smslen;
itatchi42 0:1271d15b4d4b 537 if (! fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
itatchi42 0:1271d15b4d4b 538 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 539 break;
itatchi42 0:1271d15b4d4b 540 }
itatchi42 0:1271d15b4d4b 541 pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen);
itatchi42 0:1271d15b4d4b 542 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 543 pcSerial.printf("*****\r\n");
itatchi42 0:1271d15b4d4b 544
itatchi42 0:1271d15b4d4b 545 break;
itatchi42 0:1271d15b4d4b 546 }
itatchi42 0:1271d15b4d4b 547 case 'R': {
itatchi42 0:1271d15b4d4b 548 // read all SMS
itatchi42 0:1271d15b4d4b 549 int8_t smsnum = fona.getNumSMS();
itatchi42 0:1271d15b4d4b 550 uint16_t smslen;
itatchi42 0:1271d15b4d4b 551 for (int8_t smsn=1; smsn<=smsnum; smsn++) {
itatchi42 0:1271d15b4d4b 552 pcSerial.printf("\r\nReading SMS #%d\r\n", smsn);
itatchi42 0:1271d15b4d4b 553 if (!fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
itatchi42 0:1271d15b4d4b 554 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 555 break;
itatchi42 0:1271d15b4d4b 556 }
itatchi42 0:1271d15b4d4b 557 // if the length is zero, its a special case where the index number is higher
itatchi42 0:1271d15b4d4b 558 // so increase the max we'll look at!
itatchi42 0:1271d15b4d4b 559 if (smslen == 0) {
itatchi42 0:1271d15b4d4b 560 pcSerial.printf("[empty slot]\r\n");
itatchi42 0:1271d15b4d4b 561 smsnum++;
itatchi42 0:1271d15b4d4b 562 continue;
itatchi42 0:1271d15b4d4b 563 }
itatchi42 0:1271d15b4d4b 564
itatchi42 0:1271d15b4d4b 565 pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen);
itatchi42 0:1271d15b4d4b 566 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 567 pcSerial.printf("*****\r\n");
itatchi42 0:1271d15b4d4b 568 }
itatchi42 0:1271d15b4d4b 569 break;
itatchi42 0:1271d15b4d4b 570 }
itatchi42 0:1271d15b4d4b 571
itatchi42 0:1271d15b4d4b 572 case 'd': {
itatchi42 0:1271d15b4d4b 573 // delete an SMS
itatchi42 0:1271d15b4d4b 574 flushSerial();
itatchi42 0:1271d15b4d4b 575 pcSerial.printf("Delete #");
itatchi42 0:1271d15b4d4b 576 uint8_t smsn = readnumber();
itatchi42 0:1271d15b4d4b 577
itatchi42 0:1271d15b4d4b 578 pcSerial.printf("\r\nDeleting SMS #%d\r\n", smsn);
itatchi42 0:1271d15b4d4b 579 if (fona.deleteSMS(smsn)) {
itatchi42 0:1271d15b4d4b 580 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 581 } else {
itatchi42 0:1271d15b4d4b 582 pcSerial.printf("Couldn't delete\r\n");
itatchi42 0:1271d15b4d4b 583 }
itatchi42 0:1271d15b4d4b 584 break;
itatchi42 0:1271d15b4d4b 585 }
itatchi42 0:1271d15b4d4b 586
itatchi42 0:1271d15b4d4b 587 case 's': {
itatchi42 0:1271d15b4d4b 588 // send an SMS!
itatchi42 0:1271d15b4d4b 589 char sendto[10], message[141],currChar; // 'currChar' by Jonathan
itatchi42 0:1271d15b4d4b 590 count = 0; // reset
itatchi42 0:1271d15b4d4b 591
itatchi42 0:1271d15b4d4b 592 flushSerial();
itatchi42 0:1271d15b4d4b 593 pcSerial.printf("Send to #");
itatchi42 0:1271d15b4d4b 594 //currChar = pcSerial.getc();
itatchi42 0:1271d15b4d4b 595 readline(sendto, 9);
itatchi42 0:1271d15b4d4b 596 pcSerial.printf("%s\r\n", sendto);
itatchi42 0:1271d15b4d4b 597 pcSerial.printf("Type out one-line message (140 char): ");
itatchi42 0:1271d15b4d4b 598
itatchi42 0:1271d15b4d4b 599 count = 0;
itatchi42 0:1271d15b4d4b 600 while (1) // whole while loop added by jonathan... WORKS PERFECTLY for sending texts to phone
itatchi42 0:1271d15b4d4b 601 {
itatchi42 0:1271d15b4d4b 602
itatchi42 0:1271d15b4d4b 603 pcSerial.putc(currChar = pcSerial.getc()); // local echo
itatchi42 0:1271d15b4d4b 604 if (currChar == '\r')
itatchi42 0:1271d15b4d4b 605 {
itatchi42 0:1271d15b4d4b 606 pcSerial.printf("breaking\r\n");
itatchi42 0:1271d15b4d4b 607 message[count] = '\0'; // null terminate... NECESSARY??
itatchi42 0:1271d15b4d4b 608 break;
itatchi42 0:1271d15b4d4b 609 }
itatchi42 0:1271d15b4d4b 610 message[count] = currChar; // fill in char array
itatchi42 0:1271d15b4d4b 611 count++; // global var update
itatchi42 0:1271d15b4d4b 612 //pcSerial.printf("\n%d\n", count);
itatchi42 0:1271d15b4d4b 613 }
itatchi42 0:1271d15b4d4b 614
itatchi42 0:1271d15b4d4b 615 //readline(message, count); // edited by JONATHAN (140 -> 'count'). THEN COMPLETELY COMMENTED OUT, b/c I write directly to message[] above
itatchi42 0:1271d15b4d4b 616 //pcSerial.printf("\n%d\n", count); // added by jonathan
itatchi42 0:1271d15b4d4b 617
itatchi42 0:1271d15b4d4b 618
itatchi42 0:1271d15b4d4b 619 pcSerial.printf("%s\r\n", message);
itatchi42 0:1271d15b4d4b 620 if (!fona.sendSMS(sendto, message)) {
itatchi42 0:1271d15b4d4b 621 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 622 } else {
itatchi42 0:1271d15b4d4b 623 pcSerial.printf("Sent!\r\n");
itatchi42 0:1271d15b4d4b 624 }
itatchi42 0:1271d15b4d4b 625
itatchi42 0:1271d15b4d4b 626 break;
itatchi42 0:1271d15b4d4b 627 }
itatchi42 0:1271d15b4d4b 628
itatchi42 0:1271d15b4d4b 629 /*** Time ***/
itatchi42 0:1271d15b4d4b 630
itatchi42 0:1271d15b4d4b 631 case 'y': {
itatchi42 0:1271d15b4d4b 632 // enable network time sync
itatchi42 0:1271d15b4d4b 633 if (!fona.enableNetworkTimeSync(true))
itatchi42 0:1271d15b4d4b 634 pcSerial.printf("Failed to enable\r\n");
itatchi42 0:1271d15b4d4b 635 break;
itatchi42 0:1271d15b4d4b 636 }
itatchi42 0:1271d15b4d4b 637
itatchi42 0:1271d15b4d4b 638 case 'Y': {
itatchi42 0:1271d15b4d4b 639 // enable NTP time sync
itatchi42 0:1271d15b4d4b 640 if (!fona.enableNTPTimeSync(true, "pool.ntp.org"))
itatchi42 0:1271d15b4d4b 641 pcSerial.printf("Failed to enable\r\n");
itatchi42 0:1271d15b4d4b 642 break;
itatchi42 0:1271d15b4d4b 643 }
itatchi42 0:1271d15b4d4b 644
itatchi42 0:1271d15b4d4b 645 case 't': {
itatchi42 0:1271d15b4d4b 646 // read the time
itatchi42 0:1271d15b4d4b 647 char buffer[23];
itatchi42 0:1271d15b4d4b 648
itatchi42 0:1271d15b4d4b 649 fona.getTime(buffer, 23); // make sure replybuffer is at least 23 bytes!
itatchi42 0:1271d15b4d4b 650 pcSerial.printf("Time = %s\r\n", buffer);
itatchi42 0:1271d15b4d4b 651 break;
itatchi42 0:1271d15b4d4b 652 }
itatchi42 0:1271d15b4d4b 653
itatchi42 0:1271d15b4d4b 654 /*********************************** GPS (SIM808 only) */
itatchi42 0:1271d15b4d4b 655
itatchi42 0:1271d15b4d4b 656 case 'o': {
itatchi42 0:1271d15b4d4b 657 // turn GPS off
itatchi42 0:1271d15b4d4b 658 if (!fona.enableGPS(false))
itatchi42 0:1271d15b4d4b 659 pcSerial.printf("Failed to turn off\r\n");
itatchi42 0:1271d15b4d4b 660 break;
itatchi42 0:1271d15b4d4b 661 }
itatchi42 0:1271d15b4d4b 662 case 'O': {
itatchi42 0:1271d15b4d4b 663 // turn GPS on
itatchi42 0:1271d15b4d4b 664 if (!fona.enableGPS(true))
itatchi42 0:1271d15b4d4b 665 pcSerial.printf("Failed to turn on\r\n");
itatchi42 0:1271d15b4d4b 666 break;
itatchi42 0:1271d15b4d4b 667 }
itatchi42 0:1271d15b4d4b 668 case 'x': {
itatchi42 0:1271d15b4d4b 669 int8_t stat;
itatchi42 0:1271d15b4d4b 670 // check GPS fix
itatchi42 0:1271d15b4d4b 671 stat = fona.GPSstatus();
itatchi42 0:1271d15b4d4b 672 if (stat < 0)
itatchi42 0:1271d15b4d4b 673 pcSerial.printf("Failed to query\r\n");
itatchi42 0:1271d15b4d4b 674 if (stat == 0) pcSerial.printf("GPS off\r\n");
itatchi42 0:1271d15b4d4b 675 if (stat == 1) pcSerial.printf("No fix\r\n");
itatchi42 0:1271d15b4d4b 676 if (stat == 2) pcSerial.printf("2D fix\r\n");
itatchi42 0:1271d15b4d4b 677 if (stat == 3) pcSerial.printf("3D fix\r\n");
itatchi42 0:1271d15b4d4b 678 break;
itatchi42 0:1271d15b4d4b 679 }
itatchi42 0:1271d15b4d4b 680
itatchi42 0:1271d15b4d4b 681 case 'L': {
itatchi42 0:1271d15b4d4b 682 // check for GPS location
itatchi42 0:1271d15b4d4b 683 char gpsdata[80];
itatchi42 0:1271d15b4d4b 684 fona.getGPS(0, gpsdata, 80);
itatchi42 0:1271d15b4d4b 685 pcSerial.printf("Reply in format: mode,longitude,latitude,altitude,utctime(yyyymmddHHMMSS),ttff,satellites,speed,course\r\n");
itatchi42 0:1271d15b4d4b 686 pcSerial.printf("%s\r\n", gpsdata);
itatchi42 0:1271d15b4d4b 687
itatchi42 0:1271d15b4d4b 688 break;
itatchi42 0:1271d15b4d4b 689 }
itatchi42 0:1271d15b4d4b 690
itatchi42 0:1271d15b4d4b 691 case 'E': {
itatchi42 0:1271d15b4d4b 692 flushSerial();
itatchi42 0:1271d15b4d4b 693 pcSerial.printf("GPS NMEA output sentences (0 = off, 34 = RMC+GGA, 255 = all)\r\n");
itatchi42 0:1271d15b4d4b 694 uint8_t nmeaout = readnumber();
itatchi42 0:1271d15b4d4b 695
itatchi42 0:1271d15b4d4b 696 // turn on NMEA output
itatchi42 0:1271d15b4d4b 697 fona.enableGPSNMEA(nmeaout);
itatchi42 0:1271d15b4d4b 698
itatchi42 0:1271d15b4d4b 699 break;
itatchi42 0:1271d15b4d4b 700 }
itatchi42 0:1271d15b4d4b 701
itatchi42 0:1271d15b4d4b 702 /*********************************** GPRS */
itatchi42 0:1271d15b4d4b 703
itatchi42 0:1271d15b4d4b 704 case 'g': {
itatchi42 0:1271d15b4d4b 705 // turn GPRS off
itatchi42 0:1271d15b4d4b 706 if (!fona.enableGPRS(false))
itatchi42 0:1271d15b4d4b 707 pcSerial.printf("Failed to turn off\r\n");
itatchi42 0:1271d15b4d4b 708 break;
itatchi42 0:1271d15b4d4b 709 }
itatchi42 0:1271d15b4d4b 710 case 'G': {
itatchi42 0:1271d15b4d4b 711 // turn GPRS on
itatchi42 0:1271d15b4d4b 712 if (!fona.enableGPRS(true))
itatchi42 0:1271d15b4d4b 713 pcSerial.printf("Failed to turn on\r\n");
itatchi42 0:1271d15b4d4b 714 break;
itatchi42 0:1271d15b4d4b 715 }
itatchi42 0:1271d15b4d4b 716 case 'l': {
itatchi42 0:1271d15b4d4b 717 // check for GSMLOC (requires GPRS)
itatchi42 0:1271d15b4d4b 718 uint16_t returncode;
itatchi42 0:1271d15b4d4b 719
itatchi42 0:1271d15b4d4b 720 if (!fona.getGSMLoc(&returncode, replybuffer, 250))
itatchi42 0:1271d15b4d4b 721 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 722 if (returncode == 0) {
itatchi42 0:1271d15b4d4b 723 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 724 } else {
itatchi42 0:1271d15b4d4b 725 pcSerial.printf("Fail code #%d\r\n", returncode);
itatchi42 0:1271d15b4d4b 726 }
itatchi42 0:1271d15b4d4b 727
itatchi42 0:1271d15b4d4b 728 break;
itatchi42 0:1271d15b4d4b 729 }
itatchi42 0:1271d15b4d4b 730 case 'w': {
itatchi42 0:1271d15b4d4b 731 // read website URL
itatchi42 0:1271d15b4d4b 732 uint16_t statuscode;
itatchi42 0:1271d15b4d4b 733 int16_t length;
itatchi42 0:1271d15b4d4b 734 char url[80];
itatchi42 0:1271d15b4d4b 735
itatchi42 0:1271d15b4d4b 736 flushSerial();
itatchi42 0:1271d15b4d4b 737 pcSerial.printf("NOTE: in beta! Use small webpages to read!\r\n");
itatchi42 0:1271d15b4d4b 738 pcSerial.printf("URL to read (e.g. www.adafruit.com/testwifi/index.html):\r\n");
itatchi42 0:1271d15b4d4b 739 pcSerial.printf("http://"); readline(url, 79);
itatchi42 0:1271d15b4d4b 740 pcSerial.printf("%s\r\n", url);
itatchi42 0:1271d15b4d4b 741
itatchi42 0:1271d15b4d4b 742 pcSerial.printf("****\r\n");
itatchi42 0:1271d15b4d4b 743 if (!fona.HTTP_GET_start(url, &statuscode, (uint16_t *)&length)) {
itatchi42 0:1271d15b4d4b 744 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 745 break;
itatchi42 0:1271d15b4d4b 746 }
itatchi42 0:1271d15b4d4b 747 while (length > 0) {
itatchi42 0:1271d15b4d4b 748 while (fona.readable()) {
itatchi42 0:1271d15b4d4b 749 char c = fona.getc();
itatchi42 0:1271d15b4d4b 750 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 751 length--;
itatchi42 0:1271d15b4d4b 752 if (! length) break;
itatchi42 0:1271d15b4d4b 753 }
itatchi42 0:1271d15b4d4b 754 }
itatchi42 0:1271d15b4d4b 755 pcSerial.printf("\r\n****\r\n");
itatchi42 0:1271d15b4d4b 756 fona.HTTP_GET_end();
itatchi42 0:1271d15b4d4b 757 break;
itatchi42 0:1271d15b4d4b 758 }
itatchi42 0:1271d15b4d4b 759
itatchi42 0:1271d15b4d4b 760 case 'W': {
itatchi42 0:1271d15b4d4b 761 // Post data to website
itatchi42 0:1271d15b4d4b 762 uint16_t statuscode;
itatchi42 0:1271d15b4d4b 763 int16_t length;
itatchi42 0:1271d15b4d4b 764 char url[80];
itatchi42 0:1271d15b4d4b 765 char data[80];
itatchi42 0:1271d15b4d4b 766
itatchi42 0:1271d15b4d4b 767 flushSerial();
itatchi42 0:1271d15b4d4b 768 pcSerial.printf("NOTE: in beta! Use simple websites to post!\r\n");
itatchi42 0:1271d15b4d4b 769 pcSerial.printf("URL to post (e.g. httpbin.org/post):\r\n");
itatchi42 0:1271d15b4d4b 770 pcSerial.printf("http://"); readline(url, 79);
itatchi42 0:1271d15b4d4b 771 pcSerial.printf("%s\r\n", url);
itatchi42 0:1271d15b4d4b 772 pcSerial.printf("Data to post (e.g. \"foo\" or \"{\"simple\":\"json\"}\"):\r\n");
itatchi42 0:1271d15b4d4b 773 readline(data, 79);
itatchi42 0:1271d15b4d4b 774 pcSerial.printf("%s\r\n", data);
itatchi42 0:1271d15b4d4b 775
itatchi42 0:1271d15b4d4b 776 pcSerial.printf("****\r\n");
itatchi42 0:1271d15b4d4b 777 if (!fona.HTTP_POST_start(url, "text/plain", (uint8_t *) data, strlen(data), &statuscode, (uint16_t *)&length)) {
itatchi42 0:1271d15b4d4b 778 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 779 break;
itatchi42 0:1271d15b4d4b 780 }
itatchi42 0:1271d15b4d4b 781 while (length > 0) {
itatchi42 0:1271d15b4d4b 782 while (fona.readable()) {
itatchi42 0:1271d15b4d4b 783 char c = fona.getc();
itatchi42 0:1271d15b4d4b 784 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 785 length--;
itatchi42 0:1271d15b4d4b 786 if (! length) break;
itatchi42 0:1271d15b4d4b 787 }
itatchi42 0:1271d15b4d4b 788 }
itatchi42 0:1271d15b4d4b 789 pcSerial.printf("\r\n****\r\n");
itatchi42 0:1271d15b4d4b 790 fona.HTTP_POST_end();
itatchi42 0:1271d15b4d4b 791 break;
itatchi42 0:1271d15b4d4b 792 }
itatchi42 0:1271d15b4d4b 793 /*****************************************/
itatchi42 0:1271d15b4d4b 794
itatchi42 0:1271d15b4d4b 795 case 'S': {
itatchi42 0:1271d15b4d4b 796 pcSerial.printf("Creating SERIAL TUBE\r\n");
itatchi42 0:1271d15b4d4b 797 while (1) {
itatchi42 0:1271d15b4d4b 798 while (pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 799 wait_ms(1);
itatchi42 0:1271d15b4d4b 800 fona.putc(pcSerial.getc());
itatchi42 0:1271d15b4d4b 801 }
itatchi42 0:1271d15b4d4b 802 if (fona.readable()) {
itatchi42 0:1271d15b4d4b 803 pcSerial.putc(fona.getc());
itatchi42 0:1271d15b4d4b 804 }
itatchi42 0:1271d15b4d4b 805 }
itatchi42 0:1271d15b4d4b 806 }
itatchi42 0:1271d15b4d4b 807
itatchi42 0:1271d15b4d4b 808 default: {
itatchi42 0:1271d15b4d4b 809 pcSerial.printf("Unknown command\r\n");
itatchi42 0:1271d15b4d4b 810 printMenu();
itatchi42 0:1271d15b4d4b 811 break;
itatchi42 0:1271d15b4d4b 812 }
itatchi42 0:1271d15b4d4b 813 } // end switch
itatchi42 0:1271d15b4d4b 814 // flush input
itatchi42 0:1271d15b4d4b 815 flushSerial();
itatchi42 0:1271d15b4d4b 816 while (fona.readable()) {
itatchi42 0:1271d15b4d4b 817 pcSerial.putc(fona.getc());
itatchi42 0:1271d15b4d4b 818 }
itatchi42 0:1271d15b4d4b 819 } // end while()
itatchi42 0:1271d15b4d4b 820 }
itatchi42 0:1271d15b4d4b 821
itatchi42 0:1271d15b4d4b 822 void printMenu(void) {
itatchi42 0:1271d15b4d4b 823 pcSerial.printf("-------------------------------------\r\n");
itatchi42 0:1271d15b4d4b 824 pcSerial.printf("[?] Print this menu\r\n");
itatchi42 0:1271d15b4d4b 825 pcSerial.printf("[a] read the ADC (2.8V max)\r\n");
itatchi42 0:1271d15b4d4b 826 pcSerial.printf("[b] read the Battery V and %% charged\r\n");
itatchi42 0:1271d15b4d4b 827 pcSerial.printf("[C] read the SIM CCID\r\n");
itatchi42 0:1271d15b4d4b 828 pcSerial.printf("[U] Unlock SIM with PIN code\r\n");
itatchi42 0:1271d15b4d4b 829 pcSerial.printf("[i] read RSSI\r\n");
itatchi42 0:1271d15b4d4b 830 pcSerial.printf("[n] get Network status\r\n");
itatchi42 0:1271d15b4d4b 831 pcSerial.printf("[v] set audio Volume\r\n");
itatchi42 0:1271d15b4d4b 832 pcSerial.printf("[V] get Volume\r\n");
itatchi42 0:1271d15b4d4b 833 pcSerial.printf("[H] set Headphone audio\r\n");
itatchi42 0:1271d15b4d4b 834 pcSerial.printf("[e] set External audio\r\n");
itatchi42 0:1271d15b4d4b 835 pcSerial.printf("[T] play audio Tone\r\n");
itatchi42 0:1271d15b4d4b 836 pcSerial.printf("[P] PWM/Buzzer out\r\n");
itatchi42 0:1271d15b4d4b 837
itatchi42 0:1271d15b4d4b 838 // FM (SIM800 only)
itatchi42 0:1271d15b4d4b 839 pcSerial.printf("[f] tune FM radio\r\n");
itatchi42 0:1271d15b4d4b 840 pcSerial.printf("[F] turn off FM\r\n");
itatchi42 0:1271d15b4d4b 841 pcSerial.printf("[m] set FM volume\r\n");
itatchi42 0:1271d15b4d4b 842 pcSerial.printf("[M] get FM volume\r\n");
itatchi42 0:1271d15b4d4b 843 pcSerial.printf("[q] get FM station signal level\r\n");
itatchi42 0:1271d15b4d4b 844
itatchi42 0:1271d15b4d4b 845 // Phone
itatchi42 0:1271d15b4d4b 846 pcSerial.printf("[c] make phone Call\r\n");
itatchi42 0:1271d15b4d4b 847 pcSerial.printf("[h] Hang up phone\r\n");
itatchi42 0:1271d15b4d4b 848 pcSerial.printf("[p] Pick up phone\r\n");
itatchi42 0:1271d15b4d4b 849
itatchi42 0:1271d15b4d4b 850 // SMS
itatchi42 0:1271d15b4d4b 851 pcSerial.printf("[N] Number of SMSs\r\n");
itatchi42 0:1271d15b4d4b 852 pcSerial.printf("[r] Read SMS #\r\n");
itatchi42 0:1271d15b4d4b 853 pcSerial.printf("[R] Read All SMS\r\n");
itatchi42 0:1271d15b4d4b 854 pcSerial.printf("[d] Delete SMS #\r\n");
itatchi42 0:1271d15b4d4b 855 pcSerial.printf("[s] Send SMS\r\n");
itatchi42 0:1271d15b4d4b 856
itatchi42 0:1271d15b4d4b 857 // Time
itatchi42 0:1271d15b4d4b 858 pcSerial.printf("[y] Enable network time sync\r\n");
itatchi42 0:1271d15b4d4b 859 pcSerial.printf("[Y] Enable NTP time sync (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 860 pcSerial.printf("[t] Get network time\r\n");
itatchi42 0:1271d15b4d4b 861
itatchi42 0:1271d15b4d4b 862 // GPRS
itatchi42 0:1271d15b4d4b 863 pcSerial.printf("[G] Enable GPRS\r\n");
itatchi42 0:1271d15b4d4b 864 pcSerial.printf("[g] Disable GPRS\r\n");
itatchi42 0:1271d15b4d4b 865 pcSerial.printf("[l] Query GSMLOC (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 866 pcSerial.printf("[w] Read webpage (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 867 pcSerial.printf("[W] Post to website (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 868
itatchi42 0:1271d15b4d4b 869 // GPS
itatchi42 0:1271d15b4d4b 870 pcSerial.printf("[O] Turn GPS on (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 871 pcSerial.printf("[o] Turn GPS off (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 872 pcSerial.printf("[x] GPS fix status (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 873 pcSerial.printf("[L] Query GPS location (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 874 pcSerial.printf("[E] Raw NMEA out (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 875
itatchi42 0:1271d15b4d4b 876 pcSerial.printf("[S] create Serial passthru tunnel\r\n");
itatchi42 0:1271d15b4d4b 877 pcSerial.printf("-------------------------------------\r\n");
itatchi42 0:1271d15b4d4b 878 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 879 }
itatchi42 0:1271d15b4d4b 880
itatchi42 0:1271d15b4d4b 881 void flushSerial() {
itatchi42 0:1271d15b4d4b 882 while (pcSerial.readable())
itatchi42 0:1271d15b4d4b 883 pcSerial.getc();
itatchi42 0:1271d15b4d4b 884 }
itatchi42 0:1271d15b4d4b 885
itatchi42 0:1271d15b4d4b 886 char readBlocking() {
itatchi42 0:1271d15b4d4b 887 while (!pcSerial.readable());
itatchi42 0:1271d15b4d4b 888 return pcSerial.getc();
itatchi42 0:1271d15b4d4b 889 }
itatchi42 0:1271d15b4d4b 890
itatchi42 0:1271d15b4d4b 891 uint16_t readnumber() {
itatchi42 0:1271d15b4d4b 892 uint16_t x = 0;
itatchi42 0:1271d15b4d4b 893 char c;
itatchi42 0:1271d15b4d4b 894 while (! isdigit(c = readBlocking())) {
itatchi42 0:1271d15b4d4b 895 //pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 896 }
itatchi42 0:1271d15b4d4b 897 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 898 x = c - '0';
itatchi42 0:1271d15b4d4b 899 while (isdigit(c = readBlocking())) {
itatchi42 0:1271d15b4d4b 900 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 901 x *= 10;
itatchi42 0:1271d15b4d4b 902 x += c - '0';
itatchi42 0:1271d15b4d4b 903 }
itatchi42 0:1271d15b4d4b 904 return x;
itatchi42 0:1271d15b4d4b 905 }
itatchi42 0:1271d15b4d4b 906
itatchi42 0:1271d15b4d4b 907 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
itatchi42 0:1271d15b4d4b 908 uint16_t buffidx = 0;
itatchi42 0:1271d15b4d4b 909 bool timeoutvalid = true;
itatchi42 0:1271d15b4d4b 910 if (timeout == 0) timeoutvalid = false;
itatchi42 0:1271d15b4d4b 911
itatchi42 0:1271d15b4d4b 912 while (true) {
itatchi42 0:1271d15b4d4b 913 if (buffidx > maxbuff) {
itatchi42 0:1271d15b4d4b 914 //pcSerial.printf("SPACE\r\n");
itatchi42 0:1271d15b4d4b 915 break;
itatchi42 0:1271d15b4d4b 916 }
itatchi42 0:1271d15b4d4b 917
itatchi42 0:1271d15b4d4b 918 while(pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 919 char c = pcSerial.getc();
itatchi42 0:1271d15b4d4b 920
itatchi42 0:1271d15b4d4b 921 //pcSerial.printf("%02x#%c\r\n", c, c);
itatchi42 0:1271d15b4d4b 922
itatchi42 0:1271d15b4d4b 923 if (c == '\r')
itatchi42 0:1271d15b4d4b 924 continue;
itatchi42 0:1271d15b4d4b 925
itatchi42 0:1271d15b4d4b 926
itatchi42 0:1271d15b4d4b 927 if (c == '\r') { /////////////////////////////////////////// CHANGED BY JONATHAN: (0XA -> '\r')
itatchi42 0:1271d15b4d4b 928 if (buffidx == 0) // the first 0x0A is ignored
itatchi42 0:1271d15b4d4b 929 continue;
itatchi42 0:1271d15b4d4b 930
itatchi42 0:1271d15b4d4b 931 timeout = 0; // the second 0x0A is the end of the line
itatchi42 0:1271d15b4d4b 932 timeoutvalid = true;
itatchi42 0:1271d15b4d4b 933 break;
itatchi42 0:1271d15b4d4b 934 }
itatchi42 0:1271d15b4d4b 935 buff[buffidx] = c;
itatchi42 0:1271d15b4d4b 936 buffidx++;
itatchi42 0:1271d15b4d4b 937
itatchi42 0:1271d15b4d4b 938 count++; ///////////////////////// ADED BY JONATHAN
itatchi42 0:1271d15b4d4b 939 }
itatchi42 0:1271d15b4d4b 940
itatchi42 0:1271d15b4d4b 941 if (timeoutvalid && timeout == 0) {
itatchi42 0:1271d15b4d4b 942 //pcSerial.printf("TIMEOUT\r\n");
itatchi42 0:1271d15b4d4b 943 break;
itatchi42 0:1271d15b4d4b 944 }
itatchi42 0:1271d15b4d4b 945 wait_ms(1);
itatchi42 0:1271d15b4d4b 946 }
itatchi42 0:1271d15b4d4b 947 buff[buffidx] = 0; // null term
itatchi42 0:1271d15b4d4b 948 return buffidx;
itatchi42 0:1271d15b4d4b 949 }
itatchi42 0:1271d15b4d4b 950
itatchi42 0:1271d15b4d4b 951 long map(long x, long in_min, long in_max, long out_min, long out_max)
itatchi42 0:1271d15b4d4b 952 {
itatchi42 0:1271d15b4d4b 953 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
itatchi42 0:1271d15b4d4b 954 }