Dual CANbus monitor and instrumentation cluster
Dependencies: SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed
Fork of CANary by
Revision 37:fea2c1d52c5f, committed 2013-03-24
- Comitter:
- TickTock
- Date:
- Sun Mar 24 15:35:45 2013 +0000
- Parent:
- 36:dbd39c315258
- Child:
- 38:155ec32c5e91
- Commit message:
- Got kW computation working
Changed in this revision
--- a/TOUCH_TFTx2.lib Sat Mar 23 04:43:45 2013 +0000 +++ b/TOUCH_TFTx2.lib Sun Mar 24 15:35:45 2013 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/TickTock/code/TOUCH_TFTx2/#b7fb9d3ae5ea +http://mbed.org/users/TickTock/code/TOUCH_TFTx2/#220e3da2dd00
--- a/common.h Sat Mar 23 04:43:45 2013 +0000 +++ b/common.h Sun Mar 24 15:35:45 2013 +0000 @@ -2,7 +2,7 @@ #define logScreen 1 #define dteScreen 2 #define brakeScreen 3 -#define powerScreen 4 +#define testScreen 4 #define monitorScreen 5 #define changedScreen 6 #define cpScreen 7
--- a/displayModes.cpp Sat Mar 23 04:43:45 2013 +0000 +++ b/displayModes.cpp Sun Mar 24 15:35:45 2013 +0000 @@ -1,6 +1,6 @@ //displayModes.cpp +#include "displayModes.h" -#include "displayModes.h" char sTemp1[40]; char sTemp2[16]; @@ -104,7 +104,7 @@ tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); tt.locate(200,200); - printf("%4.1fV\n",(float)packV/2); + printf("%4.1fV \n",(float)packV/2); lpackV=packV; } if(force||tick){ @@ -112,6 +112,8 @@ tt.set_font((unsigned char*) Arial28x28); tt.locate(20,200); printf("%4.2fV \n",accV); + tt.locate(170,40); + printf("%4.3fkW \n",mpkWh); //kW for now } } @@ -121,9 +123,19 @@ unsigned long temp; static unsigned char lastPressure[4] = {200,200,200,200}; unsigned char i,r,t; - static unsigned char lr, lt; + static unsigned char lr=0, lt=0; + signed short steering; + unsigned short s; + static unsigned short ls; + unsigned char throttle; + static unsigned char lthrottle; CANMessage msg; + msg = lastMsg[indexLastMsg[0x180]]; //Get Throttle position + throttle = msg.data[5]; + msg = lastMsg[indexLastMsg[0x002]]; //Get Steering angle + steering = (msg.data[1]<<8)+msg.data[0]; + s= (unsigned short) ((steering/10)+160)%310; msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5); targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5); @@ -149,6 +161,26 @@ lastPressure[2] = 200; lastPressure[3] = 200; } + + if (s!=ls){ + tt.fillrect(ls,5,ls+9,14, Navy); + tt.fillrect(s,5,s+9,14, White); + //tt.foreground(Yellow); + //tt.set_font((unsigned char*) Arial28x28); + //tt.locate(10,40); + //printf("%d %d \n",s,ls); + ls=s; + } + if (throttle!=lthrottle){ + if (throttle>239) throttle=239; + if(throttle<lthrottle){ + tt.fillrect(280,239-lthrottle,310,239-throttle,Navy); + }else{ + tt.fillrect(280,239-throttle,310,239,Yellow); + } + lthrottle=throttle; + } + // plot bar graph for each wheel pressure for (i=0; i<4; i++){ if (msg.data[i]<239) { @@ -188,9 +220,9 @@ } if (r>t) t=r; //Should never happen if((lr!=r||lt!=t)&&!prdata){ - tt.fillrect(200,10,300,239-t,Navy); - tt.fillrect(200,239-t,300,239-r,Red); - tt.fillrect(200,239-r,300,239,Green); + tt.fillrect(190,10,260,239-t,Navy); + tt.fillrect(190,239-t,260,239-r,Red); + tt.fillrect(190,239-r,260,239,Green); } lt=t; lr=r; @@ -370,6 +402,29 @@ } } +void test(bool force){ + unsigned char left,right; + CANMessage msg; + static unsigned char lleft=0; + + msg = lastMsg[indexLastMsg[0x284]]; + right = msg.data[7]; + msg = lastMsg[indexLastMsg[0x280]]; + left = msg.data[6]; + + tt.background(Navy); + if(force) tt.cls(); + if(force||left!=lleft){ + tt.foreground(Yellow); + tt.set_font((unsigned char*) Arial28x28); + tt.locate(10,200); + printf("%d \n",left); + tt.locate(200,200); + printf("%d \n",right); + lleft=left; + } +} + void updateDisplay(char display){ bool changed; changed = dMode[display]!=lastDMode[display]; @@ -384,9 +439,9 @@ case brakeScreen: braking(changed); break; - case powerScreen: - //braking(changed, true); - //break; + case testScreen: + test(changed); + break; case monitorScreen: printLast(changed); break;
--- a/displayModes.h Sat Mar 23 04:43:45 2013 +0000 +++ b/displayModes.h Sun Mar 24 15:35:45 2013 +0000 @@ -29,12 +29,14 @@ extern bool playbackEn; extern bool playbackOpen; extern float playbackInt; +extern float mpkWh; extern "C" { void printLast (bool force); void printChanged (bool force); void printLog (bool force); void printDTE (bool force); + void test (bool force); void braking (bool force, bool prdata); void cpData(bool force); void showDateTime(bool force);
--- a/main.cpp Sat Mar 23 04:43:45 2013 +0000 +++ b/main.cpp Sun Mar 24 15:35:45 2013 +0000 @@ -21,8 +21,6 @@ #include "EthernetPowerControl.h" #include "utility.h" #include "displayModes.h" -#include "GraphicsDisplay.h" -#include "SPI_TFTx2.h" #include "TOUCH_TFTx2.h" LocalFileSystem local("local"); @@ -85,15 +83,17 @@ unsigned short pollInt = 300; // polling interval=5 minutes (until config file read) bool accOn = false; // Accessories on float scale12V = 16.2; // R1:R2 ratio -signed long kWh = 0; +signed long mWs = 0; unsigned long miles = 0; float mpkWh = 0; float accV = 0; bool playbackEn = false; bool playbackOpen = false; -float playbackInt = 1; //read one message every 64 ms +float playbackInt = 0.032; //read one message every 64 ms bool step = false; +char header[5]; char data[8]; +unsigned short pbts; int main() { int readPointer=0; @@ -177,12 +177,10 @@ secsNoMsg = 0; secsNoTouch = 0; - // Read config file readConfig(); touched=false; secsNoTouch=2; - while (true) { if (!logOpen) { // Open new file if one is not already open if(logEn){ //logging enable @@ -212,11 +210,16 @@ // Dump buffer if > 1/16 full or canbus has stopped if (file == NULL) { logOpen = false; - sprintf(sTemp,"Failed to append log file.\n\n"); + sprintf(sTemp,"Failed to append log file.\n"); + logMsg(sTemp); spkr.beep(1000,0.25); - logMsg(sTemp); logEn=false; } else { + if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen*7/8)) { // Hi-water mark + sprintf(sTemp,"Write buffer overrun.\n"); + logMsg(sTemp); + spkr.beep(1000,0.25); + } while (readPointer != writePointer) { for (j = 0; j<13; j++){ fprintf(file,"%c",writeBuffer[readPointer][j]); @@ -304,6 +307,7 @@ indexOffset=indexOffset>4?indexOffset-4:1; } else if (dMode[i]==config1Screen) { wait_ms(500); + tt.background(Black); tt.calibrate(); } else if (dMode[i]==config2Screen) { // slower playbackInt *=2; @@ -442,7 +446,6 @@ lastDMode[1]=99; } } - display=display<1?display+1:0; // toggle display updateDisplay(display); @@ -465,13 +468,14 @@ }else{ dled = ledLo; } - if(kWh>0){ - mpkWh=miles/kWh; + //if(mWs>0){ + if(true){ + mpkWh= ((float) mWs)/1e6; // just kW for now }else{ mpkWh=99; } miles=0; - kWh=0; + mWs=0; tick=false; } @@ -481,11 +485,9 @@ //logMsg(sTemp); for(i=0;i<200;i++){ if(!feof(file)){ - //for (j = 0; j<5; j++){ - fscanf(file,"%5c",&writeBuffer[0][0]); - //} - fscanf(file,"%8c",&data[0]); - logCan(writeBuffer[0][0],CANMessage(0x7ff&((writeBuffer[0][4]<<8)+writeBuffer[0][3]), data, 8)); + fscanf(file,"%5c%8c",&header,&data); + pbts=(header[1]<<8)|header[2]; + logCan(header[0],CANMessage(0x7ff&((header[4]<<8)+header[3]), data, 8)); }else{ fclose(file); // restart file = fopen("/usb/playback.alc", "rb"); @@ -495,5 +497,6 @@ } step=false; } + } //while (true) } \ No newline at end of file
--- a/utility.cpp Sat Mar 23 04:43:45 2013 +0000 +++ b/utility.cpp Sun Mar 24 15:35:45 2013 +0000 @@ -1,5 +1,4 @@ // utility.cpp - #include "utility.h" void mbed_reset(); @@ -12,7 +11,7 @@ tick=true; } -extern "C" void RTC_Init (void) { +void RTC_Init (void) { LPC_RTC->ILR=0x00; // set up the RTC interrupts LPC_RTC->CIIR=0x01; // interrupts each second LPC_RTC->CCR = 0x01; // Clock enable @@ -26,7 +25,7 @@ } void touch_ISR(){ - LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF); + //LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF); // seems to work without so maybe not necessary (performed inInterruptIn handler?) touched=true; // just set flag - touch screen algorythm is long and we don't want to block other interrupts } @@ -40,16 +39,21 @@ void logCan (char mType, CANMessage canRXmsg) { char sTemp[40]; unsigned short ts = getTimeStamp(); - unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900 static unsigned char ii = 0, lasti = 0; // indexindex unsigned char changed,i; - static unsigned char bdi; + static unsigned char bdi=0; + //Determined 1db messages are 10ms apart so no need to compute deltaT + //unsigned short ms; + //static unsigned short lms=0; + unsigned short packV; + signed short packA; + signed long imWs; secsNoMsg=0; // reset deadman switch if(logOpen){ if(canRXmsg.id>0) { writeBuffer[writePointer][0]=mType; - writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8); - writeBuffer[writePointer][2]=ts&0xff; + writeBuffer[writePointer][1]=(ts&0xff00)>>8; + writeBuffer[writePointer][2]=(ts&0x00ff); writeBuffer[writePointer][3]=canRXmsg.id&0xff; writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4); for(i=5;i<13;i++){ @@ -60,7 +64,11 @@ led3 = !led3; } } - }//if logOpen + } + //Determined 1db messages are 10ms apart so no need to compute deltaT + /*if(playbackOpen){ + ts=pbts; // Use ts from playback buffer + }//if logOpen*/ if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry ii=ii<99?ii+1:0; indexLastMsg[canRXmsg.id]=ii; //Create entry if first message @@ -77,13 +85,13 @@ lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table if((mType==2)&&(canRXmsg.id==0x358)){ // headlight/turn signal indicator headlights = (canRXmsg.data[1]&0x80)?true:false; - } else if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data? Need to store all responses + }else if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data? Need to store all responses if(canRXmsg.data[0]<0x20){ if(canRXmsg.data[3]==2){//cellpair data bdi=0; sprintf(sTemp,"Getting cell pair data\n"); logMsg(sTemp); - }else if(canRXmsg.data[3]==4){//temperature data + }else if(canRXmsg.data[3]==4){//temperature data bdi=0x20; sprintf(sTemp,"Getting temperature data\n"); logMsg(sTemp); @@ -106,7 +114,26 @@ battData[i+5]=canRXmsg.data[6]; battData[i+6]=canRXmsg.data[7]; } - }//if 0x7bb + }else if((mType==1)&&(canRXmsg.id==0x1db)){ //Battery Volts and Amps + //Determined 1db messages are 10ms apart so no need to compute deltaT + //ms=(ts&0xfc00)*1000+(ts&0x03ff); // convert from BCD(ish-ssssss:mmmmmmmmmm) to binary + //if(ms<lms){ // must've rolled over + // imWs=ms+60000; // (ms)compute elapsed time since last update including rollover + // imWs-=lms; + //}else{ + // imWs=ms-lms; // (ms) compute elapsed time since last update + //} + packV=((canRXmsg.data[2]<<2)|(canRXmsg.data[3]>>6)); // 1 LSB = 0.5V + packA=((canRXmsg.data[0]<<3)|(canRXmsg.data[1]>>5)); // 1 LSB = 0.5A + if(packA>0x03ff){ + packA|=0xf800;//extend sign; + } + imWs=packV; // Volts*seconds*2 + imWs*=packA; // Watts*4 + imWs*=-2.5; // milliwatts*seconds (1db messages are 10ms apart) + mWs+=imWs; // total mWs + //lms=ms; + } } void logTS () {
--- a/utility.h Sat Mar 23 04:43:45 2013 +0000 +++ b/utility.h Sun Mar 24 15:35:45 2013 +0000 @@ -36,6 +36,8 @@ extern bool playbackOpen; extern bool step; extern float playbackInt; +extern signed long mWs; +extern unsigned short pbts; extern "C" { void mbed_reset();