Dual CANbus monitor and instrumentation cluster
Dependencies: SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed
Fork of CANary by
Diff: displayModes.h
- Revision:
- 13:62e0f7f39ff5
- Parent:
- 12:8e42d7ba8468
- Child:
- 22:a43df3905863
--- a/displayModes.h Sun Mar 03 15:50:54 2013 +0000 +++ b/displayModes.h Sun Mar 03 17:06:12 2013 +0000 @@ -1,295 +1,32 @@ // This contains all the display subroutines #include "TOUCH_TFTx2.h" -#include "SPI_TFTx2.h" #include "Arial12x12.h" #include "Arial12x12_prop.h" #include "Arial28x28.h" #include "Neu42x35.h" #include "SCProSB31x55.h" +#include "common.h" -TOUCH_TFTx2 tt(p16, p17, p19, p20, p11, p12, p13, p6, p7, p5, "TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs0, cs1, reset +extern CANMessage lastMsg[100]; +extern unsigned char indexOffset; +extern unsigned char msgChanged[100]; +extern char displayLog[20][40]; +extern unsigned char displayLoc; +extern char indexLastMsg[0x800]; +extern unsigned char battData[256]; +extern bool showCP; +extern unsigned char dMode[2]; +extern unsigned char lastDMode[2]; +extern unsigned char sMode; +extern TOUCH_TFTx2 tt; extern "C" { - void printLast (bool force){ - CANMessage msg; - tt.locate(0,6); - tt.foreground(Red); - tt.background(Yellow); - if(force) tt.cls(); // Just clear screen if forced - always update display - tt.set_font((unsigned char*) Arial12x12_prop); // select the font - for(int i=0; i<19; i++){ - msg = lastMsg[i+indexOffset]; - printf("%03x : %02x %02x %02x %02x %02x %02x %02x %02x \n",msg.id,msg.data[0],msg.data[1],msg.data[2],msg.data[3],msg.data[4],msg.data[5],msg.data[6],msg.data[7]); - } - } - - void printChanged (bool force){ - CANMessage msg; - unsigned char i,j; - tt.locate(0,6); - tt.foreground(Red); - tt.background(Yellow); - if(force) tt.cls(); // Just clear screen if forced - always update display - tt.set_font((unsigned char*) Arial12x12_prop); // select the font - i=0; - j=indexOffset; - do{ - j=j<99?j+1:j; - if(msgChanged[j]>0){ - msg = lastMsg[j]; - printf("%03x : %02x %02x %02x %02x %02x %02x %02x %02x \n",msg.id,msg.data[0],msg.data[1],msg.data[2],msg.data[3],msg.data[4],msg.data[5],msg.data[6],msg.data[7]); - i++; - }// if changed - }while(i<19&&j<99); - } - - void printLog (bool force){ - static unsigned char lastDisplayLoc = 0; - if(force||displayLoc!=lastDisplayLoc){ //only update if changed - tt.foreground(Amber); - tt.background(Black); - tt.cls(); - tt.locate(0,6); - tt.set_font((unsigned char*) Arial12x12); - for(int i=0; i<19; i++){ - printf("%s",displayLog[displayLoc]); - displayLoc=displayLoc>17?0:displayLoc+1; - } - } - lastDisplayLoc=displayLoc; - } - - void printDTE (bool force){ - unsigned short gids, SOC, packV; - static unsigned short lgids=0, lSOC=0, lpackV=0; - CANMessage msg; - - msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids - gids = (msg.data[0]<<2)+(msg.data[1]>>6); - msg = lastMsg[indexLastMsg[0x55b]]; //Get SOC - SOC = (msg.data[0]<<2)+(msg.data[1]>>6); - msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts - packV = (msg.data[2]<<2)+(msg.data[3]>>6); - - tt.background(Navy); - if(force) tt.cls(); - if(force||gids!=lgids){ - tt.foreground(Amber); - tt.set_font((unsigned char*) Arial28x28); - tt.locate(10,10); - printf("%4d gids\n",gids); - tt.locate(10,200); - printf("%4.1f kWh\n",(float)gids*0.08); - tt.set_font((unsigned char*) SCProSB31x55); - //tt.set_font((unsigned char*) Neu42x35); - tt.foreground(Green); - tt.locate(60,96); - printf("%4.1f mi \n",(float)(gids-5)*0.33); // Approx for now - lgids=gids; - } - if(force||SOC!=lSOC){ - tt.foreground(Amber); - tt.set_font((unsigned char*) Arial28x28); - tt.locate(200,10); - printf("%4.1f%s\n",(float)SOC/10,"%"); - lSOC=SOC; - } - if(force||packV!=lpackV){ - tt.foreground(Amber); - tt.set_font((unsigned char*) Arial28x28); - tt.locate(200,200); - printf("%4.1fV\n",(float)packV/2); - lpackV=packV; - } - } - - void braking (bool force, bool prdata){ - unsigned short targetBraking, regenBraking, speed; - static unsigned short maxTarget = 0, maxRegen = 0, tarDivReg = 0; - short rpm; - unsigned long temp; - static unsigned char lastPressure[4] = {200,200,200,200}; - unsigned char i,r,t; - static unsigned char lr, lt; - CANMessage msg; - - 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); - if (targetBraking>maxTarget) maxTarget=targetBraking; - if (regenBraking>maxRegen) maxRegen=regenBraking; - if (regenBraking>50) { - temp = 1000*targetBraking; - temp /= regenBraking; - if (temp>tarDivReg) tarDivReg=temp; - } - msg = lastMsg[indexLastMsg[0x176]]; //Get rpms - not sure what this is but scales to mph with .0725 - rpm = ((short)msg.data[0]<<8)+msg.data[1]; - speed =rpm>0?rpm>>3:-rpm>>3; //Take absolute to get speed; div8 - msg = lastMsg[indexLastMsg[0x1ca]]; //Get brake pressure - - tt.background(Navy); - if (force) { - tt.cls(); - tt.rect(0,111,170,239,White); - tt.line(0,207,170,207,White); - tt.line(0,175,170,175,White); - tt.line(0,143,170,143,White); - lastPressure[0] = 200; - lastPressure[1] = 200; - lastPressure[2] = 200; - lastPressure[3] = 200; - } - // plot bar graph for each wheel pressure - for (i=0; i<4; i++){ - if (msg.data[i]<239) { - if (msg.data[i]>lastPressure[i]){ - tt.fillrect(10+40*i,239-msg.data[i],40+40*i,239,Red); - } else if (msg.data[i]<lastPressure[i]) { - tt.fillrect(10+40*i,238-lastPressure[i],40+40*i,238-msg.data[i],Navy); - } - lastPressure[i]=msg.data[i]; - } - } - - if(targetBraking>50){ - targetBraking *= speed; - regenBraking *= speed; - temp = 200*targetBraking/maxTarget; - t = (char) temp; - temp = 200*regenBraking*tarDivReg/maxTarget; - r = (char) temp; - if(lr!=r&&prdata){ - tt.foreground(Amber); - tt.set_font((unsigned char*) Arial28x28); - tt.locate(100,50); - printf("%d %d \n",regenBraking,maxRegen); - tt.locate(100,90); - printf("%3.1f (%3.1f%s) \n",(float)tarDivReg/1000,(float)regenBraking*tarDivReg/targetBraking/1000,"%"); - } - if(lt!=t&&prdata){ - tt.foreground(Amber); - tt.set_font((unsigned char*) Arial28x28); - tt.locate(100,10); - printf("%d %d \n",targetBraking,maxTarget); - } - if((lr!=r||lt!=t)&&!prdata){ - if(r<lr) - tt.fillrect(200,239-lr,300,239-r,Red); - else - tt.fillrect(200,239-r,300,239,Green); - if(t<lt) - tt.fillrect(200,239-lt,300,239-t,Navy); - else - tt.fillrect(200,239-t,300,238-r,Red); - lt=t; - lr=r; - } - } - } - - void cpData(bool force){ - short unsigned max, min, jv, i, bd; - unsigned avg; - if(force){ - tt.foreground(White); - tt.background(Navy); - tt.set_font((unsigned char*) Arial12x12_prop); // select the font - max=0; - min=9999; - avg=0; - for(i=0; i<96; i++){ - bd=(battData[i*2+3]<<8)+battData[i*2+4]; - avg+=bd; - if(bd>max) max=bd; - if(bd<min) min=bd; - } - avg /= 96; - if(min<3713) { - jv=avg-(max-avg)*1.5; - } else { // Only compute judgement value if min cellpair meets <= 3712mV requirement - jv=0; - } - tt.cls(); - tt.locate(0,6); - printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",max,min,avg,jv,battData[224+5],battData[224+8],battData[224+11],battData[224+14]); - tt.locate(0,36); - for(i=0; i<16; i++){ - printf("%02d-%02d : %04d %04d %04d %04d %04d %04d\n",i*6+1,i*6+6,(battData[i*12+3]<<8)+battData[i*12+4],(battData[i*12+5]<<8)+battData[i*12+6],(battData[i*12+7]<<8)+battData[i*12+8],(battData[i*12+9]<<8)+battData[i*12+10],(battData[i*12+11]<<8)+battData[i*12+12],(battData[i*12+13]<<8)+battData[i*12+14]); - } - tt.rect(8+0*41,16,40+0*41,28,Green); - tt.rect(8+1*41,16,40+1*41,28,Yellow); - //tt.rect(8+2*41,16,40+2*41,28,White); - tt.rect(8+3*41,16,40+3*41,28,Red); - for(i=0; i<96; i++){ - bd=(battData[i*2+3]<<8)+battData[i*2+4]; - if(bd>0){ - if(bd==max) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Green); - //if(bd==avg) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,White); - if(bd==min) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Yellow); - if(bd<jv) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Red); - } - } - showCP=false; - } - } - - void updateDisplay(char display){ - bool changed; - changed = dMode[display]!=lastDMode[display]; - tt.set_display(display); - switch (dMode[display]) { - case logScreen: - printLog(changed); - break; - case dteScreen: - printDTE(changed); - break; - case brakeScreen: - braking(changed,true); - break; - case powerScreen: - braking(changed,false); - break; - case monitorScreen: - printLast(changed); - break; - case changedScreen: - printChanged(changed); - break; - case cpScreen: - cpData(changed||showCP); - break; - default: - tt.background(Black); - tt.cls(); - break; - } - lastDMode[display]=dMode[display]; - - switch (sMode) { - case 1: - tt.foreground(Yellow); - tt.background(DarkCyan); - tt.set_font((unsigned char*) Arial12x12); - tt.fillrect(btn31x1,btn11y1,btn31x2,btn11y2,DarkCyan); - tt.locate(btn31x1+5,btn11y1+5); - printf("<-Prev\n"); - tt.fillrect(btn32x1,btn11y1,btn32x2,btn11y2,DarkCyan); - tt.fillrect(btn33x1,btn11y1,btn33x2,btn11y2,DarkCyan); - tt.locate(btn33x2-50,btn11y1+5); - printf("Next->\n"); - tt.set_display(0); - tt.locate(btn32x1+15,btn11y1+5); - printf("Select %d\n",dMode[0]); - tt.set_display(1); - tt.locate(btn32x1+15,btn11y1+5); - printf("Select %d\n",dMode[1]); - tt.background(Black); - break; - default: - break; - } - } + void printLast (bool force); + void printChanged (bool force); + void printLog (bool force); + void printDTE (bool force); + void braking (bool force, bool prdata); + void cpData(bool force); + void updateDisplay(char display); } \ No newline at end of file