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

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Sun Mar 24 15:35:45 2013 +0000
Parent:
36:dbd39c315258
Child:
38:155ec32c5e91
Commit message:
Got kW computation working

Changed in this revision

TOUCH_TFTx2.lib Show annotated file Show diff for this revision Revisions of this file
common.h Show annotated file Show diff for this revision Revisions of this file
displayModes.cpp Show annotated file Show diff for this revision Revisions of this file
displayModes.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
utility.cpp Show annotated file Show diff for this revision Revisions of this file
utility.h Show annotated file Show diff for this revision Revisions of this file
--- a/TOUCH_TFTx2.lib	Sat Mar 23 04:43:45 2013 +0000
+++ b/TOUCH_TFTx2.lib	Sun Mar 24 15:35:45 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/TickTock/code/TOUCH_TFTx2/#b7fb9d3ae5ea
+http://mbed.org/users/TickTock/code/TOUCH_TFTx2/#220e3da2dd00
--- a/common.h	Sat Mar 23 04:43:45 2013 +0000
+++ b/common.h	Sun Mar 24 15:35:45 2013 +0000
@@ -2,7 +2,7 @@
 #define logScreen 1
 #define dteScreen 2
 #define brakeScreen 3
-#define powerScreen 4
+#define testScreen 4
 #define monitorScreen 5
 #define changedScreen 6
 #define cpScreen 7
--- a/displayModes.cpp	Sat Mar 23 04:43:45 2013 +0000
+++ b/displayModes.cpp	Sun Mar 24 15:35:45 2013 +0000
@@ -1,6 +1,6 @@
 //displayModes.cpp
+#include "displayModes.h"
 
-#include "displayModes.h"
 char sTemp1[40];
 char sTemp2[16];
 
@@ -104,7 +104,7 @@
         tt.foreground(Yellow);
         tt.set_font((unsigned char*) Arial28x28);
         tt.locate(200,200);
-        printf("%4.1fV\n",(float)packV/2);
+        printf("%4.1fV \n",(float)packV/2);
         lpackV=packV;
     }
     if(force||tick){
@@ -112,6 +112,8 @@
         tt.set_font((unsigned char*) Arial28x28);
         tt.locate(20,200);
         printf("%4.2fV  \n",accV);
+        tt.locate(170,40);
+        printf("%4.3fkW  \n",mpkWh); //kW for now
     }
 }
 
@@ -121,9 +123,19 @@
     unsigned long temp;
     static unsigned char lastPressure[4] = {200,200,200,200};
     unsigned char i,r,t;
-    static unsigned char lr, lt;
+    static unsigned char lr=0, lt=0;
+    signed short steering;
+    unsigned short s;
+    static unsigned short ls;
+    unsigned char throttle;
+    static unsigned char lthrottle;
     CANMessage msg;
 
+    msg = lastMsg[indexLastMsg[0x180]]; //Get Throttle position
+    throttle = msg.data[5];
+    msg = lastMsg[indexLastMsg[0x002]]; //Get Steering angle
+    steering = (msg.data[1]<<8)+msg.data[0];
+    s= (unsigned short) ((steering/10)+160)%310;
     msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
     regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
     targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
@@ -149,6 +161,26 @@
         lastPressure[2] = 200;
         lastPressure[3] = 200;
     }
+
+    if (s!=ls){
+        tt.fillrect(ls,5,ls+9,14, Navy);        
+        tt.fillrect(s,5,s+9,14, White);        
+        //tt.foreground(Yellow);
+        //tt.set_font((unsigned char*) Arial28x28);
+        //tt.locate(10,40);
+        //printf("%d %d    \n",s,ls);
+        ls=s;
+    }
+    if (throttle!=lthrottle){
+        if (throttle>239) throttle=239;
+        if(throttle<lthrottle){
+            tt.fillrect(280,239-lthrottle,310,239-throttle,Navy);
+        }else{
+            tt.fillrect(280,239-throttle,310,239,Yellow);
+        }
+        lthrottle=throttle;
+    }
+
     // plot bar graph for each wheel pressure
     for (i=0; i<4; i++){
         if (msg.data[i]<239) {
@@ -188,9 +220,9 @@
     }
     if (r>t) t=r;  //Should never happen
     if((lr!=r||lt!=t)&&!prdata){
-        tt.fillrect(200,10,300,239-t,Navy);
-        tt.fillrect(200,239-t,300,239-r,Red);
-        tt.fillrect(200,239-r,300,239,Green);
+        tt.fillrect(190,10,260,239-t,Navy);
+        tt.fillrect(190,239-t,260,239-r,Red);
+        tt.fillrect(190,239-r,260,239,Green);
     }
     lt=t;
     lr=r;
@@ -370,6 +402,29 @@
     }
 }
 
