test fork
Dependencies: SPI_TFTx2 SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2 mbed
Fork of CANary_9341 by
Revision 102:fd19f777a0b4, committed 2013-06-20
- 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
--- 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;