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:
108:29b5a760adc2
Parent:
107:e9be732c1ad4
Child:
109:3e6f0e8fca0d
--- a/utility.cpp	Sat Jun 29 02:44:02 2013 +0000
+++ b/utility.cpp	Sun Jun 30 14:45:01 2013 +0000
@@ -49,14 +49,11 @@
  
     char sTemp[40];    
     unsigned char changed;
-    unsigned short i; // was unsigned char
-    signed short j;
+    unsigned short i,j,k;
     signed short packV;
     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)){ 
@@ -263,33 +260,31 @@
                     logCP=yesBattLog; // Only log if logging enabled
                     showCP=true; // Always show
                     // 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=battData[(BatDataBaseG4*7)+3]*0x100+battData[(BatDataBaseG4*7)+4];
+                    // Find hottest temperature by finding smallest ADC value
+                    k=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;
+                    if(j<k){
+                        k=j;
                         }
                     j=battData[(BatDataBaseG4*7)+9]*0x100+battData[(BatDataBaseG4*7)+10];
-                    if(j<battTemp_x10){
-                        battTemp_x10=j;
+                    if(j<k){
+                        k=j;
                         }
                     j=battData[(BatDataBaseG4*7)+12]*0x100+battData[(BatDataBaseG4*7)+13];
-                    if(j<battTemp_x10){
-                        battTemp_x10=j;
+                    if(j<k){
+                        k=j;
                         }
-                    //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;
+                    //interpolate from lookup table
+                    unsigned short temp_adc[6] = { 1000,  589,  487,  401,  365,  000};
+                    float            temp_C[6] = {-27.0, 13.0, 23.0, 32.0, 36.0, 76.0};
+                    char ii=0;
+                    while(k<=temp_adc[++ii]) { } // Find section in table
+                    maxTemp=(float)(k-temp_adc[ii]);
+                    maxTemp/=(float)(temp_adc[ii-1]-temp_adc[ii]);
+                    maxTemp*=(temp_C[ii-1]-temp_C[ii]);
+                    maxTemp+=temp_C[ii];
+
                     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];
@@ -651,12 +646,67 @@
     }
     
     FILE *bfile;
-    //bfile = fopen("/local/batvolt.txt", "a");
     bfile = fopen("/usb/batvolt.txt", "a");
     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 = (BatDataBaseG4*7)        
+        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);    
+        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);
+        }
+        fprintf(bfile,"\r\n");
+        fclose(bfile);
+    }
+    logCP=false;
+    showCP=true;
+}
+
+void tripLog() { // Daily log
+    char sTemp[40];
+    struct tm t; // pointer to a static tm structure
+    short unsigned max, min, jv, i, bd;
+    unsigned avg;
+    unsigned short gids, SOC, packV;
+    signed short packA;
+    time_t seconds ;
+    
+    CANMessage msg;
+    
+    seconds = time(NULL); // Turbo3
+    t = *localtime(&seconds) ; // Turbo3 
+    
+    msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
+    gids = (msg.data[0]<<2)+(msg.data[1]>>6);
+    msg = lastMsg[indexLastMsg[0x55b]]; //Get SOC
+    SOC = (msg.data[0]<<2)+(msg.data[1]>>6);
+    msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts
+    packV = (msg.data[2]<<2)+(msg.data[3]>>6);
+    packA = (msg.data[0]<<3)+(msg.data[1]>>5);
+    if (packA & 0x400) packA |= 0xf800;
+    
+    max=0;
+    min=9999;
+    avg=0;
+    for(i=0; i<96; i++) {
+        bd=(battData[i*2+3]<<8)+battData[i*2+4];
+        avg+=bd;
+        if(bd>max) max=bd;
+        if(bd<min) min=bd;
+    }
+    avg /= 96;
+    if(min<3713) {
+        jv=avg-(max-avg)*1.5;
+    } else { // Only compute judgement value if min cellpair meets <= 3712mV requirement
+        jv=0;
+    }
+    
+    FILE *bfile;
+    bfile = fopen("/usb/triplog.txt", "a");
+    if(bfile!=NULL) {
+        strftime(sTemp, 40, "%a %m/%d/%Y %X", &t);
+        fprintf(bfile,"%s,%d,%5.1f%%,%5.1f%%, %4.2f, %5.1f,%5.1f,%d,%d,%d,%d,%d",sTemp,gids,(float)SOC/10, (float)SOH_x100/100,(float)Ah_x10000/10000,(float)packV/2,(float)packA/2,max,min,avg,max-min,jv);      
         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++) {
@@ -681,7 +731,7 @@
     {        
         sprintf(sTemp,"Couldn't find firmware.bin\n");
         printf(sTemp);
-        wait(5);
+        wait(3);
         lastDMode[whichTouched]=99;//force refresh
         return;
     }
@@ -714,7 +764,7 @@
     } else {
       /* could not open directory */
         printf("Couldnt open folder");
-        wait(5);
+        wait(3);
         return;
     }        
     printf("copying new firmware\n");
@@ -731,7 +781,7 @@
     {
         sprintf(sTemp,"Couldn't Open Destination\n");
         printf(sTemp);
-        wait(5);
+        wait(3);
         return;
     }
     char buffer[bufSize];
@@ -747,8 +797,18 @@
     fclose(srcFile);
     tt.cls();
     printf("Succesful\n\n");
-    printf("Rebooting in 5 seconds\n");
-    wait(5);
+    printf("Rebooting in 3 seconds\n");
+    wait(3);
     //Now run new firmware
     mbed_reset();
 }
+
+bool detectUSB(void){
+    bool usbEn=false;
+    /*FILE *tfile = fopen("/usb/presence.det", "w");
+    usbEn=(tfile==NULL)?false:true;
+    if(usbEn){
+        fclose(lfile);
+    }*/
+    return(usbEn);
+}