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:
Sat Jul 20 03:37:28 2013 +0000
Branch:
Metric
Parent:
123:a8c0042df617
Child:
125:f58b7ab2abee
Commit message:
Added tire pressure from canbus

Changed in this revision

common.h Show annotated file Show diff for this revision Revisions of this file
displayModes.cpp Show annotated file Show diff for this revision Revisions of this file
displayModes.h Show annotated file Show diff for this revision Revisions of this file
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
utility.h Show annotated file Show diff for this revision Revisions of this file
--- a/common.h	Fri Jul 19 12:48:10 2013 +0000
+++ b/common.h	Sat Jul 20 03:37:28 2013 +0000
@@ -26,14 +26,13 @@
 #define canTimeout 5
 #define userTimeout 15
 
-#define DataBaseG1 0x00 // 6 frames - SOH, SOC, Ah
-#define DataBaseG2 0x06 // 29 frames - Cell Pair data
-#define DataBaseG3 0x23 // 5 frames
-#define DataBaseG4 0x28 // 3 frames - Temperature data
-#define DataBaseG5 0x2B // 11 frames
-#define DataBaseG6 0x36 // 4 frames
-#define DataBaseG7 0x3A // 2 frames - Tire pressure
-#define DataBaseG8 0x3C
-#define DataBufMax 0x1A4 // 7 x 3C bytes
+#define BatDataBaseG1 0x00 // 6 frames - SOH, SOC, Ah
+#define BatDataBaseG2 0x06 // 29 frames - Cell Pair data
+#define BatDataBaseG3 0x23 // 5 frames
+#define BatDataBaseG4 0x28 // 3 frames - Temperature data
+#define BatDataBaseG5 0x2B // 11 frames
+#define BatDataBaseG6 0x36 // 4 frames
+#define BatDataBaseG7 0x3A
+#define BatDataBufMax 0x196 // 7 x 3A bytes
 
 #define VP230Sleep 1 // Set to 0 if using VP231 (sleep disables RX)
\ No newline at end of file
--- a/displayModes.cpp	Fri Jul 19 12:48:10 2013 +0000
+++ b/displayModes.cpp	Sat Jul 20 03:37:28 2013 +0000
@@ -5,8 +5,8 @@
 char sTemp2[16];
 
 void mainDisplay (bool force, bool showButtons){
-    unsigned short gids, SOC_x10, packV_x2;
-    static unsigned short lgids=0, lSOC=0, lSOH=0, lpackV_x2=0, maxPS=0;
+    unsigned short gids, SOC_x10, packV_x2, tireP;
+    static unsigned short lgids=0, lSOC=0, lSOH=0, lpackV_x2=0, ltireP=0, maxPS=0;
     static float lmaxTemp=0;
     static float lkW=0, laccV=0, lmpkWh=0;
     static unsigned long lAh=0;
@@ -18,7 +18,8 @@
     SOC_x10 = (msg.data[0]<<2)+(msg.data[1]>>6);
     msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts
     packV_x2 = (msg.data[2]<<2)+(msg.data[3]>>6);
-
+    msg = lastMsg[indexLastMsg[0x385]]; //Get tire pressure
+    tireP = msg.data[2]+msg.data[3]+msg.data[4]+msg.data[5];
 
     tt.background(Navy);
     tt.foreground(Yellow);
@@ -37,30 +38,51 @@
             printf("%4.1f kWh \n",(float)(gids-5)*0.075);
             tt.set_font((unsigned char*) SCProSB31x55);
             tt.foreground(Green);
-            tt.locate(60,106);            
+            tt.locate(60,96);            
             printf("%4.1f %s  \n",convertDistance(mpkWh[dtePeriod]*((float)(gids-5)*.075)),distanceUnit()); //LM - add metric conversion
             lgids=gids;
             lmpkWh=mpkWh[dtePeriod];
             tt.foreground(Yellow);
             tt.set_font((unsigned char*) Arial28x28);
         }
