Dashboard firmware for FBR2012

Dependencies:   mbed TextLCD PinDetect

Committer:
intrinseca
Date:
Wed Oct 17 16:08:51 2012 +0000
Revision:
6:11b2bbbe14b2
Parent:
5:177520d43c87
Child:
7:78cb2263290a
Add CANComms

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) {
tomontoast 5:177520d43c87 56 warn[0]=1;
intrinseca 6:11b2bbbe14b2 57 } else {
tomontoast 5:177520d43c87 58 warn[0]=0;
tomontoast 5:177520d43c87 59 }
intrinseca 6:11b2bbbe14b2 60 if(car.coolant_temp>110) {
tomontoast 5:177520d43c87 61 warn[1]=1;
intrinseca 6:11b2bbbe14b2 62 } else {
tomontoast 5:177520d43c87 63 warn[1]=0;
tomontoast 5:177520d43c87 64 }
intrinseca 6:11b2bbbe14b2 65 if(car.rpm==0 and car.gear!=0) {
tomontoast 5:177520d43c87 66 warn[2]=1;
intrinseca 6:11b2bbbe14b2 67 } else {
tomontoast 5:177520d43c87 68 warn[2]=0;
intrinseca 1:b3907b8d9f65 69 }
intrinseca 0:1f422ed56e0f 70 }
intrinseca 0:1f422ed56e0f 71
intrinseca 2:825f572902c6 72 //Refresh the LCD
intrinseca 1:b3907b8d9f65 73 void lcdRefresh()
intrinseca 0:1f422ed56e0f 74 {
intrinseca 2:825f572902c6 75 //If menu off screen, display HUD
intrinseca 6:11b2bbbe14b2 76 if(dashMenu.display == false) {
intrinseca 1:b3907b8d9f65 77 lcd.locate(0, 0);
intrinseca 6:11b2bbbe14b2 78 lcd.printf("R:%-5.1d S:%-3d", car.rpm, car.speed);
intrinseca 1:b3907b8d9f65 79 lcd.locate(0, 1);
intrinseca 6:11b2bbbe14b2 80 lcd.printf("%-4.1fV %-4.1f\xDF\x43", car.voltage, car.coolant_temp);
intrinseca 6:11b2bbbe14b2 81
intrinseca 1:b3907b8d9f65 82 write_bigchar(&lcd, 13, car.gear);
intrinseca 1:b3907b8d9f65 83 }
intrinseca 2:825f572902c6 84 //Otherwise show menu
intrinseca 6:11b2bbbe14b2 85 else {
intrinseca 1:b3907b8d9f65 86 dashMenu.refresh();
intrinseca 6:11b2bbbe14b2 87 }
intrinseca 6:11b2bbbe14b2 88
intrinseca 2:825f572902c6 89 //Blink heartbeat
intrinseca 1:b3907b8d9f65 90 heartbeat = !heartbeat;
intrinseca 0:1f422ed56e0f 91 }
intrinseca 0:1f422ed56e0f 92
intrinseca 2:825f572902c6 93
intrinseca 2:825f572902c6 94 //Used to animate LEDs for testing
intrinseca 1:b3907b8d9f65 95 /*void doIncrement()
intrinseca 1:b3907b8d9f65 96 {
intrinseca 1:b3907b8d9f65 97 if(car.rpm < LIMIT && car.gear > 0)
intrinseca 1:b3907b8d9f65 98 car.rpm++;
intrinseca 1:b3907b8d9f65 99 }*/
intrinseca 0:1f422ed56e0f 100
intrinseca 2:825f572902c6 101 //Startup animation
intrinseca 1:b3907b8d9f65 102 void selfTest()
intrinseca 1:b3907b8d9f65 103 {
intrinseca 1:b3907b8d9f65 104 lcd.printf(" FBR 2012");
tomontoast 5:177520d43c87 105 lcd.locate(0,1);
tomontoast 5:177520d43c87 106 lcd.printf(" Ready to drive");
intrinseca 6:11b2bbbe14b2 107
intrinseca 2:825f572902c6 108 //Light up LEDs
intrinseca 6:11b2bbbe14b2 109 for(int i = 0; i < LEDS::NUM_LEDS; i++) {
intrinseca 1:b3907b8d9f65 110 leds[i] = true;
intrinseca 1:b3907b8d9f65 111 if(i < 4)
intrinseca 1:b3907b8d9f65 112 warn[i] = true;
intrinseca 6:11b2bbbe14b2 113 wait(0.1);
intrinseca 1:b3907b8d9f65 114 }
intrinseca 6:11b2bbbe14b2 115
intrinseca 2:825f572902c6 116 //Turn off LEDs
intrinseca 6:11b2bbbe14b2 117 for(int i = LEDS::NUM_LEDS - 1; i >= 0; i--) {
intrinseca 1:b3907b8d9f65 118 leds[i] = false;
intrinseca 1:b3907b8d9f65 119 if(i < 4)
intrinseca 1:b3907b8d9f65 120 warn[i] = false;
intrinseca 6:11b2bbbe14b2 121 wait(0.1);
intrinseca 1:b3907b8d9f65 122 }
intrinseca 6:11b2bbbe14b2 123
intrinseca 1:b3907b8d9f65 124 lcd.cls();
intrinseca 1:b3907b8d9f65 125 }
intrinseca 1:b3907b8d9f65 126
intrinseca 1:b3907b8d9f65 127 int main()
intrinseca 6:11b2bbbe14b2 128 {
intrinseca 6:11b2bbbe14b2 129 printf("\n");
intrinseca 6:11b2bbbe14b2 130 printf("FBRDash\n");
intrinseca 6:11b2bbbe14b2 131
intrinseca 2:825f572902c6 132 //Initialise state
tomontoast 5:177520d43c87 133 car.rpm = 0;
tomontoast 5:177520d43c87 134 car.gear = 2;
tomontoast 5:177520d43c87 135 car.speed = 0;
intrinseca 6:11b2bbbe14b2 136 car.coolant_temp = 0;
tomontoast 5:177520d43c87 137 car.throttle_pos = 0;
tomontoast 5:177520d43c87 138 car.manifold_pres = 0;
tomontoast 5:177520d43c87 139 car.air_temp = 0;
tomontoast 5:177520d43c87 140 car.lambda = 0;
tomontoast 5:177520d43c87 141 car.accel_x = 0;
tomontoast 5:177520d43c87 142 car.accel_y = 0;
tomontoast 5:177520d43c87 143 car.oil_temp = 0;
intrinseca 6:11b2bbbe14b2 144 car.voltage = 10.0;
intrinseca 1:b3907b8d9f65 145
intrinseca 2:825f572902c6 146 //Set up menu
intrinseca 1:b3907b8d9f65 147 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 148 dashMenu.addItem<unsigned char>("Air Temp ", "%12d\xDF\x43", &car.air_temp);
intrinseca 6:11b2bbbe14b2 149 dashMenu.addItem<float>("Throttle Pos ", "%12.1fd\xDF", &car.throttle_pos);
intrinseca 1:b3907b8d9f65 150 dashMenu.addItem<unsigned char>("Manifold Pres ", "%10d psi", &car.manifold_pres);
intrinseca 6:11b2bbbe14b2 151 dashMenu.addItem<unsigned char>("Lambda ", "%14d", &car.lambda);
intrinseca 1:b3907b8d9f65 152 dashMenu.addItem<unsigned char>("Oil Temp ", "%12d\xDF\x43", &car.oil_temp);
intrinseca 6:11b2bbbe14b2 153
intrinseca 2:825f572902c6 154 //Set up characters on LCS
intrinseca 1:b3907b8d9f65 155 setup_bigchar(&lcd);
intrinseca 6:11b2bbbe14b2 156
intrinseca 2:825f572902c6 157 //Do bootup animation
intrinseca 1:b3907b8d9f65 158 selfTest();
intrinseca 6:11b2bbbe14b2 159
intrinseca 2:825f572902c6 160 //Start refresh tickers
intrinseca 1:b3907b8d9f65 161 lcdRefreshTicker.attach_us(&lcdRefresh, LCD_REFRESH_TIME);
intrinseca 1:b3907b8d9f65 162 revRefreshTicker.attach_us(&revRefresh, REV_REFRESH_TIME);
intrinseca 1:b3907b8d9f65 163 //increment.attach(&doIncrement, 0.0005);
intrinseca 6:11b2bbbe14b2 164
intrinseca 6:11b2bbbe14b2 165 can = new CANComms(&car);
intrinseca 1:b3907b8d9f65 166
intrinseca 2:825f572902c6 167 //Infinite loop - program is interrupt driven
intrinseca 6:11b2bbbe14b2 168 while(true) {
intrinseca 1:b3907b8d9f65 169 __WFI();
intrinseca 0:1f422ed56e0f 170 }
intrinseca 1:b3907b8d9f65 171 }