Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller
Dependencies: SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed
Fork of CANary by
Revision 161:71ac85d11f03, committed 2013-11-21
- Comitter:
- TickTock
- Date:
- Thu Nov 21 14:17:35 2013 +0000
- Parent:
- 160:905fe45ed54b
- Child:
- 162:c6545fc0164a
- Commit message:
- // * Subtract climate control power from stored efficiency data and add current CC power back in for display; // * Added X axis labels on CP histogram and scaled bar width;
Changed in this revision
--- a/displayModes.cpp Wed Nov 20 13:13:54 2013 +0000 +++ b/displayModes.cpp Thu Nov 21 14:17:35 2013 +0000 @@ -6,7 +6,7 @@ void mainDisplay (bool force, bool showButtons){ unsigned short gids, SOC_x10, packV_x2, tireP; - float useable_kWh,dte; + float useable_kWh,dte,total_kW; unsigned char aTemp; static unsigned short lgids=0, lSOC=0, lpackV_x2=0, ltireP=0; static unsigned char laTemp=0; @@ -87,22 +87,23 @@ lgids=gids; lmpkWh=mpkWh[dtePeriod]; } - if(force||kW[0]!=lkW){ + total_kW=kW[0]+CCkW; + if(force||total_kW!=lkW){ tt.foreground(Cyan); - if(kW[0]<-10){ //Right justify + if(total_kW<-10){ //Right justify tt.locate(171,40); - printf("%4.2fkW\n",kW[0]); - } else if (kW[0]<0){ + printf("%4.2fkW\n",total_kW); + } else if (total_kW<0){ tt.locate(171,40); - printf(" %4.2fkW\n",kW[0]); - } else if (kW[0]<10){ + printf(" %4.2fkW\n",total_kW); + } else if (total_kW<10){ tt.locate(165,40); - printf(" %4.2fkW\n",kW[0]); + printf(" %4.2fkW\n",total_kW); } else { tt.locate(165,40); - printf(" %4.2fkW\n",kW[0]); + printf(" %4.2fkW\n",total_kW); } - lkW=kW[0]; + lkW=total_kW; } if(force||SOC_x10!=lSOC){ tt.locate(215,10); @@ -218,10 +219,11 @@ printf("%3.1fV \n",accV); laccV=accV; } - if(force||kW[0]!=lkW){ + total_kW=kW[0]+CCkW; + if(force||total_kW!=lkW){ tt.locate(160,40); // gg - move left to keep from wrap - printf("%3.2fkw \n",kW[0]); // use small w to save space - lkW=kW[0]; + printf("%3.2fkw \n",total_kW); // use small w to save space + lkW=total_kW; } } if(led4){ @@ -727,11 +729,10 @@ nBar[i] *= nBarScale ; // scale, as needed } - // label the X axis (approximate) - //tt.locate( 2, yWinMin-14 ); printf("%04d = %04d from %1.4f", max, int( height / nBarScale ) + min, nBarScale ); + // label the Y axis tt.locate( 2, yWinMin-14 ); printf("%04d = (%d) mv range.\n", max , max - min ); tt.locate( 2, yWinMax+5); printf("%04d\n", min ); - // values, for now + // BatDataBaseG4 * 7 = 280 tt.locate( 0, yWinMax+40 ); char* sTemperatureUnit = temperatureUnit(); @@ -817,13 +818,10 @@ int xWinMax = 300; int yWinMin = 50; int yWinMax = 150; - // draw the Histogram Frame, 2 pixels wide - tt.rect( xWinMin-1,yWinMin-1, xWinMax+1,yWinMax+1,Red); - tt.rect( xWinMin-2,yWinMin-2, xWinMax+2,yWinMax+2,Green); - + // binning short nBin[301] ; // bins to count Min values in nBin[0], etc. - int height ; + int height; int iBinIndxMax = 300 ; int iBinValMax = max - min ; // zero to N if( iBinValMax > iBinIndxMax ) iBinValMax = iBinIndxMax ; @@ -837,38 +835,31 @@ for(int i=0; i<96; i++){ bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4] - min ; if( bd > iBinValMax ) bd = iBinValMax ; - nBin[bd] ++ ; + nBin[bd]++ ; } - - //---------------- - if( iBinValMax == 0 ) { - // for testing - min = 10 ; - max = 50 ; - avg = ( max + min ) / 2; - iBinValMax = max - min ; - for(int i=0; i<=(iBinValMax/2); i++) { - nBin[i] = i ; - nBin[iBinValMax-i] = i ; - } - } - - // the values, for now - // BatDataBaseG4 * 7 = 280 + + // label the Y axis + tt.locate( 0, yWinMin ); printf("25\n"); + tt.locate( 0, yWinMax-6 ); printf("0\n"); + tt.locate( xWinMin-12, yWinMax+6 ); printf("%04d\n", min); + tt.locate( xWinMax-18, yWinMax+6 ); printf("%04d\n", max); + // draw the Histogram Frame, 2 pixels wide + tt.rect( xWinMin-1,yWinMin-1, xWinMax+1,yWinMax+1,Red); + tt.rect( xWinMin-2,yWinMin-2, xWinMax+2,yWinMax+2,Green); tt.locate( 0, yWinMax+40 ); 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, convertC(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertC(battData[BatDataBaseG4*7+8]),sTemperatureUnit, convertC(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertC(battData[BatDataBaseG4*7+14]),sTemperatureUnit); - + //--------------- // show the bars - int nBarWidth = 3 ; - int nBarSpace = 1 ; // 1 for testing + int nBarWidth = (xWinMax-xWinMin-2)/iBinValMax-1; //3 + int nBarSpace = 1 ; int xPos = (xWinMin + xWinMax) / 2 ; xPos -= (avg-min) * (nBarWidth + nBarSpace) ; - + for( int i=0; i<=iBinValMax; i++) { height = 4 * nBin[i] ; if( height > 100 ) height = 100 ; // clip tops @@ -897,7 +888,7 @@ tt.cls(); } //-------- top row -------- - showButton(1,0," Reset","",4,4); + showButton(1,0," Reset","CANary",4,4); showButton(2,0," Save"," Config",4,4); //------- second row ----- @@ -948,7 +939,8 @@ } //-------- top row -------- showButton(0,0,"Calibrate"," Touch",4,4); // gg - 4x4 - + showButton(1,0," Reset","Max/Min",4,4); + // a button to step to the next skin unsigned int nextSkin = skin + 1 ; if( nextSkin > maxSkin ) nextSkin = 0 ;
--- a/displayModes.h Wed Nov 20 13:13:54 2013 +0000 +++ b/displayModes.h Thu Nov 21 14:17:35 2013 +0000 @@ -70,6 +70,7 @@ extern bool idir; extern bool autoSync; extern bool clearTest; +extern float CCkW; extern "C" { void printLast (bool force, bool showButtons);
--- a/main.cpp Wed Nov 20 13:13:54 2013 +0000 +++ b/main.cpp Thu Nov 21 14:17:35 2013 +0000 @@ -3,16 +3,13 @@ //To Do: // * Add 50% charge option // * Add linear efficiency graph with 10 minute values -// * Subtract accessory power from efficiency history (add back in when displaying) // * Add in-device config editor // * Change pack volt color when CVLI fails // * Add tire pressure cal (40psi for me = FR 38, RR 38.2, FL 37.8, RL 38 - maybe 2psi error on my tire gauge?) -// rev160 -// * Tweaked heater monitor to only issue once per power on/off -// * Added filtering to timeSync routing (some times set time to bogus value) -// * Removed debug wait commands from config save and firmware update -// * Added 3-tone sound messages +// rev161 +// * Subtract climate control power from stored efficiency data and add current CC power back in for display +// * Added X axis labels on CP histogram and scaled bar width #include "mbed.h" #include "CAN.h" @@ -22,7 +19,7 @@ #include "utility.h" #include "displayModes.h" #include "TOUCH_TFTx2.h" -char revStr[7] = "160"; // gg - revision string, max 6 characters +char revStr[7] = "161"; // gg - revision string, max 6 characters FATFS USBdrive; LocalFileSystem local("local"); @@ -116,6 +113,7 @@ unsigned short numSsamples = 0; float accV = 0; float accV2 = 0; +float CCkW = 0; bool playbackEn = false; bool playbackOpen = false; //float playbackInt = 0.05; //read messages every 50 ms @@ -469,6 +467,7 @@ } else if (dMode[whichTouched]==config2Screen) { // reset DTE Max/Min maxTripEff = 0; minTripEff = 5; + beep(2000,0.25); } else if (dMode[whichTouched]==playbackScreen) { // pause/unpause playbackEn=!playbackEn; if(playbackEn){ @@ -741,6 +740,7 @@ if(tick){ // Executes once a second tick=false; + CCkW = (lastMsg[indexLastMsg[0x510]].data[3]&0x7f)*0.125; if (miles_trip[0]>0.25) { curEff = miles_trip[0]/kWh_trip[0]; } else { @@ -857,17 +857,35 @@ if(numWsamples>0){ // Avoid div0 mpkWh[0]=mph[0]; - kW[0]=((float) mWs_x4)/numWsamples/4e3; + kW[0]=((float) mWs_x4)/numWsamples/4e3; mpkWh[0]/=kW[0]; if (mpkWh[0]<0) { mpkWh[0]=99;// negative means inf. } - } else { + kW[0]-=CCkW; // subtract climate control power from recorded value + } else { kW[0]=0; mpkWh[0]=0; } numWsamples=0; + if((accOn||playbackEn)&&!charging){ // Calculate averages + for(i=1;i<39;i++){ + average=mph[i]/timeConstant[i]; + mph[i]-=average; + mph[i]+=mph[0]; + mpkWh[i]=average; + average=kW[i]/timeConstant[i]; + kW[i]-=average; + kW[i]+=kW[0]; + average+=CCkW; //add climate control power back in for display + mpkWh[i]/=average; + if (mpkWh[i]<0) { + mpkWh[i]=99;// negative means inf. + } + } + } + if (!charging){ miles_trip[0]+=mph[0]/3600; // per trip miles_trip[1]+=mph[0]/3600; // per charge @@ -875,7 +893,7 @@ kWh_trip[0]+=kW[0]/3600; kWh_trip[1]+=kW[0]/3600; kWh_trip[2]+=kW[0]/3600; - } else { + } else { // charging so reset per charge trip meter miles_trip[1]=0; kWh_trip[1]=0; } @@ -904,22 +922,6 @@ Imax=-1000; Imin=1000; - if((accOn||playbackEn)&&!charging){ - for(i=1;i<39;i++){ - average=mph[i]/timeConstant[i]; - mph[i]-=average; - mph[i]+=mph[0]; - mpkWh[i]=average; - average=kW[i]/timeConstant[i]; - kW[i]-=average; - kW[i]+=kW[0]; - mpkWh[i]/=average; - if (mpkWh[i]<0) { - mpkWh[i]=99;// negative means inf. - } - //mpkWh[i]=floor(mpkWh[i]*10+0.5)/10; // Round to nearest 10th - } - } if(logCP&&usbEn){ if(logOnce){ tripLog();
--- a/utility.cpp Wed Nov 20 13:13:54 2013 +0000 +++ b/utility.cpp Thu Nov 21 14:17:35 2013 +0000 @@ -47,7 +47,6 @@ void logCan (char mType, CANMessage canRXmsg) { - // re-arranged to put static first static unsigned char ii = 0; static unsigned char lasti = 0; // indexindex static unsigned char bdi=0; @@ -63,7 +62,7 @@ unsigned short ts; if(debugMode||(skin==ggSkin)){ - // code to insert actual number of dropped frames for overrun debug - skiped in normal mode to keep logcan short + // code to insert actual number of dropped frames for overrun debug - skipped in normal mode to keep logcan short if(logOpen){ // check to see if buffer is already full (read - write) = 1 // actually the last buffer location cannot be used because then @@ -168,7 +167,7 @@ writeBuffer[localWritePointer][2]=(ts&0x00ff); writeBuffer[localWritePointer][3]=canRXmsg.id&0xff; writeBuffer[localWritePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4); - for(i=5;i<13;i++){ // Is there a better way to do this? (writeBuffer[localWritePointer][5]=canRXmsg.data?) + for(i=5;i<13;i++){ // Is there a better way to do this? writeBuffer[localWritePointer][i]=canRXmsg.data[i-5]; } if (writePointer==readPointer) { @@ -181,19 +180,19 @@ if(canRXmsg.id<0x800){ // Block FFE and FFF messages if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry - //ii=ii<99?ii+1:0; // Should never wrap - less than 100 different messages ever used if(ii<99) { - //indexLastMsg[canRXmsg.id]=ii; //Create entry if first message indexLastMsg[canRXmsg.id]=++ii; //Create entry for first MsgID occurance // ii max is 99 here } else { // the ii array is full, more than 100 MsgIDs found if(ii==99) { ii++; // step to 100 to log only one error - printMsg("MsgID buffer overrun.\n"); // write buffer overrun + printMsg("msgID buffer overrun.\n"); + beep3(500,0.25,1000,0.5,500,0.25); //Alert driver to check log } } } + lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store data in table at assigned index //---------------- if(dMode[0]==changedScreen||dMode[1]==changedScreen){// Skip if not using (for execution speed) @@ -206,8 +205,6 @@ } msgChanged[indexLastMsg[canRXmsg.id]]=changed; } - - lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table //------------------- //Miscellaneous on-recieve operations below