+void test(bool force){
+    unsigned char left,right;
+    CANMessage msg;
+    static unsigned char lleft=0;
+
+    msg = lastMsg[indexLastMsg[0x284]];
+    right = msg.data[7];
+    msg = lastMsg[indexLastMsg[0x280]];
+    left = msg.data[6];
+
+    tt.background(Navy);
+    if(force) tt.cls();
+    if(force||left!=lleft){
+        tt.foreground(Yellow);
+        tt.set_font((unsigned char*) Arial28x28);
+        tt.locate(10,200);
+        printf("%d  \n",left);
+        tt.locate(200,200);
+        printf("%d  \n",right);
+        lleft=left;
+    }
+}
+
 void updateDisplay(char display){
     bool changed;
     changed = dMode[display]!=lastDMode[display];
@@ -384,9 +439,9 @@
         case brakeScreen:
             braking(changed);
             break;
-        case powerScreen:
-            //braking(changed, true);
-            //break;
+        case testScreen:
+            test(changed);
+            break;
         case monitorScreen:
             printLast(changed);
             break;
--- a/displayModes.h	Sat Mar 23 04:43:45 2013 +0000
+++ b/displayModes.h	Sun Mar 24 15:35:45 2013 +0000
@@ -29,12 +29,14 @@
 extern bool playbackEn;
 extern bool playbackOpen;
 extern float playbackInt;
+extern float mpkWh;
 
 extern "C" {
     void printLast (bool force);
     void printChanged (bool force);
     void printLog (bool force);
     void printDTE (bool force);
+    void test (bool force);
     void braking (bool force, bool prdata);
     void cpData(bool force);
     void showDateTime(bool force);
--- a/main.cpp	Sat Mar 23 04:43:45 2013 +0000
+++ b/main.cpp	Sun Mar 24 15:35:45 2013 +0000
@@ -21,8 +21,6 @@
 #include "EthernetPowerControl.h"
 #include "utility.h"
 #include "displayModes.h"
-#include "GraphicsDisplay.h"
-#include "SPI_TFTx2.h"
 #include "TOUCH_TFTx2.h"
 
 LocalFileSystem local("local");
@@ -85,15 +83,17 @@
 unsigned short pollInt = 300; // polling interval=5 minutes (until config file read)
 bool accOn = false; // Accessories on
 float scale12V = 16.2; // R1:R2 ratio
-signed long kWh = 0;
+signed long mWs = 0;
 unsigned long miles = 0;
 float mpkWh = 0;
 float accV = 0;
 bool playbackEn = false;
 bool playbackOpen = false;
-float playbackInt = 1; //read one message every 64 ms
+float playbackInt = 0.032; //read one message every 64 ms
 bool step = false;
+char header[5];
 char data[8];
+unsigned short pbts;
 
 int main() {
     int readPointer=0;
@@ -177,12 +177,10 @@
 
     secsNoMsg = 0;
     secsNoTouch = 0;
-
     // Read config file
     readConfig();
     touched=false;
     secsNoTouch=2;
-
     while (true) {
         if (!logOpen) { // Open new file if one is not already open
             if(logEn){ //logging enable
@@ -212,11 +210,16 @@
                 // Dump buffer if > 1/16 full or canbus has stopped
                 if (file == NULL) {
                     logOpen = false;
-                    sprintf(sTemp,"Failed to append log file.\n\n");
+                    sprintf(sTemp,"Failed to append log file.\n");
+                    logMsg(sTemp);
                     spkr.beep(1000,0.25);
-                    logMsg(sTemp);
                     logEn=false;
                 } else {
+                    if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen*7/8)) { // Hi-water mark
+                        sprintf(sTemp,"Write buffer overrun.\n");
+                        logMsg(sTemp);
+                        spkr.beep(1000,0.25);
+                    }
                     while (readPointer != writePointer) {
                         for (j = 0; j<13; j++){
                             fprintf(file,"%c",writeBuffer[readPointer][j]);
@@ -304,6 +307,7 @@
                                 indexOffset=indexOffset>4?indexOffset-4:1;
                                 } else if (dMode[i]==config1Screen) {
                                     wait_ms(500);
+                                    tt.background(Black);
                                     tt.calibrate();
                                 } else if (dMode[i]==config2Screen) { // slower
                                         playbackInt *=2;
@@ -442,7 +446,6 @@
                 lastDMode[1]=99;
             }
         }
-
         display=display<1?display+1:0; // toggle display
         updateDisplay(display);
 
@@ -465,13 +468,14 @@
             }else{
                 dled = ledLo;
             }
-            if(kWh>0){
-                mpkWh=miles/kWh;
+            //if(mWs>0){
+            if(true){
+                mpkWh= ((float) mWs)/1e6; // just kW for now               
             }else{
                 mpkWh=99;
             }
             miles=0;
-            kWh=0;
+            mWs=0;
             tick=false;
         }
 
@@ -481,11 +485,9 @@
                 //logMsg(sTemp);
                 for(i=0;i<200;i++){
                     if(!feof(file)){
-                        //for (j = 0; j<5; j++){
-                            fscanf(file,"%5c",&writeBuffer[0][0]);
-                        //}
-                        fscanf(file,"%8c",&data[0]);
-                        logCan(writeBuffer[0][0],CANMessage(0x7ff&((writeBuffer[0][4]<<8)+writeBuffer[0][3]), data, 8));
+                        fscanf(file,"%5c%8c",&header,&data);
+                        pbts=(header[1]<<8)|header[2];
+                        logCan(header[0],CANMessage(0x7ff&((header[4]<<8)+header[3]), data, 8));
                     }else{
                         fclose(file); // restart
                         file = fopen("/usb/playback.alc", "rb");                                          
@@ -495,5 +497,6 @@
             }
             step=false;
         }
+
     } //while (true)
 }
\ No newline at end of file
--- a/utility.cpp	Sat Mar 23 04:43:45 2013 +0000
+++ b/utility.cpp	Sun Mar 24 15:35:45 2013 +0000
@@ -1,5 +1,4 @@
 // utility.cpp
-
 #include "utility.h"
 
 void mbed_reset();
@@ -12,7 +11,7 @@
     tick=true;
 }
 
-extern "C" void RTC_Init (void) {
+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
@@ -26,7 +25,7 @@
 }
 
 void touch_ISR(){
-    LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF);
+    //LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF); // seems to work without so maybe not necessary (performed inInterruptIn handler?)
     touched=true; // just set flag - touch screen algorythm is long and we don't want to block other interrupts
 }
 
