Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Revision:
92:935adef49ea4
Parent:
91:33ab084a184f
Child:
93:c2402e8cd0e2
--- a/utility.cpp	Mon Apr 22 02:22:04 2013 +0000
+++ b/utility.cpp	Mon Apr 22 02:27:37 2013 +0000
@@ -17,11 +17,11 @@
     LPC_RTC->ILR=0x00; // set up the RTC interrupts
     LPC_RTC->CIIR=0x01; // interrupts each second
     LPC_RTC->CCR = 0x01;  // Clock enable
-    NVIC_SetPriority( RTC_IRQn, 1 );
+    //NVIC_SetPriority( RTC_IRQn, 10 );
     NVIC_EnableIRQ( RTC_IRQn );
 }
 
-void printMsg (char *msg) {
+void logMsg (char *msg) {
     strcpy(displayLog[displayLoc],msg);
     displayLoc=displayLoc>17?0:displayLoc+1;
 }
@@ -48,8 +48,10 @@
     static unsigned short nLost = 0; // gg - overrun
  
     char sTemp[40];    
-    unsigned char changed, i;
-    signed short packV, packA;
+    unsigned char changed;
+    unsigned short i; // was unsigned char
+    signed short packV;
+    signed short packA;
     signed long imWs_x4;
     unsigned short ts;
 
@@ -89,7 +91,7 @@
                         writeBuffer[tempWritePointer][3]=0xfe; // MsgID, low byte
                         writeBuffer[tempWritePointer][4]=0xff; // Len nibble, and MsgID high nibble
                         // lay in the "Lost0002" text
-                        for(i=5;i<13;++i){ 
+                        for(i=5;i<13;i++){ 
                             writeBuffer[tempWritePointer][i]= strLost[i-5];
                         }
                     } else {
@@ -99,7 +101,7 @@
                         
                         // lay the new count into the comment
                         sprintf(strLost,"%04d",nLost);
-                        for(i=9;i<13;++i){ 
+                        for(i=9;i<13;i++){ 
                             writeBuffer[tempWritePointer][i]= strLost[i-9];
                         }
                     }
@@ -113,7 +115,7 @@
                     writeBuffer[writePointer][3]=canRXmsg.id&0xff; // MsgID, low byte
                     char sLen = canRXmsg.len ;
                     writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(sLen<<4); // Len nibble, and MsgID high nibble
-                    for(i=0;i<8;++i){ // Is there a better way to do this? (writeBuffer[writePointer][i]=canRXmsg.data?)
+                    for(i=0;i<8;i++){ // Is there a better way to do this? (writeBuffer[writePointer][i]=canRXmsg.data?)
                         if(i<sLen) 
                             writeBuffer[writePointer][i+5]=canRXmsg.data[i];
                         else // i>=sLen
@@ -135,7 +137,7 @@
                     if( nLost > 0 ) {
                         // We previously lost messages that did not get into the buffer
                         sprintf(sTemp,"-- Lost %d Messages.\n", nLost);
-                        printMsg(sTemp); // write buffer overrun
+                        logMsg(sTemp); // write buffer overrun
                         //spkr.beep(500,0.25);
                         
                         nLost = 0 ;
@@ -144,49 +146,45 @@
                 }
             }
         }
-    } else { // not debugMode - keep code short
+    }else{ // not debugMode - keep code short
         if(logOpen){
-            int localWritePointer = writePointer++; // create local copy to make logCan reentrant
-            // note that the static variables above do not prevent safe reentry
-            // since they are only used for msgId<0x800 which will never interrupt
-            // another msgId<0x800 (both CANbusses are same priority)
-            if (writePointer >= maxBufLen) {
-                writePointer = 0;
-                led3 = !led3;
-            }
-            if (localWritePointer >= maxBufLen) { //Have to test local, too, just in case interrupted just after increment (got double incremented)
-                localWritePointer = 0;
-            }
-            ts=getTimeStamp(); // only use
-            writeBuffer[localWritePointer][0]=mType;
-            writeBuffer[localWritePointer][1]=(ts&0xff00)>>8;
-            writeBuffer[localWritePointer][2]=(ts&0x00ff);
-            writeBuffer[localWritePointer][3]=canRXmsg.id&0xff;
-            writeBuffer[localWritePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
-            for(i=5;i<13;++i){ // Is there a better way to do this? (writeBuffer[localWritePointer][i]=canRXmsg.data?)
-                writeBuffer[localWritePointer][i]=canRXmsg.data[i-5];
-            }
-            if (writePointer==readPointer) {
-                // Just caught up to read pointer
-                sprintf(sTemp,"Write buffer overrun.\n");
-                printMsg(sTemp); // write buffer overrun
-                spkr.beep(500,0.25);
+            if(canRXmsg.id>0) {
+                ts=getTimeStamp(); // only use
+                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);
+                }
             }
         }
     }
 
     if(canRXmsg.id<0x800){ // Block FFE and FFF messages
-
         if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry
+            //ii=ii<99?ii+1:0; // Should never wrap - less than 100 different messages ever used
             if(ii<99) {
+                //indexLastMsg[canRXmsg.id]=ii; //Create entry if first message
                 indexLastMsg[canRXmsg.id]=++ii; //Create entry for first MsgID occurance
                 // ii max is 99 here
             } else {
                 // the ii array is full, more than 100 MsgIDs found
                 if(ii==99) {
-                    ++ii; // step to 100 to log only one error
+                    ii++; // step to 100 to log only one error
                     sprintf(sTemp,"MsgID buffer overrun.\n");
-                    printMsg(sTemp); // write buffer overrun
+                    logMsg(sTemp); // write buffer overrun
                 }
             }
         }
@@ -195,7 +193,7 @@
         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){
+            for(i=0;i<8;i++){
                 if(lastMsg[indexLastMsg[canRXmsg.id]].data[i]!=canRXmsg.data[i]){
                     changed |= 1<<i;
                 }
@@ -207,32 +205,35 @@
         
         //-------------------
         //Miscellaneous on-recieve operations below
-        if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data?  Need to store all responses
+        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
             if(canRXmsg.data[0]<0x20){
                 if(canRXmsg.data[3]==2){//Group 2 = cellpair data
                     bdi=BatDataBaseG2; // index offset for CP data (uses 00 - 1C)
                     sprintf(sTemp,"  Getting cell pair data\n");
-                    printMsg(sTemp);
+                    logMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==4){//Group 4 = temperature data
                     bdi=BatDataBaseG4; // index offset for Temperature data (uses 20 - 22)
                     sprintf(sTemp,"  Getting temperature data\n");
-                    printMsg(sTemp);
+                    logMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==1){//Group 1 data
                     bdi=BatDataBaseG1; // index offset for Group 1 data (uses 20 - 22)
                     sprintf(sTemp,"Getting Group 1 data\n");
-                    printMsg(sTemp);
+                    logMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==3){//Group 3 data
                     bdi=BatDataBaseG3; // index offset for Group 3 data (uses 20 - 22)
                     sprintf(sTemp,"  Getting Group 3 data\n");
-                    printMsg(sTemp);
+                    logMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==5){//Group 5 data
                     bdi=BatDataBaseG5; // index offset for Group 5 data (uses 20 - 22)
                     sprintf(sTemp,"  Getting Group 5 data\n");
-                    printMsg(sTemp);
+                    logMsg(sTemp);
                     
                 }else bdi=0xff; // ignore other messages (for now)
                 lasti=0;
@@ -274,7 +275,7 @@
             imWs_x4 *= -packA; // milliWattseconds*4
             if (!((imotorRPM<2)&&(imWs_x4<0))){ //Ignore if charging from wall
                 mWs_x4 += imWs_x4; // total mWs_x4
-                ++numWsamples;
+                numWsamples++;
             }
         }else if((mType==1)&&(canRXmsg.id==0x1da)){ //Motor Speed
             imotorRPM=((canRXmsg.data[4]<<8)|(canRXmsg.data[5]));
@@ -282,7 +283,7 @@
                 imotorRPM=-imotorRPM;
             }
             motorRPM+=imotorRPM;
-            ++numSsamples;
+            numSsamples++;
         }
     }
 }