+        if(force||tireP!=ltireP){
+            tt.foreground(LightGrey);
+            if(msg.data[6]&0x80){
+                tt.locate(40,150);
+                printf("%3.1f\n",(float)msg.data[2]/4);
+            }
+            if(msg.data[6]&0x40){
+                tt.locate(114,150);
+                printf("%3.1f\n",(float)msg.data[3]/4);
+            }
+            if(msg.data[6]&0x20){
+                tt.locate(40,178);
+                printf("%3.1f\n",(float)msg.data[4]/4);
+            }
+            if(msg.data[6]&0x10){
+                tt.locate(114,178);
+                printf("%3.1f\n",(float)msg.data[5]/4);
+            }
+            tt.foreground(Yellow);
+            ltireP=tireP;
+        }
         if(force||SOC_x10!=lSOC){
             tt.locate(200,10);
             printf("%4.1f%s\n",(float)SOC_x10/10,"% ");
             lSOC=SOC_x10;
         }
         if(force||packV_x2!=lpackV_x2){
-            tt.locate(200,200);
+            tt.locate(200,206);
             printf("%4.1fV \n",(float)packV_x2/2);
             lpackV_x2=packV_x2;
         }
         if(force||maxTemp!=lmaxTemp){
-            tt.locate(200,170);
+            tt.locate(200,176);
             printf("%4.1f%s\n",convertTemperature(maxTemp),temperatureUnit());
             lmaxTemp=maxTemp;
         }
         if(force||accV!=laccV){
-            tt.locate(20,200);
+            tt.locate(20,206);
             printf("%3.1fV  \n",accV);
             laccV=accV;
         }
@@ -87,7 +109,7 @@
             lAh=Ah_x10000;
         }
         if(force||SOH_x100!=lSOH){
-            tt.locate(200,70);
+            tt.locate(206,70);
             printf("%4.1f%s\n",(float)SOH_x100/100,"% ");
             lSOH=SOH_x100;
         }
@@ -234,7 +256,7 @@
 void healthDisplay (bool force, bool showButtons){
     unsigned short gids, SOC_x10;
     static unsigned short lgids=0, lSOC=0, lSOH=0;
-    static float lTire=0, lresr=0, lunlV=0;
+    static float lmaxTemp=0, lresr=0, lunlV=0;
     static unsigned long lAh=0;
     CANMessage msg;
 
@@ -287,22 +309,21 @@
         printf(" %4.2f Ah cap \n",(float)Ah_x10000/10000);
         lAh=Ah_x10000;
     }
+    if(force||maxTemp!=lmaxTemp){
+        tt.locate(10,130);
+        printf(" %4.1f %s (max) \n",convertTemperature(maxTemp),temperatureUnit());
+        lmaxTemp=maxTemp;
+    }
     if(force||unloadedV_x2!=lunlV){
-        tt.locate(10,130);
+        tt.locate(10,160);
         printf(" %4.1f V \n",unloadedV_x2/2);
         lunlV=unloadedV_x2;
     }
     if(force||Resr!=lresr){
-        tt.locate(10,160);
+        tt.locate(10,190);
         printf(" %3.0f mOhms \n",Resr*1000);
         lresr=Resr;
     }
-    if(force||(queryData[DataBaseG7*7+8]!=lTire)){
-        tt.locate(10,190);
-        printf("%3.1f %3.1f %3.1f %3.1f\n",(float)queryData[DataBaseG7*7+5]/4,(float)queryData[DataBaseG7*7+6]/4,(float)queryData[DataBaseG7*7+7]/4,(float)queryData[DataBaseG7*7+8]/4);
-        lTire=queryData[DataBaseG7*7+8];
-    }
-    
 }
 
 void braking (bool force, bool showButtons, bool prdata=false){
@@ -461,7 +482,7 @@
         min=9999;
         avg=0;
         for(i=0; i<96; i++){
-           bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+           bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
            avg+=bd;
             if(bd>max) max=bd;
             if(bd<min) min=bd;
@@ -482,8 +503,8 @@
             case 1:
                 tt.locate(0,6);
                 printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n\n",
-                    max,min,avg,jv, convertTemperature(queryData[DataBaseG4*7+5]),sTemperatureUnit,convertTemperature(queryData[DataBaseG4*7+8]),sTemperatureUnit,
-                    convertTemperature(queryData[DataBaseG4*7+11]),sTemperatureUnit,convertTemperature(queryData[DataBaseG4*7+14]),sTemperatureUnit);
+                    max,min,avg,jv, convertTemperature(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+8]),sTemperatureUnit,
+                    convertTemperature(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+14]),sTemperatureUnit);
                 tt.rect(8+0*41,16,40+0*41,28,Green);
                 tt.rect(8+1*41,16,40+1*41,28,Yellow);
                 //tt.rect(8+2*41,16,40+2*41,28,White);
