Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2_ILI9341 mbed
Fork of CANary_corrupt 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
