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