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

Branch:
Metric
Revision:
107:e9be732c1ad4
Parent:
106:f016912a03db
Child:
108:29b5a760adc2
--- a/utility.cpp	Fri Jun 28 20:26:11 2013 +0000
+++ b/utility.cpp	Sat Jun 29 02:44:02 2013 +0000
@@ -55,6 +55,8 @@
     signed short packA;
     signed long imWs_x4;
     unsigned short ts;
+    long temp_adc[6]       = {1000,589,487,401,365,0 };
+    signed short temp_C[6] = {-270, 130, 230, 320, 360, 760};
 
     secsNoMsg=0; // reset deadman switch
     if(debugMode||(skin==ggSkin)){ 
@@ -264,22 +266,30 @@
                     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=battData[(BatDataBaseG4*7)+3]*0x100+battData[(BatDataBaseG4*7)+4];
+                    j=battData[(BatDataBaseG4*7)+6]*0x100+battData[(BatDataBaseG4*7)+7];
+                    if(j<battTemp_x10){
+                        battTemp_x10=j;
+                        }
+                    j=battData[(BatDataBaseG4*7)+9]*0x100+battData[(BatDataBaseG4*7)+10];
+                    if(j<battTemp_x10){
                         battTemp_x10=j;
                         }
-                    j=467-(battData[(BatDataBaseG4*7)+9]*0x100+battData[(BatDataBaseG4*7)+10]);
-                    if(j>battTemp_x10){
+                    j=battData[(BatDataBaseG4*7)+12]*0x100+battData[(BatDataBaseG4*7)+13];
+                    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;
+                    //interpolate for temperature
+                    char k=0;
+                    while(battTemp_x10<=temp_adc[++k]) { } // Find section in table
+                    j=battTemp_x10-temp_adc[k];
+                    j*=(temp_C[k]-temp_C[k-1]);
+                    j/=(temp_adc[k]-temp_adc[k-1]);
+                    j+=temp_C[k];
+                    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];