Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller
Dependencies: SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed
Fork of CANary by
Diff: utility.cpp
- Revision:
- 37:fea2c1d52c5f
- Parent:
- 36:dbd39c315258
- Child:
- 38:155ec32c5e91
diff -r dbd39c315258 -r fea2c1d52c5f utility.cpp --- 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 () {