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:
9:c7857e87dd07
Parent:
8:67eed72f3e10
Child:
10:ebc6326d9bd6
--- a/main.cpp	Sat Feb 23 04:10:51 2013 +0000
+++ b/main.cpp	Sat Feb 23 05:25:35 2013 +0000
@@ -24,10 +24,10 @@
 PwmOut dled(p24);
 
 InterruptIn touchpad(p17);
-CAN can1(p9, p10);      // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
-DigitalOut can1SleepMode(p8);     // Use pin 8 to control the sleep mode of can1
-CAN can2(p30, p29);     // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
-DigitalOut can2SleepMode(p28);     // Use pin 28 to control the sleep mode of can2
+CAN can1(p30, p29);     // CAN1 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
+DigitalOut can1SleepMode(p28);     // Use pin 28 to control the sleep mode of can1
+CAN can2(p9, p10);      // CAN2 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
+DigitalOut can2SleepMode(p8);     // Use pin 8 to control the sleep mode of can2
 bool logEn = true,logOpen = false;
 FILE *rfile;
 FILE *file;
@@ -35,7 +35,7 @@
 char writeBuffer[maxBufLen][13]; // buffer for USB write
 char indexLastMsg[0x800]={0}; // index table for last message
 CANMessage lastMsg[100]; // table to store last message of eachtype
-unsigned char battData[128]={0};
+unsigned char battData[256]={0};
 unsigned char msgChanged[100]; // inidcates which bytes changed
 char c;
 volatile int writePointer = 0;
@@ -49,7 +49,6 @@
 char displayLog[20][40];
 unsigned char displayLoc = 0;
 unsigned char indexOffset = 1;
-unsigned char bdi; //battery data index
 
 TOUCH_TFTx2 tt(p16, p17, p19, p20, p11, p12, p13, p6, p7, p5, "TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs0, cs1, reset
 
@@ -87,11 +86,12 @@
 }
 
 void logCan (char mType, CANMessage canRXmsg) {
-    //char sTemp[8];
+    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;
@@ -124,6 +124,15 @@
     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
@@ -132,10 +141,8 @@
         }
         lasti=i; //remember the msb to detect rollover next time around
         i+=bdi;
-        //sprintf(sTemp,"d%d  ",i);
-        //logMsg(sTemp);
         i*=7;
-        if(i<0xc0){
+        if(i<0xfa){
             battData[i+0]=canRXmsg.data[1];
             battData[i+1]=canRXmsg.data[2];
             battData[i+2]=canRXmsg.data[3];
@@ -165,50 +172,43 @@
 
 void sendCPreq() {
     char i;
-    //char sTemp[8];
     char data[8] = {0x02, 0x21, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff};
-    can2.monitor(false); // set to active mode
-    can2SleepMode = 0; // enable TX
-    can2.write(CANMessage(0x79b, data, 8));
+    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<64;i++){
         wait_ms(16); //wait 16ms
-        can2.write(CANMessage(0x79b, data, 8));
-        //sprintf(sTemp,"c%d ",i);
-        //logMsg(sTemp);
+        can1.write(CANMessage(0x79b, data, 8));
     }
-    can2SleepMode = 1; // disable TX
-    can2.monitor(true); // set to snoop mode
+    can1SleepMode = 1; // disable TX
+    can1.monitor(true); // set to snoop mode
 }
 
 void sendTreq() {
     char i;
-    //char sTemp[8];
     char data[8] = {0x02, 0x21, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff};
-    can2.monitor(false); // set to active mode
-    can2SleepMode = 0; // enable TX
-    can2.write(CANMessage(0x79b, data, 8));
+    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<8;i++){
         wait_ms(16); //wait 16ms
-        can2.write(CANMessage(0x79b, data, 8));
-        //sprintf(sTemp,"c%d ",i);
-        //logMsg(sTemp);
+        can1.write(CANMessage(0x79b, data, 8));
     }
-    can2SleepMode = 1; // disable TX
-    can2.monitor(true); // set to snoop mode
+    can1SleepMode = 1; // disable TX
+    can1.monitor(true); // set to snoop mode
 }
 
 void recieve1() {
     CANMessage msg1;
     secsNoMsg=0; // reset deadman switch
     can1.read(msg1);
-    //printf("Can1 rxd: %d\n", msg1.data[0]);
-    logCan(2, msg1);
+    logCan(1, msg1);
     led1 = !led1;
 }
 
@@ -216,8 +216,7 @@
     CANMessage msg2;
     secsNoMsg=0; // reset deadman switch
     can2.read(msg2);
-    //printf("Can2 rxd: %d\n", msg2.data[0]);
-    logCan(1, msg2);
+    logCan(2, msg2);
     led2 = !led2;
 }
 
@@ -405,7 +404,7 @@
     tt.set_font((unsigned char*) Arial12x12_prop);  // select the font
     if(force) tt.cls();
     tt.locate(0,6);
-    printf("cellpair data\n\n");
+    printf("cellpair temperatures: %dC %dC %dC %dC\ncellpair voltages (mV):\n\n",battData[224+5],battData[224+8],battData[224+11],battData[224+14]);
     if(force) tt.cls(); // Just clear screen if forced - always update display
     for(int i=0; i<16; i++){
         //printf("%02d-%02d : %04d %04d %04d %04d %04d %04d\n",i*6,i*6+5,(battData[i*12+5]<<8)+battData[i*12+4],(battData[i*12+7]<<8)+battData[i*12+6],(battData[i*12+9]<<8)+battData[i*12+8],(battData[i*12+11]<<8)+battData[i*12+10],(battData[i*12+13]<<8)+battData[i*12+12],(battData[i*12+15]<<8)+battData[i*12+14]);
@@ -480,20 +479,10 @@
 
     can1.monitor(true); // set to snoop mode
     can2.monitor(true); // set to snoop mode
-    //LPC_CAN1->MOD |= 1;          // Disble CAN controller
-    //LPC_CAN1->MOD |= (1 << 1);   // Put into listen only mode
-    //LPC_CAN1->MOD &= ~(1);       // Re-enable CAN controller
-    //LPC_CAN2->MOD |= 1;          // Disble CAN controller
-    //LPC_CAN2->MOD |= (1 << 1);   // Put into listen only mode
-    //LPC_CAN2->MOD &= ~(1);       // Re-enable CAN controller
     can1.frequency(500000);
     can2.frequency(500000);
-    //can1SleepMode = 0;         // Enable TX
-    //can2SleepMode = 0;         // Enable TX
     can1SleepMode = 1;         // Turn on Monitor_only Mode
     can2SleepMode = 1;         // Turn on Monitor_only Mode
-    //ticker.attach(&send1, 0.5);
-    //ticker.attach(&updateDisplay, 0.5); // Display messages
     can1.attach(&recieve1);
     can2.attach(&recieve2);
     
@@ -659,8 +648,9 @@
                         }
                     } else if (dMode[i]==cpMode) {
                         if (lastTouch.x>btn32x1 && lastTouch.x<btn32x2){
-                            bdi=0;
-                            sendCPreq(); // send CP data request.
+                            sendCPreq(); // send cellpair data request.
+                            wait_ms(16);
+                            sendTreq(); //send temperature request
                         }
                     }
                 } //top of screen