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 TFT_fonts TOUCH_TFTx2 mbed
Fork of CANary by
Revision 132:08748a67280a, committed 2013-07-24
- Comitter:
- TickTock
- Date:
- Wed Jul 24 12:29:22 2013 +0000
- Parent:
- 131:0d926c080a65
- Child:
- 133:b0675d9d11dd
- Commit message:
- Added max and min DTE to main display. Put mbed to sleep during charging if not logging.
Changed in this revision
--- a/displayModes.cpp Wed Jul 24 11:20:08 2013 +0000
+++ b/displayModes.cpp Wed Jul 24 12:29:22 2013 +0000
@@ -35,15 +35,25 @@
printf("%3d sep %3d max\n",pointerSep,maxPS);
}
tt.locate(10,40);
- printf("%4.1f kWh \n",(float)(gids-5)*0.075);
+ float useable_kWh = (float)(gids-5)*0.075;
+ printf("%4.1f kWh \n",useable_kWh);
+ // Display DTE
tt.set_font((unsigned char*) SCProSB31x55);
tt.foreground(Green);
tt.locate(60,80);
- printf("%4.1f %s \n",convertDistance(mpkWh[dtePeriod]*((float)(gids-5)*.075)),distanceUnit()); //LM - add metric conversion
+ printf("%4.1f %s \n",convertDistance(mpkWh[dtePeriod]*useable_kWh),distanceUnit()); //LM - add metric conversion
lgids=gids;
lmpkWh=mpkWh[dtePeriod];
- tt.foreground(Yellow);
- tt.set_font((unsigned char*) Arial28x28);
+ if(minTripEff<10){
+ // Display max & min DTE
+ tt.set_font((unsigned char*) Arial12x12_prop);
+ tt.locate(5,120);
+ printf("%3.1f \n",convertDistance(minTripEff*useable_kWh));
+ tt.locate(280,120);
+ printf("%4.1f \n",convertDistance(maxTripEff*useable_kWh));
+ tt.foreground(Yellow);
+ tt.set_font((unsigned char*) Arial28x28);
+ }
}
if(force||SOC_x10!=lSOC){
tt.locate(200,10);
@@ -292,7 +302,7 @@
}
if(force||SOH_x100!=lSOH){
tt.locate(10,70);
- printf(" %4.1f,%4.1f %s \n",(float)SOH_x2/2,(float)SOH_x100/100,"% SOH");
+ printf(" %4.1f%s,%4.1f%s \n",(float)SOH_x2/2,"%",(float)SOH_x100/100,"% SOH");
lSOH=SOH_x100;
}
if(force||Ah_x10000!=lAh){
--- a/displayModes.h Wed Jul 24 11:20:08 2013 +0000
+++ b/displayModes.h Wed Jul 24 12:29:22 2013 +0000
@@ -58,6 +58,7 @@
extern float unloadedV_x2,Resr,curRmax,curRmin,redRmax,redRmin,incRmax,incRmin;
extern signed short Imax, Imin;
extern bool showHealth;
+extern float maxTripEff, minTripEff;
extern "C" {
void printLast (bool force, bool showButtons);
--- a/main.cpp Wed Jul 24 11:20:08 2013 +0000
+++ b/main.cpp Wed Jul 24 12:29:22 2013 +0000
@@ -20,7 +20,7 @@
#include "displayModes.h"
#include "TOUCH_TFTx2.h"
-char revStr[7] = "131"; // gg - revision string, max 6 characters
+char revStr[7] = "132"; // gg - revision string, max 6 characters
FATFS USBdrive;
LocalFileSystem local("local");
@@ -74,9 +74,9 @@
volatile int writePointer = 0;
int readPointer=0;
volatile unsigned short secsNoCarCanMsg = 0;
+volatile unsigned short secsNoEvCanMsg = 0;
volatile unsigned short secsNoTouch = 0;
-volatile bool carCanIdle;
-volatile bool userIdle;
+volatile bool carCanIdle,evCanIdle,userIdle;
bool touched=false; //flag to read touchscreen
unsigned char whichTouched = 0;
char counter = 0;
@@ -117,6 +117,8 @@
unsigned char dtePeriod = 14; //ten minute averaging interval
float kWh_trip[3]={0};
float miles_trip[3]={0};
+float maxTripEff = 0;
+float minTripEff = 99;
float mph[39]={0};
float kW[39]={0};
float mpkWh[39]={0};
@@ -143,8 +145,6 @@
bool moving=false;
int main() {
- //can1SleepMode.mode(OpenDrain);
- //can2SleepMode.mode(OpenDrain);
char sTemp[40];
unsigned long secs;
unsigned char i,j,display=0,lwt=0;
@@ -184,6 +184,7 @@
printMsg(sTemp); // revision
secsNoCarCanMsg = 0;
+ secsNoEvCanMsg = 0;
//read efficiency history data
hfile = fopen("/local/ehist.cny", "r");
@@ -285,7 +286,7 @@
led4=false;
}
} // if logOpen
- if (carCanIdle&&userIdle&&!playbackEn) { // canbus idle --> sleep to save power
+ if (carCanIdle && (evCanIdle || !logOpen) && userIdle && !playbackEn) { // canbus idle --> sleep to save power
if (repeatPoll) { // stop autopolling if enabled
autoPoll.detach();
}
@@ -305,7 +306,7 @@
led4=0;
dled=0; // turn off display
secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
- while (secsNoCarCanMsg>canTimeout && !touched) {
+ while (secsNoCarCanMsg>canTimeout && (secsNoEvCanMsg>canTimeout || !logOpen) && !touched) {
//DeepPowerDown();
tt.wfi(); //enable touch interrupt
//__wfi(); // freeze CPU and wait for interrupt (from canbus or touch)
@@ -315,6 +316,7 @@
lastDMode[1]=99;
secsNoTouch=2;
carCanIdle=secsNoCarCanMsg>canTimeout;
+ evCanIdle=secsNoEvCanMsg>canTimeout;
dled=0.8; // turn on display LED
seconds = time(NULL);
t = *localtime(&seconds) ;
@@ -684,6 +686,14 @@
if(laccOn&&!accOn){ // Car turned off
saveDmode=dMode[0];
dMode[0]=healthScreen;
+ // Keep track of max and min trip efficiency
+ float tmpeff = miles_trip[0]/kWh_trip[0];
+ if (maxTripEff<tmpeff) {
+ maxTripEff=tmpeff;
+ }
+ if (minTripEff>tmpeff) {
+ minTripEff=tmpeff;
+ }
if (repeatPoll) { // Log on shutdown if autopoll enabled
tripLog(); // Write trip log on powerdown
}
@@ -811,6 +821,10 @@
}
if(!usbEn&&!waitasec){
usbEn=detectUSB(); // Keep looking if none found
+ if(usbEn){ // Force update to clear USB init garbage
+ lastDMode[0]=99;
+ lastDMode[1]=99;
+ }
}
waitasec=false; // work around to avoid hang when USB tries to init immediately
tock=true;
--- a/utility.cpp Wed Jul 24 11:20:08 2013 +0000
+++ b/utility.cpp Wed Jul 24 12:29:22 2013 +0000
@@ -6,6 +6,7 @@
void RTC_IRQHandler() {
timer.reset(); // zero ms at the-seconds-tic
carCanIdle=(++secsNoCarCanMsg>canTimeout)?true:false;
+ evCanIdle=(++secsNoEvCanMsg>canTimeout)?true:false;
userIdle=(++secsNoTouch>userTimeout)?true:false;
LPC_RTC->ILR |= (1<<0); // clear interrupt to prepare for next
tick=true;
@@ -55,7 +56,6 @@
signed long imWs_x4;
unsigned short ts;
- secsNoCarCanMsg=0; // reset deadman switch
if(debugMode||(skin==ggSkin)){
// code to insert actual number of dropped frames for overrun debug - skiped in normal mode to keep logcan short
if(logOpen){
@@ -458,6 +458,7 @@
CANMessage msg1;
can1.read(msg1);
+ secsNoEvCanMsg=0; // reset deadman switch
if( ZeroSecTick ) { ZeroSecTick = false; logTS(); } // gg - 0-second EV bus
if(msg1.id>0) {
logCan(1, msg1); // EVcan Message Received
@@ -469,8 +470,8 @@
CANMessage msg2;
can2.read(msg2);
- if( ZeroSecTick ) { ZeroSecTick = false; logTS(); } // gg - 0-second EV bus
-
+ secsNoCarCanMsg=0; // reset deadman switch
+ if( ZeroSecTick ) { ZeroSecTick = false; logTS(); } // gg - 0-second EV bus
if(msg2.id>0) {
logCan(2, msg2); // CARcan Message Received
led2 = !led2;
--- a/utility.h Wed Jul 24 11:20:08 2013 +0000 +++ b/utility.h Wed Jul 24 12:29:22 2013 +0000 @@ -10,8 +10,10 @@ extern Timer timer; extern Ticker msgReq; extern volatile unsigned short secsNoCarCanMsg; +extern volatile unsigned short secsNoEvCanMsg; extern volatile unsigned short secsNoTouch; extern volatile bool carCanIdle; +extern volatile bool evCanIdle; extern volatile bool userIdle; extern char displayLog[20][40]; extern unsigned char displayLoc;
