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 // By: Jonathan Osei-Owusu, Alex Mussa
itatchi42 0:1271d15b4d4b 2 // 4180 Final Project
itatchi42 0:1271d15b4d4b 3
itatchi42 0:1271d15b4d4b 4 // Goal: ESP8266 static page WEB server to send text queries to Alexa via Mbed and TExt-to-Speech module.
itatchi42 0:1271d15b4d4b 5 // WEB server accessible from any network.
itatchi42 0:1271d15b4d4b 6 // Also uses FONA chip to allow Alexa text queries via SMS.
itatchi42 0:1271d15b4d4b 7
itatchi42 0:1271d15b4d4b 8
itatchi42 0:1271d15b4d4b 9 #include "mbed.h"
itatchi42 0:1271d15b4d4b 10 #include "emic2.h"
itatchi42 0:1271d15b4d4b 11 #include <string.h>
itatchi42 0:1271d15b4d4b 12 #include <ctype.h>
itatchi42 0:1271d15b4d4b 13 #include "Adafruit_FONA.h"
itatchi42 0:1271d15b4d4b 14
itatchi42 0:1271d15b4d4b 15 /////// ------ Begin FONA Global Region ----- ////////
itatchi42 0:1271d15b4d4b 16
itatchi42 0:1271d15b4d4b 17 #define FONA_RST p12
itatchi42 0:1271d15b4d4b 18 #define FONA_TX p13
itatchi42 0:1271d15b4d4b 19 #define FONA_RX p14
itatchi42 0:1271d15b4d4b 20 #define FONA_RI p11
itatchi42 0:1271d15b4d4b 21
itatchi42 0:1271d15b4d4b 22 // this is a large buffer for replies
itatchi42 0:1271d15b4d4b 23 char replybuffer[255];
itatchi42 0:1271d15b4d4b 24 char smsText[255], smsPhoneNo[11]; ///// By Jonathan: Text to send to Text -> Speech chip & phone # to send to
itatchi42 0:1271d15b4d4b 25 int count; // by Jonathan
itatchi42 0:1271d15b4d4b 26 Serial pcSerial(USBTX, USBRX);
itatchi42 0:1271d15b4d4b 27 Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
itatchi42 0:1271d15b4d4b 28 void replySMS(char*);
itatchi42 0:1271d15b4d4b 29
itatchi42 0:1271d15b4d4b 30 // Turn on a LED when somebody call the FONA
itatchi42 0:1271d15b4d4b 31 emic2 myTTS(p9, p10);
itatchi42 0:1271d15b4d4b 32 DigitalOut led1(LED1);
itatchi42 0:1271d15b4d4b 33 DigitalOut led2(LED2);
itatchi42 0:1271d15b4d4b 34 DigitalOut led3(LED3);
itatchi42 0:1271d15b4d4b 35 DigitalOut led4(LED4);
itatchi42 0:1271d15b4d4b 36
itatchi42 0:1271d15b4d4b 37 class FonaEventListener : public Adafruit_FONA::EventListener {
itatchi42 0:1271d15b4d4b 38 virtual void onRing() {
itatchi42 0:1271d15b4d4b 39 led1 = 1;
itatchi42 0:1271d15b4d4b 40 }
itatchi42 0:1271d15b4d4b 41
itatchi42 0:1271d15b4d4b 42 virtual void onNoCarrier() {
itatchi42 0:1271d15b4d4b 43 led1 = 0;
itatchi42 0:1271d15b4d4b 44 }
itatchi42 0:1271d15b4d4b 45 };
itatchi42 0:1271d15b4d4b 46 FonaEventListener fonaEventListener;
itatchi42 0:1271d15b4d4b 47
itatchi42 0:1271d15b4d4b 48 // Functions defined after main()
itatchi42 0:1271d15b4d4b 49 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
itatchi42 0:1271d15b4d4b 50 void printMenu(void);
itatchi42 0:1271d15b4d4b 51 void flushSerial();
itatchi42 0:1271d15b4d4b 52 char readBlocking();
itatchi42 0:1271d15b4d4b 53 uint16_t readnumber();
itatchi42 0:1271d15b4d4b 54 long map(long x, long in_min, long in_max, long out_min, long out_max);
itatchi42 0:1271d15b4d4b 55
itatchi42 0:1271d15b4d4b 56 /////// ------ End FONA Global Region ----- ////////
itatchi42 0:1271d15b4d4b 57
itatchi42 0:1271d15b4d4b 58
itatchi42 0:1271d15b4d4b 59 ////// ------- Begin ESP Global Region -------- //////
itatchi42 0:1271d15b4d4b 60
itatchi42 0:1271d15b4d4b 61 Serial esp(p28, p27); // tx, rx
itatchi42 0:1271d15b4d4b 62
itatchi42 0:1271d15b4d4b 63 // some test values to show on web page
itatchi42 0:1271d15b4d4b 64 AnalogIn Ain1(p18);
itatchi42 0:1271d15b4d4b 65 AnalogIn Ain2(p19);
itatchi42 0:1271d15b4d4b 66
itatchi42 0:1271d15b4d4b 67 /*
itatchi42 0:1271d15b4d4b 68 char ssid[32] = "hsd"; // enter WiFi router ssid inside the quotes
itatchi42 0:1271d15b4d4b 69 char pwd [32] = "austin123"; // enter WiFi router password inside the quotes
itatchi42 0:1271d15b4d4b 70 */
itatchi42 0:1271d15b4d4b 71 float temperature, AdcIn, Ht;
itatchi42 0:1271d15b4d4b 72 float R1=100000, R2=10000; // resistor values to give a 10:1 reduction of measured AnalogIn voltage
itatchi42 0:1271d15b4d4b 73 char Vcc[10];
itatchi42 0:1271d15b4d4b 74 char Temp[10];
itatchi42 0:1271d15b4d4b 75
itatchi42 0:1271d15b4d4b 76 // things for sending/receiving data over serial
itatchi42 0:1271d15b4d4b 77 volatile int tx_in=0;
itatchi42 0:1271d15b4d4b 78 volatile int tx_out=0;
itatchi42 0:1271d15b4d4b 79 volatile int rx_in=0;
itatchi42 0:1271d15b4d4b 80 volatile int rx_out=0;
itatchi42 0:1271d15b4d4b 81 const int buffer_size = 4095;
itatchi42 0:1271d15b4d4b 82 char tx_buffer[buffer_size+1];
itatchi42 0:1271d15b4d4b 83 char rx_buffer[buffer_size+1];
itatchi42 0:1271d15b4d4b 84 void Tx_interrupt();
itatchi42 0:1271d15b4d4b 85 void Rx_interrupt();
itatchi42 0:1271d15b4d4b 86 void send_line();
itatchi42 0:1271d15b4d4b 87 void read_line();
itatchi42 0:1271d15b4d4b 88
itatchi42 0:1271d15b4d4b 89 int DataRX;
itatchi42 0:1271d15b4d4b 90 int update;
itatchi42 0:1271d15b4d4b 91 int espCount;
itatchi42 0:1271d15b4d4b 92 char cmdbuff[1024];
itatchi42 0:1271d15b4d4b 93 char replybuff[4096];
itatchi42 0:1271d15b4d4b 94 char webdata[4096]; // This may need to be bigger depending on WEB browser used
itatchi42 0:1271d15b4d4b 95 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
itatchi42 0:1271d15b4d4b 96 char timebuf[30];
itatchi42 0:1271d15b4d4b 97 void SendCMD(),getreply(),ReadWebData(),startserver();
itatchi42 0:1271d15b4d4b 98 void gettime(),setRTC(),gettemp(),getbattery();
itatchi42 0:1271d15b4d4b 99 char rx_line[1024];
itatchi42 0:1271d15b4d4b 100 int port =80; // set server port
itatchi42 0:1271d15b4d4b 101 int SERVtimeout =5; // set server timeout in seconds in case link breaks.
itatchi42 0:1271d15b4d4b 102 struct tm t;
itatchi42 0:1271d15b4d4b 103 // manual set RTC values
itatchi42 0:1271d15b4d4b 104 int minute =00; // 0-59
itatchi42 0:1271d15b4d4b 105 int hour =12; // 2-23
itatchi42 0:1271d15b4d4b 106 int dayofmonth =26; // 1-31
itatchi42 0:1271d15b4d4b 107 int month =8; // 1-12
itatchi42 0:1271d15b4d4b 108 int year =15; // last 2 digits
itatchi42 0:1271d15b4d4b 109
itatchi42 0:1271d15b4d4b 110
itatchi42 0:1271d15b4d4b 111 //// -------- End ESP Global region -------- /////
itatchi42 0:1271d15b4d4b 112
itatchi42 0:1271d15b4d4b 113 int main()
itatchi42 0:1271d15b4d4b 114 {
itatchi42 0:1271d15b4d4b 115 myTTS.volume(5);
itatchi42 0:1271d15b4d4b 116 myTTS.voice(0);
itatchi42 0:1271d15b4d4b 117
itatchi42 0:1271d15b4d4b 118 pcSerial.baud(9600);
itatchi42 0:1271d15b4d4b 119 esp.baud(9600);
itatchi42 0:1271d15b4d4b 120 wait(1);
itatchi42 0:1271d15b4d4b 121
itatchi42 0:1271d15b4d4b 122 ////---------------- Begin FONA init setup Region -------//
itatchi42 0:1271d15b4d4b 123
itatchi42 0:1271d15b4d4b 124 pcSerial.printf("\r\n");
itatchi42 0:1271d15b4d4b 125
itatchi42 0:1271d15b4d4b 126 pcSerial.printf("FONA basic test\r\n");
itatchi42 0:1271d15b4d4b 127 pcSerial.printf("Initializing....(May take 3 seconds)\r\n");
itatchi42 0:1271d15b4d4b 128
itatchi42 0:1271d15b4d4b 129 // See if the FONA is responding
itatchi42 0:1271d15b4d4b 130 if (! fona.begin(9600)) {
itatchi42 0:1271d15b4d4b 131 pcSerial.printf("Couldn't find FONA\r\n");
itatchi42 0:1271d15b4d4b 132 while (1);
itatchi42 0:1271d15b4d4b 133 }
itatchi42 0:1271d15b4d4b 134 fona.setEventListener(&fonaEventListener);
itatchi42 0:1271d15b4d4b 135 pcSerial.printf("FONA is OK\r\n");
itatchi42 0:1271d15b4d4b 136
itatchi42 0:1271d15b4d4b 137 // Print SIM card IMEI number.
itatchi42 0:1271d15b4d4b 138 char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
itatchi42 0:1271d15b4d4b 139 uint8_t imeiLen = fona.getIMEI(imei);
itatchi42 0:1271d15b4d4b 140 if (imeiLen > 0) {
itatchi42 0:1271d15b4d4b 141 pcSerial.printf("SIM card IMEI: %s\r\n", imei);
itatchi42 0:1271d15b4d4b 142 }
itatchi42 0:1271d15b4d4b 143
itatchi42 0:1271d15b4d4b 144 ////----- End FONA init setup region -----////
itatchi42 0:1271d15b4d4b 145
itatchi42 0:1271d15b4d4b 146
itatchi42 0:1271d15b4d4b 147 ////----- Begin ESP init setup region ----////
itatchi42 0:1271d15b4d4b 148
itatchi42 0:1271d15b4d4b 149 led1 = 0, led2 = 0, led3 = 0, led4 = 0;
itatchi42 0:1271d15b4d4b 150 // Setup a serial interrupt function to receive data
itatchi42 0:1271d15b4d4b 151 esp.attach(&Rx_interrupt, Serial::RxIrq);
itatchi42 0:1271d15b4d4b 152 // Setup a serial interrupt function to transmit data
itatchi42 0:1271d15b4d4b 153 esp.attach(&Tx_interrupt, Serial::TxIrq);
itatchi42 0:1271d15b4d4b 154 if (time(NULL) < 1420070400) {
itatchi42 0:1271d15b4d4b 155 setRTC();
itatchi42 0:1271d15b4d4b 156 }
itatchi42 0:1271d15b4d4b 157 startserver();
itatchi42 0:1271d15b4d4b 158 DataRX=0;
itatchi42 0:1271d15b4d4b 159 espCount=0;
itatchi42 0:1271d15b4d4b 160 wait(3);
itatchi42 0:1271d15b4d4b 161
itatchi42 0:1271d15b4d4b 162 ////----- End ESP init setup region ----////
itatchi42 0:1271d15b4d4b 163
itatchi42 0:1271d15b4d4b 164 while(1) {
itatchi42 0:1271d15b4d4b 165 ////---- Begin ESP loop ----////
itatchi42 0:1271d15b4d4b 166 if(DataRX==1) {
itatchi42 0:1271d15b4d4b 167 ReadWebData();
itatchi42 0:1271d15b4d4b 168 esp.attach(&Rx_interrupt, Serial::RxIrq);
itatchi42 0:1271d15b4d4b 169 }
itatchi42 0:1271d15b4d4b 170 if(update==1) // update time, hit count, and analog levels in the HUZZAH chip
itatchi42 0:1271d15b4d4b 171 {
itatchi42 0:1271d15b4d4b 172 // get new values
itatchi42 0:1271d15b4d4b 173 gettime();
itatchi42 0:1271d15b4d4b 174 gettemp();
itatchi42 0:1271d15b4d4b 175 getbattery();
itatchi42 0:1271d15b4d4b 176 espCount++;
itatchi42 0:1271d15b4d4b 177 // send new values
itatchi42 0:1271d15b4d4b 178 sprintf(cmdbuff, "espCount,time,analog1,analog2=%d,\"%s\",\"%s\",\"%s\"\r\n",espCount,timebuf,Temp,Vcc);
itatchi42 0:1271d15b4d4b 179 SendCMD();
itatchi42 0:1271d15b4d4b 180 getreply();
itatchi42 0:1271d15b4d4b 181 update=0;
itatchi42 0:1271d15b4d4b 182 }
itatchi42 0:1271d15b4d4b 183 ////---- End ESP loop ----////
itatchi42 0:1271d15b4d4b 184
itatchi42 0:1271d15b4d4b 185 ////---- Begin FONA loop ----////
itatchi42 0:1271d15b4d4b 186
itatchi42 0:1271d15b4d4b 187 //pcSerial.printf("FONA waiting for SMS...\r\n");
itatchi42 0:1271d15b4d4b 188
itatchi42 0:1271d15b4d4b 189 //while (! pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 190 //if (fona.readable()) {
itatchi42 0:1271d15b4d4b 191 while (fona.readable() && ! pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 192 //// Printf that incoming SMS detected
itatchi42 0:1271d15b4d4b 193 pcSerial.putc(fona.getc());
itatchi42 0:1271d15b4d4b 194
itatchi42 0:1271d15b4d4b 195
itatchi42 0:1271d15b4d4b 196 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 197
itatchi42 0:1271d15b4d4b 198 // read an SMS + send -> TTS chip
itatchi42 0:1271d15b4d4b 199 flushSerial();
itatchi42 0:1271d15b4d4b 200 pcSerial.printf("\r\nReading SMS #1\r\n");
itatchi42 0:1271d15b4d4b 201
itatchi42 0:1271d15b4d4b 202 // Retrieve SMS sender address/phone number.
itatchi42 0:1271d15b4d4b 203 if (! fona.getSMSSender(1, replybuffer, 250)) {
itatchi42 0:1271d15b4d4b 204 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 205 break;
itatchi42 0:1271d15b4d4b 206 }
itatchi42 0:1271d15b4d4b 207 pcSerial.printf("FROM: %s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 208 for (int i = 0; i < 10; i++) { /////// BY JONATHAN to store phone # to respond to
itatchi42 0:1271d15b4d4b 209 smsPhoneNo[i] = replybuffer[i + 2]; // chop off the "+1" from phone # returned by replybuffer
itatchi42 0:1271d15b4d4b 210 }
itatchi42 0:1271d15b4d4b 211 smsPhoneNo[10] = '\0'; // null terminate.... NECESSARY??
itatchi42 0:1271d15b4d4b 212 pcSerial.printf("FROM: %s\r\n", smsPhoneNo);
itatchi42 0:1271d15b4d4b 213
itatchi42 0:1271d15b4d4b 214 // Retrieve SMS value.
itatchi42 0:1271d15b4d4b 215 uint16_t smslen;
itatchi42 0:1271d15b4d4b 216 if (! fona.readSMS(1, replybuffer, 250, &smslen)) { // pass in buffer and max len!
itatchi42 0:1271d15b4d4b 217 pcSerial.printf("Failed!\r\n");
itatchi42 0:1271d15b4d4b 218 break;
itatchi42 0:1271d15b4d4b 219 }
itatchi42 0:1271d15b4d4b 220 pcSerial.printf("***** SMS #1 (%d) bytes *****\r\n", smslen);
itatchi42 0:1271d15b4d4b 221 pcSerial.printf("%s\r\n", replybuffer);
itatchi42 0:1271d15b4d4b 222 pcSerial.printf("*****\r\n");
itatchi42 0:1271d15b4d4b 223
itatchi42 0:1271d15b4d4b 224
itatchi42 0:1271d15b4d4b 225
itatchi42 0:1271d15b4d4b 226 //char message[255]; // CHANGED BY JONATHAN. 141 -> 255
itatchi42 0:1271d15b4d4b 227 char myString[255];
itatchi42 0:1271d15b4d4b 228
itatchi42 0:1271d15b4d4b 229 for (int i = 0; i < 255; i++) {
itatchi42 0:1271d15b4d4b 230 myString[i] = replybuffer[i + 5]; // chop of the "Alexa string"
itatchi42 0:1271d15b4d4b 231 }
itatchi42 0:1271d15b4d4b 232
itatchi42 0:1271d15b4d4b 233 strcpy(smsText, "Uh lex uh "); //Pronunciation Correction.
itatchi42 0:1271d15b4d4b 234 strcat(smsText, myString);
itatchi42 0:1271d15b4d4b 235 pcSerial.printf("DEBUG::%s\r\n", smsText);
itatchi42 0:1271d15b4d4b 236 myTTS.speakf("S%s\r", smsText); // Send text message to the text to speech module.
itatchi42 0:1271d15b4d4b 237
itatchi42 0:1271d15b4d4b 238
itatchi42 0:1271d15b4d4b 239 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 240
itatchi42 0:1271d15b4d4b 241 // Send SMS back!
itatchi42 0:1271d15b4d4b 242 replySMS(replybuffer);
itatchi42 0:1271d15b4d4b 243
itatchi42 0:1271d15b4d4b 244 // ----------------------------------------------------------------//
itatchi42 0:1271d15b4d4b 245
itatchi42 0:1271d15b4d4b 246 // delete an SMS after response sent back
itatchi42 0:1271d15b4d4b 247 flushSerial();
itatchi42 0:1271d15b4d4b 248 pcSerial.printf("\r\nDeleting SMS #1\r\n");
itatchi42 0:1271d15b4d4b 249 if (fona.deleteSMS(1)) // delete SMS #1
itatchi42 0:1271d15b4d4b 250 pcSerial.printf("OK!\r\n");
itatchi42 0:1271d15b4d4b 251 else
itatchi42 0:1271d15b4d4b 252 pcSerial.printf("Couldn't delete\r\n");
itatchi42 0:1271d15b4d4b 253
itatchi42 0:1271d15b4d4b 254 // } // end if
itatchi42 0:1271d15b4d4b 255 } // end inner fona.readable() while
itatchi42 0:1271d15b4d4b 256
itatchi42 0:1271d15b4d4b 257 ////---- End FONA loop ----////
itatchi42 0:1271d15b4d4b 258
itatchi42 0:1271d15b4d4b 259 } // end outer loop
itatchi42 0:1271d15b4d4b 260 } // end main
itatchi42 0:1271d15b4d4b 261
itatchi42 0:1271d15b4d4b 262
itatchi42 0:1271d15b4d4b 263 //
itatchi42 0:1271d15b4d4b 264 void replySMS(char* inMsg)
itatchi42 0:1271d15b4d4b 265 {
itatchi42 0:1271d15b4d4b 266 // send an SMS back!
itatchi42 0:1271d15b4d4b 267 char message[255];
itatchi42 0:1271d15b4d4b 268
itatchi42 0:1271d15b4d4b 269 strcpy(message, "");
itatchi42 0:1271d15b4d4b 270
itatchi42 0:1271d15b4d4b 271 flushSerial();
itatchi42 0:1271d15b4d4b 272
itatchi42 0:1271d15b4d4b 273 pcSerial.printf("Replying to %s\r\n", smsPhoneNo);
itatchi42 0:1271d15b4d4b 274
itatchi42 0:1271d15b4d4b 275
itatchi42 0:1271d15b4d4b 276 if(strstr(inMsg, "how old are you")) { // if reply buffer contains that string
itatchi42 0:1271d15b4d4b 277 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 278 }
itatchi42 0:1271d15b4d4b 279 else if(strstr(inMsg, "what is the world population")) {
itatchi42 0:1271d15b4d4b 280 strcpy(message, "The population of the world is about 7 Billion 400 Million.");
itatchi42 0:1271d15b4d4b 281 }
itatchi42 0:1271d15b4d4b 282 else if(strstr(inMsg, "integral of x squared")) {
itatchi42 0:1271d15b4d4b 283 strcpy(message, "The integral of x squared is one third x cubed plus a constant.");
itatchi42 0:1271d15b4d4b 284 }
itatchi42 0:1271d15b4d4b 285 else if(strstr(inMsg, "discrete co sine transform")) {
itatchi42 0:1271d15b4d4b 286 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 287 }
itatchi42 0:1271d15b4d4b 288 else {
itatchi42 0:1271d15b4d4b 289 strcpy(message, "Sorry, command not recognized.");
itatchi42 0:1271d15b4d4b 290 }
itatchi42 0:1271d15b4d4b 291
itatchi42 0:1271d15b4d4b 292 pcSerial.printf("%s\r\n", message);
itatchi42 0:1271d15b4d4b 293 if (!fona.sendSMS(smsPhoneNo, message))
itatchi42 0:1271d15b4d4b 294 pcSerial.printf("Failed\r\n");
itatchi42 0:1271d15b4d4b 295 else
itatchi42 0:1271d15b4d4b 296 pcSerial.printf("Sent!\r\n");
itatchi42 0:1271d15b4d4b 297
itatchi42 0:1271d15b4d4b 298 }
itatchi42 0:1271d15b4d4b 299
itatchi42 0:1271d15b4d4b 300 // Reads and processes GET and POST web data
itatchi42 0:1271d15b4d4b 301 void ReadWebData()
itatchi42 0:1271d15b4d4b 302 {
itatchi42 0:1271d15b4d4b 303 wait_ms(200);
itatchi42 0:1271d15b4d4b 304 esp.attach(NULL,Serial::RxIrq);
itatchi42 0:1271d15b4d4b 305 DataRX=0;
itatchi42 0:1271d15b4d4b 306 memset(webdata, '\0', sizeof(webdata));
itatchi42 0:1271d15b4d4b 307 strcpy(webdata, rx_buffer);
itatchi42 0:1271d15b4d4b 308 memset(rx_buffer, '\0', sizeof(rx_buffer));
itatchi42 0:1271d15b4d4b 309 rx_in = 0;
itatchi42 0:1271d15b4d4b 310 rx_out = 0;
itatchi42 0:1271d15b4d4b 311 // check web data for form information
itatchi42 0:1271d15b4d4b 312 if( strstr(webdata, "check=age") != NULL ) { ///////// JONATHAN ::: 'led1v' -> 'age'
itatchi42 0:1271d15b4d4b 313 strcpy(smsText, "Uh lex uh, how old are you?");
itatchi42 0:1271d15b4d4b 314 led1=!led1;
itatchi42 0:1271d15b4d4b 315 myTTS.speakf("S%s\r", smsText); // Send text message to the text to speech module.
itatchi42 0:1271d15b4d4b 316 }
itatchi42 0:1271d15b4d4b 317 if( strstr(webdata, "check=population") != NULL ) {
itatchi42 0:1271d15b4d4b 318 strcpy(smsText, "Uh lex uh, what is the world population?");
itatchi42 0:1271d15b4d4b 319 led2=!led2;
itatchi42 0:1271d15b4d4b 320 myTTS.speakf("S%s\r", smsText);
itatchi42 0:1271d15b4d4b 321 }
itatchi42 0:1271d15b4d4b 322 if( strstr(webdata, "check=integral") != NULL ) {
itatchi42 0:1271d15b4d4b 323 strcpy(smsText, "Uh lex uh, what is the integral of x squared?");
itatchi42 0:1271d15b4d4b 324 led3=!led3;
itatchi42 0:1271d15b4d4b 325 myTTS.speakf("S%s\r", smsText);
itatchi42 0:1271d15b4d4b 326 }
itatchi42 0:1271d15b4d4b 327 if( strstr(webdata, "check=dct") != NULL ) {
itatchi42 0:1271d15b4d4b 328 strcpy(smsText, "Uh lex uh, what is the discrete co sine transform?");
itatchi42 0:1271d15b4d4b 329 led4=!led4;
itatchi42 0:1271d15b4d4b 330 myTTS.speakf("S%s\r", smsText);
itatchi42 0:1271d15b4d4b 331 }
itatchi42 0:1271d15b4d4b 332 if( strstr(webdata, "POST") != NULL ) { // set update flag if POST request
itatchi42 0:1271d15b4d4b 333 update=1;
itatchi42 0:1271d15b4d4b 334 }
itatchi42 0:1271d15b4d4b 335 if( strstr(webdata, "GET") != NULL && strstr(webdata, "favicon") == NULL ) { // set update flag for GET request but do not want to update for favicon requests
itatchi42 0:1271d15b4d4b 336 update=1;
itatchi42 0:1271d15b4d4b 337 }
itatchi42 0:1271d15b4d4b 338 }
itatchi42 0:1271d15b4d4b 339 // Starts webserver
itatchi42 0:1271d15b4d4b 340 void startserver()
itatchi42 0:1271d15b4d4b 341 {
itatchi42 0:1271d15b4d4b 342 gettime();
itatchi42 0:1271d15b4d4b 343 gettemp();
itatchi42 0:1271d15b4d4b 344 getbattery();
itatchi42 0:1271d15b4d4b 345 pcSerial.printf("++++++++++ Resetting ESP ++++++++++\r\n");
itatchi42 0:1271d15b4d4b 346 strcpy(cmdbuff,"node.restart()\r\n");
itatchi42 0:1271d15b4d4b 347 SendCMD();
itatchi42 0:1271d15b4d4b 348 wait(2);
itatchi42 0:1271d15b4d4b 349 getreply();
itatchi42 0:1271d15b4d4b 350
itatchi42 0:1271d15b4d4b 351 pcSerial.printf("\n++++++++++ Starting Server ++++++++++\r\n> ");
itatchi42 0:1271d15b4d4b 352
itatchi42 0:1271d15b4d4b 353 // initial values
itatchi42 0:1271d15b4d4b 354 sprintf(cmdbuff, "espCount,time,analog1,analog2=0,\"%s\",\"%s\",\"%s\"\r\n",timebuf,Temp,Vcc);
itatchi42 0:1271d15b4d4b 355 SendCMD();
itatchi42 0:1271d15b4d4b 356 getreply();
itatchi42 0:1271d15b4d4b 357 wait(0.5);
itatchi42 0:1271d15b4d4b 358
itatchi42 0:1271d15b4d4b 359 //create server
itatchi42 0:1271d15b4d4b 360 sprintf(cmdbuff, "srv=net.createServer(net.TCP,%d)\r\n",SERVtimeout);
itatchi42 0:1271d15b4d4b 361 SendCMD();
itatchi42 0:1271d15b4d4b 362 getreply();
itatchi42 0:1271d15b4d4b 363 wait(0.5);
itatchi42 0:1271d15b4d4b 364 strcpy(cmdbuff,"srv:listen(80,function(conn)\r\n");
itatchi42 0:1271d15b4d4b 365 SendCMD();
itatchi42 0:1271d15b4d4b 366 getreply();
itatchi42 0:1271d15b4d4b 367 wait(0.3);
itatchi42 0:1271d15b4d4b 368 strcpy(cmdbuff,"conn:on(\"receive\",function(conn,payload) \r\n");
itatchi42 0:1271d15b4d4b 369 SendCMD();
itatchi42 0:1271d15b4d4b 370 getreply();
itatchi42 0:1271d15b4d4b 371 wait(0.3);
itatchi42 0:1271d15b4d4b 372
itatchi42 0:1271d15b4d4b 373 //print data to mbed
itatchi42 0:1271d15b4d4b 374 strcpy(cmdbuff,"print(payload)\r\n");
itatchi42 0:1271d15b4d4b 375 SendCMD();
itatchi42 0:1271d15b4d4b 376 getreply();
itatchi42 0:1271d15b4d4b 377 wait(0.2);
itatchi42 0:1271d15b4d4b 378
itatchi42 0:1271d15b4d4b 379 //web page data
itatchi42 0:1271d15b4d4b 380 strcpy(cmdbuff,"conn:send('<!DOCTYPE html><html><body><h1>Alexa Server</h1>')\r\n");
itatchi42 0:1271d15b4d4b 381 SendCMD();
itatchi42 0:1271d15b4d4b 382 getreply();
itatchi42 0:1271d15b4d4b 383 wait(0.4);
itatchi42 0:1271d15b4d4b 384 strcpy(cmdbuff,"conn:send('Hit count: '..espCount..'')\r\n");
itatchi42 0:1271d15b4d4b 385 SendCMD();
itatchi42 0:1271d15b4d4b 386 getreply();
itatchi42 0:1271d15b4d4b 387 wait(0.2);
itatchi42 0:1271d15b4d4b 388 strcpy(cmdbuff,"conn:send('<br>Last hit (based on mbed RTC time): '..time..'<br><hr>')\r\n");
itatchi42 0:1271d15b4d4b 389 SendCMD();
itatchi42 0:1271d15b4d4b 390 getreply();
itatchi42 0:1271d15b4d4b 391 wait(0.4);
itatchi42 0:1271d15b4d4b 392 strcpy(cmdbuff,"conn:send('<form method=\"POST\"')\r\n");
itatchi42 0:1271d15b4d4b 393 SendCMD();
itatchi42 0:1271d15b4d4b 394 getreply();
itatchi42 0:1271d15b4d4b 395 wait(0.3);
itatchi42 0:1271d15b4d4b 396 strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"x\"> Data Sent')\r\n");
itatchi42 0:1271d15b4d4b 397 SendCMD();
itatchi42 0:1271d15b4d4b 398 getreply();
itatchi42 0:1271d15b4d4b 399 wait(0.3);
itatchi42 0:1271d15b4d4b 400
itatchi42 0:1271d15b4d4b 401 // end web page data
itatchi42 0:1271d15b4d4b 402 strcpy(cmdbuff, "conn:on(\"sent\",function(conn) conn:close() end)\r\n"); // close current connection
itatchi42 0:1271d15b4d4b 403 SendCMD();
itatchi42 0:1271d15b4d4b 404 getreply();
itatchi42 0:1271d15b4d4b 405 wait(0.3);
itatchi42 0:1271d15b4d4b 406 strcpy(cmdbuff, "end)\r\n");
itatchi42 0:1271d15b4d4b 407 SendCMD();
itatchi42 0:1271d15b4d4b 408 getreply();
itatchi42 0:1271d15b4d4b 409 wait(0.2);
itatchi42 0:1271d15b4d4b 410 strcpy(cmdbuff, "end)\r\n");
itatchi42 0:1271d15b4d4b 411 SendCMD();
itatchi42 0:1271d15b4d4b 412 getreply();
itatchi42 0:1271d15b4d4b 413 wait(0.2);
itatchi42 0:1271d15b4d4b 414
itatchi42 0:1271d15b4d4b 415 strcpy(cmdbuff, "tmr.alarm(0, 1000, 1, function()\r\n");
itatchi42 0:1271d15b4d4b 416 SendCMD();
itatchi42 0:1271d15b4d4b 417 getreply();
itatchi42 0:1271d15b4d4b 418 wait(0.2);
itatchi42 0:1271d15b4d4b 419 strcpy(cmdbuff, "if wifi.sta.getip() == nil then\r\n");
itatchi42 0:1271d15b4d4b 420 SendCMD();
itatchi42 0:1271d15b4d4b 421 getreply();
itatchi42 0:1271d15b4d4b 422 wait(0.2);
itatchi42 0:1271d15b4d4b 423 strcpy(cmdbuff, "print(\"Connecting to AP...\\n\")\r\n");
itatchi42 0:1271d15b4d4b 424 SendCMD();
itatchi42 0:1271d15b4d4b 425 getreply();
itatchi42 0:1271d15b4d4b 426 wait(0.2);
itatchi42 0:1271d15b4d4b 427 strcpy(cmdbuff, "else\r\n");
itatchi42 0:1271d15b4d4b 428 SendCMD();
itatchi42 0:1271d15b4d4b 429 getreply();
itatchi42 0:1271d15b4d4b 430 wait(0.2);
itatchi42 0:1271d15b4d4b 431 strcpy(cmdbuff, "ip, nm, gw=wifi.sta.getip()\r\n");
itatchi42 0:1271d15b4d4b 432 SendCMD();
itatchi42 0:1271d15b4d4b 433 getreply();
itatchi42 0:1271d15b4d4b 434 wait(0.2);
itatchi42 0:1271d15b4d4b 435 strcpy(cmdbuff,"print(\"IP Address: \",ip)\r\n");
itatchi42 0:1271d15b4d4b 436 SendCMD();
itatchi42 0:1271d15b4d4b 437 getreply();
itatchi42 0:1271d15b4d4b 438 wait(0.2);
itatchi42 0:1271d15b4d4b 439 strcpy(cmdbuff,"tmr.stop(0)\r\n");
itatchi42 0:1271d15b4d4b 440 SendCMD();
itatchi42 0:1271d15b4d4b 441 getreply();
itatchi42 0:1271d15b4d4b 442 wait(0.2);
itatchi42 0:1271d15b4d4b 443 strcpy(cmdbuff,"end\r\n");
itatchi42 0:1271d15b4d4b 444 SendCMD();
itatchi42 0:1271d15b4d4b 445 getreply();
itatchi42 0:1271d15b4d4b 446 wait(0.2);
itatchi42 0:1271d15b4d4b 447 strcpy(cmdbuff,"end)\r\n");
itatchi42 0:1271d15b4d4b 448 SendCMD();
itatchi42 0:1271d15b4d4b 449 getreply();
itatchi42 0:1271d15b4d4b 450 wait(0.2);
itatchi42 0:1271d15b4d4b 451
itatchi42 0:1271d15b4d4b 452 pcSerial.printf("\n\n++++++++++ Ready ++++++++++\r\n\n");
itatchi42 0:1271d15b4d4b 453 }
itatchi42 0:1271d15b4d4b 454
itatchi42 0:1271d15b4d4b 455 ////------- Begin ESP Helper Functions Region ------////
itatchi42 0:1271d15b4d4b 456 // ESP Command data send
itatchi42 0:1271d15b4d4b 457 void SendCMD()
itatchi42 0:1271d15b4d4b 458 {
itatchi42 0:1271d15b4d4b 459 int i;
itatchi42 0:1271d15b4d4b 460 char temp_char;
itatchi42 0:1271d15b4d4b 461 bool empty;
itatchi42 0:1271d15b4d4b 462 i = 0;
itatchi42 0:1271d15b4d4b 463 // Start Critical Section - don't interrupt while changing global buffer variables
itatchi42 0:1271d15b4d4b 464 NVIC_DisableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 465 empty = (tx_in == tx_out);
itatchi42 0:1271d15b4d4b 466 while ((i==0) || (cmdbuff[i-1] != '\n')) {
itatchi42 0:1271d15b4d4b 467 // Wait if buffer full
itatchi42 0:1271d15b4d4b 468 if (((tx_in + 1) % buffer_size) == tx_out) {
itatchi42 0:1271d15b4d4b 469 // End Critical Section - need to let interrupt routine empty buffer by sending
itatchi42 0:1271d15b4d4b 470 NVIC_EnableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 471 while (((tx_in + 1) % buffer_size) == tx_out) {
itatchi42 0:1271d15b4d4b 472 }
itatchi42 0:1271d15b4d4b 473 // Start Critical Section - don't interrupt while changing global buffer variables
itatchi42 0:1271d15b4d4b 474 NVIC_DisableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 475 }
itatchi42 0:1271d15b4d4b 476 tx_buffer[tx_in] = cmdbuff[i];
itatchi42 0:1271d15b4d4b 477 i++;
itatchi42 0:1271d15b4d4b 478 tx_in = (tx_in + 1) % buffer_size;
itatchi42 0:1271d15b4d4b 479 }
itatchi42 0:1271d15b4d4b 480 if (esp.writeable() && (empty)) {
itatchi42 0:1271d15b4d4b 481 temp_char = tx_buffer[tx_out];
itatchi42 0:1271d15b4d4b 482 tx_out = (tx_out + 1) % buffer_size;
itatchi42 0:1271d15b4d4b 483 // Send first character to start tx interrupts, if stopped
itatchi42 0:1271d15b4d4b 484 esp.putc(temp_char);
itatchi42 0:1271d15b4d4b 485 }
itatchi42 0:1271d15b4d4b 486 // End Critical Section
itatchi42 0:1271d15b4d4b 487 NVIC_EnableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 488 return;
itatchi42 0:1271d15b4d4b 489 }
itatchi42 0:1271d15b4d4b 490
itatchi42 0:1271d15b4d4b 491 // Get Command and ESP status replies
itatchi42 0:1271d15b4d4b 492 void getreply()
itatchi42 0:1271d15b4d4b 493 {
itatchi42 0:1271d15b4d4b 494 read_line();
itatchi42 0:1271d15b4d4b 495 sscanf(rx_line,replybuff);
itatchi42 0:1271d15b4d4b 496 }
itatchi42 0:1271d15b4d4b 497
itatchi42 0:1271d15b4d4b 498 // Read a line from the large rx buffer from rx interrupt routine
itatchi42 0:1271d15b4d4b 499 void read_line() {
itatchi42 0:1271d15b4d4b 500 int i;
itatchi42 0:1271d15b4d4b 501 i = 0;
itatchi42 0:1271d15b4d4b 502 // Start Critical Section - don't interrupt while changing global buffer variables
itatchi42 0:1271d15b4d4b 503 NVIC_DisableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 504 // Loop reading rx buffer characters until end of line character
itatchi42 0:1271d15b4d4b 505 while ((i==0) || (rx_line[i-1] != '\r')) {
itatchi42 0:1271d15b4d4b 506 // Wait if buffer empty
itatchi42 0:1271d15b4d4b 507 if (rx_in == rx_out) {
itatchi42 0:1271d15b4d4b 508 // End Critical Section - need to allow rx interrupt to get new characters for buffer
itatchi42 0:1271d15b4d4b 509 NVIC_EnableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 510 while (rx_in == rx_out) {
itatchi42 0:1271d15b4d4b 511 }
itatchi42 0:1271d15b4d4b 512 // Start Critical Section - don't interrupt while changing global buffer variables
itatchi42 0:1271d15b4d4b 513 NVIC_DisableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 514 }
itatchi42 0:1271d15b4d4b 515 rx_line[i] = rx_buffer[rx_out];
itatchi42 0:1271d15b4d4b 516 i++;
itatchi42 0:1271d15b4d4b 517 rx_out = (rx_out + 1) % buffer_size;
itatchi42 0:1271d15b4d4b 518 }
itatchi42 0:1271d15b4d4b 519 // End Critical Section
itatchi42 0:1271d15b4d4b 520 NVIC_EnableIRQ(UART1_IRQn);
itatchi42 0:1271d15b4d4b 521 rx_line[i-1] = 0;
itatchi42 0:1271d15b4d4b 522 return;
itatchi42 0:1271d15b4d4b 523 }
itatchi42 0:1271d15b4d4b 524
itatchi42 0:1271d15b4d4b 525
itatchi42 0:1271d15b4d4b 526 // Interupt Routine to read in data from serial port
itatchi42 0:1271d15b4d4b 527 void Rx_interrupt() {
itatchi42 0:1271d15b4d4b 528 DataRX=1;
itatchi42 0:1271d15b4d4b 529 //led3=1;
itatchi42 0:1271d15b4d4b 530 // Loop just in case more than one character is in UART's receive FIFO buffer
itatchi42 0:1271d15b4d4b 531 // Stop if buffer full
itatchi42 0:1271d15b4d4b 532 while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
itatchi42 0:1271d15b4d4b 533 rx_buffer[rx_in] = esp.getc();
itatchi42 0:1271d15b4d4b 534 // Uncomment to Echo to USB serial to watch data flow
itatchi42 0:1271d15b4d4b 535 pcSerial.putc(rx_buffer[rx_in]);
itatchi42 0:1271d15b4d4b 536 rx_in = (rx_in + 1) % buffer_size;
itatchi42 0:1271d15b4d4b 537 }
itatchi42 0:1271d15b4d4b 538 //led3=0;
itatchi42 0:1271d15b4d4b 539 return;
itatchi42 0:1271d15b4d4b 540 }
itatchi42 0:1271d15b4d4b 541
itatchi42 0:1271d15b4d4b 542
itatchi42 0:1271d15b4d4b 543 // Interupt Routine to write out data to serial port
itatchi42 0:1271d15b4d4b 544 void Tx_interrupt() {
itatchi42 0:1271d15b4d4b 545 //led2=1;
itatchi42 0:1271d15b4d4b 546 // Loop to fill more than one character in UART's transmit FIFO buffer
itatchi42 0:1271d15b4d4b 547 // Stop if buffer empty
itatchi42 0:1271d15b4d4b 548 while ((esp.writeable()) && (tx_in != tx_out)) {
itatchi42 0:1271d15b4d4b 549 esp.putc(tx_buffer[tx_out]);
itatchi42 0:1271d15b4d4b 550 tx_out = (tx_out + 1) % buffer_size;
itatchi42 0:1271d15b4d4b 551 }
itatchi42 0:1271d15b4d4b 552 //led2=0;
itatchi42 0:1271d15b4d4b 553 return;
itatchi42 0:1271d15b4d4b 554 }
itatchi42 0:1271d15b4d4b 555
itatchi42 0:1271d15b4d4b 556 void gettime()
itatchi42 0:1271d15b4d4b 557 {
itatchi42 0:1271d15b4d4b 558 time_t seconds = time(NULL);
itatchi42 0:1271d15b4d4b 559 strftime(timebuf,50,"%H:%M:%S %a %d %b %y", localtime(&seconds));
itatchi42 0:1271d15b4d4b 560 }
itatchi42 0:1271d15b4d4b 561
itatchi42 0:1271d15b4d4b 562 void setRTC()
itatchi42 0:1271d15b4d4b 563 {
itatchi42 0:1271d15b4d4b 564 t.tm_sec = (0); // 0-59
itatchi42 0:1271d15b4d4b 565 t.tm_min = (minute); // 0-59
itatchi42 0:1271d15b4d4b 566 t.tm_hour = (hour); // 0-23
itatchi42 0:1271d15b4d4b 567 t.tm_mday = (dayofmonth); // 1-31
itatchi42 0:1271d15b4d4b 568 t.tm_mon = (month-1); // 0-11 "0" = Jan, -1 added for Mbed RCT clock format
itatchi42 0:1271d15b4d4b 569 t.tm_year = ((year)+100); // year since 1900, current DCF year + 100 + 1900 = correct year
itatchi42 0:1271d15b4d4b 570 set_time(mktime(&t)); // set RTC clock
itatchi42 0:1271d15b4d4b 571 }
itatchi42 0:1271d15b4d4b 572 // Analog in example
itatchi42 0:1271d15b4d4b 573 void getbattery()
itatchi42 0:1271d15b4d4b 574 {
itatchi42 0:1271d15b4d4b 575 AdcIn=Ain1.read();
itatchi42 0:1271d15b4d4b 576 Ht = (AdcIn*3.3); // set the numeric to the exact MCU analog reference voltage for greater accuracy
itatchi42 0:1271d15b4d4b 577 sprintf(Vcc,"%2.3f",Ht);
itatchi42 0:1271d15b4d4b 578 }
itatchi42 0:1271d15b4d4b 579 // Temperature example
itatchi42 0:1271d15b4d4b 580 void gettemp()
itatchi42 0:1271d15b4d4b 581 {
itatchi42 0:1271d15b4d4b 582
itatchi42 0:1271d15b4d4b 583 AdcIn=Ain2.read();
itatchi42 0:1271d15b4d4b 584 Ht = (AdcIn*3.3); // set the numeric to the exact MCU analog reference voltage for greater accuracy
itatchi42 0:1271d15b4d4b 585 sprintf(Temp,"%2.3f",Ht);
itatchi42 0:1271d15b4d4b 586 }
itatchi42 0:1271d15b4d4b 587
itatchi42 0:1271d15b4d4b 588 ////------ End ESP Helper Functions Region ------////
itatchi42 0:1271d15b4d4b 589
itatchi42 0:1271d15b4d4b 590 ////------ Begin FONA Helper Functions Region ------////
itatchi42 0:1271d15b4d4b 591
itatchi42 0:1271d15b4d4b 592 void flushSerial() {
itatchi42 0:1271d15b4d4b 593 while (pcSerial.readable())
itatchi42 0:1271d15b4d4b 594 pcSerial.getc();
itatchi42 0:1271d15b4d4b 595 }
itatchi42 0:1271d15b4d4b 596
itatchi42 0:1271d15b4d4b 597 char readBlocking() {
itatchi42 0:1271d15b4d4b 598 while (!pcSerial.readable());
itatchi42 0:1271d15b4d4b 599 return pcSerial.getc();
itatchi42 0:1271d15b4d4b 600 }
itatchi42 0:1271d15b4d4b 601
itatchi42 0:1271d15b4d4b 602 uint16_t readnumber() {
itatchi42 0:1271d15b4d4b 603 uint16_t x = 0;
itatchi42 0:1271d15b4d4b 604 char c;
itatchi42 0:1271d15b4d4b 605 while (! isdigit(c = readBlocking())) {
itatchi42 0:1271d15b4d4b 606 //pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 607 }
itatchi42 0:1271d15b4d4b 608 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 609 x = c - '0';
itatchi42 0:1271d15b4d4b 610 while (isdigit(c = readBlocking())) {
itatchi42 0:1271d15b4d4b 611 pcSerial.putc(c);
itatchi42 0:1271d15b4d4b 612 x *= 10;
itatchi42 0:1271d15b4d4b 613 x += c - '0';
itatchi42 0:1271d15b4d4b 614 }
itatchi42 0:1271d15b4d4b 615 return x;
itatchi42 0:1271d15b4d4b 616 }
itatchi42 0:1271d15b4d4b 617
itatchi42 0:1271d15b4d4b 618 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
itatchi42 0:1271d15b4d4b 619 uint16_t buffidx = 0;
itatchi42 0:1271d15b4d4b 620 bool timeoutvalid = true;
itatchi42 0:1271d15b4d4b 621 if (timeout == 0) timeoutvalid = false;
itatchi42 0:1271d15b4d4b 622
itatchi42 0:1271d15b4d4b 623 while (true) {
itatchi42 0:1271d15b4d4b 624 if (buffidx > maxbuff) {
itatchi42 0:1271d15b4d4b 625 //pcSerial.printf("SPACE\r\n");
itatchi42 0:1271d15b4d4b 626 break;
itatchi42 0:1271d15b4d4b 627 }
itatchi42 0:1271d15b4d4b 628
itatchi42 0:1271d15b4d4b 629 while(pcSerial.readable()) {
itatchi42 0:1271d15b4d4b 630 char c = pcSerial.getc();
itatchi42 0:1271d15b4d4b 631
itatchi42 0:1271d15b4d4b 632 //pcSerial.printf("%02x#%c\r\n", c, c);
itatchi42 0:1271d15b4d4b 633
itatchi42 0:1271d15b4d4b 634 if (c == '\r')
itatchi42 0:1271d15b4d4b 635 continue;
itatchi42 0:1271d15b4d4b 636
itatchi42 0:1271d15b4d4b 637
itatchi42 0:1271d15b4d4b 638 if (c == '\r') { /////////////////////////////////////////// CHANGED BY JONATHAN: (0XA -> '\r')
itatchi42 0:1271d15b4d4b 639 if (buffidx == 0) // the first 0x0A is ignored
itatchi42 0:1271d15b4d4b 640 continue;
itatchi42 0:1271d15b4d4b 641
itatchi42 0:1271d15b4d4b 642 timeout = 0; // the second 0x0A is the end of the line
itatchi42 0:1271d15b4d4b 643 timeoutvalid = true;
itatchi42 0:1271d15b4d4b 644 break;
itatchi42 0:1271d15b4d4b 645 }
itatchi42 0:1271d15b4d4b 646 buff[buffidx] = c;
itatchi42 0:1271d15b4d4b 647 buffidx++;
itatchi42 0:1271d15b4d4b 648
itatchi42 0:1271d15b4d4b 649 count++; ///////////////////////// ADED BY JONATHAN
itatchi42 0:1271d15b4d4b 650 }
itatchi42 0:1271d15b4d4b 651
itatchi42 0:1271d15b4d4b 652 if (timeoutvalid && timeout == 0) {
itatchi42 0:1271d15b4d4b 653 //pcSerial.printf("TIMEOUT\r\n");
itatchi42 0:1271d15b4d4b 654 break;
itatchi42 0:1271d15b4d4b 655 }
itatchi42 0:1271d15b4d4b 656 wait_ms(1);
itatchi42 0:1271d15b4d4b 657 }
itatchi42 0:1271d15b4d4b 658 buff[buffidx] = 0; // null term
itatchi42 0:1271d15b4d4b 659 return buffidx;
itatchi42 0:1271d15b4d4b 660 }
itatchi42 0:1271d15b4d4b 661
itatchi42 0:1271d15b4d4b 662 long map(long x, long in_min, long in_max, long out_min, long out_max)
itatchi42 0:1271d15b4d4b 663 {
itatchi42 0:1271d15b4d4b 664 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
itatchi42 0:1271d15b4d4b 665 }
itatchi42 0:1271d15b4d4b 666
itatchi42 0:1271d15b4d4b 667 ////------ End FONA Helper Functions Region ------////
itatchi42 0:1271d15b4d4b 668