@@ -494,12 +515,12 @@
                 for(i=(step-2)*4; i<(step-1)*4; i++){
                     printf("%02d-%02d : %04d %04d %04d %04d %04d %04d\n",
                         i*6+1,i*6+6,
-                        (queryData[DataBaseG2*7+i*12+3]<<8)+queryData[DataBaseG2*7+i*12+4],(queryData[DataBaseG2*7+i*12+5]<<8)+queryData[DataBaseG2*7+i*12+6],
-                        (queryData[DataBaseG2*7+i*12+7]<<8)+queryData[DataBaseG2*7+i*12+8],(queryData[DataBaseG2*7+i*12+9]<<8)+queryData[DataBaseG2*7+i*12+10],
-                        (queryData[DataBaseG2*7+i*12+11]<<8)+queryData[DataBaseG2*7+i*12+12],(queryData[DataBaseG2*7+i*12+13]<<8)+queryData[DataBaseG2*7+i*12+14]);
+                        (battData[BatDataBaseG2*7+i*12+3]<<8)+battData[BatDataBaseG2*7+i*12+4],(battData[BatDataBaseG2*7+i*12+5]<<8)+battData[BatDataBaseG2*7+i*12+6],
+                        (battData[BatDataBaseG2*7+i*12+7]<<8)+battData[BatDataBaseG2*7+i*12+8],(battData[BatDataBaseG2*7+i*12+9]<<8)+battData[BatDataBaseG2*7+i*12+10],
+                        (battData[BatDataBaseG2*7+i*12+11]<<8)+battData[BatDataBaseG2*7+i*12+12],(battData[BatDataBaseG2*7+i*12+13]<<8)+battData[BatDataBaseG2*7+i*12+14]);
                 }
                 for(i=(step-2)*24; i<(step-1)*24; i++){
-                    bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+                    bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
                     if(bd>0){
                         if(bd==max) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Green);
                         //if(bd==avg) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,White);
@@ -584,7 +605,7 @@
        
         // calc each cell-pair voltage, find max and min
         for(i=0; i<96; i++){
-           bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+           bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
            nBar[i] = bd; // init to bar height
            avg+=bd;
             if(bd>max) max=bd;
@@ -638,14 +659,14 @@
         }
         
         // values, for now
-        // DataBaseG4 * 7 = 280
+        // BatDataBaseG4 * 7 = 280
         tt.locate( 0, yWinMax+40 );
         char* sTemperatureUnit = temperatureUnit();
         printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n\n",
-            max,min,avg,jv, convertTemperature(queryData[DataBaseG4*7+5]),sTemperatureUnit,convertTemperature(queryData[DataBaseG4*7+8]),sTemperatureUnit,
-            convertTemperature(queryData[DataBaseG4*7+11]),sTemperatureUnit,convertTemperature(queryData[DataBaseG4*7+14]),sTemperatureUnit);
+            max,min,avg,jv, convertTemperature(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+8]),sTemperatureUnit,
+            convertTemperature(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+14]),sTemperatureUnit);
         //printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
-        //        max,min,avg,jv,  queryData[DataBaseG4*7+5],queryData[DataBaseG4*7+8],  queryData[DataBaseG4*7+11],queryData[DataBaseG4*7+14]);
+        //        max,min,avg,jv,  battData[BatDataBaseG4*7+5],battData[BatDataBaseG4*7+8],  battData[BatDataBaseG4*7+11],battData[BatDataBaseG4*7+14]);
         
         // label the X axis (approximate)
         tt.locate( 2, yWinMax+5); printf("%04d", min );
@@ -711,7 +732,7 @@
         min=9999;
         avg=0;
         for(i=0; i<96; i++){
-           bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+           bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
            avg+=bd;
             if(bd>max) max=bd;
             if(bd<min) min=bd;
@@ -749,7 +770,7 @@
         
         // do the bin counting
         for(int i=0; i<96; i++){
-          bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4] - min ;
+          bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4] - min ;
           if( bd > iBinValMax ) bd = iBinValMax ;
           nBin[bd] ++ ;
         }
@@ -768,14 +789,14 @@
         }
         
         // the values, for now
-        // DataBaseG4 * 7 = 280        
+        // BatDataBaseG4 * 7 = 280        
         tt.locate( 0, yWinMax+40 );
         char* sTemperatureUnit = temperatureUnit();
         printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n\n",
