Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Wed Apr 17 12:45:13 2013 +0000
Parent:
84:fd21e5d32dab
Child:
86:d1c9e8ac1c4b
Commit message:
Merged with Gary's lost message counter

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
utility.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Apr 17 12:05:08 2013 +0000
+++ b/main.cpp	Wed Apr 17 12:45:13 2013 +0000
@@ -51,7 +51,7 @@
 // gg - revStr is used in 2 places
 // gg - and is easy to edit here
 // gg - added ZeroSecTick and revStr
-char revStr[7] = "83";
+char revStr[7] = "85";
 
 bool logEn = false, logOpen = false; 
 bool yesBattLog = false ; // gg - Batt Log
--- a/utility.cpp	Wed Apr 17 12:05:08 2013 +0000
+++ b/utility.cpp	Wed Apr 17 12:45:13 2013 +0000
@@ -39,36 +39,130 @@
 }
 
 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;
+    static signed short imotorRPM = 0;
+    static unsigned short nLost = 0; // gg - overrun
+ 
     char sTemp[40];    
-    unsigned short ts = getTimeStamp();
-    static unsigned char ii = 0, lasti = 0; // indexindex
     unsigned char changed,i;
-    static unsigned char bdi=0;
     signed short packV;
     signed short packA;
-    static signed short imotorRPM = 0;
     signed long imWs_x4;
-    
+    unsigned short ts=0; //moved getTimeStamp call to inside debug loop for speed
+
     secsNoMsg=0; // reset deadman switch
