Code for Mbed Dashboard project. http://developer.mbed.org/users/julieefreeman/notebook/mbed-dashboard---obdii/

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed

Committer:
julieefreeman
Date:
Tue Dec 09 18:12:57 2014 +0000
Revision:
0:2fa4b8d8fbd0
First stable version of dashboard project implementing CAN bus and OBDII

Who changed what in which revision?

UserRevisionLine numberNew contents of line
julieefreeman 0:2fa4b8d8fbd0 1 /*
julieefreeman 0:2fa4b8d8fbd0 2 mbed Dashboard trip computer
julieefreeman 0:2fa4b8d8fbd0 3 December 2014
julieefreeman 0:2fa4b8d8fbd0 4 ********************************************************************************
julieefreeman 0:2fa4b8d8fbd0 5 WARNING: Use at your own risk, sadly this software comes with no guarantees.
julieefreeman 0:2fa4b8d8fbd0 6 This software is provided 'free' and in good faith, but the author does not
julieefreeman 0:2fa4b8d8fbd0 7 accept liability for any damage arising from its use.
julieefreeman 0:2fa4b8d8fbd0 8 ********************************************************************************
julieefreeman 0:2fa4b8d8fbd0 9 */
julieefreeman 0:2fa4b8d8fbd0 10
julieefreeman 0:2fa4b8d8fbd0 11 #include "mbed.h"
julieefreeman 0:2fa4b8d8fbd0 12 #include "ecu_reader.h"
julieefreeman 0:2fa4b8d8fbd0 13 #include "globals.h"
julieefreeman 0:2fa4b8d8fbd0 14 #include "rtos.h"
julieefreeman 0:2fa4b8d8fbd0 15 #include "SDFileSystem.h"
julieefreeman 0:2fa4b8d8fbd0 16
julieefreeman 0:2fa4b8d8fbd0 17 Mutex stdio_mutex;
julieefreeman 0:2fa4b8d8fbd0 18 ecu_reader obdii1(CANSPEED_125); //supports different CAN speeds
julieefreeman 0:2fa4b8d8fbd0 19 ecu_reader obdii2(CANSPEED_250);
julieefreeman 0:2fa4b8d8fbd0 20 ecu_reader obdii3(CANSPEED_500);
julieefreeman 0:2fa4b8d8fbd0 21 InterruptIn switch_reading(p8);
julieefreeman 0:2fa4b8d8fbd0 22 SDFileSystem sd(p5, p6, p7, p12, "sd");
julieefreeman 0:2fa4b8d8fbd0 23 DigitalOut myled4(LED4);
julieefreeman 0:2fa4b8d8fbd0 24 DigitalOut myled3(LED3);
julieefreeman 0:2fa4b8d8fbd0 25
julieefreeman 0:2fa4b8d8fbd0 26 int flag; //indicates which reading to get from vehicle
julieefreeman 0:2fa4b8d8fbd0 27 int change; //signifies that the system is switching readings
julieefreeman 0:2fa4b8d8fbd0 28 char temp_buffer[20]; //buffers for readings from vehicle
julieefreeman 0:2fa4b8d8fbd0 29 char rpm_buffer[20];
julieefreeman 0:2fa4b8d8fbd0 30 char speed_buffer[20];
julieefreeman 0:2fa4b8d8fbd0 31 char time_buff[32];
julieefreeman 0:2fa4b8d8fbd0 32 char buffer[20];
julieefreeman 0:2fa4b8d8fbd0 33 float dial_len;
julieefreeman 0:2fa4b8d8fbd0 34 int ui_temp, ui_rpm;
julieefreeman 0:2fa4b8d8fbd0 35 float ui_speed;
julieefreeman 0:2fa4b8d8fbd0 36 int dist_init;
julieefreeman 0:2fa4b8d8fbd0 37 float dist;
julieefreeman 0:2fa4b8d8fbd0 38 time_t seconds;
julieefreeman 0:2fa4b8d8fbd0 39 int testing_temp; //not connected to car
julieefreeman 0:2fa4b8d8fbd0 40 int testing_rpm; //not connected to car
julieefreeman 0:2fa4b8d8fbd0 41 int testing_speed;
julieefreeman 0:2fa4b8d8fbd0 42
julieefreeman 0:2fa4b8d8fbd0 43 void display_coolant_temp();
julieefreeman 0:2fa4b8d8fbd0 44 void display_rpm();
julieefreeman 0:2fa4b8d8fbd0 45 void draw_tachometer();
julieefreeman 0:2fa4b8d8fbd0 46 void draw_thermometer();
julieefreeman 0:2fa4b8d8fbd0 47 void display_speed();
julieefreeman 0:2fa4b8d8fbd0 48 void draw_speedometer();
julieefreeman 0:2fa4b8d8fbd0 49 void display_trip();
julieefreeman 0:2fa4b8d8fbd0 50
julieefreeman 0:2fa4b8d8fbd0 51 void pb_hit_interrupt (void) {
julieefreeman 0:2fa4b8d8fbd0 52 myled4 = 1;
julieefreeman 0:2fa4b8d8fbd0 53 flag = flag+1;
julieefreeman 0:2fa4b8d8fbd0 54 if (flag>3) {
julieefreeman 0:2fa4b8d8fbd0 55 flag = 0;
julieefreeman 0:2fa4b8d8fbd0 56 ui_temp = -1;
julieefreeman 0:2fa4b8d8fbd0 57 }
julieefreeman 0:2fa4b8d8fbd0 58 else if (flag == 1)
julieefreeman 0:2fa4b8d8fbd0 59 ui_rpm = -1;
julieefreeman 0:2fa4b8d8fbd0 60 else if (flag == 2)
julieefreeman 0:2fa4b8d8fbd0 61 ui_speed = -1;
julieefreeman 0:2fa4b8d8fbd0 62 wait(0.5);
julieefreeman 0:2fa4b8d8fbd0 63 myled4 = 0;
julieefreeman 0:2fa4b8d8fbd0 64 change = 1;
julieefreeman 0:2fa4b8d8fbd0 65 }
julieefreeman 0:2fa4b8d8fbd0 66 void testingThread(void const *args) { // run this thread and set main OBD request conditions to 0 to test UI
julieefreeman 0:2fa4b8d8fbd0 67 ui_temp = -1;
julieefreeman 0:2fa4b8d8fbd0 68 ui_rpm = -1;
julieefreeman 0:2fa4b8d8fbd0 69 testing_temp = 100;
julieefreeman 0:2fa4b8d8fbd0 70 testing_rpm = 0;
julieefreeman 0:2fa4b8d8fbd0 71 dist_init = 0;
julieefreeman 0:2fa4b8d8fbd0 72 testing_speed = 0;
julieefreeman 0:2fa4b8d8fbd0 73 while(1){
julieefreeman 0:2fa4b8d8fbd0 74 // --- TESTING ONLY - WITHOUT CAR ---
julieefreeman 0:2fa4b8d8fbd0 75 sprintf(temp_buffer,"%d",testing_temp);
julieefreeman 0:2fa4b8d8fbd0 76 sprintf(rpm_buffer,"%d",testing_rpm);
julieefreeman 0:2fa4b8d8fbd0 77 sprintf(speed_buffer,"%d", testing_speed);
julieefreeman 0:2fa4b8d8fbd0 78 dist += 0.1;
julieefreeman 0:2fa4b8d8fbd0 79 testing_temp -= 1;
julieefreeman 0:2fa4b8d8fbd0 80 testing_rpm += 100;
julieefreeman 0:2fa4b8d8fbd0 81 testing_speed +=5;
julieefreeman 0:2fa4b8d8fbd0 82 if (testing_temp<5) {
julieefreeman 0:2fa4b8d8fbd0 83 testing_temp = 100;
julieefreeman 0:2fa4b8d8fbd0 84 }
julieefreeman 0:2fa4b8d8fbd0 85 if (testing_rpm>5000) {
julieefreeman 0:2fa4b8d8fbd0 86 testing_rpm = 900;
julieefreeman 0:2fa4b8d8fbd0 87 }
julieefreeman 0:2fa4b8d8fbd0 88 // --- TESTING ONLY - WITHOUT CAR ---
julieefreeman 0:2fa4b8d8fbd0 89 Thread::wait(1000);
julieefreeman 0:2fa4b8d8fbd0 90 }
julieefreeman 0:2fa4b8d8fbd0 91 }
julieefreeman 0:2fa4b8d8fbd0 92
julieefreeman 0:2fa4b8d8fbd0 93 void sdThread(void const *args) {
julieefreeman 0:2fa4b8d8fbd0 94 dist = -1;
julieefreeman 0:2fa4b8d8fbd0 95 dist_init = -1;
julieefreeman 0:2fa4b8d8fbd0 96 set_time(0);
julieefreeman 0:2fa4b8d8fbd0 97 char file[35];
julieefreeman 0:2fa4b8d8fbd0 98 char buffer[32];
julieefreeman 0:2fa4b8d8fbd0 99 char hours[5];
julieefreeman 0:2fa4b8d8fbd0 100 char minutes[5];
julieefreeman 0:2fa4b8d8fbd0 101 float hrs = 0;
julieefreeman 0:2fa4b8d8fbd0 102 FILE *fp;
julieefreeman 0:2fa4b8d8fbd0 103
julieefreeman 0:2fa4b8d8fbd0 104 mkdir("/sd/tripStats",0777);
julieefreeman 0:2fa4b8d8fbd0 105 sprintf(file, "/sd/tripStats/log.txt");
julieefreeman 0:2fa4b8d8fbd0 106 while (dist_init == -1){ //
julieefreeman 0:2fa4b8d8fbd0 107 stdio_mutex.lock();
julieefreeman 0:2fa4b8d8fbd0 108 if(obdii3.request(DIST_SINCE_CLR, buffer) == 1){
julieefreeman 0:2fa4b8d8fbd0 109 dist_init = atoi(buffer);
julieefreeman 0:2fa4b8d8fbd0 110 }
julieefreeman 0:2fa4b8d8fbd0 111 stdio_mutex.unlock();
julieefreeman 0:2fa4b8d8fbd0 112 }
julieefreeman 0:2fa4b8d8fbd0 113
julieefreeman 0:2fa4b8d8fbd0 114 while (1){
julieefreeman 0:2fa4b8d8fbd0 115 fp = fopen(file, "w");
julieefreeman 0:2fa4b8d8fbd0 116 myled3 = 1;
julieefreeman 0:2fa4b8d8fbd0 117 seconds = time(NULL);
julieefreeman 0:2fa4b8d8fbd0 118 strftime(time_buff, 32, "%R:%S", localtime(&seconds));
julieefreeman 0:2fa4b8d8fbd0 119 strftime(hours, 5, "%H", localtime(&seconds));
julieefreeman 0:2fa4b8d8fbd0 120 strftime(minutes, 5, "%M", localtime(&seconds));
julieefreeman 0:2fa4b8d8fbd0 121 hrs = atoi(hours) + ((float)atoi(minutes))/60;
julieefreeman 0:2fa4b8d8fbd0 122 if(fp == NULL) {
julieefreeman 0:2fa4b8d8fbd0 123 error("Could not open file for write\n");
julieefreeman 0:2fa4b8d8fbd0 124 }
julieefreeman 0:2fa4b8d8fbd0 125 stdio_mutex.lock();
julieefreeman 0:2fa4b8d8fbd0 126 if(obdii3.request(DIST_SINCE_CLR, buffer) == 1){
julieefreeman 0:2fa4b8d8fbd0 127 dist = ((float)atoi(buffer)-dist_init)*0.62;
julieefreeman 0:2fa4b8d8fbd0 128 }
julieefreeman 0:2fa4b8d8fbd0 129 stdio_mutex.unlock();
julieefreeman 0:2fa4b8d8fbd0 130 fprintf(fp, "Time since mbed start: %s\n\n", time_buff);
julieefreeman 0:2fa4b8d8fbd0 131 fprintf(fp, "Distance Traveled: %2.2f miles\n", dist);
julieefreeman 0:2fa4b8d8fbd0 132 fprintf(fp, "Average Speed: %2.2f mph\n", dist/hrs);
julieefreeman 0:2fa4b8d8fbd0 133 fclose(fp);
julieefreeman 0:2fa4b8d8fbd0 134 myled3 = 0;
julieefreeman 0:2fa4b8d8fbd0 135 Thread::wait(30000); //write to SD card every 30 seconds
julieefreeman 0:2fa4b8d8fbd0 136 }
julieefreeman 0:2fa4b8d8fbd0 137 }
julieefreeman 0:2fa4b8d8fbd0 138
julieefreeman 0:2fa4b8d8fbd0 139 int main() {
julieefreeman 0:2fa4b8d8fbd0 140 ui_temp = -1; //initialize default values
julieefreeman 0:2fa4b8d8fbd0 141 ui_rpm = -1;
julieefreeman 0:2fa4b8d8fbd0 142 ui_speed = -1;
julieefreeman 0:2fa4b8d8fbd0 143 change = 0;
julieefreeman 0:2fa4b8d8fbd0 144 flag = 0;
julieefreeman 0:2fa4b8d8fbd0 145 dial_len = 60.0;
julieefreeman 0:2fa4b8d8fbd0 146 lcd.cls();
julieefreeman 0:2fa4b8d8fbd0 147 lcd.baudrate(3000000);
julieefreeman 0:2fa4b8d8fbd0 148 switch_reading.mode(PullUp);
julieefreeman 0:2fa4b8d8fbd0 149 wait(0.2);
julieefreeman 0:2fa4b8d8fbd0 150 switch_reading.fall(&pb_hit_interrupt);
julieefreeman 0:2fa4b8d8fbd0 151 Thread t2(sdThread);
julieefreeman 0:2fa4b8d8fbd0 152 //Thread test(testingThread); //run this thread and change OBD request conditions to 0 to test UI
julieefreeman 0:2fa4b8d8fbd0 153
julieefreeman 0:2fa4b8d8fbd0 154 while (1) { //main thread
julieefreeman 0:2fa4b8d8fbd0 155 if (change == 0) { //update LCD only when not in process of switching screens
julieefreeman 0:2fa4b8d8fbd0 156 switch (flag){
julieefreeman 0:2fa4b8d8fbd0 157 case 0: //engine coolant temperature
julieefreeman 0:2fa4b8d8fbd0 158 if(obdii3.request(ENGINE_COOLANT_TEMP, temp_buffer) == 1){ //set to 1 for car, 0 for testing UI
julieefreeman 0:2fa4b8d8fbd0 159 stdio_mutex.lock();
julieefreeman 0:2fa4b8d8fbd0 160 display_coolant_temp();
julieefreeman 0:2fa4b8d8fbd0 161 stdio_mutex.unlock();
julieefreeman 0:2fa4b8d8fbd0 162 }
julieefreeman 0:2fa4b8d8fbd0 163 else {
julieefreeman 0:2fa4b8d8fbd0 164 can2.reset();
julieefreeman 0:2fa4b8d8fbd0 165 wait(0.5);
julieefreeman 0:2fa4b8d8fbd0 166 }
julieefreeman 0:2fa4b8d8fbd0 167 break;
julieefreeman 0:2fa4b8d8fbd0 168 case 1: //engine rpm
julieefreeman 0:2fa4b8d8fbd0 169 if (obdii3.request(ENGINE_RPM, rpm_buffer) == 1){ //set to 1 for car, 0 for testing UI
julieefreeman 0:2fa4b8d8fbd0 170 stdio_mutex.lock();
julieefreeman 0:2fa4b8d8fbd0 171 display_rpm();
julieefreeman 0:2fa4b8d8fbd0 172 stdio_mutex.unlock();
julieefreeman 0:2fa4b8d8fbd0 173 }
julieefreeman 0:2fa4b8d8fbd0 174 else {
julieefreeman 0:2fa4b8d8fbd0 175 can2.reset();
julieefreeman 0:2fa4b8d8fbd0 176 wait(0.5);
julieefreeman 0:2fa4b8d8fbd0 177 }
julieefreeman 0:2fa4b8d8fbd0 178 break;
julieefreeman 0:2fa4b8d8fbd0 179 case 2: //vehicle speed
julieefreeman 0:2fa4b8d8fbd0 180 if (obdii3.request(VEHICLE_SPEED, speed_buffer) == 1){ //set to 1 for car, 0 for testing UI
julieefreeman 0:2fa4b8d8fbd0 181 stdio_mutex.lock();
julieefreeman 0:2fa4b8d8fbd0 182 display_speed();
julieefreeman 0:2fa4b8d8fbd0 183 stdio_mutex.unlock();
julieefreeman 0:2fa4b8d8fbd0 184 }
julieefreeman 0:2fa4b8d8fbd0 185 else {
julieefreeman 0:2fa4b8d8fbd0 186 can2.reset();
julieefreeman 0:2fa4b8d8fbd0 187 wait(0.5);
julieefreeman 0:2fa4b8d8fbd0 188 }
julieefreeman 0:2fa4b8d8fbd0 189 break;
julieefreeman 0:2fa4b8d8fbd0 190 case 3: //distance since codes last cleared
julieefreeman 0:2fa4b8d8fbd0 191 if(obdii3.request(DIST_SINCE_CLR, buffer) == 1){
julieefreeman 0:2fa4b8d8fbd0 192 dist = ((float)atoi(buffer)-(float)dist_init)*0.62;
julieefreeman 0:2fa4b8d8fbd0 193 stdio_mutex.lock();
julieefreeman 0:2fa4b8d8fbd0 194 display_trip();
julieefreeman 0:2fa4b8d8fbd0 195 stdio_mutex.unlock();
julieefreeman 0:2fa4b8d8fbd0 196 }
julieefreeman 0:2fa4b8d8fbd0 197 else {
julieefreeman 0:2fa4b8d8fbd0 198 stdio_mutex.lock();
julieefreeman 0:2fa4b8d8fbd0 199 display_trip();
julieefreeman 0:2fa4b8d8fbd0 200 stdio_mutex.unlock();
julieefreeman 0:2fa4b8d8fbd0 201 can2.reset();
julieefreeman 0:2fa4b8d8fbd0 202 wait(0.5);
julieefreeman 0:2fa4b8d8fbd0 203 }
julieefreeman 0:2fa4b8d8fbd0 204 break;
julieefreeman 0:2fa4b8d8fbd0 205 }
julieefreeman 0:2fa4b8d8fbd0 206 }
julieefreeman 0:2fa4b8d8fbd0 207 else {
julieefreeman 0:2fa4b8d8fbd0 208 lcd.cls();
julieefreeman 0:2fa4b8d8fbd0 209 change = 0;
julieefreeman 0:2fa4b8d8fbd0 210 }
julieefreeman 0:2fa4b8d8fbd0 211 }
julieefreeman 0:2fa4b8d8fbd0 212 }
julieefreeman 0:2fa4b8d8fbd0 213
julieefreeman 0:2fa4b8d8fbd0 214 void display_coolant_temp(){ //displays temperature
julieefreeman 0:2fa4b8d8fbd0 215 float farenheit = atoi(temp_buffer) * 9/5 +32;
julieefreeman 0:2fa4b8d8fbd0 216 draw_thermometer();
julieefreeman 0:2fa4b8d8fbd0 217 lcd.color(0x909090);
julieefreeman 0:2fa4b8d8fbd0 218 lcd.text_width(2);
julieefreeman 0:2fa4b8d8fbd0 219 lcd.text_height(2);
julieefreeman 0:2fa4b8d8fbd0 220 lcd.locate(1,0);
julieefreeman 0:2fa4b8d8fbd0 221 lcd.printf("%s\n\r", "COOLANT\n TEMP.");
julieefreeman 0:2fa4b8d8fbd0 222 lcd.color(0x66CCFF);
julieefreeman 0:2fa4b8d8fbd0 223 lcd.locate(0,3);
julieefreeman 0:2fa4b8d8fbd0 224 lcd.printf("%3.0f \n\r", farenheit);
julieefreeman 0:2fa4b8d8fbd0 225 lcd.locate(0,4);
julieefreeman 0:2fa4b8d8fbd0 226 lcd.printf("oF\n\r");
julieefreeman 0:2fa4b8d8fbd0 227 }
julieefreeman 0:2fa4b8d8fbd0 228
julieefreeman 0:2fa4b8d8fbd0 229 void draw_thermometer(){ //draws temperature animation
julieefreeman 0:2fa4b8d8fbd0 230 lcd.rectangle(73,47,119,128,0xFFFFFF);
julieefreeman 0:2fa4b8d8fbd0 231 int new_temp = atoi(temp_buffer);
julieefreeman 0:2fa4b8d8fbd0 232 int height = 128-ceil((float)new_temp*.8);
julieefreeman 0:2fa4b8d8fbd0 233
julieefreeman 0:2fa4b8d8fbd0 234 if (new_temp > 100 && ui_temp!=new_temp) { //red
julieefreeman 0:2fa4b8d8fbd0 235 lcd.filled_rectangle(74,48,118,67,0xFF0000);
julieefreeman 0:2fa4b8d8fbd0 236 }
julieefreeman 0:2fa4b8d8fbd0 237 else if (new_temp > 75 && ui_temp!=new_temp) {
julieefreeman 0:2fa4b8d8fbd0 238 if (ui_temp>new_temp) lcd.filled_rectangle(74,48,118,height,0x000000);
julieefreeman 0:2fa4b8d8fbd0 239 lcd.filled_rectangle(74,height,118,67,0xFF0000);
julieefreeman 0:2fa4b8d8fbd0 240 }
julieefreeman 0:2fa4b8d8fbd0 241 else lcd.filled_rectangle(74,48,118,67,0x000000);
julieefreeman 0:2fa4b8d8fbd0 242 if (new_temp > 75 && ui_temp!=new_temp) { //dark orange
julieefreeman 0:2fa4b8d8fbd0 243 lcd.filled_rectangle(74,68,118,87,0xFF4719);
julieefreeman 0:2fa4b8d8fbd0 244 }
julieefreeman 0:2fa4b8d8fbd0 245 else if (new_temp > 50 && ui_temp!=new_temp) {
julieefreeman 0:2fa4b8d8fbd0 246 if (ui_temp>new_temp) lcd.filled_rectangle(74,68,118,height,0x000000);
julieefreeman 0:2fa4b8d8fbd0 247 lcd.filled_rectangle(74,height,118,87,0xFF4719);
julieefreeman 0:2fa4b8d8fbd0 248 }
julieefreeman 0:2fa4b8d8fbd0 249 else lcd.filled_rectangle(74,68,118,87,0x000000);
julieefreeman 0:2fa4b8d8fbd0 250 if (new_temp > 50 && ui_temp!=new_temp) { //orange
julieefreeman 0:2fa4b8d8fbd0 251 lcd.filled_rectangle(74,88,118,107,0xFF9933);
julieefreeman 0:2fa4b8d8fbd0 252 }
julieefreeman 0:2fa4b8d8fbd0 253 else if (new_temp > 25 && ui_temp!=new_temp) {
julieefreeman 0:2fa4b8d8fbd0 254 if (ui_temp>new_temp) lcd.filled_rectangle(74,88,118,height,0x000000);
julieefreeman 0:2fa4b8d8fbd0 255 lcd.filled_rectangle(74,height,118,107,0xFF9933);
julieefreeman 0:2fa4b8d8fbd0 256 }
julieefreeman 0:2fa4b8d8fbd0 257 else lcd.filled_rectangle(74,88,118,107,0x000000);
julieefreeman 0:2fa4b8d8fbd0 258 if (new_temp > 25 && ui_temp!=new_temp) { //yellow
julieefreeman 0:2fa4b8d8fbd0 259 lcd.filled_rectangle(74,108,118,128,0xFFFF99);
julieefreeman 0:2fa4b8d8fbd0 260 }
julieefreeman 0:2fa4b8d8fbd0 261 else if (new_temp > 0 && ui_temp!=new_temp) {
julieefreeman 0:2fa4b8d8fbd0 262 if (ui_temp>new_temp) lcd.filled_rectangle(74,108,118,height,0x000000);
julieefreeman 0:2fa4b8d8fbd0 263 lcd.filled_rectangle(74,height,118,128,0xFFFF99);
julieefreeman 0:2fa4b8d8fbd0 264 }
julieefreeman 0:2fa4b8d8fbd0 265 else lcd.filled_rectangle(74,108,118,128,0x000000);
julieefreeman 0:2fa4b8d8fbd0 266 ui_temp = new_temp;
julieefreeman 0:2fa4b8d8fbd0 267 }
julieefreeman 0:2fa4b8d8fbd0 268
julieefreeman 0:2fa4b8d8fbd0 269 void display_rpm(){ //displays rpm
julieefreeman 0:2fa4b8d8fbd0 270 draw_tachometer();
julieefreeman 0:2fa4b8d8fbd0 271 lcd.color(0x909090);
julieefreeman 0:2fa4b8d8fbd0 272 lcd.text_width(2);
julieefreeman 0:2fa4b8d8fbd0 273 lcd.text_height(2);
julieefreeman 0:2fa4b8d8fbd0 274 lcd.locate(1,0);
julieefreeman 0:2fa4b8d8fbd0 275 lcd.printf("%s\n\r", "ENG RPM");
julieefreeman 0:2fa4b8d8fbd0 276 lcd.color(0x66CCFF);
julieefreeman 0:2fa4b8d8fbd0 277 lcd.text_width(3);
julieefreeman 0:2fa4b8d8fbd0 278 lcd.text_height(3);
julieefreeman 0:2fa4b8d8fbd0 279 lcd.locate(1,1);
julieefreeman 0:2fa4b8d8fbd0 280 lcd.printf("%s \n\r", rpm_buffer);
julieefreeman 0:2fa4b8d8fbd0 281 }
julieefreeman 0:2fa4b8d8fbd0 282
julieefreeman 0:2fa4b8d8fbd0 283 void draw_tachometer(){ //draws rpm gauge
julieefreeman 0:2fa4b8d8fbd0 284 lcd.circle(64,120,60,0xFFFFFF);
julieefreeman 0:2fa4b8d8fbd0 285 int new_rpm = atoi(rpm_buffer);
julieefreeman 0:2fa4b8d8fbd0 286 int x = int(cos(float(new_rpm)*0.00041887902)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 287 int y = int(sin(float(new_rpm)*0.00041887902)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 288 if (ui_rpm!=new_rpm && ui_rpm!=-1) {
julieefreeman 0:2fa4b8d8fbd0 289 int old_x = int(cos(float(ui_rpm)*0.00041887902)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 290 int old_y = int(sin(float(ui_rpm)*0.00041887902)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 291 lcd.line(64-old_x,120-old_y,64,120,0x000000);
julieefreeman 0:2fa4b8d8fbd0 292 }
julieefreeman 0:2fa4b8d8fbd0 293 lcd.line(64-x,120-y,64,120,0xFF8C00);
julieefreeman 0:2fa4b8d8fbd0 294 ui_rpm = new_rpm;
julieefreeman 0:2fa4b8d8fbd0 295 }
julieefreeman 0:2fa4b8d8fbd0 296
julieefreeman 0:2fa4b8d8fbd0 297 void display_speed() { //displays speed
julieefreeman 0:2fa4b8d8fbd0 298 draw_speedometer();
julieefreeman 0:2fa4b8d8fbd0 299 lcd.color(0x909090);
julieefreeman 0:2fa4b8d8fbd0 300 lcd.text_width(2);
julieefreeman 0:2fa4b8d8fbd0 301 lcd.text_height(2);
julieefreeman 0:2fa4b8d8fbd0 302 lcd.locate(1,0);
julieefreeman 0:2fa4b8d8fbd0 303 lcd.printf("%s\n\r", "SPEED");
julieefreeman 0:2fa4b8d8fbd0 304 lcd.color(0x66CCFF);
julieefreeman 0:2fa4b8d8fbd0 305 lcd.text_width(3);
julieefreeman 0:2fa4b8d8fbd0 306 lcd.text_height(3);
julieefreeman 0:2fa4b8d8fbd0 307 lcd.locate(1,1);
julieefreeman 0:2fa4b8d8fbd0 308 lcd.printf("%3.0f \n\r", (((float)atoi(speed_buffer))*0.62));
julieefreeman 0:2fa4b8d8fbd0 309 }
julieefreeman 0:2fa4b8d8fbd0 310
julieefreeman 0:2fa4b8d8fbd0 311 void draw_speedometer(){ //draws gauge for speed
julieefreeman 0:2fa4b8d8fbd0 312 lcd.circle(64,120,60,0xFFFFFF);
julieefreeman 0:2fa4b8d8fbd0 313 float new_speed = atoi(speed_buffer) * 0.62;
julieefreeman 0:2fa4b8d8fbd0 314 int x = int(cos(new_speed*0.0314159265)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 315 int y = int(sin(new_speed*0.0314159265)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 316 if (ui_speed!=new_speed && ui_speed!=-1) {
julieefreeman 0:2fa4b8d8fbd0 317 int old_x = int(cos(ui_speed*0.0314159265)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 318 int old_y = int(sin(ui_speed*0.0314159265)*dial_len);
julieefreeman 0:2fa4b8d8fbd0 319 lcd.line(64-old_x,120-old_y,64,120,0x000000);
julieefreeman 0:2fa4b8d8fbd0 320 }
julieefreeman 0:2fa4b8d8fbd0 321 lcd.line(64-x,120-y,64,120,0xFF8C00);
julieefreeman 0:2fa4b8d8fbd0 322 ui_speed = new_speed;
julieefreeman 0:2fa4b8d8fbd0 323 }
julieefreeman 0:2fa4b8d8fbd0 324
julieefreeman 0:2fa4b8d8fbd0 325 void display_trip() { //displays data being output to SD card
julieefreeman 0:2fa4b8d8fbd0 326 lcd.color(0x909090);
julieefreeman 0:2fa4b8d8fbd0 327 lcd.text_width(2);
julieefreeman 0:2fa4b8d8fbd0 328 lcd.text_height(2);
julieefreeman 0:2fa4b8d8fbd0 329 lcd.locate(0,0);
julieefreeman 0:2fa4b8d8fbd0 330 lcd.printf("%s\n\r", "TOTALTIME");
julieefreeman 0:2fa4b8d8fbd0 331 lcd.color(0x66CCFF);
julieefreeman 0:2fa4b8d8fbd0 332 lcd.text_width(3);
julieefreeman 0:2fa4b8d8fbd0 333 lcd.text_height(3);
julieefreeman 0:2fa4b8d8fbd0 334 lcd.locate(0,1);
julieefreeman 0:2fa4b8d8fbd0 335 strftime(time_buff, 32, "%R", localtime(&seconds));
julieefreeman 0:2fa4b8d8fbd0 336 lcd.printf("%s \n\r", time_buff);
julieefreeman 0:2fa4b8d8fbd0 337
julieefreeman 0:2fa4b8d8fbd0 338 lcd.color(0x909090);
julieefreeman 0:2fa4b8d8fbd0 339 lcd.text_width(2);
julieefreeman 0:2fa4b8d8fbd0 340 lcd.text_height(2);
julieefreeman 0:2fa4b8d8fbd0 341 lcd.locate(0,4);
julieefreeman 0:2fa4b8d8fbd0 342 lcd.printf("%s\n\r", "DISTANCE");
julieefreeman 0:2fa4b8d8fbd0 343 lcd.color(0x66CCFF);
julieefreeman 0:2fa4b8d8fbd0 344 lcd.text_width(3);
julieefreeman 0:2fa4b8d8fbd0 345 lcd.text_height(3);
julieefreeman 0:2fa4b8d8fbd0 346 lcd.locate(0,4);
julieefreeman 0:2fa4b8d8fbd0 347 lcd.printf("%3.1f \n\r", dist);
julieefreeman 0:2fa4b8d8fbd0 348 }