An mbed health monitor

Dependencies:   4DGL-uLCD-SE GP-20U7 PinDetect RPCInterface mbed

Committer:
dnergui3
Date:
Thu Dec 15 07:49:32 2016 +0000
Revision:
1:ad5378dcef79
Parent:
0:0de3867984e5
2nd commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dnergui3 1:ad5378dcef79 1 // ESP8266 Static page WEB server to control Mbed
dnergui3 1:ad5378dcef79 2
dnergui3 0:0de3867984e5 3 #include "mbed.h"
dnergui3 0:0de3867984e5 4 #include "LSM9DS1.h"
dnergui3 0:0de3867984e5 5 #include "GPS.h"
dnergui3 0:0de3867984e5 6 #include "GPSstuff.h"
dnergui3 1:ad5378dcef79 7 #include <string>
dnergui3 1:ad5378dcef79 8 #include <iostream>
dnergui3 0:0de3867984e5 9
dnergui3 0:0de3867984e5 10 Serial pc(USBTX, USBRX);
dnergui3 1:ad5378dcef79 11 Serial esp(p28, p27); // tx, rx
dnergui3 0:0de3867984e5 12 GPS gps(p13, p14);
dnergui3 0:0de3867984e5 13 GPSstuff object;
dnergui3 0:0de3867984e5 14 LSM9DS1 IMU(p9, p10, 0xD6, 0x3C);
dnergui3 0:0de3867984e5 15
dnergui3 1:ad5378dcef79 16 char ssid[32] = "AndroidAP"; // enter WiFi router ssid inside the quotes
dnergui3 1:ad5378dcef79 17 char pwd [32] = "91d4f66f56c1"; // enter WiFi router passusrname inside the quotes
dnergui3 1:ad5378dcef79 18
dnergui3 1:ad5378dcef79 19 char Steps[10];
dnergui3 1:ad5378dcef79 20 char Distance_travel[10];
dnergui3 1:ad5378dcef79 21 char Calories_burned[10];
dnergui3 1:ad5378dcef79 22
dnergui3 0:0de3867984e5 23 float a, ax, ay, az; //acceleration
dnergui3 1:ad5378dcef79 24 int i=0, n=0;
dnergui3 0:0de3867984e5 25 bool flag=0;
dnergui3 0:0de3867984e5 26
dnergui3 1:ad5378dcef79 27 float buffer[4], d, totalDistance=0, threshold=1.1, calories=0, steps=0;
dnergui3 1:ad5378dcef79 28
dnergui3 1:ad5378dcef79 29 // things for sending/receiving data over serial
dnergui3 1:ad5378dcef79 30 volatile int tx_in=0;
dnergui3 1:ad5378dcef79 31 volatile int tx_out=0;
dnergui3 1:ad5378dcef79 32 volatile int rx_in=0;
dnergui3 1:ad5378dcef79 33 volatile int rx_out=0;
dnergui3 1:ad5378dcef79 34 const int buffer_size = 4095;
dnergui3 1:ad5378dcef79 35 char tx_buffer[buffer_size+1];
dnergui3 1:ad5378dcef79 36 char rx_buffer[buffer_size+1];
dnergui3 1:ad5378dcef79 37 void Tx_interrupt();
dnergui3 1:ad5378dcef79 38 void Rx_interrupt();
dnergui3 1:ad5378dcef79 39 void send_line();
dnergui3 1:ad5378dcef79 40 void read_line();
dnergui3 1:ad5378dcef79 41
dnergui3 1:ad5378dcef79 42 int DataRX;
dnergui3 1:ad5378dcef79 43 int update;
dnergui3 1:ad5378dcef79 44 int count;
dnergui3 1:ad5378dcef79 45 char cmdbuff[1024];
dnergui3 1:ad5378dcef79 46 char replybuff[4096];
dnergui3 1:ad5378dcef79 47 char webdata[4096]; // This may need to be bigger depending on WEB browser used
dnergui3 1:ad5378dcef79 48 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
dnergui3 1:ad5378dcef79 49 char timebuf[30];
dnergui3 1:ad5378dcef79 50 void SendCMD(),getreply(),ReadWebData(),startserver();
dnergui3 1:ad5378dcef79 51 void gettime(),setRTC(), getsteps(), getdistance();
dnergui3 1:ad5378dcef79 52 char rx_line[1024];
dnergui3 1:ad5378dcef79 53 int port =80; // set server port
dnergui3 1:ad5378dcef79 54 int SERVtimeout =5; // set server timeout in seconds in case link breaks.
dnergui3 1:ad5378dcef79 55 struct tm t;
dnergui3 1:ad5378dcef79 56 // manual set RTC values
dnergui3 1:ad5378dcef79 57 int minute =00; // 0-59
dnergui3 1:ad5378dcef79 58 int hour =12; // 2-23
dnergui3 1:ad5378dcef79 59 int dayofmonth =26; // 1-31
dnergui3 1:ad5378dcef79 60 int month =8; // 1-12
dnergui3 1:ad5378dcef79 61 int year =15; // last 2 digits
dnergui3 1:ad5378dcef79 62
dnergui3 1:ad5378dcef79 63 int main()
dnergui3 1:ad5378dcef79 64 {
dnergui3 1:ad5378dcef79 65 pc.baud(9600);
dnergui3 1:ad5378dcef79 66 esp.baud(9600);
dnergui3 1:ad5378dcef79 67 // Setup a serial interrupt function to receive data
dnergui3 1:ad5378dcef79 68 esp.attach(&Rx_interrupt, Serial::RxIrq);
dnergui3 1:ad5378dcef79 69 // Setup a serial interrupt function to transmit data
dnergui3 1:ad5378dcef79 70 esp.attach(&Tx_interrupt, Serial::TxIrq);
dnergui3 1:ad5378dcef79 71 if (time(NULL) < 1420070400) {
dnergui3 1:ad5378dcef79 72 setRTC();
dnergui3 1:ad5378dcef79 73 }
dnergui3 1:ad5378dcef79 74 startserver();
dnergui3 1:ad5378dcef79 75 DataRX=0;
dnergui3 1:ad5378dcef79 76 ReadWebData();
dnergui3 1:ad5378dcef79 77 IMU.begin();
dnergui3 1:ad5378dcef79 78 if (!IMU.begin()) {
dnergui3 1:ad5378dcef79 79 pc.printf("Failed to communicate with LSM9DS1.\n");
dnergui3 1:ad5378dcef79 80 }
dnergui3 1:ad5378dcef79 81 IMU.calibrate(1);
dnergui3 1:ad5378dcef79 82 while(1) {
dnergui3 1:ad5378dcef79 83 while(n<26){
dnergui3 1:ad5378dcef79 84 getsteps();
dnergui3 1:ad5378dcef79 85 wait(0.2);
dnergui3 1:ad5378dcef79 86 n++;
dnergui3 1:ad5378dcef79 87 }
dnergui3 1:ad5378dcef79 88 //if(DataRX==1) {
dnergui3 1:ad5378dcef79 89 ReadWebData();
dnergui3 1:ad5378dcef79 90 esp.attach(&Rx_interrupt, Serial::RxIrq);
dnergui3 1:ad5378dcef79 91 // get new values
dnergui3 1:ad5378dcef79 92 gettime();
dnergui3 1:ad5378dcef79 93 getdistance();
dnergui3 1:ad5378dcef79 94 // send new values
dnergui3 1:ad5378dcef79 95 sprintf(cmdbuff, "count,time,steps,distance,calories=%d,\"%s\",\"%s\",\"%s\",\"%s\"\r\n",count,timebuf,Steps,Distance_travel, Calories_burned);
dnergui3 1:ad5378dcef79 96 // sprintf(cmdbuff, "count,time,steps,distance= %d,\"%s\",\"%s\",\"%s\"\r\n",count,timebuf,Steps,Distance_travel);
dnergui3 1:ad5378dcef79 97 SendCMD();
dnergui3 1:ad5378dcef79 98 getreply();
dnergui3 1:ad5378dcef79 99 n=0;
dnergui3 1:ad5378dcef79 100 }
dnergui3 1:ad5378dcef79 101 }
dnergui3 1:ad5378dcef79 102
dnergui3 1:ad5378dcef79 103 // Reads and processes GET and POST web data
dnergui3 1:ad5378dcef79 104 void ReadWebData()
dnergui3 1:ad5378dcef79 105 {
dnergui3 1:ad5378dcef79 106 wait_ms(200);
dnergui3 1:ad5378dcef79 107 esp.attach(NULL,Serial::RxIrq);
dnergui3 1:ad5378dcef79 108 DataRX=0;
dnergui3 1:ad5378dcef79 109 memset(webdata, '\0', sizeof(webdata));
dnergui3 1:ad5378dcef79 110 strcpy(webdata, rx_buffer);
dnergui3 1:ad5378dcef79 111 memset(rx_buffer, '\0', sizeof(rx_buffer));
dnergui3 1:ad5378dcef79 112 rx_in = 0;
dnergui3 1:ad5378dcef79 113 rx_out = 0;
dnergui3 1:ad5378dcef79 114 // check web data for form information
dnergui3 1:ad5378dcef79 115 if( strstr(webdata, "POST") != NULL ) { // set update flag if POST request
dnergui3 1:ad5378dcef79 116 update=1;
dnergui3 1:ad5378dcef79 117 }
dnergui3 1:ad5378dcef79 118 if( strstr(webdata, "GET") != NULL && strstr(webdata, "favicon") == NULL ) { // set update flag for GET request but do not want to update for favicon requests
dnergui3 1:ad5378dcef79 119 update=1;
dnergui3 1:ad5378dcef79 120 }
dnergui3 1:ad5378dcef79 121 }
dnergui3 1:ad5378dcef79 122 // Starts webserver
dnergui3 1:ad5378dcef79 123 void startserver()
dnergui3 1:ad5378dcef79 124 {
dnergui3 1:ad5378dcef79 125 gettime();
dnergui3 1:ad5378dcef79 126 getsteps();
dnergui3 1:ad5378dcef79 127 getdistance();
dnergui3 1:ad5378dcef79 128 pc.printf("++++++++++ Resetting ESP ++++++++++\r\n");
dnergui3 1:ad5378dcef79 129 strcpy(cmdbuff,"node.restart()\r\n");
dnergui3 1:ad5378dcef79 130 SendCMD();
dnergui3 1:ad5378dcef79 131 wait(2);
dnergui3 1:ad5378dcef79 132 getreply();
dnergui3 1:ad5378dcef79 133
dnergui3 1:ad5378dcef79 134 pc.printf("\n++++++++++ Starting Server ++++++++++\r\n> ");
dnergui3 1:ad5378dcef79 135
dnergui3 1:ad5378dcef79 136 // initial values
dnergui3 1:ad5378dcef79 137 sprintf(cmdbuff, "count,time,steps,distance,calories=%d,\"%s\",\"%s\",\"%s\",\"%s\"\r\n",count,timebuf,Steps,Distance_travel, Calories_burned);
dnergui3 1:ad5378dcef79 138 SendCMD();
dnergui3 1:ad5378dcef79 139 getreply();
dnergui3 1:ad5378dcef79 140 wait(0.5);
dnergui3 0:0de3867984e5 141
dnergui3 1:ad5378dcef79 142 //create server
dnergui3 1:ad5378dcef79 143 sprintf(cmdbuff, "srv=net.createServer(net.TCP,%d)\r\n",SERVtimeout);
dnergui3 1:ad5378dcef79 144 SendCMD();
dnergui3 1:ad5378dcef79 145 getreply();
dnergui3 1:ad5378dcef79 146 wait(0.5);
dnergui3 1:ad5378dcef79 147 strcpy(cmdbuff,"srv:listen(80,function(conn)\r\n");
dnergui3 1:ad5378dcef79 148 SendCMD();
dnergui3 1:ad5378dcef79 149 getreply();
dnergui3 1:ad5378dcef79 150 wait(0.3);
dnergui3 1:ad5378dcef79 151 strcpy(cmdbuff,"conn:on(\"receive\",function(conn,payload) \r\n");
dnergui3 1:ad5378dcef79 152 SendCMD();
dnergui3 1:ad5378dcef79 153 getreply();
dnergui3 1:ad5378dcef79 154 wait(0.3);
dnergui3 1:ad5378dcef79 155
dnergui3 1:ad5378dcef79 156 //print data to mbed
dnergui3 1:ad5378dcef79 157 strcpy(cmdbuff,"print(payload)\r\n");
dnergui3 1:ad5378dcef79 158 SendCMD();
dnergui3 1:ad5378dcef79 159 getreply();
dnergui3 1:ad5378dcef79 160 wait(0.2);
dnergui3 1:ad5378dcef79 161
dnergui3 1:ad5378dcef79 162 //web page data
dnergui3 1:ad5378dcef79 163 strcpy(cmdbuff,"conn:send('<!DOCTYPE html><html><body><h1>Mbed IoT Web Controller</h1>')\r\n");
dnergui3 1:ad5378dcef79 164 SendCMD();
dnergui3 1:ad5378dcef79 165 getreply();
dnergui3 1:ad5378dcef79 166 wait(0.4);
dnergui3 1:ad5378dcef79 167 strcpy(cmdbuff,"conn:send('<br>Last hit (based on mbed RTC time): '..time..'<br><hr>')\r\n");
dnergui3 1:ad5378dcef79 168 SendCMD();
dnergui3 1:ad5378dcef79 169 getreply();
dnergui3 1:ad5378dcef79 170 wait(0.4);
dnergui3 1:ad5378dcef79 171 strcpy(cmdbuff,"conn:send('Steps: '..steps..' <br>Distance: '..distance..' km<br><hr>')\r\n");
dnergui3 1:ad5378dcef79 172 SendCMD();
dnergui3 1:ad5378dcef79 173 getreply();
dnergui3 1:ad5378dcef79 174 wait(0.3);
dnergui3 1:ad5378dcef79 175 strcpy(cmdbuff,"conn:send('Calories: '..calories..' kcal<br><hr>')\r\n");
dnergui3 1:ad5378dcef79 176 SendCMD();
dnergui3 1:ad5378dcef79 177 getreply();
dnergui3 1:ad5378dcef79 178 wait(0.3);
dnergui3 1:ad5378dcef79 179 strcpy(cmdbuff,"conn:send('<form method=\"POST\"')\r\n");
dnergui3 1:ad5378dcef79 180 SendCMD();
dnergui3 1:ad5378dcef79 181 getreply();
dnergui3 1:ad5378dcef79 182 wait(0.3);
dnergui3 1:ad5378dcef79 183 strcpy(cmdbuff,"conn:send('<p><input type=\"submit\" value=\"Update\"></form>')\r\n");
dnergui3 1:ad5378dcef79 184 SendCMD();
dnergui3 1:ad5378dcef79 185 getreply();
dnergui3 1:ad5378dcef79 186 wait(0.3);
dnergui3 1:ad5378dcef79 187 // end web page data
dnergui3 1:ad5378dcef79 188 strcpy(cmdbuff, "conn:on(\"sent\",function(conn) conn:close() end)\r\n"); // close current connection
dnergui3 1:ad5378dcef79 189 SendCMD();
dnergui3 1:ad5378dcef79 190 getreply();
dnergui3 1:ad5378dcef79 191 wait(0.3);
dnergui3 1:ad5378dcef79 192 strcpy(cmdbuff, "end)\r\n");
dnergui3 1:ad5378dcef79 193 SendCMD();
dnergui3 1:ad5378dcef79 194 getreply();
dnergui3 1:ad5378dcef79 195 wait(0.2);
dnergui3 1:ad5378dcef79 196 strcpy(cmdbuff, "end)\r\n");
dnergui3 1:ad5378dcef79 197 SendCMD();
dnergui3 1:ad5378dcef79 198 getreply();
dnergui3 1:ad5378dcef79 199 wait(0.2);
dnergui3 1:ad5378dcef79 200
dnergui3 1:ad5378dcef79 201 strcpy(cmdbuff, "tmr.alarm(0, 1000, 1, function()\r\n");
dnergui3 1:ad5378dcef79 202 SendCMD();
dnergui3 1:ad5378dcef79 203 getreply();
dnergui3 1:ad5378dcef79 204 wait(0.2);
dnergui3 1:ad5378dcef79 205 strcpy(cmdbuff, "if wifi.sta.getip() == nil then\r\n");
dnergui3 1:ad5378dcef79 206 SendCMD();
dnergui3 1:ad5378dcef79 207 getreply();
dnergui3 1:ad5378dcef79 208 wait(0.2);
dnergui3 1:ad5378dcef79 209 strcpy(cmdbuff, "print(\"Connecting to AP...\\n\")\r\n");
dnergui3 1:ad5378dcef79 210 SendCMD();
dnergui3 1:ad5378dcef79 211 getreply();
dnergui3 1:ad5378dcef79 212 wait(0.2);
dnergui3 1:ad5378dcef79 213 strcpy(cmdbuff, "else\r\n");
dnergui3 1:ad5378dcef79 214 SendCMD();
dnergui3 1:ad5378dcef79 215 getreply();
dnergui3 1:ad5378dcef79 216 wait(0.2);
dnergui3 1:ad5378dcef79 217 strcpy(cmdbuff, "ip, nm, gw=wifi.sta.getip()\r\n");
dnergui3 1:ad5378dcef79 218 SendCMD();
dnergui3 1:ad5378dcef79 219 getreply();
dnergui3 1:ad5378dcef79 220 wait(0.2);
dnergui3 1:ad5378dcef79 221 strcpy(cmdbuff,"print(\"IP Address: \",ip)\r\n");
dnergui3 1:ad5378dcef79 222 SendCMD();
dnergui3 1:ad5378dcef79 223 getreply();
dnergui3 1:ad5378dcef79 224 wait(0.2);
dnergui3 1:ad5378dcef79 225 strcpy(cmdbuff,"tmr.stop(0)\r\n");
dnergui3 1:ad5378dcef79 226 SendCMD();
dnergui3 1:ad5378dcef79 227 getreply();
dnergui3 1:ad5378dcef79 228 wait(0.2);
dnergui3 1:ad5378dcef79 229 strcpy(cmdbuff,"end\r\n");
dnergui3 1:ad5378dcef79 230 SendCMD();
dnergui3 1:ad5378dcef79 231 getreply();
dnergui3 1:ad5378dcef79 232 wait(0.2);
dnergui3 1:ad5378dcef79 233 strcpy(cmdbuff,"end)\r\n");
dnergui3 1:ad5378dcef79 234 SendCMD();
dnergui3 1:ad5378dcef79 235 getreply();
dnergui3 1:ad5378dcef79 236 wait(0.2);
dnergui3 1:ad5378dcef79 237
dnergui3 1:ad5378dcef79 238 pc.printf("\n\n++++++++++ Ready ++++++++++\r\n\n");
dnergui3 1:ad5378dcef79 239 }
dnergui3 1:ad5378dcef79 240
dnergui3 1:ad5378dcef79 241
dnergui3 1:ad5378dcef79 242 // ESP Command data send
dnergui3 1:ad5378dcef79 243 void SendCMD()
dnergui3 1:ad5378dcef79 244 {
dnergui3 1:ad5378dcef79 245 int i;
dnergui3 1:ad5378dcef79 246 char temp_char;
dnergui3 1:ad5378dcef79 247 bool empty;
dnergui3 1:ad5378dcef79 248 i = 0;
dnergui3 1:ad5378dcef79 249 // Start Critical Section - don't interrupt while changing global buffer variables
dnergui3 1:ad5378dcef79 250 NVIC_DisableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 251 empty = (tx_in == tx_out);
dnergui3 1:ad5378dcef79 252 while ((i==0) || (cmdbuff[i-1] != '\n')) {
dnergui3 1:ad5378dcef79 253 // Wait if buffer full
dnergui3 1:ad5378dcef79 254 if (((tx_in + 1) % buffer_size) == tx_out) {
dnergui3 1:ad5378dcef79 255 // End Critical Section - need to let interrupt routine empty buffer by sending
dnergui3 1:ad5378dcef79 256 NVIC_EnableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 257 while (((tx_in + 1) % buffer_size) == tx_out) {
dnergui3 1:ad5378dcef79 258 }
dnergui3 1:ad5378dcef79 259 // Start Critical Section - don't interrupt while changing global buffer variables
dnergui3 1:ad5378dcef79 260 NVIC_DisableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 261 }
dnergui3 1:ad5378dcef79 262 tx_buffer[tx_in] = cmdbuff[i];
dnergui3 1:ad5378dcef79 263 i++;
dnergui3 1:ad5378dcef79 264 tx_in = (tx_in + 1) % buffer_size;
dnergui3 1:ad5378dcef79 265 }
dnergui3 1:ad5378dcef79 266 if (esp.writeable() && (empty)) {
dnergui3 1:ad5378dcef79 267 temp_char = tx_buffer[tx_out];
dnergui3 1:ad5378dcef79 268 tx_out = (tx_out + 1) % buffer_size;
dnergui3 1:ad5378dcef79 269 // Send first character to start tx interrupts, if stopped
dnergui3 1:ad5378dcef79 270 esp.putc(temp_char);
dnergui3 1:ad5378dcef79 271 }
dnergui3 1:ad5378dcef79 272 // End Critical Section
dnergui3 1:ad5378dcef79 273 NVIC_EnableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 274 return;
dnergui3 1:ad5378dcef79 275 }
dnergui3 1:ad5378dcef79 276
dnergui3 1:ad5378dcef79 277 // Get Command and ESP status replies
dnergui3 1:ad5378dcef79 278 void getreply()
dnergui3 1:ad5378dcef79 279 {
dnergui3 1:ad5378dcef79 280 read_line();
dnergui3 1:ad5378dcef79 281 sscanf(rx_line,replybuff);
dnergui3 1:ad5378dcef79 282 }
dnergui3 1:ad5378dcef79 283
dnergui3 1:ad5378dcef79 284 // Read a line from the large rx buffer from rx interrupt routine
dnergui3 1:ad5378dcef79 285 void read_line() {
dnergui3 1:ad5378dcef79 286 int i;
dnergui3 1:ad5378dcef79 287 i = 0;
dnergui3 1:ad5378dcef79 288 // Start Critical Section - don't interrupt while changing global buffer variables
dnergui3 1:ad5378dcef79 289 NVIC_DisableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 290 // Loop reading rx buffer characters until end of line character
dnergui3 1:ad5378dcef79 291 while ((i==0) || (rx_line[i-1] != '\r')) {
dnergui3 1:ad5378dcef79 292 // Wait if buffer empty
dnergui3 1:ad5378dcef79 293 if (rx_in == rx_out) {
dnergui3 1:ad5378dcef79 294 // End Critical Section - need to allow rx interrupt to get new characters for buffer
dnergui3 1:ad5378dcef79 295 NVIC_EnableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 296 while (rx_in == rx_out) {
dnergui3 1:ad5378dcef79 297 }
dnergui3 1:ad5378dcef79 298 // Start Critical Section - don't interrupt while changing global buffer variables
dnergui3 1:ad5378dcef79 299 NVIC_DisableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 300 }
dnergui3 1:ad5378dcef79 301 rx_line[i] = rx_buffer[rx_out];
dnergui3 1:ad5378dcef79 302 i++;
dnergui3 1:ad5378dcef79 303 rx_out = (rx_out + 1) % buffer_size;
dnergui3 1:ad5378dcef79 304 }
dnergui3 1:ad5378dcef79 305 // End Critical Section
dnergui3 1:ad5378dcef79 306 NVIC_EnableIRQ(UART1_IRQn);
dnergui3 1:ad5378dcef79 307 rx_line[i-1] = 0;
dnergui3 1:ad5378dcef79 308 return;
dnergui3 1:ad5378dcef79 309 }
dnergui3 1:ad5378dcef79 310
dnergui3 1:ad5378dcef79 311
dnergui3 1:ad5378dcef79 312 // Interupt Routine to read in data from serial port
dnergui3 1:ad5378dcef79 313 void Rx_interrupt() {
dnergui3 1:ad5378dcef79 314 DataRX=1;
dnergui3 1:ad5378dcef79 315 // Loop just in case more than one character is in UART's receive FIFO buffer
dnergui3 1:ad5378dcef79 316 // Stop if buffer full
dnergui3 1:ad5378dcef79 317 while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
dnergui3 1:ad5378dcef79 318 rx_buffer[rx_in] = esp.getc();
dnergui3 1:ad5378dcef79 319 // Uncomment to Echo to USB serial to watch data flow
dnergui3 1:ad5378dcef79 320 pc.putc(rx_buffer[rx_in]);
dnergui3 1:ad5378dcef79 321 rx_in = (rx_in + 1) % buffer_size;
dnergui3 1:ad5378dcef79 322 }
dnergui3 1:ad5378dcef79 323 return;
dnergui3 1:ad5378dcef79 324 }
dnergui3 1:ad5378dcef79 325
dnergui3 1:ad5378dcef79 326
dnergui3 1:ad5378dcef79 327 // Interupt Routine to write out data to serial port
dnergui3 1:ad5378dcef79 328 void Tx_interrupt() {
dnergui3 1:ad5378dcef79 329 // Loop to fill more than one character in UART's transmit FIFO buffer
dnergui3 1:ad5378dcef79 330 // Stop if buffer empty
dnergui3 1:ad5378dcef79 331 while ((esp.writeable()) && (tx_in != tx_out)) {
dnergui3 1:ad5378dcef79 332 esp.putc(tx_buffer[tx_out]);
dnergui3 1:ad5378dcef79 333 tx_out = (tx_out + 1) % buffer_size;
dnergui3 1:ad5378dcef79 334 }
dnergui3 1:ad5378dcef79 335 return;
dnergui3 1:ad5378dcef79 336 }
dnergui3 1:ad5378dcef79 337
dnergui3 1:ad5378dcef79 338 void gettime()
dnergui3 1:ad5378dcef79 339 {
dnergui3 1:ad5378dcef79 340 time_t seconds = time(NULL);
dnergui3 1:ad5378dcef79 341 strftime(timebuf,50,"%H:%M:%S %a %d %b %y", localtime(&seconds));
dnergui3 1:ad5378dcef79 342 }
dnergui3 1:ad5378dcef79 343
dnergui3 1:ad5378dcef79 344 void setRTC()
dnergui3 1:ad5378dcef79 345 {
dnergui3 1:ad5378dcef79 346 t.tm_sec = (0); // 0-59
dnergui3 1:ad5378dcef79 347 t.tm_min = (minute); // 0-59
dnergui3 1:ad5378dcef79 348 t.tm_hour = (hour); // 0-23
dnergui3 1:ad5378dcef79 349 t.tm_mday = (dayofmonth); // 1-31
dnergui3 1:ad5378dcef79 350 t.tm_mon = (month-1); // 0-11 "0" = Jan, -1 added for Mbed RCT clock format
dnergui3 1:ad5378dcef79 351 t.tm_year = ((year)+100); // year since 1900, current DCF year + 100 + 1900 = correct year
dnergui3 1:ad5378dcef79 352 set_time(mktime(&t)); // set RTC clock
dnergui3 1:ad5378dcef79 353 }
dnergui3 1:ad5378dcef79 354 // Analog in example
dnergui3 1:ad5378dcef79 355 void getsteps(){
dnergui3 0:0de3867984e5 356 while(!IMU.accelAvailable());
dnergui3 0:0de3867984e5 357 IMU.readAccel();
dnergui3 0:0de3867984e5 358 ax=IMU.calcAccel(IMU.ax);
dnergui3 0:0de3867984e5 359 ay=IMU.calcAccel(IMU.ay);
dnergui3 0:0de3867984e5 360 az=IMU.calcAccel(IMU.az);
dnergui3 0:0de3867984e5 361 a=sqrt(pow(ax, 2) + pow(ay, 2) + pow(az, 2));
dnergui3 0:0de3867984e5 362 if (a>=threshold && flag==0){ // if it crosses threshold increment step by one and raise the flag
dnergui3 1:ad5378dcef79 363 steps+=1; flag=1; calories=steps/20;
dnergui3 1:ad5378dcef79 364 pc.printf("steps: %i\n", steps);
dnergui3 0:0de3867984e5 365 }
dnergui3 0:0de3867984e5 366
dnergui3 0:0de3867984e5 367 else if (a < threshold && flag==1){ // if flag is raised and threshold is not crossed , put that flag down.
dnergui3 0:0de3867984e5 368 flag=0;
dnergui3 0:0de3867984e5 369 }
dnergui3 1:ad5378dcef79 370 sprintf(Steps,"%2.3f",steps);
dnergui3 1:ad5378dcef79 371 sprintf(Calories_burned, "%2.3f", calories);
dnergui3 0:0de3867984e5 372 }
dnergui3 1:ad5378dcef79 373 void getdistance(){
dnergui3 0:0de3867984e5 374 if (i==0){
dnergui3 0:0de3867984e5 375 //initial reading made by the GPS
dnergui3 0:0de3867984e5 376 gps.sample();
dnergui3 0:0de3867984e5 377 buffer[i]= gps.longitude;
dnergui3 0:0de3867984e5 378 buffer[i+1] = gps.latitude;
dnergui3 0:0de3867984e5 379 i=i+2;
dnergui3 0:0de3867984e5 380 if (buffer[2]==0 && buffer[3]==0){
dnergui3 0:0de3867984e5 381 //second reading made by GPS
dnergui3 0:0de3867984e5 382 gps.sample();
dnergui3 0:0de3867984e5 383 buffer[2]= gps.longitude;
dnergui3 0:0de3867984e5 384 buffer[3] = gps.latitude;
dnergui3 0:0de3867984e5 385 i=2;
dnergui3 0:0de3867984e5 386 }
dnergui3 0:0de3867984e5 387 }
dnergui3 0:0de3867984e5 388 else if (i==2){
dnergui3 0:0de3867984e5 389 float lat1d = buffer[0];
dnergui3 0:0de3867984e5 390 float lon1d = buffer[1];
dnergui3 0:0de3867984e5 391 float lat2d = buffer[2];
dnergui3 0:0de3867984e5 392 float lon2d = buffer[3];
dnergui3 1:ad5378dcef79 393 d = object.distanceEarth(lat1d, lon1d, lat2d, lon2d);
dnergui3 0:0de3867984e5 394 lat1d = buffer[2];
dnergui3 0:0de3867984e5 395 lon1d = buffer[3];
dnergui3 0:0de3867984e5 396 i=0;
dnergui3 0:0de3867984e5 397 }
dnergui3 1:ad5378dcef79 398 totalDistance+=d;
dnergui3 1:ad5378dcef79 399 sprintf(Distance_travel, "%2.3f", totalDistance);
dnergui3 0:0de3867984e5 400 }