Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of FBRDash by
main.cpp
00001 #include "mbed.h" 00002 #include "TextLCD.h" 00003 #include "PinDetect.h" 00004 #include "Menu.h" 00005 #include "Comms.h" 00006 #include "PCComms.h" 00007 #include "Gears.h" 00008 #include "LEDS.h" 00009 #include "bigchar.h" 00010 //Test comment 2 00011 //Refresh interval for LCD 00012 #define LCD_REFRESH_TIME 150000 00013 00014 //Refresh interval for rev LEDs 00015 #define REV_REFRESH_TIME 50000 00016 00017 //Warning lights 00018 DigitalOut warn[] = { (p20), (p19), (p27), (p18) }; 00019 00020 //mBED LEDs 00021 DigitalOut debug[] = { (LED1), (LED2), (LED3) }; 00022 00023 //Heartbeat LED 00024 DigitalOut heartbeat(LED4); 00025 00026 //Rev LEDS 00027 PwmOut leds[] = { (p24), (p25), (p26), (p23), (p22), (p21) }; 00028 00029 //LCD 00030 TextLCD lcd(p5, p6, p7, p8, p9, p10, p11); 00031 00032 //Tickers for refreshing 00033 Ticker lcdRefreshTicker; 00034 Ticker revRefreshTicker; 00035 00036 //Used to animate LEDs for testing 00037 Ticker increment; 00038 00039 //Main car state structure 00040 State car; 00041 00042 //Initialise CAN 00043 CAN can(p30, p29); 00044 00045 //Classes for various parts of the firmware 00046 Menu dashMenu(&lcd, p16, p17, p12); //*LCD, OK, Left, Right 00047 PCComms pc(&car); 00048 Gears gearButtons(p14, p13, p15, &car.gear, &pc); //Up, Neutral, Down, *Current Gear 00049 LEDS revs(leds); 00050 00051 //Refresh the rev LEDs and warning LEDs 00052 void revRefresh() 00053 { 00054 CANMessage msg; 00055 revs.refresh(car.rpm); 00056 00057 if(car.voltage<12){ 00058 warn[0]=1; 00059 }else{ 00060 warn[0]=0; 00061 } 00062 if(car.coolant_temp>110){ 00063 warn[1]=1; 00064 }else{ 00065 warn[1]=0; 00066 } 00067 if(car.rpm==0 and car.gear!=0){ 00068 warn[2]=1; 00069 }else{ 00070 warn[2]=0; 00071 } 00072 if(can.read(msg)) { 00073 if(msg.id==100 and msg.len==8){ 00074 car.rpm = msg.data[0] + (msg.data[1] << 8); 00075 car.throttle_pos = msg.data[2]; 00076 car.manifold_pres = msg.data[3]; 00077 car.air_temp = msg.data[4]; 00078 car.coolant_temp = msg.data[5]; 00079 car.lambda = msg.data[6]; 00080 } 00081 else if(msg.id==200 and msg.len==8){ 00082 car.speed = msg.data[0]; 00083 car.accel_x = msg.data[1]; 00084 car.accel_y = msg.data[2]; 00085 car.gear = msg.data[3]; 00086 car.oil_temp = msg.data[4]; 00087 car.voltage = msg.data[5]/16.0; 00088 } 00089 } 00090 00091 } 00092 00093 //Refresh the LCD 00094 void lcdRefresh() 00095 { 00096 //If menu off screen, display HUD 00097 if(dashMenu.display == false) 00098 { 00099 lcd.locate(0, 0); 00100 lcd.printf("%3.0fC%5.1dRPM", car.coolant_temp, car.rpm); 00101 lcd.locate(0, 1); 00102 lcd.printf("%2dMPH %3.1fV", car.speed, car.voltage); 00103 00104 write_bigchar(&lcd, 13, car.gear); 00105 } 00106 //Otherwise show menu 00107 else 00108 { 00109 dashMenu.refresh(); 00110 } 00111 00112 //Blink heartbeat 00113 heartbeat = !heartbeat; 00114 } 00115 00116 00117 //Used to animate LEDs for testing 00118 /*void doIncrement() 00119 { 00120 if(car.rpm < LIMIT && car.gear > 0) 00121 car.rpm++; 00122 }*/ 00123 00124 //Startup animation 00125 void selfTest() 00126 { 00127 lcd.printf(" FBR 2012"); 00128 lcd.locate(0,1); 00129 lcd.printf(" Ready to drive"); 00130 int offset = 0; 00131 int type=1; 00132 int blk=7; 00133 int from=1; 00134 int to=0; 00135 int id = offset*262144+type*32768+from*2048+to*128+blk*8; 00136 CANMessage msg; 00137 msg = CANMessage(id,0,8,CANData,CANExtended); 00138 lcd.cls(); 00139 lcd.printf("%x",id); 00140 can.reset(); 00141 if(can.write(msg)){ 00142 wait(0.01); 00143 lcd.printf(" %d errors",can.tderror()); 00144 can.reset(); 00145 while(can.read(msg)==false){ 00146 wait(0.1); 00147 } 00148 wait(0.5); 00149 lcd.printf(" %d errors",can.tderror()); 00150 } 00151 //Light up LEDs 00152 for(int i = 0; i < LEDS::NUM_LEDS; i++) 00153 { 00154 leds[i] = true; 00155 if(i < 4) 00156 warn[i] = true; 00157 wait(0.2); 00158 } 00159 00160 //Turn off LEDs 00161 for(int i = LEDS::NUM_LEDS - 1; i >= 0; i--) 00162 { 00163 leds[i] = false; 00164 if(i < 4) 00165 warn[i] = false; 00166 wait(0.2); 00167 } 00168 00169 lcd.cls(); 00170 } 00171 00172 int main() 00173 { 00174 //Initialise CAN 00175 can.frequency(500000); 00176 //Initialise state 00177 car.rpm = 0; 00178 car.gear = 2; 00179 car.speed = 0; 00180 car.coolant_temp = 0; 00181 car.throttle_pos = 0; 00182 car.manifold_pres = 0; 00183 car.air_temp = 0; 00184 car.lambda = 0; 00185 car.accel_x = 0; 00186 car.accel_y = 0; 00187 car.oil_temp = 0; 00188 car.voltage = 0; 00189 00190 //Set up menu 00191 dashMenu.addItem<float>("Coolant Temp ", "%12.1f\xDF\x43", &car.coolant_temp); // \xDF\x43 -> �C . Need code for C as otherwise it gets taken as hex digit. 00192 dashMenu.addItem<unsigned char>("Air Temp ", "%12d\xDF\x43", &car.air_temp); 00193 dashMenu.addItem<unsigned char>("Throttle Pos ", "%13d\xDF", &car.throttle_pos); 00194 dashMenu.addItem<unsigned char>("Manifold Pres ", "%10d psi", &car.manifold_pres); 00195 dashMenu.addItem<unsigned char>("Lambda ", "%14d", &car.lambda); 00196 dashMenu.addItem<unsigned char>("Oil Temp ", "%12d\xDF\x43", &car.oil_temp); 00197 00198 //Set up characters on LCS 00199 setup_bigchar(&lcd); 00200 00201 //Do bootup animation 00202 selfTest(); 00203 00204 //Start refresh tickers 00205 lcdRefreshTicker.attach_us(&lcdRefresh, LCD_REFRESH_TIME); 00206 revRefreshTicker.attach_us(&revRefresh, REV_REFRESH_TIME); 00207 //increment.attach(&doIncrement, 0.0005); 00208 00209 //Infinite loop - program is interrupt driven 00210 while(true) 00211 { 00212 __WFI(); 00213 } 00214 }
Generated on Wed Jul 13 2022 14:23:01 by
1.7.2