-            max,min,avg,jv, convertTemperature(queryData[DataBaseG4*7+5]),sTemperatureUnit,convertTemperature(queryData[DataBaseG4*7+8]),sTemperatureUnit,
-            convertTemperature(queryData[DataBaseG4*7+11]),sTemperatureUnit,convertTemperature(queryData[DataBaseG4*7+14]),sTemperatureUnit);
+            max,min,avg,jv, convertTemperature(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+8]),sTemperatureUnit,
+            convertTemperature(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+14]),sTemperatureUnit);
         //printf(" MAX  MIN  AVG CVLI T1  T2  T3  T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
-        //        max,min,avg,jv,  queryData[DataBaseG2*7+DataBaseG4*7+5],queryData[DataBaseG2*7+DataBaseG4*7+8],  queryData[DataBaseG2*7+DataBaseG4*7+11],queryData[DataBaseG2*7+DataBaseG4*7+14]);
+        //        max,min,avg,jv,  battData[BatDataBaseG2*7+BatDataBaseG4*7+5],battData[BatDataBaseG2*7+BatDataBaseG4*7+8],  battData[BatDataBaseG2*7+BatDataBaseG4*7+11],battData[BatDataBaseG2*7+BatDataBaseG4*7+14]);
         
         //---------------
         // show the bars
--- a/displayModes.h	Fri Jul 19 12:48:10 2013 +0000
+++ b/displayModes.h	Sat Jul 20 03:37:28 2013 +0000
@@ -16,7 +16,8 @@
 extern unsigned char displayLoc;
 extern char indexLastMsg[0x800];
 
-extern unsigned char queryData[DataBufMax]; // BatDataBufMax
+//extern unsigned char battData[256]; // 
+extern unsigned char battData[BatDataBufMax]; // BatDataBufMax
 
 extern bool showCP;
 extern bool logEn;
--- a/main.cpp	Fri Jul 19 12:48:10 2013 +0000
+++ b/main.cpp	Sat Jul 20 03:37:28 2013 +0000
@@ -10,7 +10,6 @@
 // * Change semilog efficiency graph to linear with 10 minute values
 // * Add additional 79b bank readouts
 // * Add ability to transfer settings config file to/from USB
-// * Is CAN/EV designator reversed in canlog?
 
 #include "mbed.h"
 #include "CAN.h"
@@ -22,7 +21,7 @@
 #include "displayModes.h"
 #include "TOUCH_TFTx2.h"
 
-char revStr[7] = "123"; // gg - revision string, max 6 characters
+char revStr[7] = "124"; // gg - revision string, max 6 characters
 
 FATFS USBdrive;
 LocalFileSystem local("local");
@@ -69,7 +68,7 @@
 char indexLastMsg[0x800]={0}; // index table for last message
 CANMessage lastMsg[100]; // table to store last message of eachtype
 
-unsigned char queryData[DataBufMax]={0}; // 7 * 0x3D = DataBufMax
+unsigned char battData[BatDataBufMax]={0}; // 7 * 0x3D = BatDataBufMax
 
 unsigned char msgChanged[100]; // inidcates which bytes changed
 char c;
@@ -140,14 +139,13 @@
 bool metric = false;
 bool shunt[96]={0};
 bool charging=false;
-bool reqRest=false;
+
 int main() {
     //can1SleepMode.mode(OpenDrain);
     //can2SleepMode.mode(OpenDrain);
     char sTemp[40];
     unsigned long secs;
     unsigned char i,j,display=0,lwt=0;
-    char reqData[8] = {0x30, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff};
     point lastTouch;
     float average;
     tt.set_orientation(1);
@@ -333,8 +331,7 @@
                 logTS(); // Date-Time at wakeup
             }
             if (repeatPoll) { // re-enable autopolling if enabled
-                //autoPoll.attach(&autoPollISR,pollInt);
-                autoPoll.attach(&autoPollISR,10);
+                autoPoll.attach(&autoPollISR,pollInt);
             }
         } // if idle
         
@@ -421,13 +418,13 @@
                                     dMode[whichTouched] = brakeScreen ; // GoTo Brake Screen
                                 } else if (dMode[whichTouched]==cpScreen) {
                                     reqMsgCnt=0;
-                                    msgReq.attach(&sendReq,0.035);
+                                    msgReq.attach(&sendReq,0.015);
                                 } else if (dMode[whichTouched]==cpHistScreen) { // gg - hist
                                     reqMsgCnt=0;
-                                    msgReq.attach(&sendReq,0.035);
+                                    msgReq.attach(&sendReq,0.015);
                                 } else if (dMode[whichTouched]==cpBarScreen) { // gg - cpbars
                                     reqMsgCnt=0;
-                                    msgReq.attach(&sendReq,0.035);
+                                    msgReq.attach(&sendReq,0.015);
                                 } else if (dMode[whichTouched]==configScreen) {
                                     mbed_reset();
                                 } else if (dMode[whichTouched]==playbackScreen) { // pause/unpause
@@ -671,15 +668,6 @@
             }
         }
 