@@ -40,16 +39,21 @@
 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;
+    static unsigned char bdi=0;
+    //Determined 1db messages are 10ms apart so no need to compute deltaT
+    //unsigned short ms;
+    //static unsigned short lms=0;
+    unsigned short packV;
+    signed short packA;
+    signed long imWs;
     secsNoMsg=0; // reset deadman switch
     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][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++){
@@ -60,7 +64,11 @@
                 led3 = !led3;
             }
         }
-    }//if logOpen
+    }
+    //Determined 1db messages are 10ms apart so no need to compute deltaT
+    /*if(playbackOpen){
+        ts=pbts; // Use ts from playback buffer
+    }//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
@@ -77,13 +85,13 @@
     lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table
     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
+    }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){//cellpair data
                 bdi=0;
                 sprintf(sTemp,"Getting cell pair data\n");
                 logMsg(sTemp);
-           }else if(canRXmsg.data[3]==4){//temperature data
+            }else if(canRXmsg.data[3]==4){//temperature data
                 bdi=0x20;
                 sprintf(sTemp,"Getting temperature data\n");
                 logMsg(sTemp);
@@ -106,7 +114,26 @@
             battData[i+5]=canRXmsg.data[6];
             battData[i+6]=canRXmsg.data[7];
         }
-    }//if 0x7bb
+    }else if((mType==1)&&(canRXmsg.id==0x1db)){ //Battery Volts and Amps
+        //Determined 1db messages are 10ms apart so no need to compute deltaT
+        //ms=(ts&0xfc00)*1000+(ts&0x03ff); // convert from BCD(ish-ssssss:mmmmmmmmmm) to binary
+        //if(ms<lms){ // must've rolled over
+        //    imWs=ms+60000; // (ms)compute elapsed time since last update including rollover
+        //    imWs-=lms;
+        //}else{
+        //    imWs=ms-lms; // (ms) compute elapsed time since last update
+        //}
+        packV=((canRXmsg.data[2]<<2)|(canRXmsg.data[3]>>6)); // 1 LSB = 0.5V
+        packA=((canRXmsg.data[0]<<3)|(canRXmsg.data[1]>>5)); // 1 LSB = 0.5A
+        if(packA>0x03ff){
+            packA|=0xf800;//extend sign;
+        }
+        imWs=packV; // Volts*seconds*2
+        imWs*=packA; // Watts*4
+        imWs*=-2.5; // milliwatts*seconds (1db messages are 10ms apart)
+        mWs+=imWs; // total mWs
+        //lms=ms;
+    }
 }
 
 void logTS () {
--- a/utility.h	Sat Mar 23 04:43:45 2013 +0000
+++ b/utility.h	Sun Mar 24 15:35:45 2013 +0000
@@ -36,6 +36,8 @@
 extern bool playbackOpen;
 extern bool step;
 extern float playbackInt;
+extern signed long mWs;
+extern unsigned short pbts;
 
 extern "C" {
     void mbed_reset();