An mbed health monitor
Dependencies: 4DGL-uLCD-SE GP-20U7 PinDetect RPCInterface mbed
main.cpp@1:ad5378dcef79, 2016-12-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |