Dashboard firmware for FBR2012
Dependencies: mbed TextLCD PinDetect
main.cpp@6:11b2bbbe14b2, 2012-10-17 (annotated)
- 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?
User | Revision | Line number | New 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 -> �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 | } |