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

Revision:
13:62e0f7f39ff5
Child:
20:3bf176d14b14
--- /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;
+}
+