Dashboard firmware for FBR2012

Dependencies:   mbed TextLCD PinDetect

Revision:
1:b3907b8d9f65
Parent:
0:1f422ed56e0f
Child:
2:825f572902c6
--- a/main.cpp	Thu Nov 03 20:38:12 2011 +0000
+++ b/main.cpp	Mon Jun 25 21:01:02 2012 +0000
@@ -1,80 +1,130 @@
 #include "mbed.h"
 #include "TextLCD.h"
+#include "PinDetect.h"
+#include "Menu.h"
+#include "Comms.h"
+#include "PCComms.h"
+#include "Gears.h"
+#include "LEDS.h"
+#include "bigchar.h"
 
-#define NUM_LEDS 6
-PwmOut leds[] = { (p26), (p25), (p24), (p23), (p22), (p21) };
+#define LCD_REFRESH_TIME 150000
+#define REV_REFRESH_TIME 50000
+
+DigitalOut warn[] = { (p20), (p19), (p27), (p18) };
+DigitalOut debug[] = { (LED1), (LED2), (LED3) };
 
-TextLCD lcd(p10, p11, p12, p17, p18, p19, p20);
+DigitalOut heartbeat(LED4);
+
+PwmOut leds[] = { (p24), (p25), (p26), (p23), (p22), (p21) };
+
+TextLCD lcd(p5, p6, p7, p8, p9, p10, p11);
 
-InterruptIn shiftDown(p5);
-InterruptIn shiftUp(p6);
-InterruptIn shiftNeutral(p7);
+Ticker lcdRefreshTicker;
+Ticker revRefreshTicker;
+Ticker increment;
+
+State car;
 
-volatile float increment = 0;
+Menu dashMenu(&lcd, p13, p14, p15); //*LCD, OK, Left, Right
+PCComms pc(&car);
+Gears gearButtons(p17, p16, p12, &car.gear, &pc); //Up, Neutral, Down, *Current Gear
+LEDS revs(leds);
 
-void up()
+void revRefresh()
 {
-    increment += 0.01;
+    revs.refresh(car.rpm);
+    
+    for(int i = 0; i < 4; i++)
+    {
+        warn[i] = car.warnings & (1 << i);
+    }
 }
 
-void down()
+void lcdRefresh()
 {
-    increment -= 0.01;
-}
-
-void neutral()
-{
-    increment = 0;
+    if(dashMenu.display == false)
+    {
+        lcd.locate(0, 0);
+        lcd.printf("R:%-11.0d", car.rpm);
+        lcd.locate(0, 1);
+        lcd.printf("S:%-3d T:%-5.0f", car.speed, car.coolant_temp);
+        
+        write_bigchar(&lcd, 13, car.gear);
+    }
+    else
+    {
+        dashMenu.refresh();
+    }    
+    
+    heartbeat = !heartbeat;
 }
 
-int main() {
-    float i;
+/*void doIncrement()
+{
+    if(car.rpm < LIMIT && car.gear > 0)
+        car.rpm++;
+}*/
 
-    shiftUp.rise(&up);
-    shiftDown.rise(&down);
-    shiftNeutral.rise(&neutral);
-
-    leds[0].period(0.0001);
+void selfTest()
+{
+    lcd.printf("    FBR 2012");
     
-    lcd.locate(0, 1);
-    lcd.printf("Neutral");
+   for(int i = 0; i < LEDS::NUM_LEDS; i++)
+    {
+        leds[i] = true;
+        if(i < 4)
+            warn[i] = true;
+        wait(0.04);
+    }
     
-    while(1) {
-        if(increment >= 0)
-            i = 0;
-        else
-            i = 6.0;
+    for(int i = LEDS::NUM_LEDS - 1; i >= 0; i--)
+    {
+        leds[i] = false;
+        if(i < 4)
+            warn[i] = false;
+        wait(0.04);
+    }
     
-        for(; i <= 6 && i >= 0; i += increment)
-        {
-            for(int j = 0; j < NUM_LEDS; j++)
-            {          
-                if(j < (int)i)
-                {
-                    leds[j] = 1.0;
-                }
-                else if(j >= (int)i + 1)
-                {
-                    leds[j] = 0;
-                }
-                else
-                {
-                    leds[j] = i - ((int)i);
-                }
-            }
-      
-            lcd.locate(0, 0);
-            lcd.printf("%4.2f %4.2f", i, increment);
-            
-            lcd.locate(0, 1);
-            if(increment < 0)
-                lcd.printf("Down   ");
-            else if(increment > 0)
-                lcd.printf("Up     ");
-            else
-                lcd.printf("Neutral");
-            
-            wait_ms(10);
-        }
+    lcd.cls();
+}
+
+int main()
+{    
+    car.rpm = 5000;
+    car.gear = 0;
+    car.speed = 150;
+    car.coolant_temp = 21.5;
+    
+    car.throttle_pos = 1;
+    car.manifold_pres = 2;
+    car.air_temp = 3;
+    car.lambda = 5;
+    car.accel_x = 7;
+    car.accel_y = 8;
+    car.oil_temp = 10;
+    car.oil_pres = 11;
+    car.warnings = 12;
+
+    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.
+    dashMenu.addItem<unsigned char>("Air Temp      ", "%12d\xDF\x43", &car.air_temp);
+    dashMenu.addItem<unsigned char>("Throttle Pos  ", "%13d\xDF", &car.throttle_pos);
+    dashMenu.addItem<unsigned char>("Manifold Pres ", "%10d psi", &car.manifold_pres);
+    dashMenu.addItem<unsigned char>("Lambda        ", "%14d", &car.lambda);
+    
+    dashMenu.addItem<unsigned char>("Oil Temp      ", "%12d\xDF\x43", &car.oil_temp);
+    dashMenu.addItem<unsigned char>("Oil Pressure  ", "%10d psi", &car.oil_pres);
+    
+    setup_bigchar(&lcd);
+        
+    selfTest();
+    
+    lcdRefreshTicker.attach_us(&lcdRefresh, LCD_REFRESH_TIME);
+    revRefreshTicker.attach_us(&revRefresh, REV_REFRESH_TIME);
+    //increment.attach(&doIncrement, 0.0005);
+    
+    while(true)
+    {
+        __WFI();
     }
-}
+}
\ No newline at end of file