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:
Thu Jun 20 05:35:36 2013 +0000
Branch:
Metric
Parent:
101:94b8aca2d47a
Child:
103:1389e9efe8c3
Commit message:
Added Ah, SOH, and more precise temperature measurement.

Changed in this revision

common.h Show annotated file Show diff for this revision Revisions of this file
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/common.h	Sat Jun 15 19:05:32 2013 +0000
+++ b/common.h	Thu Jun 20 05:35:36 2013 +0000
@@ -24,13 +24,22 @@
 #define canTimeout 5
 #define userTimeout 15
 
-#define BatDataBaseG1 0x24 
-#define BatDataBaseG2 0x00 // Cell Pair data
-#define BatDataBaseG3 0x2B 
-#define BatDataBaseG4 0x20 // Temperature data 0x20 * 7 = 224
-#define BatDataBaseG5 0x31
+//#define BatDataBaseG1 0x24 
+//#define BatDataBaseG2 0x00 // Cell Pair data
+//#define BatDataBaseG3 0x2B 
+//#define BatDataBaseG4 0x20 // Temperature data 0x20 * 7 = 224
+//#define BatDataBaseG5 0x31
+//#define BatDataBufMax 0x1B2 // 7 x 3E bytes
+
+#define BatDataBaseG1 0x00 // 6 frames - SOH, SOC, Ah
+#define BatDataBaseG2 0x06 // 29 frames - Cell Pair data
+#define BatDataBaseG3 0x23 // 5 frames
+#define BatDataBaseG4 0x28 // 3 frames - Temperature data
+#define BatDataBaseG5 0x2B // 11 frames
+#define BatDataBaseG6 0x36
 #define BatDataBufMax 0x1B2 // 7 x 3E bytes
 
+
 // gg - 4x4 touch
 // #define tNavRow = 2 ; // for 3x3
 extern unsigned char tNavRow ; // gg - 4x4
--- a/displayModes.cpp	Sat Jun 15 19:05:32 2013 +0000
+++ b/displayModes.cpp	Thu Jun 20 05:35:36 2013 +0000
@@ -73,9 +73,11 @@
 
 void mainDisplay (bool force, bool showButtons){
     unsigned short gids, SOC, packV;
-    static unsigned short lgids=0, lSOC=0, lpackV=0, maxPS=0;
-    static unsigned char lbattTemp_x4=0;
+    static unsigned short lgids=0, lSOC=0, lSOH=0, lpackV=0, maxPS=0;
+    //static unsigned char lbattTemp_x4=0;
+    static signed short lbattTemp_x10=0;
     static float lkW=0, laccV=0, lmpkWh=0;
+    static unsigned long lAh=0;
     CANMessage msg;
 
     msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
@@ -102,7 +104,7 @@
             printf("%4.1f kWh \n",(float)(gids-5)*0.075);
             tt.set_font((unsigned char*) SCProSB31x55);
             tt.foreground(Green);
-            tt.locate(60,96);            
+            tt.locate(60,106);            
             printf("%4.1f %s  \n",convertDistance(mpkWh[dtePeriod]*((float)(gids-5)*.075)),distanceUnit()); //LM - add metric conversion
             lgids=gids;
             lmpkWh=mpkWh[dtePeriod];
@@ -119,10 +121,13 @@
             printf("%4.1fV \n",(float)packV/2);
             lpackV=packV;
         }
