Dashboard firmware for FBR2012

Dependencies:   mbed TextLCD PinDetect

Committer:
intrinseca
Date:
Tue Feb 19 22:05:53 2013 +0000
Revision:
8:e59084742552
Parent:
7:78cb2263290a
Update libraries

Who changed what in which revision?

UserRevisionLine numberNew contents of line
intrinseca 0:1f422ed56e0f 1 #include "mbed.h"
intrinseca 0:1f422ed56e0f 2 #include "TextLCD.h"
intrinseca 1:b3907b8d9f65 3 #include "PinDetect.h"
intrinseca 1:b3907b8d9f65 4 #include "Menu.h"
intrinseca 1:b3907b8d9f65 5 #include "Comms.h"
intrinseca 1:b3907b8d9f65 6 #include "PCComms.h"
intrinseca 6:11b2bbbe14b2 7 #include "CANComms.h"
intrinseca 1:b3907b8d9f65 8 #include "Gears.h"
intrinseca 1:b3907b8d9f65 9 #include "LEDS.h"
intrinseca 1:b3907b8d9f65 10 #include "bigchar.h"
tomontoast 4:53b28844b594 11 //Test comment 2
intrinseca 2:825f572902c6 12 //Refresh interval for LCD
intrinseca 1:b3907b8d9f65 13 #define LCD_REFRESH_TIME 150000
intrinseca 2:825f572902c6 14
intrinseca 2:825f572902c6 15 //Refresh interval for rev LEDs
intrinseca 1:b3907b8d9f65 16 #define REV_REFRESH_TIME 50000
intrinseca 1:b3907b8d9f65 17
intrinseca 2:825f572902c6 18 //Warning lights
intrinseca 1:b3907b8d9f65 19 DigitalOut warn[] = { (p20), (p19), (p27), (p18) };
intrinseca 2:825f572902c6 20
intrinseca 2:825f572902c6 21 //mBED LEDs
intrinseca 1:b3907b8d9f65 22 DigitalOut debug[] = { (LED1), (LED2), (LED3) };
intrinseca 0:1f422ed56e0f 23
intrinseca 2:825f572902c6 24 //Heartbeat LED
intrinseca 1:b3907b8d9f65 25 DigitalOut heartbeat(LED4);
intrinseca 1:b3907b8d9f65 26
intrinseca 2:825f572902c6 27 //Rev LEDS
intrinseca 1:b3907b8d9f65 28 PwmOut leds[] = { (p24), (p25), (p26), (p23), (p22), (p21) };
intrinseca 1:b3907b8d9f65 29
intrinseca 2:825f572902c6 30 //LCD
intrinseca 1:b3907b8d9f65 31 TextLCD lcd(p5, p6, p7, p8, p9, p10, p11);
intrinseca 0:1f422ed56e0f 32
intrinseca 2:825f572902c6 33 //Tickers for refreshing
intrinseca 1:b3907b8d9f65 34 Ticker lcdRefreshTicker;
intrinseca 1:b3907b8d9f65 35 Ticker revRefreshTicker;
intrinseca 2:825f572902c6 36
intrinseca 2:825f572902c6 37 //Used to animate LEDs for testing
intrinseca 1:b3907b8d9f65 38 Ticker increment;
intrinseca 1:b3907b8d9f65 39
intrinseca 2:825f572902c6 40 //Main car state structure
intrinseca 1:b3907b8d9f65 41 State car;
intrinseca 0:1f422ed56e0f 42
intrinseca 2:825f572902c6 43 //Classes for various parts of the firmware
tomontoast 5:177520d43c87 44 Menu dashMenu(&lcd, p16, p17, p12); //*LCD, OK, Left, Right
intrinseca 1:b3907b8d9f65 45 PCComms pc(&car);
intrinseca 6:11b2bbbe14b2 46 CANComms *can;
tomontoast 5:177520d43c87 47 Gears gearButtons(p14, p13, p15, &car.gear, &pc); //Up, Neutral, Down, *Current Gear
intrinseca 1:b3907b8d9f65 48 LEDS revs(leds);
intrinseca 0:1f422ed56e0f 49
intrinseca 2:825f572902c6 50 //Refresh the rev LEDs and warning LEDs
intrinseca 1:b3907b8d9f65 51 void revRefresh()
intrinseca 0:1f422ed56e0f 52 {
intrinseca 1:b3907b8d9f65 53 revs.refresh(car.rpm);
intrinseca 6:11b2bbbe14b2 54
intrinseca 6:11b2bbbe14b2 55 if(car.voltage < 12) {
intrinseca 7:78cb2263290a 56 warn[0] = 1;
intrinseca 6:11b2bbbe14b2 57 } else {
intrinseca 7:78cb2263290a 58 warn[0] = 0;
tomontoast 5:177520d43c87 59 }
intrinseca 7:78cb2263290a 60
intrinseca 7:78cb2263290a 61 if(car.coolant_temp > 110) {
intrinseca 7:78cb2263290a 62 warn[1] = 1;
intrinseca 6:11b2bbbe14b2 63 } else {
intrinseca 7:78cb2263290a 64 warn[1] = 0;
tomontoast 5:177520d43c87 65 }
intrinseca 7:78cb2263290a 66
intrinseca 7:78cb2263290a 67 if(car.rpm == 0 and car.gear != 0)
intrinseca 7:78cb2263290a 68 {
intrinseca 7:78cb2263290a 69 warn[2] = 1;
intrinseca 6:11b2bbbe14b2 70 } else {
intrinseca 7:78cb2263290a 71 warn[2] = 0;
intrinseca 1:b3907b8d9f65 72 }
intrinseca 0:1f422ed56e0f 73 }
intrinseca 0:1f422ed56e0f 74
intrinseca 2:825f572902c6 75 //Refresh the LCD
intrinseca 1:b3907b8d9f65 76 void lcdRefresh()
intrinseca 0:1f422ed56e0f 77 {
intrinseca 2:825f572902c6 78 //If menu off screen, display HUD
intrinseca 6:11b2bbbe14b2 79 if(dashMenu.display == false) {
intrinseca 1:b3907b8d9f65 80 lcd.locate(0, 0);
intrinseca 6:11b2bbbe14b2 81 lcd.printf("R:%-5.1d S:%-3d", car.rpm, car.speed);
intrinseca 1:b3907b8d9f65 82 lcd.locate(0, 1);
intrinseca 6:11b2bbbe14b2 83 lcd.printf("%-4.1fV %-4.1f\xDF\x43", car.voltage, car.coolant_temp);
intrinseca 6:11b2bbbe14b2 84
intrinseca 1:b3907b8d9f65 85 write_bigchar(&lcd, 13, car.gear);
intrinseca 1:b3907b8d9f65 86 }
intrinseca 2:825f572902c6 87 //Otherwise show menu
intrinseca 6:11b2bbbe14b2 88 else {
intrinseca 1:b3907b8d9f65 89 dashMenu.refresh();
intrinseca 6:11b2bbbe14b2 90 }
intrinseca 6:11b2bbbe14b2 91
intrinseca 2:825f572902c6 92 //Blink heartbeat
intrinseca 1:b3907b8d9f65 93 heartbeat = !heartbeat;
intrinseca 0:1f422ed56e0f 94 }
intrinseca 0:1f422ed56e0f 95
intrinseca 2:825f572902c6 96
intrinseca 2:825f572902c6 97 //Used to animate LEDs for testing
intrinseca 1:b3907b8d9f65 98 /*void doIncrement()
intrinseca 1:b3907b8d9f65 99 {
intrinseca 1:b3907b8d9f65 100 if(car.rpm < LIMIT && car.gear > 0)
intrinseca 1:b3907b8d9f65 101 car.rpm++;
intrinseca 1:b3907b8d9f65 102 }*/
intrinseca 0:1f422ed56e0f 103
intrinseca 2:825f572902c6 104 //Startup animation
intrinseca 1:b3907b8d9f65 105 void selfTest()
intrinseca 1:b3907b8d9f65 106 {
intrinseca 1:b3907b8d9f65 107 lcd.printf(" FBR 2012");
tomontoast 5:177520d43c87 108 lcd.locate(0,1);
tomontoast 5:177520d43c87 109 lcd.printf(" Ready to drive");
intrinseca 6:11b2bbbe14b2 110
intrinseca 2:825f572902c6 111 //Light up LEDs
intrinseca 6:11b2bbbe14b2 112 for(int i = 0; i < LEDS::NUM_LEDS; i++) {
intrinseca 1:b3907b8d9f65 113 leds[i] = true;
intrinseca 1:b3907b8d9f65 114 if(i < 4)
intrinseca 1:b3907b8d9f65 115 warn[i] = true;
intrinseca 6:11b2bbbe14b2 116 wait(0.1);
intrinseca 1:b3907b8d9f65 117 }
intrinseca 6:11b2bbbe14b2 118
intrinseca 2:825f572902c6 119 //Turn off LEDs
intrinseca 6:11b2bbbe14b2 120 for(int i = LEDS::NUM_LEDS - 1; i >= 0; i--) {
intrinseca 1:b3907b8d9f65 121 leds[i] = false;
intrinseca 1:b3907b8d9f65 122 if(i < 4)
intrinseca 1:b3907b8d9f65 123 warn[i] = false;
intrinseca 6:11b2bbbe14b2 124 wait(0.1);
intrinseca 1:b3907b8d9f65 125 }
intrinseca 6:11b2bbbe14b2 126
intrinseca 1:b3907b8d9f65 127 lcd.cls();
intrinseca 1:b3907b8d9f65 128 }
intrinseca 1:b3907b8d9f65 129
intrinseca 1:b3907b8d9f65 130 int main()
intrinseca 6:11b2bbbe14b2 131 {
intrinseca 6:11b2bbbe14b2 132 printf("\n");
intrinseca 6:11b2bbbe14b2 133 printf("FBRDash\n");
intrinseca 6:11b2bbbe14b2 134
intrinseca 2:825f572902c6 135 //Initialise state
tomontoast 5:177520d43c87 136 car.rpm = 0;
tomontoast 5:177520d43c87 137 car.gear = 2;
tomontoast 5:177520d43c87 138 car.speed = 0;
intrinseca 6:11b2bbbe14b2 139 car.coolant_temp = 0;
tomontoast 5:177520d43c87 140 car.throttle_pos = 0;
tomontoast 5:177520d43c87 141 car.manifold_pres = 0;
tomontoast 5:177520d43c87 142 car.air_temp = 0;
tomontoast 5:177520d43c87 143 car.lambda = 0;
tomontoast 5:177520d43c87 144 car.accel_x = 0;
tomontoast 5:177520d43c87 145 car.accel_y = 0;
tomontoast 5:177520d43c87 146 car.oil_temp = 0;
intrinseca 6:11b2bbbe14b2 147 car.voltage = 10.0;
intrinseca 1:b3907b8d9f65 148
intrinseca 2:825f572902c6 149 //Set up menu
intrinseca 1:b3907b8d9f65 150 dashMenu.addItem<float>("Coolant Temp ", "%12.1f\xDF\x43", &car.coolant_temp); // \xDF\x43 -> &#65533;C . Need code for C as otherwise it gets taken as hex digit.
intrinseca 1:b3907b8d9f65 151 dashMenu.addItem<unsigned char>("Air Temp ", "%12d\xDF\x43", &car.air_temp);
intrinseca 6:11b2bbbe14b2 152 dashMenu.addItem<float>("Throttle Pos ", "%12.1fd\xDF", &car.throttle_pos);
intrinseca 1:b3907b8d9f65 153 dashMenu.addItem<unsigned char>("Manifold Pres ", "%10d psi", &car.manifold_pres);
intrinseca 6:11b2bbbe14b2 154 dashMenu.addItem<unsigned char>("Lambda ", "%14d", &car.lambda);
intrinseca 1:b3907b8d9f65 155 dashMenu.addItem<unsigned char>("Oil Temp ", "%12d\xDF\x43", &car.oil_temp);
intrinseca 6:11b2bbbe14b2 156
intrinseca 2:825f572902c6 157 //Set up characters on LCS
intrinseca 1:b3907b8d9f65 158 setup_bigchar(&lcd);
intrinseca 6:11b2bbbe14b2 159
intrinseca 2:825f572902c6 160 //Do bootup animation
intrinseca 1:b3907b8d9f65 161 selfTest();
intrinseca 6:11b2bbbe14b2 162
intrinseca 2:825f572902c6 163 //Start refresh tickers
intrinseca 1:b3907b8d9f65 164 lcdRefreshTicker.attach_us(&lcdRefresh, LCD_REFRESH_TIME);
intrinseca 1:b3907b8d9f65 165 revRefreshTicker.attach_us(&revRefresh, REV_REFRESH_TIME);
intrinseca 1:b3907b8d9f65 166 //increment.attach(&doIncrement, 0.0005);
intrinseca 6:11b2bbbe14b2 167
intrinseca 6:11b2bbbe14b2 168 can = new CANComms(&car);
intrinseca 1:b3907b8d9f65 169
intrinseca 2:825f572902c6 170 //Infinite loop - program is interrupt driven
intrinseca 6:11b2bbbe14b2 171 while(true) {
intrinseca 1:b3907b8d9f65 172 __WFI();
intrinseca 0:1f422ed56e0f 173 }
intrinseca 1:b3907b8d9f65 174 }