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 // Author: Alexander Mussa, Jonathan Osei-Owusu
itatchi42 0:1271d15b4d4b 2 // Purpose: Integrate ESP8266 WiFi Chip with Adafruit FONA Cellular Module to send text commands to Amazon Echo Dot
itatchi42 0:1271d15b4d4b 3 // 4180 Final Project
itatchi42 0:1271d15b4d4b 4
itatchi42 0:1271d15b4d4b 5 /***************************************************
itatchi42 0:1271d15b4d4b 6 This is an example for our Adafruit FONA Cellular Module + ESP8266 WiFi Chip
itatchi42 0:1271d15b4d4b 7
itatchi42 0:1271d15b4d4b 8 Designed specifically to work with the Adafruit FONA
itatchi42 0:1271d15b4d4b 9 ----> http://www.adafruit.com/products/1946
itatchi42 0:1271d15b4d4b 10 ----> http://www.adafruit.com/products/1963
itatchi42 0:1271d15b4d4b 11 ----> http://www.adafruit.com/products/2468
itatchi42 0:1271d15b4d4b 12 ----> http://www.adafruit.com/products/2542
itatchi42 0:1271d15b4d4b 13
itatchi42 0:1271d15b4d4b 14 These cellular modules use TTL Serial to communicate, 2 pins are
itatchi42 0:1271d15b4d4b 15 required to interface
itatchi42 0:1271d15b4d4b 16 Adafruit invests time and resources providing this open source code,
itatchi42 0:1271d15b4d4b 17 please support Adafruit and open-source hardware by purchasing
itatchi42 0:1271d15b4d4b 18 products from Adafruit!
itatchi42 0:1271d15b4d4b 19
itatchi42 0:1271d15b4d4b 20 Written by Limor Fried/Ladyada for Adafruit Industries.
itatchi42 0:1271d15b4d4b 21 BSD license, all text above must be included in any redistribution
itatchi42 0:1271d15b4d4b 22 ****************************************************/
itatchi42 0:1271d15b4d4b 23
itatchi42 0:1271d15b4d4b 24 /*
itatchi42 0:1271d15b4d4b 25 * Modified by Jesse Baker & George Tzintzarov 03/30/2016 for use in mbed LPC1768
itatchi42 0:1271d15b4d4b 26 */
itatchi42 0:1271d15b4d4b 27
itatchi42 0:1271d15b4d4b 28 /*
itatchi42 0:1271d15b4d4b 29 THIS CODE IS STILL IN PROGRESS!
itatchi42 0:1271d15b4d4b 30
itatchi42 0:1271d15b4d4b 31 Open up the serial console on the Arduino at 4800 baud to interact with FONA
itatchi42 0:1271d15b4d4b 32
itatchi42 0:1271d15b4d4b 33 Note that if you need to set a GPRS APN, username, and password scroll down to
itatchi42 0:1271d15b4d4b 34 the commented section below just before the main "while (true)" loop.
itatchi42 0:1271d15b4d4b 35 */
itatchi42 0:1271d15b4d4b 36
itatchi42 0:1271d15b4d4b 37 #include <string.h> //// BY JONATHAN: For strcpy()
itatchi42 0:1271d15b4d4b 38 #include <ctype.h>
itatchi42 0:1271d15b4d4b 39 //#include "SoftSerial.h" I dont think we need this
itatchi42 0:1271d15b4d4b 40 #include "Adafruit_FONA.h"
itatchi42 0:1271d15b4d4b 41 #include "emic2.h"
itatchi42 0:1271d15b4d4b 42
itatchi42 0:1271d15b4d4b 43 #define FONA_RST p12
itatchi42 0:1271d15b4d4b 44 #define FONA_TX p13
itatchi42 0:1271d15b4d4b 45 #define FONA_RX p14
itatchi42 0:1271d15b4d4b 46 #define FONA_RI p11
itatchi42 0:1271d15b4d4b 47
itatchi42 0:1271d15b4d4b 48 // this is a large buffer for replies
itatchi42 0:1271d15b4d4b 49 char replybuffer[255];
itatchi42 0:1271d15b4d4b 50 char smsText[255], smsPhoneNo[11]; ///// By Jonathan: Text to send to Text -> Speech chip & phone # to send to
itatchi42 0:1271d15b4d4b 51
itatchi42 0:1271d15b4d4b 52 int myCount; // by Jonathan
itatchi42 0:1271d15b4d4b 53
itatchi42 0:1271d15b4d4b 54
itatchi42 0:1271d15b4d4b 55 Serial pcSerial(USBTX, USBRX);
itatchi42 0:1271d15b4d4b 56 Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
itatchi42 0:1271d15b4d4b 57 //uLCD_4DGL uLCD(p28,p27,p30);
itatchi42 0:1271d15b4d4b 58
itatchi42 0:1271d15b4d4b 59 // Turn on a LED when somebody call the FONA
itatchi42 0:1271d15b4d4b 60 DigitalOut led1(LED1);
itatchi42 0:1271d15b4d4b 61 emic2 myTTS(p9, p10);
itatchi42 0:1271d15b4d4b 62
itatchi42 0:1271d15b4d4b 63 ///// ---------------- Below are global vars and functions for ESP2886 chip -------------//////////
itatchi42 0:1271d15b4d4b 64
itatchi42 0:1271d15b4d4b 65 Serial esp(p28, p27); // tx, rx
itatchi42 0:1271d15b4d4b 66 DigitalOut reset(p26);
itatchi42 0:1271d15b4d4b 67 DigitalOut led4(LED4);
itatchi42 0:1271d15b4d4b 68 Timer t;
itatchi42 0:1271d15b4d4b 69
itatchi42 0:1271d15b4d4b 70 int count,ended,timeout;
itatchi42 0:1271d15b4d4b 71 char buf[2024];
itatchi42 0:1271d15b4d4b 72 char snd[1024];
itatchi42 0:1271d15b4d4b 73
itatchi42 0:1271d15b4d4b 74 char myText[1024]; //////////////// by Jonathan (string to post to web server)
itatchi42 0:1271d15b4d4b 75
itatchi42 0:1271d15b4d4b 76 char ssid[32] = "Brocano"; // enter WiFi router ssid inside the quotes
itatchi42 0:1271d15b4d4b 77 char pwd [32] = "habitacion"; // enter WiFi router password inside the quotes
itatchi42 0:1271d15b4d4b 78
itatchi42 0:1271d15b4d4b 79 void SendCMD(),getreply(),ESPconfig(),ESPsetbaudrate();
itatchi42 0:1271d15b4d4b 80 void dev_recv()
itatchi42 0:1271d15b4d4b 81 {
itatchi42 0:1271d15b4d4b 82 led1 = !led1;
itatchi42 0:1271d15b4d4b 83 while(esp.readable()) {
itatchi42 0:1271d15b4d4b 84 pcSerial.putc(esp.getc());
itatchi42 0:1271d15b4d4b 85 }
itatchi42 0:1271d15b4d4b 86 }
itatchi42 0:1271d15b4d4b 87
itatchi42 0:1271d15b4d4b 88 //////// JONATHAN: CODE TO EDIIIIT ////////////////
itatchi42 0:1271d15b4d4b 89 void pc_recv() //////// CODE TO EDIT TO INPUT TEXT FROM TERMINAL -> WEBSITE //////
itatchi42 0:1271d15b4d4b 90 {
itatchi42 0:1271d15b4d4b 91 led4 = !led4;
itatchi42 0:1271d15b4d4b 92 char currChar;
itatchi42 0:1271d15b4d4b 93 myText[0] = '\0'; // clear text from char array
itatchi42 0:1271d15b4d4b 94 int i = 0;
itatchi42 0:1271d15b4d4b 95 while(pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 96 currChar = pcSerial.getc();
itatchi42 0:1271d15b4d4b 97 pcSerial.putc(currChar); // Added by Jonathan. local echo
itatchi42 0:1271d15b4d4b 98 myText[i++] = currChar;
itatchi42 0:1271d15b4d4b 99 }
itatchi42 0:1271d15b4d4b 100 }
itatchi42 0:1271d15b4d4b 101
itatchi42 0:1271d15b4d4b 102
itatchi42 0:1271d15b4d4b 103
itatchi42 0:1271d15b4d4b 104
itatchi42 0:1271d15b4d4b 105
itatchi42 0:1271d15b4d4b 106
itatchi42 0:1271d15b4d4b 107 //// ---------------------End ESP8226 Global region ------------------------------////
itatchi42 0:1271d15b4d4b 108
itatchi42 0:1271d15b4d4b 109
itatchi42 0:1271d15b4d4b 110
itatchi42 0:1271d15b4d4b 111 class FonaEventListener : public Adafruit_FONA::EventListener {
itatchi42 0:1271d15b4d4b 112 virtual void onRing() {
itatchi42 0:1271d15b4d4b 113 led1 = 1;
itatchi42 0:1271d15b4d4b 114 }
itatchi42 0:1271d15b4d4b 115
itatchi42 0:1271d15b4d4b 116 virtual void onNoCarrier() {
itatchi42 0:1271d15b4d4b 117 led1 = 0;
itatchi42 0:1271d15b4d4b 118 }
itatchi42 0:1271d15b4d4b 119 };
itatchi42 0:1271d15b4d4b 120 FonaEventListener fonaEventListener;
itatchi42 0:1271d15b4d4b 121
itatchi42 0:1271d15b4d4b 122 // Functions defined after main()
itatchi42 0:1271d15b4d4b 123 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
itatchi42 0:1271d15b4d4b 124 void printMenu(void);
itatchi42 0:1271d15b4d4b 125 void flushSerial();
itatchi42 0:1271d15b4d4b 126 char readBlocking();
itatchi42 0:1271d15b4d4b 127 uint16_t readnumber();
itatchi42 0:1271d15b4d4b 128 long map(long x, long in_min, long in_max, long out_min, long out_max);
itatchi42 0:1271d15b4d4b 129
itatchi42 0:1271d15b4d4b 130 int main() {
itatchi42 0:1271d15b4d4b 131 myTTS.volume(5);
itatchi42 0:1271d15b4d4b 132 myTTS.voice(0);
itatchi42 0:1271d15b4d4b 133 pcSerial.baud(9600);
itatchi42 0:1271d15b4d4b 134 wait(1);
itatchi42 0:1271d15b4d4b 135 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 136
itatchi42 0:1271d15b4d4b 137 //// ------------------- Setting up ESP8266 WiFi Below --------------- ///
itatchi42 0:1271d15b4d4b 138
itatchi42 0:1271d15b4d4b 139 reset=0; //hardware reset for 8266
itatchi42 0:1271d15b4d4b 140 pcSerial.printf("\f\n\r-------------ESP8266 Hardware Reset-------------\n\r");
itatchi42 0:1271d15b4d4b 141 wait(0.5);
itatchi42 0:1271d15b4d4b 142 reset=1;
itatchi42 0:1271d15b4d4b 143 timeout=2;
itatchi42 0:1271d15b4d4b 144 getreply();
itatchi42 0:1271d15b4d4b 145
itatchi42 0:1271d15b4d4b 146 esp.baud(9600); // change this to the new ESP8266 baudrate if it is changed at any time.
itatchi42 0:1271d15b4d4b 147
itatchi42 0:1271d15b4d4b 148 //ESPsetbaudrate(); //****************** include this routine to set a different ESP8266 baudrate ******************
itatchi42 0:1271d15b4d4b 149
itatchi42 0:1271d15b4d4b 150 ESPconfig(); //****************** include Config to set the ESP8266 configuration ***********************
itatchi42 0:1271d15b4d4b 151
itatchi42 0:1271d15b4d4b 152
itatchi42 0:1271d15b4d4b 153
itatchi42 0:1271d15b4d4b 154 pcSerial.attach(&pc_recv, Serial::RxIrq);
itatchi42 0:1271d15b4d4b 155 esp.attach(&dev_recv, Serial::RxIrq);
itatchi42 0:1271d15b4d4b 156
itatchi42 0:1271d15b4d4b 157
itatchi42 0:1271d15b4d4b 158
itatchi42 0:1271d15b4d4b 159
itatchi42 0:1271d15b4d4b 160 //// ---------------------Setting up FONA GSM Chip Below ------------------- ////
itatchi42 0:1271d15b4d4b 161
itatchi42 0:1271d15b4d4b 162
itatchi42 0:1271d15b4d4b 163 pcSerial.printf("FONA basic test\r\n");
itatchi42 0:1271d15b4d4b 164 pcSerial.printf("Initializing....(May take 3 seconds)\r\n");
itatchi42 0:1271d15b4d4b 165
itatchi42 0:1271d15b4d4b 166 // See if the FONA is responding
itatchi42 0:1271d15b4d4b 167 if (! fona.begin(9600)) {
itatchi42 0:1271d15b4d4b 168 pcSerial.printf("Couldn't find FONA\r\n");
itatchi42 0:1271d15b4d4b 169 while (1);
itatchi42 0:1271d15b4d4b 170 }
itatchi42 0:1271d15b4d4b 171 fona.setEventListener(&fonaEventListener);
itatchi42 0:1271d15b4d4b 172 pcSerial.printf("FONA is OK\r\n");
itatchi42 0:1271d15b4d4b 173
itatchi42 0:1271d15b4d4b 174 // Print SIM card IMEI number.
itatchi42 0:1271d15b4d4b 175 char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
itatchi42 0:1271d15b4d4b 176 uint8_t imeiLen = fona.getIMEI(imei);
itatchi42 0:1271d15b4d4b 177 if (imeiLen > 0) {
itatchi42 0:1271d15b4d4b 178 pcSerial.printf("SIM card IMEI: %s\r\n", imei);
itatchi42 0:1271d15b4d4b 179 }
itatchi42 0:1271d15b4d4b 180
itatchi42 0:1271d15b4d4b 181 // Optionally configure a GPRS APN, username, and password.
itatchi42 0:1271d15b4d4b 182 // You might need to do this to access your network's GPRS/data
itatchi42 0:1271d15b4d4b 183 // network. Contact your provider for the exact APN, username,
itatchi42 0:1271d15b4d4b 184 // and password values. Username and password are optional and
itatchi42 0:1271d15b4d4b 185 // can be removed, but APN is required.
itatchi42 0:1271d15b4d4b 186 //fona.setGPRSNetworkSettings("your APN", "your username", "your password");
itatchi42 0:1271d15b4d4b 187 //fona.setGPRSNetworkSettings("web.pt.lu", "", "");
itatchi42 0:1271d15b4d4b 188
itatchi42 0:1271d15b4d4b 189 // Optionally configure HTTP gets to follow redirects over SSL.
itatchi42 0:1271d15b4d4b 190 // Default is not to follow SSL redirects, however if you uncomment
itatchi42 0:1271d15b4d4b 191 // the following line then redirects over SSL will be followed.
itatchi42 0:1271d15b4d4b 192 //fona.setHTTPSRedirect(true);
itatchi42 0:1271d15b4d4b 193
itatchi42 0:1271d15b4d4b 194 printMenu();
itatchi42 0:1271d15b4d4b 195
itatchi42 0:1271d15b4d4b 196
itatchi42 0:1271d15b4d4b 197 while (true) {
itatchi42 0:1271d15b4d4b 198
itatchi42 0:1271d15b4d4b 199 pcSerial.printf("FONA> ");
itatchi42 0:1271d15b4d4b 200 // 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 201
itatchi42 0:1271d15b4d4b 202 /*
itatchi42 0:1271d15b4d4b 203 while (! pcSerial.readable() ) {
itatchi42 0:1271d15b4d4b 204 if (fona.readable()) {
itatchi42 0:1271d15b4d4b 205 pcSerial.putc(fona.getc()); /////// RESPONSIBLE FOR DETECTING RECV'D TXT///////
itatchi42 0:1271d15b4d4b 206 }
itatchi42 0:1271d15b4d4b 207 } */
itatchi42 0:1271d15b4d4b 208
itatchi42 0:1271d15b4d4b 209 //////////////////// By Jonathan: Edited version of while() above
itatchi42 0:1271d15b4d4b 210 while (! pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 211 if (fona.readable()) {
itatchi42 0:1271d15b4d4b 212
itatchi42 0:1271d15b4d4b 213 //// Printf that incoming SMS detected
itatchi42 0:1271d15b4d4b 214 pcSerial.putc(fona.getc());
itatchi42 0:1271d15b4d4b 215
itatchi42 0:1271d15b4d4b 216
itatchi42 0:1271d15b4d4b 217 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 218
itatchi42 0:1271d15b4d4b 219 // read an SMS + send -> TTS chip
itatchi42 0:1271d15b4d4b 220 flushSerial();
itatchi42 0:1271d15b4d4b 221 pcSerial.printf("\r\nReading SMS #1\r\n");
itatchi42 0:1271d15b4d4b 222
itatchi42 0:1271d15b4d4b 223 // Retrieve SMS sender address/phone number.
itatchi42 0:1271d15b4d4b 224 if (! fona.getSMSSender(1, replybuffer, 250)) {
itatchi42 0:1271d15b4d4b 225 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 226 break;
itatchi42 0:1271d15b4d4b 227 }
itatchi42 0:1271d15b4d4b 228 pcSerial.printf("FROM: %s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 229 for (int i = 0; i < 10; i++) { /////// BY JONATHAN to store phone # to respond to
itatchi42 0:1271d15b4d4b 230 smsPhoneNo[i] = replybuffer[i + 2]; // chop off the "+1" from phone # returned by replybuffer
itatchi42 0:1271d15b4d4b 231 }
itatchi42 0:1271d15b4d4b 232 smsPhoneNo[10] = '\0'; // null terminate.... NECESSARY??
itatchi42 0:1271d15b4d4b 233 pcSerial.printf("FROM: %s\r\n", smsPhoneNo);
itatchi42 0:1271d15b4d4b 234
itatchi42 0:1271d15b4d4b 235 // Retrieve SMS value.
itatchi42 0:1271d15b4d4b 236 uint16_t smslen;
itatchi42 0:1271d15b4d4b 237 if (! fona.readSMS(1, replybuffer, 250, &smslen)) { // pass in buffer and max len!
itatchi42 0:1271d15b4d4b 238 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 239 break;
itatchi42 0:1271d15b4d4b 240 }
itatchi42 0:1271d15b4d4b 241 pcSerial.printf("***** SMS #1 (%d) bytes *****\r\n", smslen);
itatchi42 0:1271d15b4d4b 242 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 243 pcSerial.printf("*****\r\n");
itatchi42 0:1271d15b4d4b 244
itatchi42 0:1271d15b4d4b 245
itatchi42 0:1271d15b4d4b 246
itatchi42 0:1271d15b4d4b 247 //char message[255]; // CHANGED BY JONATHAN. 141 -> 255
itatchi42 0:1271d15b4d4b 248 char myString[255];
itatchi42 0:1271d15b4d4b 249
itatchi42 0:1271d15b4d4b 250 for (int i = 0; i < 255; i++) {
itatchi42 0:1271d15b4d4b 251 myString[i] = replybuffer[i + 5]; // chop of the "Alexa string"
itatchi42 0:1271d15b4d4b 252 }
itatchi42 0:1271d15b4d4b 253
itatchi42 0:1271d15b4d4b 254 strcpy(smsText, "Uh lex uh "); //Pronunciation Correction.
itatchi42 0:1271d15b4d4b 255 strcat(smsText, myString);
itatchi42 0:1271d15b4d4b 256 myTTS.speakf("S%s\r", smsText); // Send text message to the text to speech module.
itatchi42 0:1271d15b4d4b 257
itatchi42 0:1271d15b4d4b 258
itatchi42 0:1271d15b4d4b 259 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 260
itatchi42 0:1271d15b4d4b 261 // send an SMS back!
itatchi42 0:1271d15b4d4b 262 char message[255];
itatchi42 0:1271d15b4d4b 263
itatchi42 0:1271d15b4d4b 264 strcpy(message, "");
itatchi42 0:1271d15b4d4b 265
itatchi42 0:1271d15b4d4b 266 flushSerial();
itatchi42 0:1271d15b4d4b 267
itatchi42 0:1271d15b4d4b 268 pcSerial.printf("Replying to %s\r\n", smsPhoneNo);
itatchi42 0:1271d15b4d4b 269
itatchi42 0:1271d15b4d4b 270
itatchi42 0:1271d15b4d4b 271 if(strstr(replybuffer, "how old are you")) { // if reply buffer contains that string
itatchi42 0:1271d15b4d4b 272 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 273 }
itatchi42 0:1271d15b4d4b 274 else if(strstr(replybuffer, "what is the world population")) {
itatchi42 0:1271d15b4d4b 275 strcpy(message, "The population of the world is about 7 Billion 400 Million.");
itatchi42 0:1271d15b4d4b 276 }
itatchi42 0:1271d15b4d4b 277 else if(strstr(replybuffer, "integral of x squared")) {
itatchi42 0:1271d15b4d4b 278 strcpy(message, "The integral of x squared is one third x cubed plus a constant.");
itatchi42 0:1271d15b4d4b 279 }
itatchi42 0:1271d15b4d4b 280 else if(strstr(replybuffer, "discrete co sine transform")) {
itatchi42 0:1271d15b4d4b 281 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 282 }
itatchi42 0:1271d15b4d4b 283 else {
itatchi42 0:1271d15b4d4b 284 strcpy(message, "Sorry, command not recognized.");
itatchi42 0:1271d15b4d4b 285 }
itatchi42 0:1271d15b4d4b 286
itatchi42 0:1271d15b4d4b 287
itatchi42 0:1271d15b4d4b 288
itatchi42 0:1271d15b4d4b 289 // message[255] = '\0';
itatchi42 0:1271d15b4d4b 290
itatchi42 0:1271d15b4d4b 291 pcSerial.printf("%s\r\n", message);
itatchi42 0:1271d15b4d4b 292 if (!fona.sendSMS(smsPhoneNo, message))
itatchi42 0:1271d15b4d4b 293 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 294 else
itatchi42 0:1271d15b4d4b 295 pcSerial.printf("Sent!\r\n");
itatchi42 0:1271d15b4d4b 296
itatchi42 0:1271d15b4d4b 297 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 298
itatchi42 0:1271d15b4d4b 299 // delete an SMS after response sent back
itatchi42 0:1271d15b4d4b 300 flushSerial();
itatchi42 0:1271d15b4d4b 301 pcSerial.printf("\r\nDeleting SMS #1\r\n");
itatchi42 0:1271d15b4d4b 302 if (fona.deleteSMS(1)) // delete SMS #1
itatchi42 0:1271d15b4d4b 303 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 304 else
itatchi42 0:1271d15b4d4b 305 pcSerial.printf("Couldn't delete\r\n");
itatchi42 0:1271d15b4d4b 306
itatchi42 0:1271d15b4d4b 307 } // end if
itatchi42 0:1271d15b4d4b 308 } // end while
itatchi42 0:1271d15b4d4b 309
itatchi42 0:1271d15b4d4b 310
itatchi42 0:1271d15b4d4b 311
itatchi42 0:1271d15b4d4b 312 // Above while() by Jonathan //
itatchi42 0:1271d15b4d4b 313
itatchi42 0:1271d15b4d4b 314
itatchi42 0:1271d15b4d4b 315
itatchi42 0:1271d15b4d4b 316 // get the input command from the terminal
itatchi42 0:1271d15b4d4b 317 char command = pcSerial.getc();
itatchi42 0:1271d15b4d4b 318 pcSerial.printf("%c\r\n", command); //loops back to COM port
itatchi42 0:1271d15b4d4b 319
itatchi42 0:1271d15b4d4b 320
itatchi42 0:1271d15b4d4b 321 switch (command) {
itatchi42 0:1271d15b4d4b 322 case '?': {
itatchi42 0:1271d15b4d4b 323 printMenu();
itatchi42 0:1271d15b4d4b 324 break;
itatchi42 0:1271d15b4d4b 325 }
itatchi42 0:1271d15b4d4b 326
itatchi42 0:1271d15b4d4b 327 case 'a': {
itatchi42 0:1271d15b4d4b 328 // read the ADC
itatchi42 0:1271d15b4d4b 329 uint16_t adc;
itatchi42 0:1271d15b4d4b 330 if (! fona.getADCVoltage(&adc)) {
itatchi42 0:1271d15b4d4b 331 pcSerial.printf("Failed to read ADC\r\n");
itatchi42 0:1271d15b4d4b 332 } else {
itatchi42 0:1271d15b4d4b 333 pcSerial.printf("ADC = %d mV\r\n", adc);
itatchi42 0:1271d15b4d4b 334 }
itatchi42 0:1271d15b4d4b 335 break;
itatchi42 0:1271d15b4d4b 336 }
itatchi42 0:1271d15b4d4b 337
itatchi42 0:1271d15b4d4b 338 case 'b': {
itatchi42 0:1271d15b4d4b 339 // read the battery voltage and percentage
itatchi42 0:1271d15b4d4b 340 uint16_t vbat;
itatchi42 0:1271d15b4d4b 341 if (! fona.getBattVoltage(&vbat)) {
itatchi42 0:1271d15b4d4b 342 pcSerial.printf("Failed to read Batt\r\n");
itatchi42 0:1271d15b4d4b 343 } else {
itatchi42 0:1271d15b4d4b 344 pcSerial.printf("VBat = %d mV\r\n", vbat);
itatchi42 0:1271d15b4d4b 345 }
itatchi42 0:1271d15b4d4b 346
itatchi42 0:1271d15b4d4b 347 if (! fona.getBattPercent(&vbat)) {
itatchi42 0:1271d15b4d4b 348 pcSerial.printf("Failed to read Batt\r\n");
itatchi42 0:1271d15b4d4b 349 } else {
itatchi42 0:1271d15b4d4b 350 pcSerial.printf("VPct = %d%%\r\n", vbat);
itatchi42 0:1271d15b4d4b 351 }
itatchi42 0:1271d15b4d4b 352
itatchi42 0:1271d15b4d4b 353 break;
itatchi42 0:1271d15b4d4b 354 }
itatchi42 0:1271d15b4d4b 355
itatchi42 0:1271d15b4d4b 356 case 'U': {
itatchi42 0:1271d15b4d4b 357 // Unlock the SIM with a PIN code
itatchi42 0:1271d15b4d4b 358 char PIN[5];
itatchi42 0:1271d15b4d4b 359 flushSerial();
itatchi42 0:1271d15b4d4b 360 pcSerial.printf("Enter 4-digit PIN\r\n");
itatchi42 0:1271d15b4d4b 361 readline(PIN, 3);
itatchi42 0:1271d15b4d4b 362 pcSerial.printf("%s\r\n", PIN);
itatchi42 0:1271d15b4d4b 363 pcSerial.printf("Unlocking SIM card: ");
itatchi42 0:1271d15b4d4b 364 if (! fona.unlockSIM(PIN)) {
itatchi42 0:1271d15b4d4b 365 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 366 } else {
itatchi42 0:1271d15b4d4b 367 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 368 }
itatchi42 0:1271d15b4d4b 369 break;
itatchi42 0:1271d15b4d4b 370 }
itatchi42 0:1271d15b4d4b 371
itatchi42 0:1271d15b4d4b 372 case 'C': {
itatchi42 0:1271d15b4d4b 373 // read the CCID
itatchi42 0:1271d15b4d4b 374 fona.getSIMCCID(replybuffer); // make sure replybuffer is at least 21 bytes!
itatchi42 0:1271d15b4d4b 375 pcSerial.printf("SIM CCID = %s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 376 break;
itatchi42 0:1271d15b4d4b 377 }
itatchi42 0:1271d15b4d4b 378
itatchi42 0:1271d15b4d4b 379 case 'i': {
itatchi42 0:1271d15b4d4b 380 // read the RSSI
itatchi42 0:1271d15b4d4b 381 uint8_t n = fona.getRSSI();
itatchi42 0:1271d15b4d4b 382 int8_t r = 0;
itatchi42 0:1271d15b4d4b 383
itatchi42 0:1271d15b4d4b 384 pcSerial.printf("RSSI = %d: ", n);
itatchi42 0:1271d15b4d4b 385 if (n == 0) r = -115;
itatchi42 0:1271d15b4d4b 386 if (n == 1) r = -111;
itatchi42 0:1271d15b4d4b 387 if (n == 31) r = -52;
itatchi42 0:1271d15b4d4b 388 if ((n >= 2) && (n <= 30)) {
itatchi42 0:1271d15b4d4b 389 r = map(n, 2, 30, -110, -54);
itatchi42 0:1271d15b4d4b 390 }
itatchi42 0:1271d15b4d4b 391 pcSerial.printf("%d dBm\r\n", r);
itatchi42 0:1271d15b4d4b 392
itatchi42 0:1271d15b4d4b 393 break;
itatchi42 0:1271d15b4d4b 394 }
itatchi42 0:1271d15b4d4b 395
itatchi42 0:1271d15b4d4b 396 case 'n': {
itatchi42 0:1271d15b4d4b 397 // read the network/cellular status
itatchi42 0:1271d15b4d4b 398 uint8_t n = fona.getNetworkStatus();
itatchi42 0:1271d15b4d4b 399 pcSerial.printf("Network status %d: ", n);
itatchi42 0:1271d15b4d4b 400 if (n == 0) pcSerial.printf("Not registered\r\n");
itatchi42 0:1271d15b4d4b 401 if (n == 1) pcSerial.printf("Registered (home)\r\n");
itatchi42 0:1271d15b4d4b 402 if (n == 2) pcSerial.printf("Not registered (searching)\r\n");
itatchi42 0:1271d15b4d4b 403 if (n == 3) pcSerial.printf("Denied\r\n");
itatchi42 0:1271d15b4d4b 404 if (n == 4) pcSerial.printf("Unknown\r\n");
itatchi42 0:1271d15b4d4b 405 if (n == 5) pcSerial.printf("Registered roaming\r\n");
itatchi42 0:1271d15b4d4b 406 break;
itatchi42 0:1271d15b4d4b 407 }
itatchi42 0:1271d15b4d4b 408
itatchi42 0:1271d15b4d4b 409 /*** Audio ***/
itatchi42 0:1271d15b4d4b 410 case 'v': {
itatchi42 0:1271d15b4d4b 411 // set volume
itatchi42 0:1271d15b4d4b 412 flushSerial();
itatchi42 0:1271d15b4d4b 413 pcSerial.printf("Set Vol %%");
itatchi42 0:1271d15b4d4b 414 uint8_t vol = readnumber();
itatchi42 0:1271d15b4d4b 415 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 416 if (! fona.setVolume(vol)) {
itatchi42 0:1271d15b4d4b 417 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 418 } else {
itatchi42 0:1271d15b4d4b 419 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 420 }
itatchi42 0:1271d15b4d4b 421 break;
itatchi42 0:1271d15b4d4b 422 }
itatchi42 0:1271d15b4d4b 423
itatchi42 0:1271d15b4d4b 424 case 'V': {
itatchi42 0:1271d15b4d4b 425 uint8_t v = fona.getVolume();
itatchi42 0:1271d15b4d4b 426 pcSerial.printf("%d%%\r\n", v);
itatchi42 0:1271d15b4d4b 427
itatchi42 0:1271d15b4d4b 428 break;
itatchi42 0:1271d15b4d4b 429 }
itatchi42 0:1271d15b4d4b 430
itatchi42 0:1271d15b4d4b 431 case 'H': {
itatchi42 0:1271d15b4d4b 432 // Set Headphone output
itatchi42 0:1271d15b4d4b 433 if (! fona.setAudio(FONA_HEADSETAUDIO)) {
itatchi42 0:1271d15b4d4b 434 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 435 } else {
itatchi42 0:1271d15b4d4b 436 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 437 }
itatchi42 0:1271d15b4d4b 438 fona.setMicVolume(FONA_HEADSETAUDIO, 15);
itatchi42 0:1271d15b4d4b 439 break;
itatchi42 0:1271d15b4d4b 440 }
itatchi42 0:1271d15b4d4b 441 case 'e': {
itatchi42 0:1271d15b4d4b 442 // Set External output
itatchi42 0:1271d15b4d4b 443 if (! fona.setAudio(FONA_EXTAUDIO)) {
itatchi42 0:1271d15b4d4b 444 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 445 } else {
itatchi42 0:1271d15b4d4b 446 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 447 }
itatchi42 0:1271d15b4d4b 448
itatchi42 0:1271d15b4d4b 449 fona.setMicVolume(FONA_EXTAUDIO, 10);
itatchi42 0:1271d15b4d4b 450 break;
itatchi42 0:1271d15b4d4b 451 }
itatchi42 0:1271d15b4d4b 452
itatchi42 0:1271d15b4d4b 453 case 'T': {
itatchi42 0:1271d15b4d4b 454 // play tone
itatchi42 0:1271d15b4d4b 455 flushSerial();
itatchi42 0:1271d15b4d4b 456 pcSerial.printf("Play tone #");
itatchi42 0:1271d15b4d4b 457 uint8_t kittone = readnumber();
itatchi42 0:1271d15b4d4b 458 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 459 // play for 1 second (1000 ms)
itatchi42 0:1271d15b4d4b 460 if (! fona.playToolkitTone(kittone, 1000)) {
itatchi42 0:1271d15b4d4b 461 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 462 } else {
itatchi42 0:1271d15b4d4b 463 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 464 }
itatchi42 0:1271d15b4d4b 465 break;
itatchi42 0:1271d15b4d4b 466 }
itatchi42 0:1271d15b4d4b 467
itatchi42 0:1271d15b4d4b 468 /*** FM Radio ***/
itatchi42 0:1271d15b4d4b 469
itatchi42 0:1271d15b4d4b 470 case 'f': {
itatchi42 0:1271d15b4d4b 471 // get freq
itatchi42 0:1271d15b4d4b 472 flushSerial();
itatchi42 0:1271d15b4d4b 473 pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): ");
itatchi42 0:1271d15b4d4b 474 uint16_t station = readnumber();
itatchi42 0:1271d15b4d4b 475 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 476 // FM radio ON using headset
itatchi42 0:1271d15b4d4b 477 if (fona.FMradio(true, FONA_HEADSETAUDIO)) {
itatchi42 0:1271d15b4d4b 478 pcSerial.printf("Opened\r\n");
itatchi42 0:1271d15b4d4b 479 }
itatchi42 0:1271d15b4d4b 480 if (! fona.tuneFMradio(station)) {
itatchi42 0:1271d15b4d4b 481 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 482 } else {
itatchi42 0:1271d15b4d4b 483 pcSerial.printf("Tuned\r\n");
itatchi42 0:1271d15b4d4b 484 }
itatchi42 0:1271d15b4d4b 485 break;
itatchi42 0:1271d15b4d4b 486 }
itatchi42 0:1271d15b4d4b 487 case 'F': {
itatchi42 0:1271d15b4d4b 488 // FM radio off
itatchi42 0:1271d15b4d4b 489 if (! fona.FMradio(false)) {
itatchi42 0:1271d15b4d4b 490 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 491 } else {
itatchi42 0:1271d15b4d4b 492 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 493 }
itatchi42 0:1271d15b4d4b 494 break;
itatchi42 0:1271d15b4d4b 495 }
itatchi42 0:1271d15b4d4b 496 case 'm': {
itatchi42 0:1271d15b4d4b 497 // Set FM volume.
itatchi42 0:1271d15b4d4b 498 flushSerial();
itatchi42 0:1271d15b4d4b 499 pcSerial.printf("Set FM Vol [0-6]:");
itatchi42 0:1271d15b4d4b 500 uint8_t vol = readnumber();
itatchi42 0:1271d15b4d4b 501 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 502 if (!fona.setFMVolume(vol)) {
itatchi42 0:1271d15b4d4b 503 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 504 } else {
itatchi42 0:1271d15b4d4b 505 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 506 }
itatchi42 0:1271d15b4d4b 507 break;
itatchi42 0:1271d15b4d4b 508 }
itatchi42 0:1271d15b4d4b 509 case 'M': {
itatchi42 0:1271d15b4d4b 510 // Get FM volume.
itatchi42 0:1271d15b4d4b 511 int8_t fmvol = fona.getFMVolume();
itatchi42 0:1271d15b4d4b 512 if (fmvol < 0) {
itatchi42 0:1271d15b4d4b 513 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 514 } else {
itatchi42 0:1271d15b4d4b 515 pcSerial.printf("FM volume: %d\r\n", fmvol);
itatchi42 0:1271d15b4d4b 516 }
itatchi42 0:1271d15b4d4b 517 break;
itatchi42 0:1271d15b4d4b 518 }
itatchi42 0:1271d15b4d4b 519 case 'q': {
itatchi42 0:1271d15b4d4b 520 // Get FM station signal level (in decibels).
itatchi42 0:1271d15b4d4b 521 flushSerial();
itatchi42 0:1271d15b4d4b 522 pcSerial.printf("FM Freq (eg 1011 == 101.1 MHz): ");
itatchi42 0:1271d15b4d4b 523 uint16_t station = readnumber();
itatchi42 0:1271d15b4d4b 524 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 525 int8_t level = fona.getFMSignalLevel(station);
itatchi42 0:1271d15b4d4b 526 if (level < 0) {
itatchi42 0:1271d15b4d4b 527 pcSerial.printf("Failed! Make sure FM radio is on (tuned to station).\r\n");
itatchi42 0:1271d15b4d4b 528 } else {
itatchi42 0:1271d15b4d4b 529 pcSerial.printf("Signal level (dB): %d\r\n", level);
itatchi42 0:1271d15b4d4b 530 }
itatchi42 0:1271d15b4d4b 531 break;
itatchi42 0:1271d15b4d4b 532 }
itatchi42 0:1271d15b4d4b 533
itatchi42 0:1271d15b4d4b 534 /*** PWM ***/
itatchi42 0:1271d15b4d4b 535
itatchi42 0:1271d15b4d4b 536 case 'P': {
itatchi42 0:1271d15b4d4b 537 // PWM Buzzer output @ 2KHz max
itatchi42 0:1271d15b4d4b 538 flushSerial();
itatchi42 0:1271d15b4d4b 539 pcSerial.printf("PWM Freq, 0 = Off, (1-2000): ");
itatchi42 0:1271d15b4d4b 540 uint16_t freq = readnumber();
itatchi42 0:1271d15b4d4b 541 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 542 if (! fona.setPWM(freq)) {
itatchi42 0:1271d15b4d4b 543 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 544 } else {
itatchi42 0:1271d15b4d4b 545 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 546 }
itatchi42 0:1271d15b4d4b 547 break;
itatchi42 0:1271d15b4d4b 548 }
itatchi42 0:1271d15b4d4b 549
itatchi42 0:1271d15b4d4b 550 /*** Call ***/
itatchi42 0:1271d15b4d4b 551 case 'c': {
itatchi42 0:1271d15b4d4b 552 // call a phone!
itatchi42 0:1271d15b4d4b 553 char number[10];
itatchi42 0:1271d15b4d4b 554 flushSerial();
itatchi42 0:1271d15b4d4b 555 pcSerial.printf("Call #");
itatchi42 0:1271d15b4d4b 556 readline(number, 9);
itatchi42 0:1271d15b4d4b 557 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 558 pcSerial.printf("Calling %s\r\n", number);
itatchi42 0:1271d15b4d4b 559 if (!fona.callPhone(number)) {
itatchi42 0:1271d15b4d4b 560 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 561 } else {
itatchi42 0:1271d15b4d4b 562 pcSerial.printf("Sent!\r\n");
itatchi42 0:1271d15b4d4b 563 }
itatchi42 0:1271d15b4d4b 564
itatchi42 0:1271d15b4d4b 565 break;
itatchi42 0:1271d15b4d4b 566 }
itatchi42 0:1271d15b4d4b 567 case 'h': {
itatchi42 0:1271d15b4d4b 568 // hang up!
itatchi42 0:1271d15b4d4b 569 if (! fona.hangUp()) {
itatchi42 0:1271d15b4d4b 570 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 571 } else {
itatchi42 0:1271d15b4d4b 572 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 573 }
itatchi42 0:1271d15b4d4b 574 break;
itatchi42 0:1271d15b4d4b 575 }
itatchi42 0:1271d15b4d4b 576
itatchi42 0:1271d15b4d4b 577 case 'p': {
itatchi42 0:1271d15b4d4b 578 // pick up!
itatchi42 0:1271d15b4d4b 579 if (! fona.pickUp()) {
itatchi42 0:1271d15b4d4b 580 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 581 } else {
itatchi42 0:1271d15b4d4b 582 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 583 }
itatchi42 0:1271d15b4d4b 584 break;
itatchi42 0:1271d15b4d4b 585 }
itatchi42 0:1271d15b4d4b 586
itatchi42 0:1271d15b4d4b 587 /*** SMS ***/
itatchi42 0:1271d15b4d4b 588
itatchi42 0:1271d15b4d4b 589 case 'N': {
itatchi42 0:1271d15b4d4b 590 // read the number of SMS's!
itatchi42 0:1271d15b4d4b 591 int8_t smsnum = fona.getNumSMS();
itatchi42 0:1271d15b4d4b 592 if (smsnum < 0) {
itatchi42 0:1271d15b4d4b 593 pcSerial.printf("Could not read # SMS\r\n");
itatchi42 0:1271d15b4d4b 594 } else {
itatchi42 0:1271d15b4d4b 595 pcSerial.printf("%d SMS's on SIM card!\r\n", smsnum);
itatchi42 0:1271d15b4d4b 596 }
itatchi42 0:1271d15b4d4b 597 break;
itatchi42 0:1271d15b4d4b 598 }
itatchi42 0:1271d15b4d4b 599 case 'r': {
itatchi42 0:1271d15b4d4b 600 // read an SMS
itatchi42 0:1271d15b4d4b 601 flushSerial();
itatchi42 0:1271d15b4d4b 602 pcSerial.printf("Read #");
itatchi42 0:1271d15b4d4b 603 uint8_t smsn = readnumber();
itatchi42 0:1271d15b4d4b 604 pcSerial.printf("\r\nReading SMS #%d\r\n", smsn);
itatchi42 0:1271d15b4d4b 605
itatchi42 0:1271d15b4d4b 606 // Retrieve SMS sender address/phone number.
itatchi42 0:1271d15b4d4b 607 if (! fona.getSMSSender(smsn, replybuffer, 250)) {
itatchi42 0:1271d15b4d4b 608 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 609 break;
itatchi42 0:1271d15b4d4b 610 }
itatchi42 0:1271d15b4d4b 611 pcSerial.printf("FROM: %s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 612
itatchi42 0:1271d15b4d4b 613 // Retrieve SMS value.
itatchi42 0:1271d15b4d4b 614 uint16_t smslen;
itatchi42 0:1271d15b4d4b 615 if (! fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
itatchi42 0:1271d15b4d4b 616 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 617 break;
itatchi42 0:1271d15b4d4b 618 }
itatchi42 0:1271d15b4d4b 619 pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen);
itatchi42 0:1271d15b4d4b 620 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 621 pcSerial.printf("*****\r\n");
itatchi42 0:1271d15b4d4b 622
itatchi42 0:1271d15b4d4b 623 break;
itatchi42 0:1271d15b4d4b 624 }
itatchi42 0:1271d15b4d4b 625 case 'R': {
itatchi42 0:1271d15b4d4b 626 // read all SMS
itatchi42 0:1271d15b4d4b 627 int8_t smsnum = fona.getNumSMS();
itatchi42 0:1271d15b4d4b 628 uint16_t smslen;
itatchi42 0:1271d15b4d4b 629 for (int8_t smsn=1; smsn<=smsnum; smsn++) {
itatchi42 0:1271d15b4d4b 630 pcSerial.printf("\r\nReading SMS #%d\r\n", smsn);
itatchi42 0:1271d15b4d4b 631 if (!fona.readSMS(smsn, replybuffer, 250, &smslen)) { // pass in buffer and max len!
itatchi42 0:1271d15b4d4b 632 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 633 break;
itatchi42 0:1271d15b4d4b 634 }
itatchi42 0:1271d15b4d4b 635 // if the length is zero, its a special case where the index number is higher
itatchi42 0:1271d15b4d4b 636 // so increase the max we'll look at!
itatchi42 0:1271d15b4d4b 637 if (smslen == 0) {
itatchi42 0:1271d15b4d4b 638 pcSerial.printf("[empty slot]\r\n");
itatchi42 0:1271d15b4d4b 639 smsnum++;
itatchi42 0:1271d15b4d4b 640 continue;
itatchi42 0:1271d15b4d4b 641 }
itatchi42 0:1271d15b4d4b 642
itatchi42 0:1271d15b4d4b 643 pcSerial.printf("***** SMS #%d (%d) bytes *****\r\n", smsn, smslen);
itatchi42 0:1271d15b4d4b 644 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 645 pcSerial.printf("*****\r\n");
itatchi42 0:1271d15b4d4b 646 }
itatchi42 0:1271d15b4d4b 647 break;
itatchi42 0:1271d15b4d4b 648 }
itatchi42 0:1271d15b4d4b 649
itatchi42 0:1271d15b4d4b 650 case 'd': {
itatchi42 0:1271d15b4d4b 651 // delete an SMS
itatchi42 0:1271d15b4d4b 652 flushSerial();
itatchi42 0:1271d15b4d4b 653 pcSerial.printf("Delete #");
itatchi42 0:1271d15b4d4b 654 uint8_t smsn = readnumber();
itatchi42 0:1271d15b4d4b 655
itatchi42 0:1271d15b4d4b 656 pcSerial.printf("\r\nDeleting SMS #%d\r\n", smsn);
itatchi42 0:1271d15b4d4b 657 if (fona.deleteSMS(smsn)) {
itatchi42 0:1271d15b4d4b 658 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 659 } else {
itatchi42 0:1271d15b4d4b 660 pcSerial.printf("Couldn't delete\r\n");
itatchi42 0:1271d15b4d4b 661 }
itatchi42 0:1271d15b4d4b 662 break;
itatchi42 0:1271d15b4d4b 663 }
itatchi42 0:1271d15b4d4b 664
itatchi42 0:1271d15b4d4b 665 case 's': {
itatchi42 0:1271d15b4d4b 666 // send an SMS!
itatchi42 0:1271d15b4d4b 667 char sendto[10], message[141],currChar; // 'currChar' by Jonathan
itatchi42 0:1271d15b4d4b 668 myCount = 0; // reset
itatchi42 0:1271d15b4d4b 669
itatchi42 0:1271d15b4d4b 670 flushSerial();
itatchi42 0:1271d15b4d4b 671 pcSerial.printf("Send to #");
itatchi42 0:1271d15b4d4b 672 //currChar = pcSerial.getc();
itatchi42 0:1271d15b4d4b 673 readline(sendto, 9);
itatchi42 0:1271d15b4d4b 674 pcSerial.printf("%s\r\n", sendto);
itatchi42 0:1271d15b4d4b 675 pcSerial.printf("Type out one-line message (140 char): ");
itatchi42 0:1271d15b4d4b 676
itatchi42 0:1271d15b4d4b 677 myCount = 0;
itatchi42 0:1271d15b4d4b 678 while (1) // whole while loop added by jonathan... WORKS PERFECTLY for sending texts to phone
itatchi42 0:1271d15b4d4b 679 {
itatchi42 0:1271d15b4d4b 680
itatchi42 0:1271d15b4d4b 681 pcSerial.putc(currChar = pcSerial.getc()); // local echo
itatchi42 0:1271d15b4d4b 682 if (currChar == '\r')
itatchi42 0:1271d15b4d4b 683 {
itatchi42 0:1271d15b4d4b 684 pcSerial.printf("breaking\r\n");
itatchi42 0:1271d15b4d4b 685 message[myCount] = '\0'; // null terminate... NECESSARY??
itatchi42 0:1271d15b4d4b 686 break;
itatchi42 0:1271d15b4d4b 687 }
itatchi42 0:1271d15b4d4b 688 message[myCount] = currChar; // fill in char array
itatchi42 0:1271d15b4d4b 689 myCount++; // global var update
itatchi42 0:1271d15b4d4b 690 //pcSerial.printf("\n%d\n", myCount);
itatchi42 0:1271d15b4d4b 691 }
itatchi42 0:1271d15b4d4b 692
itatchi42 0:1271d15b4d4b 693 //readline(message, myCount); // edited by JONATHAN (140 -> 'myCount'). THEN COMPLETELY COMMENTED OUT, b/c I write directly to message[] above
itatchi42 0:1271d15b4d4b 694 //pcSerial.printf("\n%d\n", myCount); // added by jonathan
itatchi42 0:1271d15b4d4b 695
itatchi42 0:1271d15b4d4b 696
itatchi42 0:1271d15b4d4b 697 pcSerial.printf("%s\r\n", message);
itatchi42 0:1271d15b4d4b 698 if (!fona.sendSMS(sendto, message)) {
itatchi42 0:1271d15b4d4b 699 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 700 } else {
itatchi42 0:1271d15b4d4b 701 pcSerial.printf("Sent!\r\n");
itatchi42 0:1271d15b4d4b 702 }
itatchi42 0:1271d15b4d4b 703
itatchi42 0:1271d15b4d4b 704 break;
itatchi42 0:1271d15b4d4b 705 }
itatchi42 0:1271d15b4d4b 706
itatchi42 0:1271d15b4d4b 707 /*** Time ***/
itatchi42 0:1271d15b4d4b 708
itatchi42 0:1271d15b4d4b 709 case 'y': {
itatchi42 0:1271d15b4d4b 710 // enable network time sync
itatchi42 0:1271d15b4d4b 711 if (!fona.enableNetworkTimeSync(true))
itatchi42 0:1271d15b4d4b 712 pcSerial.printf("Failed to enable\r\n");
itatchi42 0:1271d15b4d4b 713 break;
itatchi42 0:1271d15b4d4b 714 }
itatchi42 0:1271d15b4d4b 715
itatchi42 0:1271d15b4d4b 716 case 'Y': {
itatchi42 0:1271d15b4d4b 717 // enable NTP time sync
itatchi42 0:1271d15b4d4b 718 if (!fona.enableNTPTimeSync(true, "pool.ntp.org"))
itatchi42 0:1271d15b4d4b 719 pcSerial.printf("Failed to enable\r\n");
itatchi42 0:1271d15b4d4b 720 break;
itatchi42 0:1271d15b4d4b 721 }
itatchi42 0:1271d15b4d4b 722
itatchi42 0:1271d15b4d4b 723 case 't': {
itatchi42 0:1271d15b4d4b 724 // read the time
itatchi42 0:1271d15b4d4b 725 char buffer[23];
itatchi42 0:1271d15b4d4b 726
itatchi42 0:1271d15b4d4b 727 fona.getTime(buffer, 23); // make sure replybuffer is at least 23 bytes!
itatchi42 0:1271d15b4d4b 728 pcSerial.printf("Time = %s\r\n", buffer);
itatchi42 0:1271d15b4d4b 729 break;
itatchi42 0:1271d15b4d4b 730 }
itatchi42 0:1271d15b4d4b 731
itatchi42 0:1271d15b4d4b 732 /*********************************** GPS (SIM808 only) */
itatchi42 0:1271d15b4d4b 733
itatchi42 0:1271d15b4d4b 734 case 'o': {
itatchi42 0:1271d15b4d4b 735 // turn GPS off
itatchi42 0:1271d15b4d4b 736 if (!fona.enableGPS(false))
itatchi42 0:1271d15b4d4b 737 pcSerial.printf("Failed to turn off\r\n");
itatchi42 0:1271d15b4d4b 738 break;
itatchi42 0:1271d15b4d4b 739 }
itatchi42 0:1271d15b4d4b 740 case 'O': {
itatchi42 0:1271d15b4d4b 741 // turn GPS on
itatchi42 0:1271d15b4d4b 742 if (!fona.enableGPS(true))
itatchi42 0:1271d15b4d4b 743 pcSerial.printf("Failed to turn on\r\n");
itatchi42 0:1271d15b4d4b 744 break;
itatchi42 0:1271d15b4d4b 745 }
itatchi42 0:1271d15b4d4b 746 case 'x': {
itatchi42 0:1271d15b4d4b 747 int8_t stat;
itatchi42 0:1271d15b4d4b 748 // check GPS fix
itatchi42 0:1271d15b4d4b 749 stat = fona.GPSstatus();
itatchi42 0:1271d15b4d4b 750 if (stat < 0)
itatchi42 0:1271d15b4d4b 751 pcSerial.printf("Failed to query\r\n");
itatchi42 0:1271d15b4d4b 752 if (stat == 0) pcSerial.printf("GPS off\r\n");
itatchi42 0:1271d15b4d4b 753 if (stat == 1) pcSerial.printf("No fix\r\n");
itatchi42 0:1271d15b4d4b 754 if (stat == 2) pcSerial.printf("2D fix\r\n");
itatchi42 0:1271d15b4d4b 755 if (stat == 3) pcSerial.printf("3D fix\r\n");
itatchi42 0:1271d15b4d4b 756 break;
itatchi42 0:1271d15b4d4b 757 }
itatchi42 0:1271d15b4d4b 758
itatchi42 0:1271d15b4d4b 759 case 'L': {
itatchi42 0:1271d15b4d4b 760 // check for GPS location
itatchi42 0:1271d15b4d4b 761 char gpsdata[80];
itatchi42 0:1271d15b4d4b 762 fona.getGPS(0, gpsdata, 80);
itatchi42 0:1271d15b4d4b 763 pcSerial.printf("Reply in format: mode,longitude,latitude,altitude,utctime(yyyymmddHHMMSS),ttff,satellites,speed,course\r\n");
itatchi42 0:1271d15b4d4b 764 pcSerial.printf("%s\r\n", gpsdata);
itatchi42 0:1271d15b4d4b 765
itatchi42 0:1271d15b4d4b 766 break;
itatchi42 0:1271d15b4d4b 767 }
itatchi42 0:1271d15b4d4b 768
itatchi42 0:1271d15b4d4b 769 case 'E': {
itatchi42 0:1271d15b4d4b 770 flushSerial();
itatchi42 0:1271d15b4d4b 771 pcSerial.printf("GPS NMEA output sentences (0 = off, 34 = RMC+GGA, 255 = all)\r\n");
itatchi42 0:1271d15b4d4b 772 uint8_t nmeaout = readnumber();
itatchi42 0:1271d15b4d4b 773
itatchi42 0:1271d15b4d4b 774 // turn on NMEA output
itatchi42 0:1271d15b4d4b 775 fona.enableGPSNMEA(nmeaout);
itatchi42 0:1271d15b4d4b 776
itatchi42 0:1271d15b4d4b 777 break;
itatchi42 0:1271d15b4d4b 778 }
itatchi42 0:1271d15b4d4b 779
itatchi42 0:1271d15b4d4b 780 /*********************************** GPRS */
itatchi42 0:1271d15b4d4b 781
itatchi42 0:1271d15b4d4b 782 case 'g': {
itatchi42 0:1271d15b4d4b 783 // turn GPRS off
itatchi42 0:1271d15b4d4b 784 if (!fona.enableGPRS(false))
itatchi42 0:1271d15b4d4b 785 pcSerial.printf("Failed to turn off\r\n");
itatchi42 0:1271d15b4d4b 786 break;
itatchi42 0:1271d15b4d4b 787 }
itatchi42 0:1271d15b4d4b 788 case 'G': {
itatchi42 0:1271d15b4d4b 789 // turn GPRS on
itatchi42 0:1271d15b4d4b 790 if (!fona.enableGPRS(true))
itatchi42 0:1271d15b4d4b 791 pcSerial.printf("Failed to turn on\r\n");
itatchi42 0:1271d15b4d4b 792 break;
itatchi42 0:1271d15b4d4b 793 }
itatchi42 0:1271d15b4d4b 794 case 'l': {
itatchi42 0:1271d15b4d4b 795 // check for GSMLOC (requires GPRS)
itatchi42 0:1271d15b4d4b 796 uint16_t returncode;
itatchi42 0:1271d15b4d4b 797
itatchi42 0:1271d15b4d4b 798 if (!fona.getGSMLoc(&returncode, replybuffer, 250))
itatchi42 0:1271d15b4d4b 799 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 800 if (returncode == 0) {
itatchi42 0:1271d15b4d4b 801 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 802 } else {
itatchi42 0:1271d15b4d4b 803 pcSerial.printf("Fail code #%d\r\n", returncode);
itatchi42 0:1271d15b4d4b 804 }
itatchi42 0:1271d15b4d4b 805
itatchi42 0:1271d15b4d4b 806 break;
itatchi42 0:1271d15b4d4b 807 }
itatchi42 0:1271d15b4d4b 808 case 'w': {
itatchi42 0:1271d15b4d4b 809 // read website URL
itatchi42 0:1271d15b4d4b 810 uint16_t statuscode;
itatchi42 0:1271d15b4d4b 811 int16_t length;
itatchi42 0:1271d15b4d4b 812 char url[80];
itatchi42 0:1271d15b4d4b 813
itatchi42 0:1271d15b4d4b 814 flushSerial();
itatchi42 0:1271d15b4d4b 815 pcSerial.printf("NOTE: in beta! Use small webpages to read!\r\n");
itatchi42 0:1271d15b4d4b 816 pcSerial.printf("URL to read (e.g. www.adafruit.com/testwifi/index.html):\r\n");
itatchi42 0:1271d15b4d4b 817 pcSerial.printf("http://"); readline(url, 79);
itatchi42 0:1271d15b4d4b 818 pcSerial.printf("%s\r\n", url);
itatchi42 0:1271d15b4d4b 819
itatchi42 0:1271d15b4d4b 820 pcSerial.printf("****\r\n");
itatchi42 0:1271d15b4d4b 821 if (!fona.HTTP_GET_start(url, &statuscode, (uint16_t *)&length)) {
itatchi42 0:1271d15b4d4b 822 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 823 break;
itatchi42 0:1271d15b4d4b 824 }
itatchi42 0:1271d15b4d4b 825 while (length > 0) {
itatchi42 0:1271d15b4d4b 826 while (fona.readable()) {
itatchi42 0:1271d15b4d4b 827 char c = fona.getc();
itatchi42 0:1271d15b4d4b 828 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 829 length--;
itatchi42 0:1271d15b4d4b 830 if (! length) break;
itatchi42 0:1271d15b4d4b 831 }
itatchi42 0:1271d15b4d4b 832 }
itatchi42 0:1271d15b4d4b 833 pcSerial.printf("\r\n****\r\n");
itatchi42 0:1271d15b4d4b 834 fona.HTTP_GET_end();
itatchi42 0:1271d15b4d4b 835 break;
itatchi42 0:1271d15b4d4b 836 }
itatchi42 0:1271d15b4d4b 837
itatchi42 0:1271d15b4d4b 838 case 'W': {
itatchi42 0:1271d15b4d4b 839 // Post data to website
itatchi42 0:1271d15b4d4b 840 uint16_t statuscode;
itatchi42 0:1271d15b4d4b 841 int16_t length;
itatchi42 0:1271d15b4d4b 842 char url[80];
itatchi42 0:1271d15b4d4b 843 char data[80];
itatchi42 0:1271d15b4d4b 844
itatchi42 0:1271d15b4d4b 845 flushSerial();
itatchi42 0:1271d15b4d4b 846 pcSerial.printf("NOTE: in beta! Use simple websites to post!\r\n");
itatchi42 0:1271d15b4d4b 847 pcSerial.printf("URL to post (e.g. httpbin.org/post):\r\n");
itatchi42 0:1271d15b4d4b 848 pcSerial.printf("http://"); readline(url, 79);
itatchi42 0:1271d15b4d4b 849 pcSerial.printf("%s\r\n", url);
itatchi42 0:1271d15b4d4b 850 pcSerial.printf("Data to post (e.g. \"foo\" or \"{\"simple\":\"json\"}\"):\r\n");
itatchi42 0:1271d15b4d4b 851 readline(data, 79);
itatchi42 0:1271d15b4d4b 852 pcSerial.printf("%s\r\n", data);
itatchi42 0:1271d15b4d4b 853
itatchi42 0:1271d15b4d4b 854 pcSerial.printf("****\r\n");
itatchi42 0:1271d15b4d4b 855 if (!fona.HTTP_POST_start(url, "text/plain", (uint8_t *) data, strlen(data), &statuscode, (uint16_t *)&length)) {
itatchi42 0:1271d15b4d4b 856 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 857 break;
itatchi42 0:1271d15b4d4b 858 }
itatchi42 0:1271d15b4d4b 859 while (length > 0) {
itatchi42 0:1271d15b4d4b 860 while (fona.readable()) {
itatchi42 0:1271d15b4d4b 861 char c = fona.getc();
itatchi42 0:1271d15b4d4b 862 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 863 length--;
itatchi42 0:1271d15b4d4b 864 if (! length) break;
itatchi42 0:1271d15b4d4b 865 }
itatchi42 0:1271d15b4d4b 866 }
itatchi42 0:1271d15b4d4b 867 pcSerial.printf("\r\n****\r\n");
itatchi42 0:1271d15b4d4b 868 fona.HTTP_POST_end();
itatchi42 0:1271d15b4d4b 869 break;
itatchi42 0:1271d15b4d4b 870 }
itatchi42 0:1271d15b4d4b 871 /*****************************************/
itatchi42 0:1271d15b4d4b 872
itatchi42 0:1271d15b4d4b 873 case 'S': {
itatchi42 0:1271d15b4d4b 874 pcSerial.printf("Creating SERIAL TUBE\r\n");
itatchi42 0:1271d15b4d4b 875 while (1) {
itatchi42 0:1271d15b4d4b 876 while (pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 877 wait_ms(1);
itatchi42 0:1271d15b4d4b 878 fona.putc(pcSerial.getc());
itatchi42 0:1271d15b4d4b 879 }
itatchi42 0:1271d15b4d4b 880 if (fona.readable()) {
itatchi42 0:1271d15b4d4b 881 pcSerial.putc(fona.getc());
itatchi42 0:1271d15b4d4b 882 }
itatchi42 0:1271d15b4d4b 883 }
itatchi42 0:1271d15b4d4b 884 }
itatchi42 0:1271d15b4d4b 885
itatchi42 0:1271d15b4d4b 886 default: {
itatchi42 0:1271d15b4d4b 887 pcSerial.printf("Unknown command\r\n");
itatchi42 0:1271d15b4d4b 888 printMenu();
itatchi42 0:1271d15b4d4b 889 break;
itatchi42 0:1271d15b4d4b 890 }
itatchi42 0:1271d15b4d4b 891 } // end switch
itatchi42 0:1271d15b4d4b 892 // flush input
itatchi42 0:1271d15b4d4b 893 flushSerial();
itatchi42 0:1271d15b4d4b 894 while (fona.readable()) {
itatchi42 0:1271d15b4d4b 895 pcSerial.putc(fona.getc());
itatchi42 0:1271d15b4d4b 896 }
itatchi42 0:1271d15b4d4b 897 } // end while()
itatchi42 0:1271d15b4d4b 898 } // end main
itatchi42 0:1271d15b4d4b 899
itatchi42 0:1271d15b4d4b 900 void printMenu(void) {
itatchi42 0:1271d15b4d4b 901 pcSerial.printf("-------------------------------------\r\n");
itatchi42 0:1271d15b4d4b 902 pcSerial.printf("[?] Print this menu\r\n");
itatchi42 0:1271d15b4d4b 903 pcSerial.printf("[a] read the ADC (2.8V max)\r\n");
itatchi42 0:1271d15b4d4b 904 pcSerial.printf("[b] read the Battery V and %% charged\r\n");
itatchi42 0:1271d15b4d4b 905 pcSerial.printf("[C] read the SIM CCID\r\n");
itatchi42 0:1271d15b4d4b 906 pcSerial.printf("[U] Unlock SIM with PIN code\r\n");
itatchi42 0:1271d15b4d4b 907 pcSerial.printf("[i] read RSSI\r\n");
itatchi42 0:1271d15b4d4b 908 pcSerial.printf("[n] get Network status\r\n");
itatchi42 0:1271d15b4d4b 909 pcSerial.printf("[v] set audio Volume\r\n");
itatchi42 0:1271d15b4d4b 910 pcSerial.printf("[V] get Volume\r\n");
itatchi42 0:1271d15b4d4b 911 pcSerial.printf("[H] set Headphone audio\r\n");
itatchi42 0:1271d15b4d4b 912 pcSerial.printf("[e] set External audio\r\n");
itatchi42 0:1271d15b4d4b 913 pcSerial.printf("[T] play audio Tone\r\n");
itatchi42 0:1271d15b4d4b 914 pcSerial.printf("[P] PWM/Buzzer out\r\n");
itatchi42 0:1271d15b4d4b 915
itatchi42 0:1271d15b4d4b 916 // FM (SIM800 only)
itatchi42 0:1271d15b4d4b 917 pcSerial.printf("[f] tune FM radio\r\n");
itatchi42 0:1271d15b4d4b 918 pcSerial.printf("[F] turn off FM\r\n");
itatchi42 0:1271d15b4d4b 919 pcSerial.printf("[m] set FM volume\r\n");
itatchi42 0:1271d15b4d4b 920 pcSerial.printf("[M] get FM volume\r\n");
itatchi42 0:1271d15b4d4b 921 pcSerial.printf("[q] get FM station signal level\r\n");
itatchi42 0:1271d15b4d4b 922
itatchi42 0:1271d15b4d4b 923 // Phone
itatchi42 0:1271d15b4d4b 924 pcSerial.printf("[c] make phone Call\r\n");
itatchi42 0:1271d15b4d4b 925 pcSerial.printf("[h] Hang up phone\r\n");
itatchi42 0:1271d15b4d4b 926 pcSerial.printf("[p] Pick up phone\r\n");
itatchi42 0:1271d15b4d4b 927
itatchi42 0:1271d15b4d4b 928 // SMS
itatchi42 0:1271d15b4d4b 929 pcSerial.printf("[N] Number of SMSs\r\n");
itatchi42 0:1271d15b4d4b 930 pcSerial.printf("[r] Read SMS #\r\n");
itatchi42 0:1271d15b4d4b 931 pcSerial.printf("[R] Read All SMS\r\n");
itatchi42 0:1271d15b4d4b 932 pcSerial.printf("[d] Delete SMS #\r\n");
itatchi42 0:1271d15b4d4b 933 pcSerial.printf("[s] Send SMS\r\n");
itatchi42 0:1271d15b4d4b 934
itatchi42 0:1271d15b4d4b 935 // Time
itatchi42 0:1271d15b4d4b 936 pcSerial.printf("[y] Enable network time sync\r\n");
itatchi42 0:1271d15b4d4b 937 pcSerial.printf("[Y] Enable NTP time sync (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 938 pcSerial.printf("[t] Get network time\r\n");
itatchi42 0:1271d15b4d4b 939
itatchi42 0:1271d15b4d4b 940 // GPRS
itatchi42 0:1271d15b4d4b 941 pcSerial.printf("[G] Enable GPRS\r\n");
itatchi42 0:1271d15b4d4b 942 pcSerial.printf("[g] Disable GPRS\r\n");
itatchi42 0:1271d15b4d4b 943 pcSerial.printf("[l] Query GSMLOC (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 944 pcSerial.printf("[w] Read webpage (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 945 pcSerial.printf("[W] Post to website (GPRS)\r\n");
itatchi42 0:1271d15b4d4b 946
itatchi42 0:1271d15b4d4b 947 // GPS
itatchi42 0:1271d15b4d4b 948 pcSerial.printf("[O] Turn GPS on (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 949 pcSerial.printf("[o] Turn GPS off (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 950 pcSerial.printf("[x] GPS fix status (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 951 pcSerial.printf("[L] Query GPS location (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 952 pcSerial.printf("[E] Raw NMEA out (SIM808)\r\n");
itatchi42 0:1271d15b4d4b 953
itatchi42 0:1271d15b4d4b 954 pcSerial.printf("[S] create Serial passthru tunnel\r\n");
itatchi42 0:1271d15b4d4b 955 pcSerial.printf("-------------------------------------\r\n");
itatchi42 0:1271d15b4d4b 956 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 957 }
itatchi42 0:1271d15b4d4b 958
itatchi42 0:1271d15b4d4b 959 void flushSerial() {
itatchi42 0:1271d15b4d4b 960 while (pcSerial.readable())
itatchi42 0:1271d15b4d4b 961 pcSerial.getc();
itatchi42 0:1271d15b4d4b 962 }
itatchi42 0:1271d15b4d4b 963
itatchi42 0:1271d15b4d4b 964 char readBlocking() {
itatchi42 0:1271d15b4d4b 965 while (!pcSerial.readable());
itatchi42 0:1271d15b4d4b 966 return pcSerial.getc();
itatchi42 0:1271d15b4d4b 967 }
itatchi42 0:1271d15b4d4b 968
itatchi42 0:1271d15b4d4b 969 uint16_t readnumber() {
itatchi42 0:1271d15b4d4b 970 uint16_t x = 0;
itatchi42 0:1271d15b4d4b 971 char c;
itatchi42 0:1271d15b4d4b 972 while (! isdigit(c = readBlocking())) {
itatchi42 0:1271d15b4d4b 973 //pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 974 }
itatchi42 0:1271d15b4d4b 975 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 976 x = c - '0';
itatchi42 0:1271d15b4d4b 977 while (isdigit(c = readBlocking())) {
itatchi42 0:1271d15b4d4b 978 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 979 x *= 10;
itatchi42 0:1271d15b4d4b 980 x += c - '0';
itatchi42 0:1271d15b4d4b 981 }
itatchi42 0:1271d15b4d4b 982 return x;
itatchi42 0:1271d15b4d4b 983 }
itatchi42 0:1271d15b4d4b 984
itatchi42 0:1271d15b4d4b 985 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
itatchi42 0:1271d15b4d4b 986 uint16_t buffidx = 0;
itatchi42 0:1271d15b4d4b 987 bool timeoutvalid = true;
itatchi42 0:1271d15b4d4b 988 if (timeout == 0) timeoutvalid = false;
itatchi42 0:1271d15b4d4b 989
itatchi42 0:1271d15b4d4b 990 while (true) {
itatchi42 0:1271d15b4d4b 991 if (buffidx > maxbuff) {
itatchi42 0:1271d15b4d4b 992 //pcSerial.printf("SPACE\r\n");
itatchi42 0:1271d15b4d4b 993 break;
itatchi42 0:1271d15b4d4b 994 }
itatchi42 0:1271d15b4d4b 995
itatchi42 0:1271d15b4d4b 996 while(pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 997 char c = pcSerial.getc();
itatchi42 0:1271d15b4d4b 998
itatchi42 0:1271d15b4d4b 999 //pcSerial.printf("%02x#%c\r\n", c, c);
itatchi42 0:1271d15b4d4b 1000
itatchi42 0:1271d15b4d4b 1001 if (c == '\r')
itatchi42 0:1271d15b4d4b 1002 continue;
itatchi42 0:1271d15b4d4b 1003
itatchi42 0:1271d15b4d4b 1004
itatchi42 0:1271d15b4d4b 1005 if (c == '\r') { /////////////////////////////////////////// CHANGED BY JONATHAN: (0XA -> '\r')
itatchi42 0:1271d15b4d4b 1006 if (buffidx == 0) // the first 0x0A is ignored
itatchi42 0:1271d15b4d4b 1007 continue;
itatchi42 0:1271d15b4d4b 1008
itatchi42 0:1271d15b4d4b 1009 timeout = 0; // the second 0x0A is the end of the line
itatchi42 0:1271d15b4d4b 1010 timeoutvalid = true;
itatchi42 0:1271d15b4d4b 1011 break;
itatchi42 0:1271d15b4d4b 1012 }
itatchi42 0:1271d15b4d4b 1013 buff[buffidx] = c;
itatchi42 0:1271d15b4d4b 1014 buffidx++;
itatchi42 0:1271d15b4d4b 1015
itatchi42 0:1271d15b4d4b 1016 myCount++; ///////////////////////// ADED BY JONATHAN
itatchi42 0:1271d15b4d4b 1017 }
itatchi42 0:1271d15b4d4b 1018
itatchi42 0:1271d15b4d4b 1019 if (timeoutvalid && timeout == 0) {
itatchi42 0:1271d15b4d4b 1020 //pcSerial.printf("TIMEOUT\r\n");
itatchi42 0:1271d15b4d4b 1021 break;
itatchi42 0:1271d15b4d4b 1022 }
itatchi42 0:1271d15b4d4b 1023 wait_ms(1);
itatchi42 0:1271d15b4d4b 1024 }
itatchi42 0:1271d15b4d4b 1025 buff[buffidx] = 0; // null term
itatchi42 0:1271d15b4d4b 1026 return buffidx;
itatchi42 0:1271d15b4d4b 1027 }
itatchi42 0:1271d15b4d4b 1028
itatchi42 0:1271d15b4d4b 1029 long map(long x, long in_min, long in_max, long out_min, long out_max)
itatchi42 0:1271d15b4d4b 1030 {
itatchi42 0:1271d15b4d4b 1031 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
itatchi42 0:1271d15b4d4b 1032 }
itatchi42 0:1271d15b4d4b 1033
itatchi42 0:1271d15b4d4b 1034
itatchi42 0:1271d15b4d4b 1035 ///// ------------------- Below is ESP8266 WiFi Chip Config + Setup COde -------------------- ////
itatchi42 0:1271d15b4d4b 1036 // Sets new ESP8266 baurate, change the esp.baud(xxxxx) to match your new setting once this has been executed
itatchi42 0:1271d15b4d4b 1037 void ESPsetbaudrate()
itatchi42 0:1271d15b4d4b 1038 {
itatchi42 0:1271d15b4d4b 1039 strcpy(snd, "AT+CIOBAUD=115200\r\n"); // change the numeric value to the required baudrate
itatchi42 0:1271d15b4d4b 1040 SendCMD();
itatchi42 0:1271d15b4d4b 1041 }
itatchi42 0:1271d15b4d4b 1042
itatchi42 0:1271d15b4d4b 1043 void ESPstart() {
itatchi42 0:1271d15b4d4b 1044 wait(3);
itatchi42 0:1271d15b4d4b 1045 pcSerial.printf("\f---------- Starting ESP Config ----------\r\n\n");
itatchi42 0:1271d15b4d4b 1046 strcpy(snd,".\r\n.\r\n");
itatchi42 0:1271d15b4d4b 1047 SendCMD();
itatchi42 0:1271d15b4d4b 1048 }
itatchi42 0:1271d15b4d4b 1049
itatchi42 0:1271d15b4d4b 1050 void ESPreset() {
itatchi42 0:1271d15b4d4b 1051 wait(1);
itatchi42 0:1271d15b4d4b 1052 pcSerial.printf("---------- Reset & get Firmware ----------\r\n");
itatchi42 0:1271d15b4d4b 1053 strcpy(snd,"node.restart()\r\n");
itatchi42 0:1271d15b4d4b 1054 SendCMD();
itatchi42 0:1271d15b4d4b 1055 timeout=5;
itatchi42 0:1271d15b4d4b 1056 getreply();
itatchi42 0:1271d15b4d4b 1057 pcSerial.printf(buf);
itatchi42 0:1271d15b4d4b 1058 }
itatchi42 0:1271d15b4d4b 1059
itatchi42 0:1271d15b4d4b 1060 void ESPversion() {
itatchi42 0:1271d15b4d4b 1061 wait(1);
itatchi42 0:1271d15b4d4b 1062 pcSerial.printf("\n---------- Get Version ----------\r\n");
itatchi42 0:1271d15b4d4b 1063 strcpy(snd,"print(node.info())\r\n");
itatchi42 0:1271d15b4d4b 1064 SendCMD();
itatchi42 0:1271d15b4d4b 1065 timeout=4;
itatchi42 0:1271d15b4d4b 1066 getreply();
itatchi42 0:1271d15b4d4b 1067 pcSerial.printf(buf);
itatchi42 0:1271d15b4d4b 1068 }
itatchi42 0:1271d15b4d4b 1069
itatchi42 0:1271d15b4d4b 1070 void ESPmode() {
itatchi42 0:1271d15b4d4b 1071 wait(2);
itatchi42 0:1271d15b4d4b 1072
itatchi42 0:1271d15b4d4b 1073 // set CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station)
itatchi42 0:1271d15b4d4b 1074 pcSerial.printf("\n---------- Setting Mode ----------\r\n");
itatchi42 0:1271d15b4d4b 1075 strcpy(snd, "wifi.setmode(wifi.STATION)\r\n");
itatchi42 0:1271d15b4d4b 1076 SendCMD();
itatchi42 0:1271d15b4d4b 1077 timeout=4;
itatchi42 0:1271d15b4d4b 1078 getreply();
itatchi42 0:1271d15b4d4b 1079 pcSerial.printf(buf);
itatchi42 0:1271d15b4d4b 1080 }
itatchi42 0:1271d15b4d4b 1081
itatchi42 0:1271d15b4d4b 1082 void ESPconnect() {
itatchi42 0:1271d15b4d4b 1083 pcSerial.printf("\n---------- Connecting to AP ----------\r\n");
itatchi42 0:1271d15b4d4b 1084 pcSerial.printf("ssid = %s pwd = %s\r\n",ssid,pwd);
itatchi42 0:1271d15b4d4b 1085 strcpy(snd, "wifi.sta.config(\"");
itatchi42 0:1271d15b4d4b 1086 strcat(snd, ssid);
itatchi42 0:1271d15b4d4b 1087 strcat(snd, "\",\"");
itatchi42 0:1271d15b4d4b 1088 strcat(snd, pwd);
itatchi42 0:1271d15b4d4b 1089 strcat(snd, "\")\r\n");
itatchi42 0:1271d15b4d4b 1090 SendCMD();
itatchi42 0:1271d15b4d4b 1091 timeout=10;
itatchi42 0:1271d15b4d4b 1092 getreply();
itatchi42 0:1271d15b4d4b 1093 pcSerial.printf(buf);
itatchi42 0:1271d15b4d4b 1094 wait(2);
itatchi42 0:1271d15b4d4b 1095 }
itatchi42 0:1271d15b4d4b 1096
itatchi42 0:1271d15b4d4b 1097 void ESPip() {
itatchi42 0:1271d15b4d4b 1098 pcSerial.printf("\n---------- Get chip's IP ----------\r\n");
itatchi42 0:1271d15b4d4b 1099
itatchi42 0:1271d15b4d4b 1100 strcpy(snd, "print(wifi.sta.getip())\r\n");
itatchi42 0:1271d15b4d4b 1101 SendCMD(); // get device IP
itatchi42 0:1271d15b4d4b 1102 timeout=3;
itatchi42 0:1271d15b4d4b 1103 getreply();
itatchi42 0:1271d15b4d4b 1104 pcSerial.printf(buf);
itatchi42 0:1271d15b4d4b 1105
itatchi42 0:1271d15b4d4b 1106 wait(1);
itatchi42 0:1271d15b4d4b 1107 }
itatchi42 0:1271d15b4d4b 1108
itatchi42 0:1271d15b4d4b 1109 void ESPstatus() {
itatchi42 0:1271d15b4d4b 1110 pcSerial.printf("\n---------- Get Connection Status ----------\r\n");
itatchi42 0:1271d15b4d4b 1111 strcpy(snd, "print(wifi.sta.status())\r\n");
itatchi42 0:1271d15b4d4b 1112 SendCMD();
itatchi42 0:1271d15b4d4b 1113 timeout=5;
itatchi42 0:1271d15b4d4b 1114 getreply();
itatchi42 0:1271d15b4d4b 1115 pcSerial.printf(buf);
itatchi42 0:1271d15b4d4b 1116
itatchi42 0:1271d15b4d4b 1117 pcSerial.printf("\n\n\n If you get a valid (non zero) IP, ESP8266 has been set up.\r\n");
itatchi42 0:1271d15b4d4b 1118 pcSerial.printf(" Run this if you want to reconfig the ESP8266 at any time.\r\n");
itatchi42 0:1271d15b4d4b 1119 pcSerial.printf(" It saves the SSID and password settings internally\r\n");
itatchi42 0:1271d15b4d4b 1120 wait(5);
itatchi42 0:1271d15b4d4b 1121 }
itatchi42 0:1271d15b4d4b 1122
itatchi42 0:1271d15b4d4b 1123 // +++++++++++++++++++++++++++++++++ This is for ESP8266 config only, run this once to set up the ESP8266 +++++++++++++++
itatchi42 0:1271d15b4d4b 1124 void ESPconfig()
itatchi42 0:1271d15b4d4b 1125 {
itatchi42 0:1271d15b4d4b 1126 ESPstart();
itatchi42 0:1271d15b4d4b 1127 ESPreset();
itatchi42 0:1271d15b4d4b 1128 ESPversion();
itatchi42 0:1271d15b4d4b 1129 ESPmode();
itatchi42 0:1271d15b4d4b 1130 ESPconnect();
itatchi42 0:1271d15b4d4b 1131 ESPip();
itatchi42 0:1271d15b4d4b 1132 ESPstatus();
itatchi42 0:1271d15b4d4b 1133
itatchi42 0:1271d15b4d4b 1134 /*
itatchi42 0:1271d15b4d4b 1135 pcSerial.printf("\n---------- Connecting to website -----------\r\n");
itatchi42 0:1271d15b4d4b 1136
itatchi42 0:1271d15b4d4b 1137 strcpy(snd, "conn=net.createConnection(net.TCP, 0)\r\n");
itatchi42 0:1271d15b4d4b 1138 SendCMD();
itatchi42 0:1271d15b4d4b 1139 wait(1);
itatchi42 0:1271d15b4d4b 1140
itatchi42 0:1271d15b4d4b 1141 strcpy(snd, "conn:on(\"receive\",function(conn,payload)\r\n");
itatchi42 0:1271d15b4d4b 1142 SendCMD();
itatchi42 0:1271d15b4d4b 1143 wait(1);
itatchi42 0:1271d15b4d4b 1144
itatchi42 0:1271d15b4d4b 1145 strcpy(snd, "end)\r\n");
itatchi42 0:1271d15b4d4b 1146 SendCMD();
itatchi42 0:1271d15b4d4b 1147 wait(1);
itatchi42 0:1271d15b4d4b 1148
itatchi42 0:1271d15b4d4b 1149 strcpy(snd, "conn:connect(80,\"https://sites.google.com/site/4180echo/home\")");
itatchi42 0:1271d15b4d4b 1150 SendCMD();
itatchi42 0:1271d15b4d4b 1151 wait(1);
itatchi42 0:1271d15b4d4b 1152
itatchi42 0:1271d15b4d4b 1153 strcpy("conn:on(\"connection\", function(conn, payload)");
itatchi42 0:1271d15b4d4b 1154 SendCMD();
itatchi42 0:1271d15b4d4b 1155 wait(1);
itatchi42 0:1271d15b4d4b 1156 */
itatchi42 0:1271d15b4d4b 1157
itatchi42 0:1271d15b4d4b 1158
itatchi42 0:1271d15b4d4b 1159
itatchi42 0:1271d15b4d4b 1160
itatchi42 0:1271d15b4d4b 1161
itatchi42 0:1271d15b4d4b 1162 pcSerial.printf("\n---------- Setting up http server ----------\r\n");
itatchi42 0:1271d15b4d4b 1163 strcpy(snd, "srv=net.createServer(net.TCP)\r\n");
itatchi42 0:1271d15b4d4b 1164 SendCMD();
itatchi42 0:1271d15b4d4b 1165 wait(1);
itatchi42 0:1271d15b4d4b 1166 strcpy(snd, "srv:listen(80,function(conn)\r\n");
itatchi42 0:1271d15b4d4b 1167 SendCMD();
itatchi42 0:1271d15b4d4b 1168 wait(1);
itatchi42 0:1271d15b4d4b 1169 strcpy(snd, "conn:on(\"receive\",function(conn,payload)\r\n");
itatchi42 0:1271d15b4d4b 1170 SendCMD();
itatchi42 0:1271d15b4d4b 1171 wait(1);
itatchi42 0:1271d15b4d4b 1172 strcpy(snd, "print(payload)\r\n");
itatchi42 0:1271d15b4d4b 1173 SendCMD();
itatchi42 0:1271d15b4d4b 1174 wait(1);
itatchi42 0:1271d15b4d4b 1175
itatchi42 0:1271d15b4d4b 1176 strcpy(snd, "conn:send(\"<!DOCTYPE html>\")\r\n");
itatchi42 0:1271d15b4d4b 1177 SendCMD();
itatchi42 0:1271d15b4d4b 1178 wait(1);
itatchi42 0:1271d15b4d4b 1179
itatchi42 0:1271d15b4d4b 1180 strcpy(snd, "conn:send(\"<html>\")\r\n");
itatchi42 0:1271d15b4d4b 1181 SendCMD();
itatchi42 0:1271d15b4d4b 1182 wait(1);
itatchi42 0:1271d15b4d4b 1183
itatchi42 0:1271d15b4d4b 1184 strcpy(snd, "conn:send(\"<h1> Hi Jonathan!</h1>\")\r\n");
itatchi42 0:1271d15b4d4b 1185 SendCMD();
itatchi42 0:1271d15b4d4b 1186 wait(1);
itatchi42 0:1271d15b4d4b 1187
itatchi42 0:1271d15b4d4b 1188 strcpy(snd, "conn:send(\"<h2> test</h2>\")\r\n");
itatchi42 0:1271d15b4d4b 1189 SendCMD();
itatchi42 0:1271d15b4d4b 1190 wait(1);
itatchi42 0:1271d15b4d4b 1191
itatchi42 0:1271d15b4d4b 1192 strcpy(snd, "conn:send(\"</html>\")\r\n");
itatchi42 0:1271d15b4d4b 1193 SendCMD();
itatchi42 0:1271d15b4d4b 1194 wait(1);
itatchi42 0:1271d15b4d4b 1195
itatchi42 0:1271d15b4d4b 1196 strcpy(snd, "end)\r\n");
itatchi42 0:1271d15b4d4b 1197 SendCMD();
itatchi42 0:1271d15b4d4b 1198 wait(1);
itatchi42 0:1271d15b4d4b 1199
itatchi42 0:1271d15b4d4b 1200 strcpy(snd, "conn:on(\"sent\",function(conn) conn:close() end)\r\n");
itatchi42 0:1271d15b4d4b 1201 SendCMD();
itatchi42 0:1271d15b4d4b 1202 wait(1);
itatchi42 0:1271d15b4d4b 1203 strcpy(snd, "end)\r\n");
itatchi42 0:1271d15b4d4b 1204 SendCMD();
itatchi42 0:1271d15b4d4b 1205 wait(1);
itatchi42 0:1271d15b4d4b 1206 timeout=17;
itatchi42 0:1271d15b4d4b 1207 getreply();
itatchi42 0:1271d15b4d4b 1208 pcSerial.printf(buf);
itatchi42 0:1271d15b4d4b 1209 pcSerial.printf("\r\nDONE");
itatchi42 0:1271d15b4d4b 1210 }
itatchi42 0:1271d15b4d4b 1211
itatchi42 0:1271d15b4d4b 1212 void SendCMD()
itatchi42 0:1271d15b4d4b 1213 {
itatchi42 0:1271d15b4d4b 1214 esp.printf("%s", snd);
itatchi42 0:1271d15b4d4b 1215 }
itatchi42 0:1271d15b4d4b 1216
itatchi42 0:1271d15b4d4b 1217 void getreply()
itatchi42 0:1271d15b4d4b 1218 {
itatchi42 0:1271d15b4d4b 1219 memset(buf, '\0', sizeof(buf));
itatchi42 0:1271d15b4d4b 1220 t.start();
itatchi42 0:1271d15b4d4b 1221 ended=0;
itatchi42 0:1271d15b4d4b 1222 count=0;
itatchi42 0:1271d15b4d4b 1223 while(!ended) {
itatchi42 0:1271d15b4d4b 1224 if(esp.readable()) {
itatchi42 0:1271d15b4d4b 1225 buf[count] = esp.getc();
itatchi42 0:1271d15b4d4b 1226 count++;
itatchi42 0:1271d15b4d4b 1227 }
itatchi42 0:1271d15b4d4b 1228 if(t.read() > timeout) {
itatchi42 0:1271d15b4d4b 1229 ended = 1;
itatchi42 0:1271d15b4d4b 1230 t.stop();
itatchi42 0:1271d15b4d4b 1231 t.reset();
itatchi42 0:1271d15b4d4b 1232 }
itatchi42 0:1271d15b4d4b 1233 }
itatchi42 0:1271d15b4d4b 1234 }