-        if(force||battTemp_x4!=lbattTemp_x4){
+        //if(force||battTemp_x4!=lbattTemp_x4){
+        if(force||battTemp_x10!=lbattTemp_x10){
             tt.locate(200,170);
-            printf("%4.1f%s\n",convertTemperature((float)battTemp_x4*0.25f),temperatureUnit());
-            lbattTemp_x4=battTemp_x4;
+            //printf("%4.1f%s\n",convertTemperature((float)battTemp_x4*0.25f),temperatureUnit());
+            printf("%4.1f%s\n",convertTemperature((float)battTemp_x10*0.1f),temperatureUnit());
+            //lbattTemp_x4=battTemp_x4;
+            lbattTemp_x10=battTemp_x10;
         }
         if(force||accV!=laccV){
             tt.locate(20,200);
@@ -130,11 +135,21 @@
             laccV=accV;
         }
         if(force||kW[0]!=lkW){
-            tt.locate(180,40);
+            tt.locate(180,70);
             printf("%3.2fkW  \n",kW[0]);
             //printf("%3.1f mpkWh  \n",mpkWh[0]);
             lkW=kW[0];
         }
+        if(force||Ah_x10000!=lAh){
+            tt.locate(10,70);
+            printf("%4.2fAh  \n",(float)Ah_x10000/10000);
+            lAh=Ah_x10000;
+        }
+        if(force||SOH_x100!=lSOH){
+            tt.locate(180,40);
+            printf("%3.1f%s\n",(float)SOH_x100/100,"% ");
+            lSOH=SOH_x100;
+        }
     }else {//if(skin==ggSkin){
         if(force||gids!=lgids){
             tt.locate(10,10);
@@ -350,13 +365,13 @@
                 break;
             case 1:
                 tt.locate(0,6);
-                // BatDataBaseG4 * 7 = 224
+                // BatDataBaseG4 * 7 = 280
                 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, convertTemperature(battData[224+5]),sTemperatureUnit,convertTemperature(battData[224+8]),sTemperatureUnit,
-                    convertTemperature(battData[224+11]),sTemperatureUnit,convertTemperature(battData[224+14]),sTemperatureUnit);
+                    max,min,avg,jv, convertTemperature(battData[(BatDataBaseG4*7)+5]),sTemperatureUnit,convertTemperature(battData[(BatDataBaseG4*7)+8]),sTemperatureUnit,
+                    convertTemperature(battData[(BatDataBaseG4*7)+11]),sTemperatureUnit,convertTemperature(battData[(BatDataBaseG4*7)+14]),sTemperatureUnit);
                 //printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
-                //            max,min,avg,jv, battData[224+5],battData[224+8],battData[224+11],battData[224+14]);
+                //            max,min,avg,jv, battData[(BatDataBaseG4*7)+5],battData[(BatDataBaseG4*7)+8],battData[(BatDataBaseG4*7)+11],battData[(BatDataBaseG4*7)+14]);
                 tt.rect(8+0*41,16,40+0*41,28,Green);
                 tt.rect(8+1*41,16,40+1*41,28,Yellow);
                 //tt.rect(8+2*41,16,40+2*41,28,White);
@@ -510,10 +525,10 @@
         }
         
         // values, for now
-        // BatDataBaseG4 * 7 = 224
+        // BatDataBaseG4 * 7 = 280
         tt.locate( 0, yWinMax+40 );
         printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
-                max,min,avg,jv,  battData[224+5],battData[224+8],  battData[224+11],battData[224+14]);
+                max,min,avg,jv,  battData[(BatDataBaseG4*7)+5],battData[(BatDataBaseG4*7)+8],  battData[(BatDataBaseG4*7)+11],battData[(BatDataBaseG4*7)+14]);
         
         // label the X axis (approximate)
         tt.locate( 2, yWinMax+5); printf("%04d", min );
@@ -633,10 +648,10 @@
         }
         
         // the values, for now
-        // BatDataBaseG4 * 7 = 224        
+        // BatDataBaseG4 * 7 = 280        
         tt.locate( 0, yWinMax+40 );
         printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
-                max,min,avg,jv,  battData[224+5],battData[224+8],  battData[224+11],battData[224+14]);
+                max,min,avg,jv,  battData[(BatDataBaseG4*7)+5],battData[(BatDataBaseG4*7)+8],  battData[(BatDataBaseG4*7)+11],battData[(BatDataBaseG4*7)+14]);
         
         //---------------
         // show the bars
--- a/displayModes.h	Sat Jun 15 19:05:32 2013 +0000
+++ b/displayModes.h	Thu Jun 20 05:35:36 2013 +0000
@@ -41,6 +41,10 @@
 extern unsigned char tNavRow; // gg - 4x4
 extern unsigned short pointerSep; // log write buffer pointer separation
 extern unsigned char battTemp_x4;
