test fork

Dependencies:   SPI_TFTx2 SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2 mbed

Fork of CANary_9341 by Tick Tock

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Wed Sep 25 03:33:18 2013 +0000
Parent:
148:6e3b9135fad2
Child:
150:ef46ce63345c
Commit message:
Compensated DTE with air drag of current ambient temperature.

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
utility.h Show annotated file Show diff for this revision Revisions of this file
--- a/displayModes.cpp	Thu Sep 12 14:42:22 2013 +0000
+++ b/displayModes.cpp	Wed Sep 25 03:33:18 2013 +0000
@@ -7,7 +7,7 @@
 void mainDisplay (bool force, bool showButtons){
     unsigned short gids, SOC_x10, packV_x2, tireP;
     float useable_kWh,dte;
-    unsigned char aTemp;
+    //unsigned char aTemp;
     static unsigned short lgids=0, lSOC=0, lpackV_x2=0, ltireP=0;
     static unsigned char laTemp=0;
     static float lmaxTemp=0, lkW=0, laccV=0, lmpkWh=0;
@@ -20,12 +20,7 @@
     SOC_x10 = (msg.data[0]<<2)+(msg.data[1]>>6);
     msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts
     packV_x2 = (msg.data[2]<<2)+(msg.data[3]>>6);
-    msg = lastMsg[indexLastMsg[0x54c]]; //Get ambient
-    aTemp = msg.data[6]-56;
-    //msg = lastMsg[indexLastMsg[0x79a]]; //Get ambient and cabin temperature
-    //aTemp = msg.data[5]-41; // Need to add convertsion to C if metric
-    //c1Temp = msg.data[4]-41;
-    //c2Temp = msg.data[6]-41;
+
     msg = lastMsg[indexLastMsg[0x385]]; //Get tire pressure
     tireP = msg.data[2]+msg.data[3]+msg.data[4]+msg.data[5];
 
@@ -46,7 +41,7 @@
             printf("%4.1f kWh \n",useable_kWh);
 
             // Display DTE
-            dte=convertDistance(minTripEff*useable_kWh);
+            dte=convertDistance(minTripEff*nomDrag/airDrag(ambient_F)*useable_kWh);
             tt.foreground(Green);
             tt.locate(20,80);            
             if(dte>=9.5){
@@ -57,7 +52,8 @@
 
             tt.set_font((unsigned char*) SCProSB31x55);
             tt.foreground(Yellow);
-            dte=convertDistance(mpkWh[dtePeriod]*useable_kWh);
+            //Totest:convert from 25C to current ambient temperature
+            dte=convertDistance(mpkWh[dtePeriod]);
             if(dte>199){
                 dte=199;
             }
@@ -76,7 +72,7 @@
             tt.locate(195,106);
             printf("%s\n",distanceUnit()); //LM - add metric conversion
 
-            dte=convertDistance(maxTripEff*useable_kWh);
+            dte=convertDistance(maxTripEff*nomDrag/airDrag(ambient_F)*useable_kWh);
             tt.foreground(Orange);
             if(dte>=99.5){
                 tt.locate(255,80);            
@@ -121,11 +117,11 @@
             lpackV_x2=packV_x2;
             ltireP=0;//Force tire pressure redraw, too
         }
-        if(force||aTemp!=laTemp){
+        if(force||ambient_F!=laTemp){
             tt.foreground(Cyan);
             tt.locate(20,146);
-            printf("%2.0f%s\n",convertF(aTemp),temperatureUnit());
-            laTemp=aTemp;
+            printf("%2.0f%s\n",convertF(ambient_F),temperatureUnit());
+            laTemp=ambient_F;
         }
         if(force||maxTemp!=lmaxTemp){
             tt.foreground(Cyan);
@@ -1139,6 +1135,7 @@
         tt.set_font((unsigned char*) SCProSB31x55);
         tt.foreground(Green);
         if (showMiles){
+            //Totest:convert from 25C to current ambient temperature
             float miles = mpkWh[dtePeriod]*((float)(gids-5)*.075);
             miles = convertDistance(miles); // LM - Metric support
             // Right justify
@@ -1155,9 +1152,11 @@
             tt.foreground(Cyan);
             tt.set_font((unsigned char*) Arial24x23);
             tt.locate(198,70);
+            //Totest:convert from 25C to current ambient temperature
             printf("%3.1f \n",mpkWh[dtePeriod]);
         } else {
             tt.locate(200,10);
+            //Totest:convert from 25C to current ambient temperature
             printf("%3.1f \n",mpkWh[dtePeriod]);
             tt.foreground(Cyan);
             tt.set_font((unsigned char*) Arial24x23);
@@ -1272,7 +1271,8 @@
     }
     if(pointerSep>maxPS){maxPS=pointerSep;}
     tt.locate(10,10);
-    printf("%3d sep  %3d max\n",pointerSep,maxPS);
+    //printf("%3d sep  %3d max\n",pointerSep,maxPS);
+    printf("%f %4.3f \n", ambient_F, airDrag(ambient_F));
     tt.locate(10,40);
     printf("%4.2fV %4.2fV \n",accV,accV2);
     for (i=0; i<4; i++){
@@ -1498,7 +1498,7 @@
 float convertC(float input) 
 {
     if (!metric) {
-        //convert!
+        //convert C to F!
         float output = input *1.8f;
         output += 32.0f;
         return output;   
@@ -1509,7 +1509,7 @@
 float convertF(float input) 
 {
     if (metric) {
-        //convert!
+        //convert F to C!
         float output = input -32.0f;
         output /= 1.8f;
         return output;   
@@ -1535,3 +1535,4 @@
         return "C";
     return "F";
 }
+
--- a/displayModes.h	Thu Sep 12 14:42:22 2013 +0000
+++ b/displayModes.h	Wed Sep 25 03:33:18 2013 +0000
@@ -63,6 +63,8 @@
 extern bool brakeMon;
 extern float curEff;
 extern unsigned short uMsgId[8];
+extern float ambient_F;
+extern float nomDrag;
 
 extern "C" {
     void printLast (bool force, bool showButtons);
@@ -82,6 +84,7 @@
     float convertDistance(float input); // LM - Metric
     float convertC(float input); // LM - Metric
     float convertF(float input); // LM - Metric
+    float airDrag(float F);
     char* distanceUnit(); // LM - Metric
     char* temperatureUnit(); // LM - Metric
 }
\ No newline at end of file
--- a/main.cpp	Thu Sep 12 14:42:22 2013 +0000
+++ b/main.cpp	Wed Sep 25 03:33:18 2013 +0000
@@ -5,20 +5,18 @@
 // * Add 50% charge option
 // * Add coasting regen to regen/braking display
 // * Change semilog efficiency graph to linear with 10 minute values
-// * Add additional 79b bank readouts
 // * Subtract accessory power from efficiency history (add back in when displaying)
-// * Add trip history display
 // * Add in-device config editor
-// * Add temperature to efficiency lookup table
-// * Add debug screen
+// * Normalize efficiency to 25C relative to ambient.  Display efficiency at current temp.
+// * Change pack volt color when CVLI fails
+// * Add per-charge efficiency meter; add to triplop.txt
+// * Add tire pressure cal (40psi for me = FR 38, RR 38.2, FL 37.8, RL 38 - maybe 2psi error on my tire gauge?)
+// * Add heater activation warning message
+// * Add trip efficiency reset
 
-// rev148
-// No longer save config after firmware update
-// Added config health check after read
-// Added debugScreen
-// Switched friction monitor to msgId:292 so MY2013 will work
-// Added ambient to main display
-// Added Resr to trip log
+
+// rev149
+// Added temperature compensation for efficiency/DTE computation
 
 #include "mbed.h"
 #include "CAN.h"
@@ -29,7 +27,7 @@
 #include "utility.h"
 #include "displayModes.h"
 #include "TOUCH_TFTx2.h"
-char revStr[7] = "148"; // gg - revision string, max 6 characters
+char revStr[7] = "149"; // gg - revision string, max 6 characters
 
 FATFS USBdrive;
 LocalFileSystem local("local");
@@ -135,6 +133,7 @@
 float mph[39]={0};
 float kW[39]={0};
 float mpkWh[39]={0};
+float ambient_F;
 float unloadedV_x2,Resr,curRmax,curRmin,redRmax,redRmin,incRmax,incRmin;
 signed short Imax, Imin;
 // Logarithmic division scale (roughly - snapped to common units of time)
@@ -158,6 +157,7 @@
 bool moving=false;
 unsigned short chirpInt;
 unsigned short uMsgId[8] = {0x5103, 0x50a3, 0x54a4, 0x54b4, 0x54c0, 0x55b4, 0x0000, 0x0000}; // messages to display on debug screen msgId:byte
+float nomDrag;
 
 int main() {
     char sTemp[40];
@@ -205,7 +205,9 @@
     printMsg(sTemp); // revision
 
     //read efficiency history data
-    hfile = fopen("/local/ehist.cny", "r");
+    if(!tt.is_touched()){  //skip if screen touched (reset efficiency)
+        hfile = fopen("/local/ehist.cny", "r");
+    }
     if (hfile!=NULL){ // found a efficiency history file
         for(i=0;i<39;i++){
             if(!feof(hfile)){
@@ -227,6 +229,8 @@
             mpkWh[i]=4;
         }
     }
+    
+    nomDrag = airDrag(77); // Compute drag coefficient for 25C
 
     // Read config file
     readConfig();
@@ -709,6 +713,7 @@
 
         if(tick){ // Executes once a second
             tick=false;
+            ambient_F = lastMsg[indexLastMsg[0x54c]].data[6]-56;
             curEff = miles_trip[0]/kWh_trip[0];
             headlights = (lastMsg[indexLastMsg[0x358]].data[1]&0x80)?true:false;  // headlight/turn signal indicator
             if(accOn&&indexLastMsg[0x355]>0){
@@ -805,7 +810,7 @@
 
             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.
@@ -814,6 +819,8 @@
                 kW[0]=0;
                 mpkWh[0]=0;
             }
+            // TOTest: Normalize kW[0] to 25C (after computing mpkWh[0])
+            kW[0]=kW[0]/airDrag(ambient_F)*nomDrag;
             numWsamples=0;
 
             if (!charging){
--- a/utility.cpp	Thu Sep 12 14:42:22 2013 +0000
+++ b/utility.cpp	Wed Sep 25 03:33:18 2013 +0000
@@ -517,7 +517,7 @@
     char buffer[bufSize];
 
     cfile = fopen("/local/config.txt", "w");    
-    fprintf(cfile,"format 7\r\n");
+    fprintf(cfile,"format 8\r\n");
     fprintf(cfile,"x0_off %d\r\n",tt.x0_off);
     fprintf(cfile,"y0_off %d\r\n",tt.y0_off);
     fprintf(cfile,"x0_pp %d\r\n",tt.x0_pp);
@@ -547,7 +547,10 @@
     fprintf(cfile,"showHealth %d\r\n",(showHealth?1:0));
     fprintf(cfile,"brakeMon %d\r\n",(brakeMon?1:0));
     fprintf(cfile,"brkMonRate %d\r\n", brkMonRate );            
-    fprintf(cfile,"brkMonThr %d\r\n", brkMonThr );            
+    fprintf(cfile,"brkMonThr %d\r\n", brkMonThr );
+    for(char i=0;i<8;i++){
+        fprintf(cfile,"usrMsgId %4x\r\n", i, uMsgId[i] );
+    }
     fclose(cfile);
     
     // Make copy of CONFIG.TXT
@@ -631,8 +634,13 @@
             fscanf(cfile, "brkMonRate %d\r\n", &brkMonRate );        
             fscanf(cfile, "brkMonThr %d\r\n", &brkMonThr );            
         }
+        if(ff>7){
+            for(char i=0;i<8;i++){
+                fscanf(cfile, "usrMsgId %4x\r\n", &uMsgId[i] );        
+            }
+        }
         fclose(cfile);
-        if((ff>7)||(ff<1)||(ledHi<0.1)||(scale12V<10)||(tt.x_mid<16000)||(ledHi>1)||(ledLo>1)||(dMode[0]>maxScreens)||(dMode[1]>maxScreens)){ //Sanity check a few things
+        if((ff>8)||(ff<1)||(ledHi<0.1)||(scale12V<10)||(tt.x_mid<16000)||(ledHi>1)||(ledLo>1)||(dMode[0]>maxScreens)||(dMode[1]>maxScreens)){ //Sanity check a few things
             //Something wrong. Load defaults
             printf("Invalid config file.  Loading defaults.\n");
             wait(3);
@@ -661,7 +669,16 @@
             brakeMon=true;
             brkMonRate=400000;
             brkMonThr=4000;
+            uMsgId[0]=0x5103;
+            uMsgId[1]=0x50a3;
+            uMsgId[2]=0x54a4;
+            uMsgId[3]=0x54b4;
+            uMsgId[4]=0x54c0;
+            uMsgId[5]=0x55b4;
+            uMsgId[6]=0x0000;
+            uMsgId[7]=0x0000;
             }
+
         if(ff<7){//If not latest format, save as latest format
             saveConfig();
             printMsg("Config file format updated.\n"); // config forat updates
@@ -981,6 +998,20 @@
     }
 }
 
+float airDrag(float F)
+{
+    float drag_F[16] = {1.47,1.39,1.363,1.337,1.312,1.288,1.265,1.243,1.221,1.2,1.18,1.161,1.142,1.124,1.106,1.034};
+    float temp_F[16] = {-31,-4,5,14,23,32,41,50,59,68,77,86,95,104,113,149};
+    char ii=0;
+    float drag;
+    while(ambient_F<=temp_F[++ii]) { } // Find section in table
+    drag=(ambient_F-temp_F[ii]);
+    drag/=(temp_F[ii-1]-temp_F[ii]);
+    drag*=(drag_F[ii-1]-drag_F[ii]);
+    drag+=drag_F[ii];
+    return drag;
+}
+
 //Sample CONFIG.TXT
 /*
 format 7
@@ -1008,4 +1039,4 @@
 brakeMon 1
 brkMonRate 400000
 brkMonThr 4000
-*/
\ No newline at end of file
+*/
--- a/utility.h	Thu Sep 12 14:42:22 2013 +0000
+++ b/utility.h	Wed Sep 25 03:33:18 2013 +0000
@@ -76,6 +76,8 @@
 extern bool brakeMon;
 extern Ticker geiger;
 extern unsigned short chirpInt;
+extern unsigned short uMsgId[8];
+extern float ambient_F;
 
 extern "C" {
     void mbed_reset();
@@ -104,6 +106,7 @@
     void updateFirmware(); // LM - Update firmware off USB
     bool detectUSB();
     void chirp();
+    float airDrag(float);
 }
 
 //LEAF OBD