Dual CANbus monitor and instrumentation cluster
Dependencies: SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed
Fork of CANary by
Diff: utility.cpp
- Revision:
- 13:62e0f7f39ff5
- Child:
- 20:3bf176d14b14
diff -r 8e42d7ba8468 -r 62e0f7f39ff5 utility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utility.cpp Sun Mar 03 17:06:12 2013 +0000 @@ -0,0 +1,177 @@ +// utility.cpp + +#include "utility.h" + +void mbed_reset(); +void RTC_IRQHandler() { + timer.reset(); // zero ms at the-seconds-tic + canIdle=(++secsNoMsg>canTimeout); + userIdle=(++secsNoTouch>userTimeout); + LPC_RTC->ILR |= (1<<0); // clear interrupt to prepare for next +} + +extern "C" void RTC_Init (void) { + 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, 10 ); + NVIC_EnableIRQ( RTC_IRQn ); +} + +void logMsg (char *msg) { + strcpy(displayLog[displayLoc],msg); + displayLoc=displayLoc>17?0:displayLoc+1; +} + +void touch_ISR(){ + LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF); + secsNoTouch = 0; + touched=true; +} + +unsigned short getTimeStamp() { + unsigned short msec = timer.read_ms() ; // read ms from the timer + unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900 + unsigned short isecs = secs%60 ; // modulo 60 for 0-59 seconds from RTC + return ((isecs<<10)+msec) ; // return the two byte time stamp +} + +void logCan (char mType, CANMessage canRXmsg) { + char sTemp[40]; + unsigned short ts = getTimeStamp(); + unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900 + static unsigned char ii = 0, lasti = 0; // indexindex + unsigned char changed,i; + static unsigned char bdi; + if(logOpen){ + if(canRXmsg.id>0) { + writeBuffer[writePointer][0]=mType; + writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8); + writeBuffer[writePointer][2]=ts&0xff; + writeBuffer[writePointer][3]=canRXmsg.id&0xff; + writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4); + for(i=5;i<13;i++){ + writeBuffer[writePointer][i]=canRXmsg.data[i-5]; + } + if (++writePointer >= maxBufLen) { + writePointer = 0; + led3 = !led3; + } + } + }//if logOpen + if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry + ii=ii<99?ii+1:0; + indexLastMsg[canRXmsg.id]=ii; //Create entry if first message + } + if(dMode[0]==changedScreen||dMode[1]==changedScreen){ + changed=msgChanged[indexLastMsg[canRXmsg.id]]; + for(i=0;i<8;i++){ + if(lastMsg[indexLastMsg[canRXmsg.id]].data[i]!=canRXmsg.data[i]){ + changed |= 1<<i; + } + } + msgChanged[indexLastMsg[canRXmsg.id]]=changed; + } + lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table + if(mType==1&&canRXmsg.id==0x7bb){ // is battery data? Need to store all responses + if(canRXmsg.data[0]<0x20){ + if(canRXmsg.data[3]==2){//cellpair data + bdi=0; + sprintf(sTemp,"Getting cell pair data\n"); + logMsg(sTemp); + }else if(canRXmsg.data[3]==4){//temperature data + bdi=0x20; + sprintf(sTemp,"Getting temperature data\n"); + logMsg(sTemp); + }else bdi=0; + lasti=0; + } + i=canRXmsg.data[0]&0x0f; //lower nibble of D0 is index + if(lasti>i){ //detect rolloever and offset index appropriately + bdi=0x10; + } + lasti=i; //remember the msb to detect rollover next time around + i+=bdi; + i*=7; + if(i<0xfa){ + 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 0x7bb +} + +void logTS () { + CANMessage tsMsg; + unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900 + tsMsg.id=0xfff; + tsMsg.len=0xf; + tsMsg.data[0]=secs&0xff; + tsMsg.data[1]=(secs>>8)&0xff; + tsMsg.data[2]=(secs>>16)&0xff; + tsMsg.data[3]=secs>>24; + tsMsg.data[4]=0xff; + tsMsg.data[5]=0xff; + tsMsg.data[6]=0xff; + tsMsg.data[7]=0xff; + logCan(0,tsMsg); +} + +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)); + data[0]=0x30; //change to request next line message + data[1]=0x01; + data[2]=0x00; + for(i=0;i<27;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)); + data[0]=0x30; //change to request next line message + data[1]=0x01; + data[2]=0x00; + for(i=0;i<2;i++){ + wait_ms(16); //wait 16ms + can1.write(CANMessage(0x79b, data, 8)); + } + can1SleepMode = 1; // disable TX + can1.monitor(true); // set to snoop mode +} + +void tickerISR() { //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 recieve1() { + CANMessage msg1; + secsNoMsg=0; // reset deadman switch + can1.read(msg1); + logCan(1, msg1); + led1 = !led1; +} + +void recieve2() { + CANMessage msg2; + secsNoMsg=0; // reset deadman switch + can2.read(msg2); + logCan(2, msg2); + led2 = !led2; +} +