+extern signed short battTemp_x10;
+extern unsigned long Ah_x10000;
+extern unsigned long SOC_x10000;
+extern unsigned short SOH_x100;
 extern bool metric;
 
 extern "C" {
--- a/main.cpp	Sat Jun 15 19:05:32 2013 +0000
+++ b/main.cpp	Thu Jun 20 05:35:36 2013 +0000
@@ -2,7 +2,7 @@
 
 //To Do:
 // * USB device detect
-// * Ability to update binary from the thumb-drive (requires file timestamp)
+// * Enable file timestamps
 // * Audible friction brake feedback
 // * User-configurable watchpoint
 // * Add 50% charge option
@@ -10,6 +10,20 @@
 // * Fix bug in playback while connected to canbus (hangs)
 // * Fix no power displayed while charging
 // * Force regen display to zero when in neutral
+// * Add coasting regen to regen/braking display
+// * Change semilog efficiancy graph to linear with 10 minute values
+// * Add Trip meter (kWh and efficiency for current trip)
+// * Make unique sound when log file write fails and logging disabled
+// * Make display updates interruptable for log writes
+// * Add additional 79b bank readouts
+// * Add algorithmic temperature using raw ADC for better accuracy
+// * Display max temperature instead of average
+// * Ignore the missing 4th pemperature sensor on 2013 models
+// * Add ability to transfer settings config file to/from USB
+// * Add Ah & Health
+
+//Bugs:
+// *** Average temperature seems to only get 3 out of 4 on the first read
 
 #include "mbed.h"
 #include "CAN.h"
@@ -129,6 +143,10 @@
 unsigned short pointerSep;
 unsigned char reqMsgCnt = 99;
 unsigned char battTemp_x4 = 0;
+unsigned long Ah_x10000 = 0;
+unsigned long SOC_x10000 = 0;
+unsigned short SOH_x100 = 0;
+signed short battTemp_x10 = 0;
 bool metric = false;
 
 int main() {
--- a/utility.cpp	Sat Jun 15 19:05:32 2013 +0000
+++ b/utility.cpp	Thu Jun 20 05:35:36 2013 +0000
@@ -50,6 +50,7 @@
     char sTemp[40];    
     unsigned char changed;
     unsigned short i; // was unsigned char
+    signed short j;
     signed short packV;
     signed short packA;
     signed long imWs_x4;
@@ -258,14 +259,35 @@
                 lasti=i; //remember the msb to detect rollover next time around
                 i+=bdi;
                 //-------
-                if(i==BatDataBaseG4+2){ // Last of Temperature data
+                if(i==BatDataBaseG5){ // Last of Temperature data was loaded last time
                     logCP=yesBattLog; // Only log if logging enabled
                     showCP=true; // Always show
-                    battTemp_x4=battData[224+5]+battData[224+8]+battData[224+11]+battData[224+14];
+                    // 2013 models only have three sensors
+                    battTemp_x4=battData[(BatDataBaseG4*7)+5]+battData[(BatDataBaseG4*7)+8]+battData[(BatDataBaseG4*7)+11]+battData[(BatDataBaseG4*7)+14];
+                    // Or =25+(467-ADC)/9.33 (C)
+                    // Find hottest temperature
+                    battTemp_x10=467-(battData[(BatDataBaseG4*7)+3]*0x100+battData[(BatDataBaseG4*7)+4]);
+                    j=467-(battData[(BatDataBaseG4*7)+6]*0x100+battData[(BatDataBaseG4*7)+7]);
+                    if(j>battTemp_x10){
+                        battTemp_x10=j;
+                        }
+                    j=467-(battData[(BatDataBaseG4*7)+9]*0x100+battData[(BatDataBaseG4*7)+10]);
+                    if(j>battTemp_x10){
+                        battTemp_x10=j;
+                        }
+                    j=467-(battData[(BatDataBaseG4*7)+12]*0x100+battData[(BatDataBaseG4*7)+13]);
+                    if(j>battTemp_x10){
+                        battTemp_x10=j;
+                        }
+                    battTemp_x10*=100;
+                    battTemp_x10/=93;
+                    battTemp_x10+=250;
+                    SOH_x100=battData[(BatDataBaseG1*7)+29]*0x100+battData[(BatDataBaseG1*7)+30];
+                    Ah_x10000=battData[(BatDataBaseG1*7)+36]*0x10000+battData[(BatDataBaseG1*7)+37]*0x100+battData[(BatDataBaseG1*7)+38];
+                    SOC_x10000=battData[(BatDataBaseG1*7)+32]*0x10000+battData[(BatDataBaseG1*7)+33]*0x100+battData[(BatDataBaseG1*7)+34];
                 }
                 //-------
                 i*=7;
-                //if(i<0xfa){ // Is there a better way to do this?
                 if(i+6 < BatDataBufMax) {
                     battData[i+0]=canRXmsg.data[1];
                     battData[i+1]=canRXmsg.data[2];
@@ -337,36 +359,36 @@
     static char data[8] = {0x02, 0x21, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff};
     if(reqMsgCnt<99){
         switch (reqMsgCnt){
-            case 0:
+            case BatDataBaseG1:
                 can1.monitor(false); // set to active mode
                 can1SleepMode = 0; // enable TX
                 data[0]=0x02; //change to request group 1
                 data[1]=0x21;
                 data[2]=0x01;
                 break;
-            case 6: // group 1 has 6 frames
+            case BatDataBaseG2: // group 1 has 6 frames
                 can1.monitor(false); // set to active mode
                 can1SleepMode = 0; // enable TX
                 data[0]=0x02; //change to request group 2 (cp data)
                 data[1]=0x21;
                 data[2]=0x02;
                 break;
-            case 35: // group 2 has 29 frames
+            case BatDataBaseG3: // group 2 has 29 frames
                 data[0]=0x02; //change to request group 3
                 data[1]=0x21;
                 data[2]=0x03;
                 break;
-            case 40: // group 3 has 5 frames
+            case BatDataBaseG4: // group 3 has 5 frames
                 data[0]=0x02; //change to request group 4 (temperature)
                 data[1]=0x21;
                 data[2]=0x04;
                 break;
-            case 43: // group 4 has 3 frames
+            case BatDataBaseG5: // group 4 has 3 frames
                 data[0]=0x02; //change to request group 5
                 data[1]=0x21;
                 data[2]=0x05;
                 break;
-            case 54: // group 5 has 11 frames
+            case BatDataBaseG6: // group 5 has 11 frames
                 reqMsgCnt = 99;
                 can1SleepMode = 1; // disable TX
                 can1.monitor(true); // set to snoop mode
@@ -474,9 +496,9 @@
         // NOTE: calibrates screen 1 first, then screen 0.
         saveConfig();
     } else {
-        ledHi = 0.823;
+        ledHi = 0.8;
         ledLo = 0.1;
-        pollInt = 300;
+        pollInt = 60;
         scale12V = 16.2;
         skin = ttSkin;
         fscanf(cfile, "format %d\r\n", &ff );
@@ -623,9 +645,9 @@
     if(bfile!=NULL) {
         strftime(sTemp, 40, "%a %m/%d/%Y %X", &t);
         fprintf(bfile,"%s,%d,%5.1f%%,%5.1f,%5.1f,%d,%d,%d,%d,%d",sTemp,gids,(float)SOC/10,(float)packV/2,(float)packA/2,max,min,avg,max-min,jv);
-        // BatDataBaseG4 * 7 = 224        
-        fprintf(bfile,"%d,%d,%d,%d,",(battData[224+ 3]<<8)+battData[224+ 4],battData[224+ 5],(battData[224+ 6]<<8)+battData[224+ 7],battData[224+ 8]);
-        fprintf(bfile,"%d,%d,%d,%d", (battData[224+ 9]<<8)+battData[224+10],battData[224+11],(battData[224+12]<<8)+battData[224+13],battData[224+14]);
+        // BatDataBaseG4 * 7 = (BatDataBaseG4*7)        
+        fprintf(bfile,"%d,%d,%d,%d,",(battData[(BatDataBaseG4*7)+ 3]<<8)+battData[(BatDataBaseG4*7)+ 4],battData[(BatDataBaseG4*7)+ 5],(battData[(BatDataBaseG4*7)+ 6]<<8)+battData[(BatDataBaseG4*7)+ 7],battData[(BatDataBaseG4*7)+ 8]);
+        fprintf(bfile,"%d,%d,%d,%d", (battData[(BatDataBaseG4*7)+ 9]<<8)+battData[(BatDataBaseG4*7)+10],battData[(BatDataBaseG4*7)+11],(battData[(BatDataBaseG4*7)+12]<<8)+battData[(BatDataBaseG4*7)+13],battData[(BatDataBaseG4*7)+14]);
         for(i=0; i<96; i++) {
             bd=(battData[i*2+3]<<8)+battData[i*2+4];
             fprintf(bfile,",%d",bd);
--- a/utility.h	Sat Jun 15 19:05:32 2013 +0000
+++ b/utility.h	Thu Jun 20 05:35:36 2013 +0000
@@ -55,6 +55,10 @@
 extern Beep spkr;
 extern unsigned char reqMsgCnt;
 extern unsigned char battTemp_x4;
+extern signed short battTemp_x10;
+extern unsigned long Ah_x10000;
+extern unsigned long SOC_x10000;
+extern unsigned short SOH_x100;
 extern bool metric;
 extern unsigned char lastDMode[2];
 extern unsigned char whichTouched;