Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller
Dependencies: SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed
Fork of CANary by
Diff: utility.cpp
- Branch:
- Metric
- Revision:
- 108:29b5a760adc2
- Parent:
- 107:e9be732c1ad4
- Child:
- 109:3e6f0e8fca0d
diff -r e9be732c1ad4 -r 29b5a760adc2 utility.cpp --- 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); +}