-        if (reqRest){
-            reqRest=false;
-            if (reqMsgCnt<DataBaseG7){
-                can1.write(CANMessage(0x79b, reqData, 8));
-            }else{
-                can1.write(CANMessage(0x745, reqData, 8));
-            }
-        }
-
         if(tick){ // Executes once a second
             tick=false;
             headlights = (lastMsg[indexLastMsg[0x358]].data[1]&0x80)?true:false;  // headlight/turn signal indicator
@@ -717,7 +705,7 @@
                 if (repeatPoll&&(wait5secs==0)) { // Poll on startup if autopoll enabled
                     logOnce=true;
                     reqMsgCnt=0;
-                    msgReq.attach(&sendReq,0.035);
+                    msgReq.attach(&sendReq,0.015);
                 }
             }
 
--- a/utility.cpp	Fri Jul 19 12:48:10 2013 +0000
+++ b/utility.cpp	Sat Jul 20 03:37:28 2013 +0000
@@ -205,54 +205,46 @@
         
         //-------------------
         //Miscellaneous on-recieve operations below
-        if((mType==2)&&((canRXmsg.id==0x7bb)||(canRXmsg.id==0x765))){ // is 7bb data?  Need to store all responses
-            if(canRXmsg.data[0]==0x10){
+        if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data?  Need to store all responses
+            if(canRXmsg.data[0]<0x20){
                 if(canRXmsg.data[3]==1){//Group 1 data
-                    bdi=DataBaseG1; // index offset for Group 1 data
+                    bdi=BatDataBaseG1; // 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=DataBaseG2; // index offset for CP data
+                    bdi=BatDataBaseG2; // index offset for CP data
                     if(debugMode){
                         printMsg("  Getting cell pair data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==3){//Group 3 data
-                    bdi=DataBaseG3; // index offset for Group 3 data
+                    bdi=BatDataBaseG3; // 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=DataBaseG4; // index offset for Temperature data
+                    bdi=BatDataBaseG4; // index offset for Temperature data
                     if(debugMode){
                         printMsg("  Getting temperature data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==5){//Group 5 data
-                    bdi=DataBaseG5; // index offset for Group 5 data
+                    bdi=BatDataBaseG5; // 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=DataBaseG6; // index offset for Group 6 data
+                    bdi=BatDataBaseG6; // 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){
@@ -265,27 +257,27 @@
                 //-------
                 //-------
                 i*=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+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==(DataBaseG6+1)*7){ // All data loaded
+                if(i==(BatDataBaseG6+3)*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=queryData[(DataBaseG4*7)+3]*0x100+queryData[(DataBaseG4*7)+4];
-                    j=queryData[(DataBaseG4*7)+6]*0x100+queryData[(DataBaseG4*7)+7];
+                    k=battData[(BatDataBaseG4*7)+3]*0x100+battData[(BatDataBaseG4*7)+4];
+                    j=battData[(BatDataBaseG4*7)+6]*0x100+battData[(BatDataBaseG4*7)+7];
                     if(j<k)k=j;
-                    j=queryData[(DataBaseG4*7)+9]*0x100+queryData[(DataBaseG4*7)+10];
+                    j=battData[(BatDataBaseG4*7)+9]*0x100+battData[(BatDataBaseG4*7)+10];
                     if(j<k)k=j;
-                    j=queryData[(DataBaseG4*7)+12]*0x100+queryData[(DataBaseG4*7)+13];
+                    j=battData[(BatDataBaseG4*7)+12]*0x100+battData[(BatDataBaseG4*7)+13];
                     if(j<k)k=j;
                     //interpolate from lookup table
                     unsigned short temp_adc[8] = {1000,589,487,401,365,340,309,000};
@@ -298,16 +290,16 @@
                     maxTemp+=temp_C[ii];
 
                     // Get state of health
-                    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];
+                    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];
                     
                     // Save shunt data
                     for(j=0; j<24; j++){
-                        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;
+                        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;
                     }
                 }
             }
@@ -400,57 +392,49 @@
     static char data[8] = {0x02, 0x21, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff};
     if(reqMsgCnt<99){
         switch (reqMsgCnt){
-            case DataBaseG1: // group 1 has 6 frames
+            case BatDataBaseG1:
                 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 DataBaseG2: // group 2 has 29 frames
+            case BatDataBaseG2: // group 1 has 6 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 DataBaseG3: // group 3 has 5 frames
+            case BatDataBaseG3: // group 2 has 29 frames
                 data[0]=0x02; //change to request group 3
                 data[1]=0x21;
                 data[2]=0x03;
-                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case DataBaseG4: // group 4 has 3 frames
+            case BatDataBaseG4: // group 3 has 5 frames
                 data[0]=0x02; //change to request group 4 (temperature)
                 data[1]=0x21;
                 data[2]=0x04;
-                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case DataBaseG5: // group 5 has 11 frames
+            case BatDataBaseG5: // group 4 has 3 frames
                 data[0]=0x02; //change to request group 5
                 data[1]=0x21;
                 data[2]=0x05;
-                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            case DataBaseG6: // group 6 has 4 frames
-                data[0]=0x02; //change to request group 6
+            case BatDataBaseG6: // group 4 has 3 frames
+                data[0]=0x02; //change to request group 5
                 data[1]=0x21;
                 data[2]=0x06;
-                can1.write(CANMessage(0x79b, data, 8));
                 break;
-            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: 
+            case BatDataBaseG7: // group 5 has 11 frames
                 reqMsgCnt = 99;
                 can1SleepMode = VP230Sleep; // disable TX
                 can1.monitor(true); // set to snoop mode
                 msgReq.detach(); // stop ticker
-            default: // wait 30ms
+            default:
+                data[0]=0x30; //change to request next line message
+                data[1]=0x01;
+                data[2]=0x00;
         }
+        can1.write(CANMessage(0x79b, data, 8));
         reqMsgCnt++;
     }
 }
@@ -460,7 +444,7 @@
     //sprintf(sTemp,"Requesting cp data\n"); // just for debug
     //printMsg(sTemp); // just for debug
     reqMsgCnt = 0; //reset message counter
-    msgReq.attach(&sendReq,0.035);
+    msgReq.attach(&sendReq,0.015);
 }
 
 void playbackISR() { //Used for autoplayback
@@ -677,7 +661,7 @@
     min=9999;
     avg=0;
     for(i=0; i<96; i++) {
-        bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+        bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
         avg+=bd;
         if(bd>max) max=bd;
         if(bd<min) min=bd;
@@ -698,10 +682,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,",(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]);
+        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]);
         for(i=0; i<96; i++) {
-            bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+            bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
             f_printf(&bfile,",%d",bd);
         }
         f_printf(&bfile,"\r\n");
@@ -738,7 +722,7 @@
     min=9999;
     avg=0;
     for(i=0; i<96; i++) {
-        bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+        bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
         avg+=bd;
         if(bd>max) max=bd;
         if(bd<min) min=bd;
@@ -759,16 +743,15 @@
         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,",(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]);
+        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]);
         for(i=0; i<96; i++) {
-            bd=(queryData[DataBaseG2*7+i*2+3]<<8)+queryData[DataBaseG2*7+i*2+4];
+            bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
             f_printf(&bfile,",%d",bd);
         }
         // temporariliy dump everything
-        /*for(i=0; i<DataBufMax; i++) {
-            sprintf(sTemp,",%02x",queryData[i]);
-            f_printf(&bfile,"%s",sTemp);  
+        /*for(i=0; i<BatDataBufMax; i++) {
+            f_printf(&bfile,",%02x",battData[i]);
         }*/
 
         f_printf(&bfile,"\r\n");
--- a/utility.h	Fri Jul 19 12:48:10 2013 +0000
+++ b/utility.h	Sat Jul 20 03:37:28 2013 +0000
@@ -27,7 +27,7 @@
 extern char indexLastMsg[0x800];
 extern unsigned char dMode[2];
 extern unsigned char msgChanged[100];
-extern unsigned char queryData[DataBufMax]; // BatDataBufMax
+extern unsigned char battData[BatDataBufMax]; // BatDataBufMax
 extern CANMessage lastMsg[100];
 extern CAN can1,can2;
 extern unsigned int fwCount;
@@ -66,7 +66,6 @@
 extern bool debugMode;
 extern bool shunt[96];
 extern float accV;
-extern bool reqRest;
 
 extern "C" {
     void mbed_reset();