@@ -306,16 +307,16 @@
     logCan(0,tsMsg); // Date-Time
 }
 
-void logEventMsg (char * eventMsg) {
+void logErrMsg (char * errMsg) {
     // log CAN-Do 8-character Pseudo Message
     CANMessage tsMsg;
     tsMsg.id=0xffe; // pseudo Message to CAN-Do log
     tsMsg.len=0xf;
-    int iMsgLen = strlen(eventMsg);
+    int iMsgLen = strlen(errMsg);
     // 8 character message compatible with CAN-Do
-    for(int i=0; i<8; ++i){
+    for(int i=0; i<8; i++){
       tsMsg.data[i]=' '; 
-      if( i < iMsgLen ) tsMsg.data[i]=eventMsg[i];
+      if( i < iMsgLen ) tsMsg.data[i]=errMsg[i];
     }
     logCan(0,tsMsg); // FFE Comment Message
 }
@@ -323,37 +324,37 @@
 void sendReq() {
     static char data[8] = {0x02, 0x21, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff};
     if(reqMsgCnt<99){
-        switch (++reqMsgCnt){
-            case 1:
+        switch (reqMsgCnt){
+            case 0:
                 can1.monitor(false); // set to active mode
                 can1SleepMode = 0; // enable TX
                 data[0]=0x02; //change to request group 1
                 data[1]=0x21;
                 data[2]=0x01;
                 break;
-            case 7: // group 1 has 6 frames
+            case 6: // group 1 has 6 frames
                 can1.monitor(false); // set to active mode
                 can1SleepMode = 0; // enable TX
                 data[0]=0x02; //change to request group 2 (cp data)
                 data[1]=0x21;
                 data[2]=0x02;
                 break;
-            case 36: // group 2 has 29 frames
+            case 35: // group 2 has 29 frames
                 data[0]=0x02; //change to request group 3
                 data[1]=0x21;
                 data[2]=0x03;
                 break;
-            case 41: // group 3 has 5 frames
+            case 40: // group 3 has 5 frames
                 data[0]=0x02; //change to request group 4 (temperature)
                 data[1]=0x21;
                 data[2]=0x04;
                 break;
-            case 44: // group 4 has 3 frames
+            case 43: // group 4 has 3 frames
                 data[0]=0x02; //change to request group 5
                 data[1]=0x21;
                 data[2]=0x05;
                 break;
-            case 55: // group 5 has 11 frames
+            case 54: // group 5 has 11 frames
                 reqMsgCnt = 99;
                 can1SleepMode = 1; // disable TX
                 can1.monitor(true); // set to snoop mode
@@ -364,9 +365,56 @@
                 data[2]=0x00;
         }
         can1.write(CANMessage(0x79b, data, 8));
+        reqMsgCnt++;
     }
 }
 
+/*void sendCPreq() {
+    char i;
+    char data[8] = {0x02, 0x21, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff};
+    can1.monitor(false); // set to active mode
+    can1SleepMode = 0; // enable TX
+    can1.write(CANMessage(0x79b, data, 8));
+    
+    if( ZeroSecTick ) { ZeroSecTick = false; logTS(); } // gg - 0-second EV bus
+    
+    logCan(1,CANMessage(0x79b, data, 8)); // Group 2 Request on EV
+    data[0]=0x30; //change to request next line message
+    data[1]=0x01;
+    data[2]=0x00;
+    for(i=0;i<29;i++){
+        wait_ms(16); //wait 16ms
+        can1.write(CANMessage(0x79b, data, 8));
+    }
+    can1SleepMode = 1; // disable TX
+    can1.monitor(true); // set to snoop mode
+}
+
+void sendTreq() {
+    char i;
+    char data[8] = {0x02, 0x21, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff};
+    can1.monitor(false); // set to active mode
+    can1SleepMode = 0; // enable TX
+    can1.write(CANMessage(0x79b, data, 8));
+    
+    if( ZeroSecTick ) { ZeroSecTick = false; logTS(); } // gg - 0-second EV bus
+    
+    logCan(1,CANMessage(0x79b, data, 8)); // Group 4 request on EV
+    data[0]=0x30; //change to request next line message
+    data[1]=0x01;
+    data[2]=0x00;
+    for(i=0;i<3;i++){
+        wait_ms(16); //wait 16ms
+        can1.write(CANMessage(0x79b, data, 8));
+    }
+    can1SleepMode = 1; // disable TX
+    can1.monitor(true); // set to snoop mode
+}
+
+void autoPollISR() {  //This is the ticker ISR for auto-polling
+    pollCP=true;    //Set a flag to do in main loop instead of here
+}                   //since ticker blocks other interrupts*/
+
 void autoPollISR(){
     reqMsgCnt = 0; //reset message counter
     msgReq.attach(&sendReq,0.025);
@@ -448,9 +496,9 @@
     cfile = fopen("/local/config.txt", "r");
     if (cfile==NULL){ // if doesn't exist --> create
         sprintf(sTemp,"No config file found.\n");
-        printMsg(sTemp); // no config file
+        logMsg(sTemp); // no config file
         sprintf(sTemp,"Calibrating touch screen.\n");
-        printMsg(sTemp); // calibrating
+        logMsg(sTemp); // calibrating
         //tt.setcal(5570, 34030, 80, 108, 33700, 5780, 82, 108, 32500);// bypass calibration using my values
         tt.calibrate();   // run touchscreen calibration routine
         // NOTE: calibrates screen 1 first, then screen 0.
@@ -494,10 +542,10 @@
         if(ff<4){//If not latest format, save as latest format
             saveConfig();
             sprintf(sTemp,"Config file format updated.\n");
-            printMsg(sTemp); // config forat updates
+            logMsg(sTemp); // config forat updates
         }
         sprintf(sTemp,"Config file loaded.\n");
-        printMsg(sTemp); // config file loaded
+        logMsg(sTemp); // config file loaded
     }
 }
 
@@ -581,7 +629,7 @@
     max=0;
     min=9999;
     avg=0;
-    for(i=0; i<96; ++i) {
+    for(i=0; i<96; i++) {
         bd=(battData[i*2+3]<<8)+battData[i*2+4];
         avg+=bd;
         if(bd>max) max=bd;
@@ -603,7 +651,7 @@
         // BatDataBaseG4 * 7 = 224        
         fprintf(bfile,"%d,%d,%d,%d,",(battData[224+ 3]<<8)+battData[224+ 4],battData[224+ 5],(battData[224+ 6]<<8)+battData[224+ 7],battData[224+ 8]);
         fprintf(bfile,"%d,%d,%d,%d", (battData[224+ 9]<<8)+battData[224+10],battData[224+11],(battData[224+12]<<8)+battData[224+13],battData[224+14]);
-        for(i=0; i<96; ++i) {
+        for(i=0; i<96; i++) {
             bd=(battData[i*2+3]<<8)+battData[i*2+4];
             fprintf(bfile,",%d",bd);
         }