Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller

Dependencies:   SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed

Fork of CANary by Tick Tock

Revision:
132:08748a67280a
Parent:
131:0d926c080a65
Child:
133:b0675d9d11dd
--- a/main.cpp	Wed Jul 24 11:20:08 2013 +0000
+++ b/main.cpp	Wed Jul 24 12:29:22 2013 +0000
@@ -20,7 +20,7 @@
 #include "displayModes.h"
 #include "TOUCH_TFTx2.h"
 
-char revStr[7] = "131"; // gg - revision string, max 6 characters
+char revStr[7] = "132"; // gg - revision string, max 6 characters
 
 FATFS USBdrive;
 LocalFileSystem local("local");
@@ -74,9 +74,9 @@
 volatile int writePointer = 0;
 int readPointer=0;
 volatile unsigned short secsNoCarCanMsg = 0;
+volatile unsigned short secsNoEvCanMsg = 0;
 volatile unsigned short secsNoTouch = 0;
-volatile bool carCanIdle;
-volatile bool userIdle;
+volatile bool carCanIdle,evCanIdle,userIdle;
 bool touched=false; //flag to read touchscreen
 unsigned char whichTouched = 0;
 char counter = 0;
@@ -117,6 +117,8 @@
 unsigned char dtePeriod = 14; //ten minute averaging interval
 float kWh_trip[3]={0};
 float miles_trip[3]={0};
+float maxTripEff = 0;
+float minTripEff = 99;
 float mph[39]={0};
 float kW[39]={0};
 float mpkWh[39]={0};
@@ -143,8 +145,6 @@
 bool moving=false;
 
 int main() {
-    //can1SleepMode.mode(OpenDrain);
-    //can2SleepMode.mode(OpenDrain);
     char sTemp[40];
     unsigned long secs;
     unsigned char i,j,display=0,lwt=0;
@@ -184,6 +184,7 @@
     printMsg(sTemp); // revision
 
     secsNoCarCanMsg = 0;
+    secsNoEvCanMsg = 0;
 
     //read efficiency history data
     hfile = fopen("/local/ehist.cny", "r");
@@ -285,7 +286,7 @@
                 led4=false;
             }
         } // if logOpen
-        if (carCanIdle&&userIdle&&!playbackEn) { // canbus idle --> sleep to save power
+        if (carCanIdle && (evCanIdle || !logOpen) && userIdle && !playbackEn) { // canbus idle --> sleep to save power
             if (repeatPoll) { // stop autopolling if enabled
                 autoPoll.detach();
             }
@@ -305,7 +306,7 @@
             led4=0;
             dled=0; // turn off display
             secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
-            while (secsNoCarCanMsg>canTimeout && !touched) {
+            while (secsNoCarCanMsg>canTimeout && (secsNoEvCanMsg>canTimeout || !logOpen) && !touched) {
                 //DeepPowerDown();
                 tt.wfi(); //enable touch interrupt
                 //__wfi(); // freeze CPU and wait for interrupt (from canbus or touch)
@@ -315,6 +316,7 @@
             lastDMode[1]=99;
             secsNoTouch=2;
             carCanIdle=secsNoCarCanMsg>canTimeout;
+            evCanIdle=secsNoEvCanMsg>canTimeout;
             dled=0.8; // turn on display LED
             seconds = time(NULL);
             t = *localtime(&seconds) ;
@@ -684,6 +686,14 @@
             if(laccOn&&!accOn){ // Car turned off
                 saveDmode=dMode[0];
                 dMode[0]=healthScreen;
+                // Keep track of max and min trip efficiency
+                float tmpeff = miles_trip[0]/kWh_trip[0];
+                if (maxTripEff<tmpeff) {
+                    maxTripEff=tmpeff;
+                }
+                if (minTripEff>tmpeff) {
+                    minTripEff=tmpeff;
+                }
                 if (repeatPoll) { // Log on shutdown if autopoll enabled
                     tripLog(); // Write trip log on powerdown
                 }
@@ -811,6 +821,10 @@
             }
             if(!usbEn&&!waitasec){
                 usbEn=detectUSB(); // Keep looking if none found
+                if(usbEn){ // Force update to clear USB init garbage
+                    lastDMode[0]=99;
+                    lastDMode[1]=99;
+                }
             }
             waitasec=false; // work around to avoid hang when USB tries to init immediately
             tock=true;