Dual CANbus monitor and instrumentation cluster
Dependencies: SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed
Fork of CANary by
Diff: utility.cpp
- 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);