Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller

Dependencies:   SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed

Fork of CANary by Tick Tock

Branch:
Metric
Revision:
123:a8c0042df617
Parent:
122:138a40892a4c
Child:
124:0d622967b764
--- a/utility.cpp	Wed Jul 17 13:48:51 2013 +0000
+++ b/utility.cpp	Fri Jul 19 12:48:10 2013 +0000
@@ -205,46 +205,54 @@
         
         //-------------------
         //Miscellaneous on-recieve operations below
-        if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data?  Need to store all responses
-            if(canRXmsg.data[0]<0x20){
+        if((mType==2)&&((canRXmsg.id==0x7bb)||(canRXmsg.id==0x765))){ // is 7bb data?  Need to store all responses
+            if(canRXmsg.data[0]==0x10){
                 if(canRXmsg.data[3]==1){//Group 1 data
-                    bdi=BatDataBaseG1; // index offset for Group 1 data
+                    bdi=DataBaseG1; // index offset for Group 1 data
                     if(debugMode){
                         printMsg("  Getting Group 1 data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==2){//Group 2 = cellpair data
-                    bdi=BatDataBaseG2; // index offset for CP data
+                    bdi=DataBaseG2; // index offset for CP data
                     if(debugMode){
                         printMsg("  Getting cell pair data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==3){//Group 3 data
-                    bdi=BatDataBaseG3; // index offset for Group 3 data
+                    bdi=DataBaseG3; // index offset for Group 3 data
                     if(debugMode){
                         printMsg("  Getting Group 3 data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==4){//Group 4 = temperature data
-                    bdi=BatDataBaseG4; // index offset for Temperature data
+                    bdi=DataBaseG4; // index offset for Temperature data
                     if(debugMode){
                         printMsg("  Getting temperature data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==5){//Group 5 data
-                    bdi=BatDataBaseG5; // index offset for Group 5 data
+                    bdi=DataBaseG5; // index offset for Group 5 data
                     if(debugMode){
                         printMsg("  Getting Group 5 data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==6){//Group 6 data = shunt data
-                    bdi=BatDataBaseG6; // index offset for Group 6 data
+                    bdi=DataBaseG6; // index offset for Group 6 data
                     if(debugMode){
                         printMsg("  Getting Group 6 data\n");
                     }
                     
+                }else if(canRXmsg.data[3]==0x10){//Group 7 data = tire pressure data
+                    bdi=DataBaseG7; // index offset for Group 6 data
+                    if(debugMode){
+                        printMsg("  Getting Group 7 data\n");
+                    }
+                    
                 }else bdi=0xff; // ignore other messages (for now)
                 lasti=0;
+                // Request rest of data
+                reqRest=true;
             }
             
             if(bdi<0xff){
@@ -257,27 +265,27 @@
                 //-------
                 //-------
                 i*=7;
-                if(i+6 < BatDataBufMax) {
-                    battData[i+0]=canRXmsg.data[1];
-                    battData[i+1]=canRXmsg.data[2];
-                    battData[i+2]=canRXmsg.data[3];
-                    battData[i+3]=canRXmsg.data[4];
-                    battData[i+4]=canRXmsg.data[5];
-                    battData[i+5]=canRXmsg.data[6];
-                    battData[i+6]=canRXmsg.data[7];
+                if(i+6 < DataBufMax) {
+                    queryData[i+0]=canRXmsg.data[1];
+                    queryData[i+1]=canRXmsg.data[2];
+                    queryData[i+2]=canRXmsg.data[3];
+                    queryData[i+3]=canRXmsg.data[4];
+                    queryData[i+4]=canRXmsg.data[5];
+                    queryData[i+5]=canRXmsg.data[6];
+                    queryData[i+6]=canRXmsg.data[7];
                 }
-                if(i==(BatDataBaseG6+3)*7){ // All data loaded
+                if(i==(DataBaseG6+1)*7){ // All data loaded
                     logCP=yesBattLog; // Only log if logging enabled
                     showCP=true; // Always show
                     
                     // Find hottest temperature by finding smallest ADC value
                     // 2013 models only have three sensors
-                    k=battData[(BatDataBaseG4*7)+3]*0x100+battData[(BatDataBaseG4*7)+4];
-                    j=battData[(BatDataBaseG4*7)+6]*0x100+battData[(BatDataBaseG4*7)+7];
+                    k=queryData[(DataBaseG4*7)+3]*0x100+queryData[(DataBaseG4*7)+4];
+                    j=queryData[(DataBaseG4*7)+6]*0x100+queryData[(DataBaseG4*7)+7];
                     if(j<k)k=j;
-                    j=battData[(BatDataBaseG4*7)+9]*0x100+battData[(BatDataBaseG4*7)+10];
+                    j=queryData[(DataBaseG4*7)+9]*0x100+queryData[(DataBaseG4*7)+10];
                     if(j<k)k=j;
-                    j=battData[(BatDataBaseG4*7)+12]*0x100+battData[(BatDataBaseG4*7)+13];
+                    j=queryData[(DataBaseG4*7)+12]*0x100+queryData[(DataBaseG4*7)+13];
                     if(j<k)k=j;
                     //interpolate from lookup table
                     unsigned short temp_adc[8] = {1000,589,487,401,365,340,309,000};
@@ -290,16 +298,16 @@
                     maxTemp+=temp_C[ii];
 
                     // Get state of health
-                    SOH_x100=battData[(BatDataBaseG1*7)+29]*0x100+battData[(BatDataBaseG1*7)+30];
-                    Ah_x10000=battData[(BatDataBaseG1*7)+36]*0x10000+battData[(BatDataBaseG1*7)+37]*0x100+battData[(BatDataBaseG1*7)+38];
-                    SOC_x10000=battData[(BatDataBaseG1*7)+32]*0x10000+battData[(BatDataBaseG1*7)+33]*0x100+battData[(BatDataBaseG1*7)+34];
+                    SOH_x100=queryData[(DataBaseG1*7)+29]*0x100+queryData[(DataBaseG1*7)+30];
+                    Ah_x10000=queryData[(DataBaseG1*7)+36]*0x10000+queryData[(DataBaseG1*7)+37]*0x100+queryData[(DataBaseG1*7)+38];
+                    SOC_x10000=queryData[(DataBaseG1*7)+32]*0x10000+queryData[(DataBaseG1*7)+33]*0x100+queryData[(DataBaseG1*7)+34];
                     
                     // Save shunt data
                     for(j=0; j<24; j++){
-                        shunt[j*4+0]=battData[BatDataBaseG6*7+j+3]&0x08;
-                        shunt[j*4+1]=battData[BatDataBaseG6*7+j+3]&0x04;
-                        shunt[j*4+2]=battData[BatDataBaseG6*7+j+3]&0x02;
-                        shunt[j*4+3]=battData[BatDataBaseG6*7+j+3]&0x01;
+                        shunt[j*4+0]=queryData[DataBaseG6*7+j+3]&0x08;
+                        shunt[j*4+1]=queryData[DataBaseG6*7+j+3]&0x04;
+                        shunt[j*4+2]=queryData[DataBaseG6*7+j+3]&0x02;
+                        shunt[j*4+3]=queryData[DataBaseG6*7+j+3]&0x01;
                     }
                 }
             }
@@ -392,49 +400,57 @@
     static char data[8] = {0x02, 0x21, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff};
     if(reqMsgCnt<99){
         switch (reqMsgCnt){
-            case BatDataBaseG1:
+            case DataBaseG1: // group 1 has 6 frames
                 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;
+                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case BatDataBaseG2: // group 1 has 6 frames
+            case DataBaseG2: // group 2 has 29 frames
                 data[0]=0x02; //change to request group 2 (cp data)
                 data[1]=0x21;
                 data[2]=0x02;
+                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case BatDataBaseG3: // group 2 has 29 frames
+            case DataBaseG3: // group 3 has 5 frames
                 data[0]=0x02; //change to request group 3
                 data[1]=0x21;
                 data[2]=0x03;
+                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case BatDataBaseG4: // group 3 has 5 frames
+            case DataBaseG4: // group 4 has 3 frames
                 data[0]=0x02; //change to request group 4 (temperature)
                 data[1]=0x21;
                 data[2]=0x04;
+                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case BatDataBaseG5: // group 4 has 3 frames
+            case DataBaseG5: // group 5 has 11 frames
                 data[0]=0x02; //change to request group 5
                 data[1]=0x21;
                 data[2]=0x05;
+                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case BatDataBaseG6: // group 4 has 3 frames
-                data[0]=0x02; //change to request group 5
+            case DataBaseG6: // group 6 has 4 frames
+                data[0]=0x02; //change to request group 6
                 data[1]=0x21;
                 data[2]=0x06;
+                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case BatDataBaseG7: // group 5 has 11 frames
+            case DataBaseG7: // group 7 has 2 frames
+                data[0]=0x02; //change to request group 7
+                data[1]=0x21;
+                data[2]=0x10;
+                can1.write(CANMessage(0x745, data, 8));
+                break;
+            case DataBaseG8: 
                 reqMsgCnt = 99;
                 can1SleepMode = VP230Sleep; // disable TX
                 can1.monitor(true); // set to snoop mode
                 msgReq.detach(); // stop ticker
-            default:
-                data[0]=0x30; //change to request next line message
-                data[1]=0x01;
-                data[2]=0x00;
+            default: // wait 30ms
         }
-        can1.write(CANMessage(0x79b, data, 8));
         reqMsgCnt++;
     }
 }
@@ -444,7 +460,7 @@
     //sprintf(sTemp,"Requesting cp data\n"); // just for debug
     //printMsg(sTemp); // just for debug
     reqMsgCnt = 0; //reset message counter
-    msgReq.attach(&sendReq,0.015);
+    msgReq.attach(&sendReq,0.035);
 }
 
 void playbackISR() { //Used for autoplayback
@@ -661,7 +677,7 @@
     min=9999;
     avg=0;
     for(i=0; i<96; i++) {
-        bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
+        bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
         avg+=bd;
         if(bd>max) max=bd;
         if(bd<min) min=bd;
@@ -682,10 +698,10 @@
         f_printf(&bfile,"%s,",sTemp);
         sprintf(sTemp,"%d,%5.1f%%,%5.1f,%5.1f,%d,%d,%d,%d,%d",gids,(float)SOC/10,(float)packV_x2/2,(float)packA_x2/2,max,min,avg,max-min,jv);
         f_printf(&bfile,"%s,",sTemp);           
-        f_printf(&bfile,"%d,%d,%d,%d,",(battData[(BatDataBaseG4*7)+ 3]<<8)+battData[(BatDataBaseG4*7)+ 4],battData[(BatDataBaseG4*7)+ 5],(battData[(BatDataBaseG4*7)+ 6]<<8)+battData[(BatDataBaseG4*7)+ 7],battData[(BatDataBaseG4*7)+ 8]);
-        f_printf(&bfile,"%d,%d,%d,%d", (battData[(BatDataBaseG4*7)+ 9]<<8)+battData[(BatDataBaseG4*7)+10],battData[(BatDataBaseG4*7)+11],(battData[(BatDataBaseG4*7)+12]<<8)+battData[(BatDataBaseG4*7)+13],battData[(BatDataBaseG4*7)+14]);
+        f_printf(&bfile,"%d,%d,%d,%d,",(queryData[(DataBaseG4*7)+ 3]<<8)+queryData[(DataBaseG4*7)+ 4],queryData[(DataBaseG4*7)+ 5],(queryData[(DataBaseG4*7)+ 6]<<8)+queryData[(DataBaseG4*7)+ 7],queryData[(DataBaseG4*7)+ 8]);
+        f_printf(&bfile,"%d,%d,%d,%d", (queryData[(DataBaseG4*7)+ 9]<<8)+queryData[(DataBaseG4*7)+10],queryData[(DataBaseG4*7)+11],(queryData[(DataBaseG4*7)+12]<<8)+queryData[(DataBaseG4*7)+13],queryData[(DataBaseG4*7)+14]);
         for(i=0; i<96; i++) {
-            bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
+            bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
             f_printf(&bfile,",%d",bd);
         }
         f_printf(&bfile,"\r\n");
@@ -722,7 +738,7 @@
     min=9999;
     avg=0;
     for(i=0; i<96; i++) {
-        bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
+        bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
         avg+=bd;
         if(bd>max) max=bd;
         if(bd<min) min=bd;
@@ -743,16 +759,17 @@
         f_printf(&bfile,"%s,",sTemp);
         sprintf(sTemp,"%3.1f,%d,%5.1f%%,%5.1f%%, %4.2f, %5.1f,%4.1f,%d,%d,%d,%d,%d",accV,gids,(float)SOC/10, (float)SOH_x100/100,(float)Ah_x10000/10000,(float)packV_x2/2,(float)packA_x2/2,max,min,avg,max-min,jv);      
         f_printf(&bfile,"%s,",sTemp);           
-        /*f_printf(&bfile,"%d,%d,%d,%d,",(battData[(BatDataBaseG4*7)+ 3]<<8)+battData[(BatDataBaseG4*7)+ 4],battData[(BatDataBaseG4*7)+ 5],(battData[(BatDataBaseG4*7)+ 6]<<8)+battData[(BatDataBaseG4*7)+ 7],battData[(BatDataBaseG4*7)+ 8]);
-        f_printf(&bfile,"%d,%d,%d,%d", (battData[(BatDataBaseG4*7)+ 9]<<8)+battData[(BatDataBaseG4*7)+10],battData[(BatDataBaseG4*7)+11],(battData[(BatDataBaseG4*7)+12]<<8)+battData[(BatDataBaseG4*7)+13],battData[(BatDataBaseG4*7)+14]);
+        f_printf(&bfile,"%d,%d,%d,%d,",(queryData[(DataBaseG4*7)+ 3]<<8)+queryData[(DataBaseG4*7)+ 4],queryData[(DataBaseG4*7)+ 5],(queryData[(DataBaseG4*7)+ 6]<<8)+queryData[(DataBaseG4*7)+ 7],queryData[(DataBaseG4*7)+ 8]);
+        f_printf(&bfile,"%d,%d,%d,%d", (queryData[(DataBaseG4*7)+ 9]<<8)+queryData[(DataBaseG4*7)+10],queryData[(DataBaseG4*7)+11],(queryData[(DataBaseG4*7)+12]<<8)+queryData[(DataBaseG4*7)+13],queryData[(DataBaseG4*7)+14]);
         for(i=0; i<96; i++) {
-            bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
+            bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
             f_printf(&bfile,",%d",bd);
-        }*/
+        }
         // temporariliy dump everything
-        for(i=0; i<BatDataBufMax; i++) {
-            f_printf(&bfile,",%02x",battData[i]);
-        }
+        /*for(i=0; i<DataBufMax; i++) {
+            sprintf(sTemp,",%02x",queryData[i]);
+            f_printf(&bfile,"%s",sTemp);  
+        }*/
 
         f_printf(&bfile,"\r\n");
         f_close(&bfile);