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

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Thu Nov 21 14:17:35 2013 +0000
Parent:
160:905fe45ed54b
Child:
162:c6545fc0164a
Commit message:
// * Subtract climate control power from stored efficiency data and add current CC power back in for display; // * Added X axis labels on CP histogram and scaled bar width;

Changed in this revision

displayModes.cpp Show annotated file Show diff for this revision Revisions of this file
displayModes.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
utility.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/displayModes.cpp	Wed Nov 20 13:13:54 2013 +0000
+++ b/displayModes.cpp	Thu Nov 21 14:17:35 2013 +0000
@@ -6,7 +6,7 @@
 
 void mainDisplay (bool force, bool showButtons){
     unsigned short gids, SOC_x10, packV_x2, tireP;
-    float useable_kWh,dte;
+    float useable_kWh,dte,total_kW;
     unsigned char aTemp;
     static unsigned short lgids=0, lSOC=0, lpackV_x2=0, ltireP=0;
     static unsigned char laTemp=0;
@@ -87,22 +87,23 @@
             lgids=gids;
             lmpkWh=mpkWh[dtePeriod];
         }
-        if(force||kW[0]!=lkW){
+        total_kW=kW[0]+CCkW;
+        if(force||total_kW!=lkW){
             tt.foreground(Cyan);
-            if(kW[0]<-10){ //Right justify
+            if(total_kW<-10){ //Right justify
                 tt.locate(171,40);
-                printf("%4.2fkW\n",kW[0]);
-            } else if (kW[0]<0){
+                printf("%4.2fkW\n",total_kW);
+            } else if (total_kW<0){
                 tt.locate(171,40);
-                printf(" %4.2fkW\n",kW[0]);
-            } else if (kW[0]<10){
+                printf(" %4.2fkW\n",total_kW);
+            } else if (total_kW<10){
                 tt.locate(165,40);
-                printf("  %4.2fkW\n",kW[0]);
+                printf("  %4.2fkW\n",total_kW);
             } else {
                 tt.locate(165,40);
-                printf(" %4.2fkW\n",kW[0]);
+                printf(" %4.2fkW\n",total_kW);
             }
-            lkW=kW[0];
+            lkW=total_kW;
         }
         if(force||SOC_x10!=lSOC){
             tt.locate(215,10);
@@ -218,10 +219,11 @@
             printf("%3.1fV  \n",accV);
             laccV=accV;
         }
-        if(force||kW[0]!=lkW){
+        total_kW=kW[0]+CCkW;
+        if(force||total_kW!=lkW){
             tt.locate(160,40); // gg - move left to keep from wrap
-            printf("%3.2fkw \n",kW[0]); // use small w to save space
-            lkW=kW[0];
+            printf("%3.2fkw \n",total_kW); // use small w to save space
+            lkW=total_kW;
         }
     }
     if(led4){
@@ -727,11 +729,10 @@
           nBar[i] *= nBarScale ; // scale, as needed
         }
         
-        // label the X axis (approximate)
-        //tt.locate( 2, yWinMin-14 ); printf("%04d = %04d from %1.4f", max, int( height / nBarScale ) + min, nBarScale );
+        // label the Y axis
         tt.locate( 2, yWinMin-14 ); printf("%04d = (%d) mv range.\n", max , max - min );
         tt.locate( 2, yWinMax+5); printf("%04d\n", min );
-        // values, for now
+
         // BatDataBaseG4 * 7 = 280
         tt.locate( 0, yWinMax+40 );
         char* sTemperatureUnit = temperatureUnit();
@@ -817,13 +818,10 @@
         int xWinMax = 300;
         int yWinMin = 50;
         int yWinMax = 150;
-        // draw the Histogram Frame, 2 pixels wide
-        tt.rect( xWinMin-1,yWinMin-1, xWinMax+1,yWinMax+1,Red);
-        tt.rect( xWinMin-2,yWinMin-2, xWinMax+2,yWinMax+2,Green);
-        
+
         // binning
         short nBin[301] ; // bins to count Min values in nBin[0], etc.
-        int height ;
+        int height;
         int iBinIndxMax = 300 ;
         int iBinValMax = max - min ; // zero to N
         if( iBinValMax > iBinIndxMax ) iBinValMax = iBinIndxMax ;
@@ -837,38 +835,31 @@
         for(int i=0; i<96; i++){
           bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4] - min ;
           if( bd > iBinValMax ) bd = iBinValMax ;
-          nBin[bd] ++ ;
+          nBin[bd]++ ;
         }
-        
-        //----------------
-        if( iBinValMax == 0 ) {
-            // for testing
-            min = 10 ; 
-            max = 50 ;
-            avg = ( max + min ) / 2;
-            iBinValMax = max - min ;
-            for(int i=0; i<=(iBinValMax/2); i++) {
-              nBin[i] = i ;
-              nBin[iBinValMax-i] = i ;
-            }
-        }
-        
-        // the values, for now
-        // BatDataBaseG4 * 7 = 280        
+
+        // label the Y axis
+        tt.locate( 0, yWinMin ); printf("25\n");
+        tt.locate( 0, yWinMax-6 ); printf("0\n");  
+        tt.locate( xWinMin-12, yWinMax+6 ); printf("%04d\n", min);
+        tt.locate( xWinMax-18, yWinMax+6 ); printf("%04d\n", max);
+        // draw the Histogram Frame, 2 pixels wide
+        tt.rect( xWinMin-1,yWinMin-1, xWinMax+1,yWinMax+1,Red);
+        tt.rect( xWinMin-2,yWinMin-2, xWinMax+2,yWinMax+2,Green);
         tt.locate( 0, yWinMax+40 );
         char* sTemperatureUnit = temperatureUnit();
         printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n\n",
             max,min,avg,jv, convertC(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertC(battData[BatDataBaseG4*7+8]),sTemperatureUnit,
             convertC(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertC(battData[BatDataBaseG4*7+14]),sTemperatureUnit);
-
+        
         //---------------
         // show the bars
-        int nBarWidth = 3 ;
-        int nBarSpace = 1 ; // 1 for testing
+        int nBarWidth = (xWinMax-xWinMin-2)/iBinValMax-1; //3
+        int nBarSpace = 1 ;
         
         int xPos = (xWinMin + xWinMax) / 2 ; 
         xPos -= (avg-min) * (nBarWidth + nBarSpace) ;
-        
+
         for( int i=0; i<=iBinValMax; i++) {
             height = 4 * nBin[i] ;
             if( height > 100 ) height = 100 ; // clip tops
@@ -897,7 +888,7 @@
         tt.cls();
     }
     //-------- top row --------
-    showButton(1,0," Reset","",4,4);
+    showButton(1,0," Reset","CANary",4,4);
     showButton(2,0,"  Save"," Config",4,4);
                
     //------- second row -----
@@ -948,7 +939,8 @@
     }
     //-------- top row --------
     showButton(0,0,"Calibrate"," Touch",4,4); // gg - 4x4
-           
+    showButton(1,0," Reset","Max/Min",4,4);
+          
     // a button to step to the next skin
     unsigned int nextSkin = skin + 1 ;
     if( nextSkin > maxSkin ) nextSkin = 0 ;
--- a/displayModes.h	Wed Nov 20 13:13:54 2013 +0000
+++ b/displayModes.h	Thu Nov 21 14:17:35 2013 +0000
@@ -70,6 +70,7 @@
 extern bool idir;
 extern bool autoSync;
 extern bool clearTest;
+extern float CCkW;
 
 extern "C" {
     void printLast (bool force, bool showButtons);
--- a/main.cpp	Wed Nov 20 13:13:54 2013 +0000
+++ b/main.cpp	Thu Nov 21 14:17:35 2013 +0000
@@ -3,16 +3,13 @@
 //To Do:
 // * Add 50% charge option
 // * Add linear efficiency graph with 10 minute values
-// * Subtract accessory power from efficiency history (add back in when displaying)
 // * Add in-device config editor
 // * Change pack volt color when CVLI fails
 // * Add tire pressure cal (40psi for me = FR 38, RR 38.2, FL 37.8, RL 38 - maybe 2psi error on my tire gauge?)
 
-// rev160
-// * Tweaked heater monitor to only issue once per power on/off
-// * Added filtering to timeSync routing (some times set time to bogus value)
-// * Removed debug wait commands from config save and firmware update
-// * Added 3-tone sound messages
+// rev161
+// * Subtract climate control power from stored efficiency data and add current CC power back in for display
+// * Added X axis labels on CP histogram and scaled bar width
 
 #include "mbed.h"
 #include "CAN.h"
@@ -22,7 +19,7 @@
 #include "utility.h"
 #include "displayModes.h"
 #include "TOUCH_TFTx2.h"
-char revStr[7] = "160"; // gg - revision string, max 6 characters
+char revStr[7] = "161"; // gg - revision string, max 6 characters
 
 FATFS USBdrive;
 LocalFileSystem local("local");
@@ -116,6 +113,7 @@
 unsigned short numSsamples = 0;
 float accV = 0;
 float accV2 = 0;
+float CCkW = 0;
 bool playbackEn = false;
 bool playbackOpen = false;
 //float playbackInt = 0.05; //read messages every 50 ms
@@ -469,6 +467,7 @@
                                 } else if (dMode[whichTouched]==config2Screen) { // reset DTE Max/Min
                                     maxTripEff = 0;
                                     minTripEff = 5;
+                                    beep(2000,0.25);
                                 } else if (dMode[whichTouched]==playbackScreen) { // pause/unpause
                                     playbackEn=!playbackEn;
                                     if(playbackEn){
@@ -741,6 +740,7 @@
 
         if(tick){ // Executes once a second
             tick=false;
+            CCkW = (lastMsg[indexLastMsg[0x510]].data[3]&0x7f)*0.125;
             if (miles_trip[0]>0.25) {
                 curEff = miles_trip[0]/kWh_trip[0];
             } else {
@@ -857,17 +857,35 @@
 
             if(numWsamples>0){ // Avoid div0
                 mpkWh[0]=mph[0];
-                kW[0]=((float) mWs_x4)/numWsamples/4e3;     
+                kW[0]=((float) mWs_x4)/numWsamples/4e3;
                 mpkWh[0]/=kW[0];
                 if (mpkWh[0]<0) {
                     mpkWh[0]=99;// negative means inf.
                 }
-            } else {
+                kW[0]-=CCkW; // subtract climate control power from recorded value
+           } else {
                 kW[0]=0;
                 mpkWh[0]=0;
             }
             numWsamples=0;
 
+            if((accOn||playbackEn)&&!charging){ // Calculate averages
+                for(i=1;i<39;i++){
+                    average=mph[i]/timeConstant[i];
+                    mph[i]-=average;
+                    mph[i]+=mph[0];
+                    mpkWh[i]=average;
+                    average=kW[i]/timeConstant[i];
+                    kW[i]-=average;
+                    kW[i]+=kW[0];
+                    average+=CCkW; //add climate control power back in for display
+                    mpkWh[i]/=average;
+                    if (mpkWh[i]<0) {
+                        mpkWh[i]=99;// negative means inf.
+                    }
+               }
+            }
+
             if (!charging){
                 miles_trip[0]+=mph[0]/3600; // per trip
                 miles_trip[1]+=mph[0]/3600; // per charge
@@ -875,7 +893,7 @@
                 kWh_trip[0]+=kW[0]/3600;
                 kWh_trip[1]+=kW[0]/3600;
                 kWh_trip[2]+=kW[0]/3600;
-            } else {
+            } else { // charging so reset per charge trip meter
                 miles_trip[1]=0;
                 kWh_trip[1]=0;
             }
@@ -904,22 +922,6 @@
             Imax=-1000;
             Imin=1000;
 
-            if((accOn||playbackEn)&&!charging){
-                for(i=1;i<39;i++){
-                    average=mph[i]/timeConstant[i];
-                    mph[i]-=average;
-                    mph[i]+=mph[0];
-                    mpkWh[i]=average;
-                    average=kW[i]/timeConstant[i];
-                    kW[i]-=average;
-                    kW[i]+=kW[0];
-                    mpkWh[i]/=average;
-                    if (mpkWh[i]<0) {
-                        mpkWh[i]=99;// negative means inf.
-                    }
-                    //mpkWh[i]=floor(mpkWh[i]*10+0.5)/10; // Round to nearest 10th
-               }
-            }
             if(logCP&&usbEn){
                 if(logOnce){
                     tripLog();
--- a/utility.cpp	Wed Nov 20 13:13:54 2013 +0000
+++ b/utility.cpp	Thu Nov 21 14:17:35 2013 +0000
@@ -47,7 +47,6 @@
 
 void logCan (char mType, CANMessage canRXmsg) {
 
-   // re-arranged to put static first
     static unsigned char ii = 0;
     static unsigned char lasti = 0; // indexindex
     static unsigned char bdi=0;
@@ -63,7 +62,7 @@
     unsigned short ts;
 
     if(debugMode||(skin==ggSkin)){ 
-        // code to insert actual number of dropped frames for overrun debug - skiped in normal mode to keep logcan short
+        // code to insert actual number of dropped frames for overrun debug - skipped in normal mode to keep logcan short
         if(logOpen){
             // check to see if buffer is already full (read - write) = 1
             // actually the last buffer location cannot be used because then 
@@ -168,7 +167,7 @@
             writeBuffer[localWritePointer][2]=(ts&0x00ff);
             writeBuffer[localWritePointer][3]=canRXmsg.id&0xff;
             writeBuffer[localWritePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
-            for(i=5;i<13;i++){ // Is there a better way to do this? (writeBuffer[localWritePointer][5]=canRXmsg.data?)
+            for(i=5;i<13;i++){ // Is there a better way to do this?
                 writeBuffer[localWritePointer][i]=canRXmsg.data[i-5];
             }
             if (writePointer==readPointer) {
@@ -181,19 +180,19 @@
 
     if(canRXmsg.id<0x800){ // Block FFE and FFF messages
         if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry
-            //ii=ii<99?ii+1:0; // Should never wrap - less than 100 different messages ever used
             if(ii<99) {
-                //indexLastMsg[canRXmsg.id]=ii; //Create entry if first message
                 indexLastMsg[canRXmsg.id]=++ii; //Create entry for first MsgID occurance
                 // ii max is 99 here
             } else {
                 // the ii array is full, more than 100 MsgIDs found
                 if(ii==99) {
                     ii++; // step to 100 to log only one error
-                    printMsg("MsgID buffer overrun.\n"); // write buffer overrun
+                    printMsg("msgID buffer overrun.\n");
+                    beep3(500,0.25,1000,0.5,500,0.25); //Alert driver to check log
                 }
             }
         }
+        lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store data in table at assigned index
         
         //----------------
         if(dMode[0]==changedScreen||dMode[1]==changedScreen){// Skip if not using (for execution speed)
@@ -206,8 +205,6 @@
             }
             msgChanged[indexLastMsg[canRXmsg.id]]=changed;
         }
-    
-        lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table
         
         //-------------------
         //Miscellaneous on-recieve operations below