diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Projekt Systementwicklung/OBD2_uart.c | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Master/Projekt Systementwicklung/OBD2_uart.c')
| -rw-r--r-- | Master/Projekt Systementwicklung/OBD2_uart.c | 1486 |
1 files changed, 1486 insertions, 0 deletions
diff --git a/Master/Projekt Systementwicklung/OBD2_uart.c b/Master/Projekt Systementwicklung/OBD2_uart.c new file mode 100644 index 0000000..455748b --- /dev/null +++ b/Master/Projekt Systementwicklung/OBD2_uart.c @@ -0,0 +1,1486 @@ +/** + * OBD2 Reader + * Avraham Aisenberg, Mike Andromalos + * Spring 2009- ECE 4760 + * Assistance from Bruce Land and Ruibing Wang + */ +/******************************************************************************************/ +/* Includes */ +#include <avr/io.h> +#include <avr/interrupt.h> +#include <util/delay.h> +#include <string.h> +#include <stdio.h> +#include "lcd_lib.h" +#include <math.h> + +/* Global/System Constants */ +#define TRUE 1 +#define FALSE 0 + +#define sbi(data,bit) (data |= (1<<bit)) // Set Bit +#define cbi(data,bit) (data &= ~(1<<bit)) // Clear Bit +#define gbi(data,bit) (data & (1<<bit)) // Get Bit +#define tbi(data,bit) (data ^= (1<<bit)) // Toggle Bit + +//State Machine States +#define St_Initial 1 +#define St_Trans_EchoOff 2 +#define St_Rec_EchoOff 3 +#define St_Trans_Reset 4 +#define St_Rec_Reset 5 +#define St_Print_Menu 6 +#define St_Print_Gauges_Eng 7 +#define St_Trans_Speed 8 +#define St_Rec_Speed 9 +#define St_Trans_Rpm 10 +#define St_Rec_Rpm 11 +#define St_Trans_Volt 12 +#define St_Rec_Volt 13 +#define St_Trans_Mpg 14 +#define St_Rec_Mpg 15 +#define St_Print_Units 16 +#define St_Print_Time_Trials 17 +#define St_Print_Gauges_Metric 18 +#define St_Print_Engine_Codes 19 +#define St_Print_Disclaimer 20 +#define St_Print_Timer60 21 +#define St_Print_Timer_Mile 22 +#define St_Print_About 23 +#define St_Trans_Vin 24 +#define St_Rec_Vin 25 +#define St_Trans_SN 26 +#define St_Rec_SN 27 +#define St_Trans_Clear 28 +#define St_Rec_Clear 29 +#define St_Trans_Engine_Temp 30 +#define St_Rec_Engine_Temp 31 +#define St_Codes_Cleared 32 +#define St_Codes_Not_Cleared 33 +#define St_Trans_Check_Engine 34 +#define St_Rec_Check_Engine 35 +#define St_Print_Check_Engine 36 + +//State machine state names for debounce +#define Release 1 +#define DebouncePress 2 +#define StillPressed 3 +#define DebounceRelease 4 + +//Conversion Macros +//Data conversion macros +#define rpm_convert(a,b) floor(((256*(a))+(b))/4); +#define airflowrate_convert(a,b) ((256*(a))+(b))/100; +#define mpg_convert(a,b) (710.733*(a))/(b); +#define speed_convert(a) floor((a)*(0.621371192)); +#define temp_convert(a) floor(((a)*(1.8))+32); + + +//Buttons +//Button +#define Up 14 //Green- Up +#define Down 13 //Yellow- Down +#define Left 11 //Orange- Left +#define Right 7 //Brown- Right + + +/* Global Variables */ +uint8_t mcu_state; +uint8_t rx_buffer[128]; +uint8_t rx_buffer_index; +uint8_t lcd_buffer[17]; // LCD display buffer +enum {MCU_STATE_IDLE, MCU_STATE_TX}; +uint8_t error_buffer[40]; + +//Meassages +uint8_t Reset[4] = "ATZ\r"; +uint8_t EchoOff[5] = "ATE0\r"; +uint8_t Speed[6] = "010D1\r"; +uint8_t Rpm[6] = "010C1\r"; +uint8_t Volt[5] = "ATRV\r"; +uint8_t Maf[6] = "01101\r"; +uint8_t Info[4] = "ATI\r"; +uint8_t Serial[5] = "AT@2\r"; +uint8_t Vin[6] = "09025\r"; +uint8_t Clear[3] = "04\r"; +uint8_t EngineTemp[6] = "01051\r"; +uint8_t Check[3] = "03\r"; + +/* Prototype Functions */ +void init_mcu(void); +void init_uart0_rxtx(void); +void uart0_send_byte_array(uint8_t *data, uint8_t length); +void uart0_send_byte(uint8_t data); +void uart0_parse_rx(uint8_t rx_data); +void init_lcd(void); +void initialize(void); +void state_machine(void); +void debounce_machine(void); + +//State Machine Marker +int state; + +//Car data +int mph, rpm, mpg; +int kph, kpl; +int temp_rpm1, temp_rpm2; +int maf, temp_maf1, temp_maf2; +int mile_speed, mile_time; +int time60; +int temperature; +int error1, error2, error3, error4, error5, error6, error7; + +//Debounce State Machine Variables +unsigned char maybe, PushState; +unsigned char button_pressed, button_mask; + +//Menu Surfing Flags +unsigned char menu_cursor; +unsigned char menu; +unsigned char metric_flag; //0 - English, 1 - Metric SI + +unsigned char sn; +unsigned char serial_buffer[14]; +unsigned char about_flag; + +//Time Keeping +volatile unsigned int milliseconds; // 0-60 timer +volatile unsigned int seconds; +unsigned int milli_temp; +unsigned char trial_flag; +unsigned char timeOn; +volatile char button_timer; + +/******************************************************************************************/ +//timer 0 overflow ISR +ISR (TIMER0_COMPA_vect){ + if(timeOn == 1){ + milliseconds++; + if(milliseconds%1000 == 0){ + seconds = seconds + 1; + milliseconds = 0; + } + } + if (button_timer != 0) + button_timer--; +} + +/******************************************************************************************/ +/** + * UART transmission function for byte arrays + * + * Can be used to transmitt strings + * Length terminated (versus null terminated) + */ +void uart0_send_byte_array(uint8_t *data, uint8_t length) { + for (uint8_t i=0; i<length; i++) { + while ( !( UCSR0A & (1<<UDRE0)) ); // Wait for empty buffer + UDR0 = *data++; // Put data into buffer, sends the data + } +} + +//Parsing function based on current state +void uart0_parse_rx(uint8_t rx_data) { + + if (state == St_Rec_EchoOff){ + if (rx_data == 0x3E) { + rx_buffer_index = 0; + state = St_Trans_Reset; + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + else if (state == St_Rec_Speed){ + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + trial_flag = 0; + timeOn = 0; + milliseconds = 0; + seconds = 0; + + LCDGotoXY(0,0); + LCDsendChar(7); + + kph = 0; + mph = 0; + rpm = 0; + mpg = 0; + } + if (rx_data == 0x3E) { + sscanf(rx_buffer,"%*s %*s %X",&kph); + LCDGotoXY(6,0); + if (menu == 8) { + mph = speed_convert(kph); + if ((mph > 0) && (trial_flag == 0)){ + LCDGotoXY(0,2); + sprintf(lcd_buffer, "TO BEGIN: SLOW TO 0"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + state = St_Trans_Speed; + } + else if ((mph == 0) && (trial_flag == 0)){ + LCDGotoXY(0,1); + if(mph <10) + sprintf(lcd_buffer, "MPH: %d", mph); + else if ((mph >= 10) && (mph < 100)) + sprintf(lcd_buffer, "MPH: %d", mph); + else + sprintf(lcd_buffer, "MPH: %d", mph); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,2); + sprintf(lcd_buffer,"PROCEED WHEN READY"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + trial_flag = 1; + } + else if ((mph > 0) && (trial_flag == 1) && (timeOn == 0)) { + timeOn = 1; + } + else if ((mph >= 0) && (timeOn == 1)){ + if(mph < 60 && seconds <60){ + LCDGotoXY(0,1); + if(mph <10) + sprintf(lcd_buffer, "MPH: %d", mph); + else if ((mph >= 10) && (mph < 100)) + sprintf(lcd_buffer, "MPH: %d", mph); + else + sprintf(lcd_buffer, "MPH: %d", mph); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + LCDGotoXY(0,2); + if(seconds < 10){ + if(milliseconds<10){ + sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);} + else if(milliseconds<100){ + sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);} + else{ + sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);} + } + else { + if(milliseconds<10){ + sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);} + else if(milliseconds<100){ + sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);} + else{ + sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);} + } + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if ((mph >= 60) || (seconds >= 60)){ + timeOn = 0; + LCDGotoXY(0,2); + if(seconds < 10){ + if(milliseconds<10){ + sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);} + else if(milliseconds<100){ + sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);} + else{ + sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);} + } + else { + if(milliseconds<10){ + sprintf(lcd_buffer, "Time: %u.00%u seconds",seconds,milliseconds);} + else if(milliseconds<100){ + sprintf(lcd_buffer, "Time: %u.0%u seconds",seconds,milliseconds);} + else{ + sprintf(lcd_buffer, "Time: %u.%u seconds",seconds,milliseconds);} + } + LCDstring(lcd_buffer, strlen(lcd_buffer)); + LCDGotoXY(0,1); + if(mph <10) + sprintf(lcd_buffer, "MPH: %d", mph); + else if ((mph >= 10) && (mph < 100)) + sprintf(lcd_buffer, "MPH: %d", mph); + else + sprintf(lcd_buffer, "MPH: %d", mph); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + trial_flag = 3; + } + } + rx_buffer_index = 0; + state = St_Print_Timer60; + } + else if(metric_flag == 0){ + mph = speed_convert(kph); + if(mph <10) + sprintf(lcd_buffer, " %d", mph); + else if ((mph >= 10) && (mph < 100)) + sprintf(lcd_buffer, " %d", mph); + else + sprintf(lcd_buffer, " %d", mph); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + state = St_Trans_Rpm; + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + LCDGotoXY(0,0); + LCDsendChar(7); + mph = 0; + rpm = 0; + mpg = 0; + } + } + else if(metric_flag == 1){ + if(kph <10) + sprintf(lcd_buffer, " %d", kph); + else if ((kph >= 10) && (kph < 100)) + sprintf(lcd_buffer, " %d", kph); + else + sprintf(lcd_buffer, " %d", kph); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + state = St_Trans_Rpm; + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + + LCDGotoXY(0,0); + LCDsendChar(7); + + mph = 0; + rpm = 0; + mpg = 0; + } + } + rx_buffer_index = 0; + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + else if (state == St_Rec_Rpm){ + if (rx_data == 0x3E) { + sscanf(rx_buffer,"%*s %*s %X %X",&temp_rpm1,&temp_rpm2); + rpm = rpm_convert(temp_rpm1,temp_rpm2); + LCDGotoXY(16,0); + if(rpm<1000) + sprintf(lcd_buffer, " %d", rpm); + else + sprintf(lcd_buffer, "%d", rpm); + + LCDstring(lcd_buffer, strlen(lcd_buffer)); + rx_buffer_index = 0; + state = St_Trans_Volt; + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + LCDGotoXY(0,0); + LCDsendChar(7); + mph = 0; + rpm = 0; + mpg = 0; + } + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + else if (state == St_Rec_Mpg){ + if (rx_data == 0x3E) { + sscanf(rx_buffer,"%*s %*s %X %X",&temp_maf1,&temp_maf2); + maf = airflowrate_convert(temp_maf1,temp_maf2); + mpg = mpg_convert(mph,maf); + LCDGotoXY(16,1); + sprintf(lcd_buffer, "%2.1f", mpg); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + rx_buffer_index = 0; + state = St_Trans_Speed; + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + else if (state == St_Rec_Volt){ + if (rx_data == 0x3E){ + rx_buffer_index = 0; + state = St_Trans_Engine_Temp; + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + LCDGotoXY(0,0); + LCDsendChar(7); + mph = 0; + rpm = 0; + mpg = 0; + } + } + if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + if (rx_data == 0x56) { + LCDGotoXY(5,1); + sprintf(lcd_buffer, "%c%c%c%c", rx_buffer[0],rx_buffer[1],rx_buffer[2],rx_buffer[3]); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + else if (state == St_Rec_Reset){ + if (rx_data == 0x3E) { + LCDGotoXY(5,3); + sprintf(lcd_buffer, "%s", rx_buffer); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + rx_buffer_index = 0; + PORTB = 0xFF; + state = St_Print_Menu; + _delay_ms(1000); + LCDclr(); + LCDGotoXY(0,0); + LCDsendChar(7); + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + else if (state == St_Rec_SN){ + if (about_flag == 1){ + LCDGotoXY(5,2); + LCDstring(serial_buffer, strlen(serial_buffer)); + state = St_Print_About; + } + else if(about_flag == 0){ + if (rx_data == 0x3E) { + menu_cursor = 2; + LCDGotoXY(5,2); + sprintf(serial_buffer, "%c%c%c%c%c%c%c%c%c%c%c%c", rx_buffer[0],rx_buffer[1],rx_buffer[2],rx_buffer[3],rx_buffer[4],rx_buffer[5],rx_buffer[6],rx_buffer[7],rx_buffer[8],rx_buffer[9],rx_buffer[10],rx_buffer[11]); + LCDstring(serial_buffer, strlen(serial_buffer)); + rx_buffer_index = 0; + about_flag = 1; + state = St_Print_About; + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + } + else if (state == St_Rec_Clear){ + if (rx_data == 0x3E) { + if (rx_buffer[0] == 0x34) + state = St_Codes_Cleared; + else + state = St_Codes_Not_Cleared; + LCDclr(); + rx_buffer_index = 0; + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + else if(state == St_Rec_Engine_Temp){ + if (rx_data == 0x3E) { + sscanf(rx_buffer,"%*s %*s %X",&temperature); + rx_buffer_index = 0; + if(metric_flag == 0){ + temperature = temp_convert(temperature - 40); + } + else + temperature = temperature - 40; + LCDGotoXY(15 ,1); + if (temperature <= 10) + sprintf(lcd_buffer,"%d",temperature); + else if (temperature<0 && temperature>10) + sprintf(lcd_buffer," %d", temperature); + else if((temperature >= 0) && (temperature <10)) + sprintf(lcd_buffer, " %d", (temperature)); + else if ((temperature >= 10) && (temperature < 100)) + sprintf(lcd_buffer, " %d", temperature); + else + sprintf(lcd_buffer, "%d", temperature); + + LCDstring(lcd_buffer, strlen(lcd_buffer)); + state = St_Trans_Speed; + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } + else if(state == St_Rec_Check_Engine){ + if (rx_data == 0x3E){ + sscanf(rx_buffer,"%X %X %X %X %X %X %X",&error1, &error2, &error3, &error4, &error5, &error6, &error7); + if (error1 = 0x43){ + state = St_Print_Check_Engine; + } + else { + LCDGotoXY(0,0); + sprintf(lcd_buffer,"********************"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,0); + sprintf(lcd_buffer,"* NO CODES *"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,0); + sprintf(lcd_buffer,"* DETECTED *"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"********************"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + _delay_ms(1000); + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + LCDGotoXY(0,0); + LCDsendChar(7); + } + rx_buffer_index = 0; + } + else if (rx_data >= 0x20 && rx_data <= 0x5F) { + rx_buffer[rx_buffer_index++] = rx_data; + } + } +} + +/******************************************************************************************/ +/** + * Main program + */ +int main(void) { + initialize(); + // Main program loop + while(1) { + if ((button_timer == 0) && (PINA != 15)){ + button_pressed = PINA; + button_timer = 0; + } + else + button_pressed = 15; + state_machine(); + } +} +/******************************************************************************************/ +void initialize(void){ + rx_buffer_index = 0; + DDRD = 0xFF; + PORTD = 0xFF; + + //init pushbuttonsf + DDRA = 0xF0; + PushState = Release; + + init_uart0_rxtx(); // Initialize UART TX + init_lcd(); + + state = St_Initial; + mph = 0; + rpm = 0; + mpg = 0; + kph = 0; + kpl = 0; + temp_rpm1 = 0; + temp_rpm2 = 0; + maf = 0; + temperature = 0; + milli_temp = 0; + seconds = 0; + about_flag = 0; + + menu = 1; + menu_cursor = 1; + button_pressed = 0; + metric_flag = 0; + trial_flag = 0; + timeOn = 0; + button_timer = 0; + + // set up timer 0 + OCR0A = 249; // clear after 250 counts + TIMSK0 = (1<<OCIE0A) ; //turn on timer 0 cmp-match ISR + + // turn on timer 0 clear on match + TCCR0A = (1<<WGM01) ; + // timer 0 prescalar to 64 + TCCR0B = 3 ; + + sei(); +} +/******************************************************************************************/ +void state_machine(void){ + + switch(state){ + case St_Initial: + LCDGotoXY(6,0); + sprintf(lcd_buffer,"OBD2 LCD"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(4,1); + sprintf(lcd_buffer,"AMA64, MAA66"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(3,2); + sprintf(lcd_buffer,"Copyright 2009"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + _delay_ms(2000); + state = St_Trans_EchoOff; + + break; + + case St_Trans_EchoOff: + uart0_send_byte_array(EchoOff,5); + _delay_ms(500); + state = St_Rec_EchoOff; + + break; + + case St_Rec_EchoOff: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + + break; + + case St_Trans_Reset: + uart0_send_byte_array(Info,4); + state = St_Rec_Reset; + + break; + + case St_Rec_Reset: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + + break; + + case St_Print_Menu: + rx_buffer_index = 0; + kph = 0; + mph = 0; + trial_flag = 0; + timeOn = 0; + milliseconds = 0; + seconds = 0; + + if(button_pressed == Up){ + if(menu_cursor == 1){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 5; + LCDGotoXY(0,0); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 2){ + LCDGotoXY(0,0); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 3){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 2; + LCDGotoXY(0,2); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 4){ + LCDGotoXY(0,2); + LCDsendChar(7); + menu_cursor = 3; + LCDGotoXY(19,0); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 5){ + LCDGotoXY(19,0); + LCDsendChar(6); + menu_cursor = 4; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + else if(button_pressed == Down){ + if(menu_cursor == 1){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 2; + LCDGotoXY(0,0); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 2){ + LCDGotoXY(0,2); + LCDsendChar(7); + menu_cursor = 3; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 3){ + LCDGotoXY(19,0); + LCDsendChar(6); + menu_cursor = 4; + LCDGotoXY(0,2); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 4){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 5; + LCDGotoXY(19,0); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 5){ + LCDGotoXY(0,0); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + LCDGotoXY(1,0); + sprintf(lcd_buffer,"GAUGES TRIALS"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(1,1); + sprintf(lcd_buffer,"DIAGNOSTICS UNITS"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(1,2); + sprintf(lcd_buffer,"ABOUT"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(15,3); + sprintf(lcd_buffer,"ENTER"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(button_pressed == Right){ + if(menu_cursor == 1){ + if(metric_flag == 0){ + state = St_Print_Gauges_Eng; + menu = 2; + } + else if (metric_flag == 1){ + state = St_Print_Gauges_Metric; + menu = 7; + } + menu_cursor = 1; + LCDclr(); + } + else if(menu_cursor == 2){ + state = St_Print_Engine_Codes; + menu = 3; + menu_cursor = 1; + LCDclr(); + LCDGotoXY(0,1); + LCDsendChar(7); + } + else if(menu_cursor == 3){ + state = St_Print_About; + menu = 4; + menu_cursor = 1; + LCDclr(); + } + else if(menu_cursor == 4){ + state = St_Print_Time_Trials; + menu = 5; + menu_cursor = 1; + LCDclr(); + LCDGotoXY(0,1); + LCDsendChar(7); + } + else if(menu_cursor == 5){ + LCDclr(); + state = St_Print_Units; + menu = 6; + menu_cursor = 1; + LCDGotoXY(0,1); + LCDsendChar(7); + } + } + break; + + case St_Print_Gauges_Eng: + + LCDGotoXY(0,0); + sprintf(lcd_buffer,"MPH RPM"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,1); + sprintf(lcd_buffer,"VOLT TEMP"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(18,1); + sprintf(lcd_buffer,"ßF"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + state = St_Trans_Speed; + break; + + case St_Trans_Speed: + uart0_send_byte_array(Speed,6); + state = St_Rec_Speed; + break; + + case St_Rec_Speed: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + break; + + case St_Trans_Rpm: + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + + LCDGotoXY(0,0); + LCDsendChar(7); + + mph = 0; + rpm = 0; + mpg = 0; + } + + uart0_send_byte_array(Rpm,6); + state = St_Rec_Rpm; + + break; + + case St_Rec_Rpm: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + break; + + case St_Trans_Volt: + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + + LCDGotoXY(0,0); + LCDsendChar(7); + + mph = 0; + rpm = 0; + mpg = 0; + } + + uart0_send_byte_array(Volt,5); + state = St_Rec_Volt; + break; + + case St_Rec_Volt: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + break; + + case St_Trans_Mpg: + uart0_send_byte_array(Volt,5); + state = St_Rec_Mpg; + break; + + case St_Rec_Mpg: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + break; + + case St_Print_Units: + + LCDGotoXY(3,0); + sprintf(lcd_buffer,"UNIT SELECTION"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(1,1); + sprintf(lcd_buffer,"ENGLISH METRIC"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(metric_flag == 0){ + LCDGotoXY(0,2); + sprintf(lcd_buffer,"Current: English"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(metric_flag == 1){ + LCDGotoXY(0,2); + sprintf(lcd_buffer,"Current: Metric"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU SELECT"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(button_pressed == Up){ + if(menu_cursor == 1){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 2; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 2){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + else if(button_pressed == Down){ + if(menu_cursor == 1){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 2; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 2){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + else if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + LCDGotoXY(0,0); + LCDsendChar(7); + menu = 1; + menu_cursor = 1; + } + + else if(button_pressed == Right){ + if(menu_cursor == 1) + metric_flag = 0; + else if (menu_cursor == 2) + metric_flag = 1; + } + break; + + case St_Print_Time_Trials: + + if(button_pressed == Up){ + if(menu_cursor == 1){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 2; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 2){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + else if(button_pressed == Down){ + if(menu_cursor == 1){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 2; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else if(menu_cursor == 2){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + LCDGotoXY(4,0); + sprintf(lcd_buffer,"Timed Trials"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(1,1); + sprintf(lcd_buffer,"0-60 mph "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU BEGIN"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + + LCDGotoXY(0,0); + LCDsendChar(7); + } + else if(button_pressed == Right){ + if(menu_cursor == 1){ + state = St_Print_Timer60; + menu = 8; + LCDclr(); + } + else if(menu_cursor == 2){ + state = St_Print_Timer_Mile; + LCDclr(); + } + } + break; + + case St_Print_Gauges_Metric: + + LCDGotoXY(0,0); + sprintf(lcd_buffer,"KPH RPM"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,1); + sprintf(lcd_buffer,"VOLT TEMP"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(18,1); + sprintf(lcd_buffer,"ßC"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + LCDGotoXY(0,0); + LCDsendChar(7); + kph = 0; + rpm = 0; + } + state = St_Trans_Speed; + break; + + case St_Print_Engine_Codes: + + if(button_pressed == Up){ + if(menu_cursor == 1){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 2; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + + else if(menu_cursor == 2){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + + else if(button_pressed == Down){ + if(menu_cursor == 1){ + LCDGotoXY(19,1); + LCDsendChar(6); + menu_cursor = 2; + LCDGotoXY(0,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + + else if(menu_cursor == 2){ + LCDGotoXY(0,1); + LCDsendChar(7); + menu_cursor = 1; + LCDGotoXY(19,1); + sprintf(lcd_buffer," "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + } + LCDGotoXY(0,0); + sprintf(lcd_buffer," ENGINE CODES"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(1,1); + sprintf(lcd_buffer,"CHECK CLEAR"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU ENTER"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + LCDGotoXY(0,0); + LCDsendChar(7); + menu = 1; + menu_cursor = 1; + } + + else if(button_pressed == Right){ + if(menu_cursor == 1){ + state = St_Trans_Check_Engine; + LCDclr(); + } + else if (menu_cursor == 2){ + state = St_Print_Disclaimer; + LCDclr(); + } + } + break; + + case St_Print_Disclaimer: + + LCDGotoXY(0,0); + sprintf(lcd_buffer,"-----DISCLAIMER-----"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(3,1); + sprintf(lcd_buffer,"HAS THE ENGINE"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(3,2); + sprintf(lcd_buffer,"BEEN REPAIRED?"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"YES NO"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(button_pressed == Left){ + state = St_Trans_Clear; + } + else if (button_pressed == Right){ + state = St_Print_Engine_Codes; + LCDclr(); + LCDGotoXY(0,1); + LCDsendChar(7); + menu = 1; + menu_cursor = 1; + } + break; + + case St_Print_Timer60: + + if(trial_flag == 3){ + state = St_Print_Timer60; + LCDGotoXY(0,0); + sprintf(lcd_buffer,"-TEST RUN COMPLETED-"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + else{ + state = St_Trans_Speed; + LCDGotoXY(0,0); + sprintf(lcd_buffer,"--0 to 60 MPH TIME--"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + } + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + trial_flag = 0; + timeOn = 0; + milliseconds = 0; + seconds = 0; + + LCDGotoXY(0,0); + LCDsendChar(7); + + mph = 0; + kph = 0; + } + break; + + case St_Print_Timer_Mile: + + LCDGotoXY(3,0); + sprintf(lcd_buffer,"1/4 MILE TRIAL"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(2,1); + sprintf(lcd_buffer,"%i seconds",mile_time); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(3,2); + sprintf(lcd_buffer,"%i MPH", mile_speed); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU STOP"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + break; + + case St_Print_About: + rx_buffer_index = 0; + if(menu_cursor == 1){ + LCDGotoXY(5,0); + sprintf(lcd_buffer,"ID NUMBERS"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,2); + sprintf(lcd_buffer,"S/N: "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + state = St_Trans_SN; + } + + else if (menu_cursor == 2) + St_Print_About; + if(button_pressed == Left){ + state = St_Print_Menu; + menu = 1; + menu_cursor = 1; + LCDclr(); + LCDGotoXY(0,0); + LCDsendChar(7); + } + break; + + case St_Trans_SN: + rx_buffer_index = 0; + uart0_send_byte_array(Serial,5); + state = St_Rec_SN; + + break; + + case St_Rec_SN: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + break; + + case St_Trans_Clear: + uart0_send_byte_array(Clear,3); + state = St_Rec_Clear; + break; + + case St_Rec_Clear: + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + break; + + case St_Trans_Engine_Temp: + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + + LCDGotoXY(0,0); + LCDsendChar(7); + + mph = 0; + rpm = 0; + mpg = 0; + } + + uart0_send_byte_array(EngineTemp,6); + state = St_Rec_Engine_Temp; + + break; + + case St_Rec_Engine_Temp: + + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + + break; + + case St_Codes_Cleared: + + LCDGotoXY(0,0); + sprintf(lcd_buffer,"********************"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,1); + sprintf(lcd_buffer,"* CODE CLEAR *"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,2); + sprintf(lcd_buffer,"* SUCCESSFUL *"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"********************"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + _delay_ms(500); + + state = St_Print_Menu; + LCDclr(); + LCDGotoXY(0,0); + LCDsendChar(7); + menu = 1; + menu_cursor = 1; + + break; + + case St_Codes_Not_Cleared: + + LCDGotoXY(0,0); + sprintf(lcd_buffer,"********************"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,1); + sprintf(lcd_buffer,"* CODE CLEAR *"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,2); + sprintf(lcd_buffer,"%X", rx_buffer); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"********************"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + _delay_ms(500); + + state = St_Print_Menu; + LCDclr(); + LCDGotoXY(0,0); + LCDsendChar(7); + menu = 1; + menu_cursor = 1; + + break; + + case St_Trans_Check_Engine: + + uart0_send_byte_array(Check,3); + state = St_Rec_Check_Engine; + + break; + + case St_Rec_Check_Engine: + + if(UCSR0A & (1<<RXC0)) { + uart0_parse_rx(UDR0); + } + + break; + + case St_Print_Check_Engine: + + LCDGotoXY(0,0); + sprintf(lcd_buffer," Engine Codes "); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,1); + sprintf(lcd_buffer," %X%X %X%X %X%X ",error1,error2,error3,error4,error5,error6,error7); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + LCDGotoXY(0,3); + sprintf(lcd_buffer,"MENU"); + LCDstring(lcd_buffer, strlen(lcd_buffer)); + + if(button_pressed == Left){ + state = St_Print_Menu; + LCDclr(); + menu = 1; + menu_cursor = 1; + + LCDGotoXY(0,0); + LCDsendChar(7); + } + break; + } +} + +void init_lcd(void) { + LCDinit(); //initialize the display + LCDcursorOFF(); + LCDclr(); //clear the display +} + +/******************************************************************************************/ +/** + * Initialize UART RX + */ +void init_uart0_rxtx(void){ + UBRR0L = 25; // 38400 Baud Rate for 16 MHz Clock + + UCSR0A = 0b00000000;// 7 - UART RX complete flag + // 6 - UART TX complete flag + // 5 - UART DRE flag + // 4 - Frame error flag + // 3 - Data overrun flag + // 2 - Parity error flag + // 1 - Double UART speed mode + // 0 - Multi processor communication mode + + UCSR0B = 0b00011000; // 7 - RX Complete Interrupt Enable + // 6 - TX Complete Interrupt Enable + // 5 - UART DRE Interrupt Enable + // 4 - Enable receiver + // 3 - Enable transmitter + // 2 - Character size + // 1:0 - Ninth data bit + + UCSR0C = 0b00000110;// 7:6 - UART Mode Select + // 00 - Asynchronous UART + // 01 - Synchronous UART + // 10 - Reserved + // 11 - Master SPI + // 5:4 - Parity mode + // 00 - Disabled + // 01 - Reserved + // 10 - Enabled, Even + // 11 - Enabled, Odd + // 3 - Select stop bit length + // 0 - 1-bit + // 1 - 2-bit + // 2:1 - Character size, with UCSRB.2 + // 000 - 5 bit + // 001 - 6 bit + // 010 - 7 bit + // 011 - 8 bit + // 100 - Reserved + // 101 - Reserved + // 110 - Reserved + // 111 - 9 bit + // 0 - Select clock polarity + // 0 - Rising XCK edge + // 1 - Falling XCK edge +} + |