-    if(logOpen){
-        if(canRXmsg.id>0) {
-            writeBuffer[writePointer][0]=mType;
-            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++){ // Is there a better way to do this? (writeBuffer[writePointer][i]=canRXmsg.data?)
-                writeBuffer[writePointer][i]=canRXmsg.data[i-5];
+    if(debugMode){ // code to insert actual number of dropped frames for overrun debug - skiped in normal mode to keep logcan short
+        ts = getTimeStamp();
+        if(logOpen){
+            if(canRXmsg.id>0) {
+                // check to see if buffer is already full (read - write) = 1
+                // actually the last buffer location cannot be used because then 
+                //   the buffer would look empty after writePointer++
+                
+                //if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen/16)) // modulo is slow?
+     
+                // maxBufLen = 512, so pointers are 0 through 511
+                if( (readPointer - writePointer) == 1 || (writePointer - readPointer) == (maxBufLen - 1)) {
+                    // the buffer is "full", so Lose this message
+                    
+                    // point to the last-stored message
+                    int tempWritePointer = writePointer - 1 ;
+                    if( tempWritePointer == -1 ) tempWritePointer = maxBufLen - 1;
+                    char strLost[9] ;
+     
+                    if( nLost == 0 ) {
+                        // this is the first message lost 
+                        //   and we must overwrite the last message with an FFE comment message
+                        // So, there will be two messages lost as the comment message is laid in.
+                        nLost = 2;
+                        sprintf(strLost,"%s","Lost0002"); // indicate two messages lost
+                        
+                        // overlay the last message with a "Lost0002" comment
+                        writeBuffer[tempWritePointer][0]=0;
+                        writeBuffer[tempWritePointer][1]=(ts&0xff00)>>8; // Time Stamp (2 bytes_
+                        writeBuffer[tempWritePointer][2]=(ts&0x00ff);
+                        writeBuffer[tempWritePointer][3]=0xfe; // MsgID, low byte
+                        writeBuffer[tempWritePointer][4]=0xff; // Len nibble, and MsgID high nibble
+                            
+                        for(i=5;i<13;i++){ 
+                            writeBuffer[tempWritePointer][i]= strLost[i-5];
+                        }
+                    } else {
+                        // increment the loat counter
+                        nLost += 1;
+                        
+                        // lay the new count into the comment
+                        sprintf(strLost,"%04d",nLost);
+                        for(i=9;i<13;i++){ 
+                            writeBuffer[tempWritePointer][i]= strLost[i-9];
+                        }
+                    }
+                } else {
+                    // is room to insert the message
+                    // get it inserted quickly
+                    writeBuffer[writePointer][0]=mType;
+                    writeBuffer[writePointer][1]=(ts&0xff00)>>8; // Time Stamp (2 bytes_
+                    writeBuffer[writePointer][2]=(ts&0x00ff);
+                    writeBuffer[writePointer][3]=canRXmsg.id&0xff; // MsgID, low byte
+                    writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4); // Len nibble, and MsgID high nibble
+                    for(i=5;i<13;i++){ // Is there a better way to do this? (writeBuffer[writePointer][i]=canRXmsg.data?)
+                        writeBuffer[writePointer][i]=canRXmsg.data[i-5];
+                    }
+                    //--------------
+                    // force unused data bytes to FF for CAN-Do compatibility - gg - force FF
+                    if(canRXmsg.len < 8){
+                        for(i=canRXmsg.len; i<8; i++) {
+                            writeBuffer[writePointer][i+5]=0xFF;
+                        }
+                    }
+                    //--------------
+                    // note, this is not protected from the interrupt
+                    // due to the nLost code above, this no longer
+                    //    overflows to writePointer = readPointer
+                    //    which would make the buffer look empty
+                    if (++writePointer >= maxBufLen) {
+                        writePointer = 0;
+                        led3 = !led3;
+                    }
+                    //--------------
+                    // log a local message if we had lost messages. gg - logcan
+                    if( nLost > 0 ) {
+                        // We previously lost messages that did not get into the buffer
+                        sprintf(sTemp,"-- Write Buffer Lost [%d]\n", nLost);
+                        logMsg(sTemp); // write buffer overrun
+                        spkr.beep(500,0.25);
+                        
+                        nLost = 0 ;
+                    }
+                    //--------------
+                }
             }
-            if (++writePointer >= maxBufLen) {
-                writePointer = 0;
-                led3 = !led3;
-            }
-            if (writePointer==readPointer) {
-                // Just overwrote an entry that hasn't been sent to thumbdrive
-                sprintf(sTemp,"Write buffer overrun.\n");
-                logMsg(sTemp); // write buffer overrun
-                spkr.beep(500,0.25);
+        }
+    }else{ // not debugMode - keep code short
+        if(logOpen){
+            if(canRXmsg.id>0) {
+                writeBuffer[writePointer][0]=mType;
+                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++){ // Is there a better way to do this? (writeBuffer[writePointer][i]=canRXmsg.data?)
+                    writeBuffer[writePointer][i]=canRXmsg.data[i-5];
+                }
+                if (++writePointer >= maxBufLen) {
+                    writePointer = 0;
+                    led3 = !led3;
+                }
+                if (writePointer==readPointer) {
+                    // Just overwrote an entry that hasn't been sent to thumbdrive
+                    sprintf(sTemp,"Write buffer overrun.\n");
+                    logMsg(sTemp); // write buffer overrun
+                    spkr.beep(500,0.25);
+                }
             }
         }
     }
@@ -78,8 +172,9 @@
             ii=ii<99?ii+1:0; // Should never wrap - less than 100 different messages ever used
             indexLastMsg[canRXmsg.id]=ii; //Create entry if first message
         }
-        if(dMode[0]==changedScreen||dMode[1]==changedScreen){
+        if(dMode[0]==changedScreen||dMode[1]==changedScreen){// Skip if not using (for execution speed)
             changed=msgChanged[indexLastMsg[canRXmsg.id]];
+            // This is cleared in the main loop when reset button is touched
             for(i=0;i<8;i++){
                 if(lastMsg[indexLastMsg[canRXmsg.id]].data[i]!=canRXmsg.data[i]){
                     changed |= 1<<i;
@@ -113,8 +208,6 @@
                 }
                 lasti=i; //remember the msb to detect rollover next time around
                 i+=bdi;
-                //if(i==22) logCP=true; //Turbo3
-                //if( (i==22) && (yesBattLog) ) logCP=true; // only if enabled gg - Batt Log 
                 if(i==22){
                     logCP=yesBattLog; // Only log if logging enabled
                     showCP=true; // Always show