Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Revision:
37:fea2c1d52c5f
Parent:
36:dbd39c315258
Child:
38:155ec32c5e91
--- 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 () {