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