Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller
Dependencies: SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed
Fork of CANary by
displayModes.cpp
- Committer:
- TickTock
- Date:
- 2013-03-11
- Revision:
- 22:a43df3905863
- Parent:
- 18:999401f359a5
- Child:
- 23:cd03f9c3395e
File content as of revision 22:a43df3905863:
//displayModes.cpp #include "displayModes.h" char sTemp[16]; 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); if(sMode==1){ tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp,"<up>"); showButton(0,0,sTemp,3,3); //tt.fillrect(btn31x1,btn31y1,btn31x2,btn31y2,DarkCyan); //tt.locate(btn31x1+5,btn31y1+5); //printf(" <up>\n"); tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp,"<down>"); showButton(2,0,sTemp,3,3); //tt.fillrect(btn33x1,btn31y1,btn33x2,btn31y2,DarkCyan); //tt.locate(btn33x1+5,btn31y1+5); //printf(" <down>\n"); } break; case changedScreen: printChanged(changed); break; case cpScreen: cpData(changed||showCP); if(sMode==1){ tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp,"Request"); showButton(1,0,sTemp,3,3); } break; case configScreen: printLog(changed); //sMode=2; break; default: tt.background(Black); tt.cls(); break; } lastDMode[display]=dMode[display]; switch (sMode) { case 1: // Select screens tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp,"<-Prev"); showButton(0,2,sTemp,3,3); sprintf(sTemp," Select %d",dMode[display]); showButton(1,2,sTemp,3,3); sprintf(sTemp," Next->"); showButton(2,2,sTemp,3,3); break; case 2: // numpad tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial24x23); sprintf(sTemp," 1"); showButton(0,0,sTemp,4,4); sprintf(sTemp," 2"); showButton(1,0,sTemp,4,4); sprintf(sTemp," 3"); showButton(2,0,sTemp,4,4); sprintf(sTemp," 4"); showButton(0,1,sTemp,4,4); sprintf(sTemp," 5"); showButton(1,1,sTemp,4,4); sprintf(sTemp," 6"); showButton(2,1,sTemp,4,4); sprintf(sTemp," 7"); showButton(0,2,sTemp,4,4); sprintf(sTemp," 8"); showButton(1,2,sTemp,4,4); sprintf(sTemp," 9"); showButton(2,2,sTemp,4,4); sprintf(sTemp," 0"); showButton(1,3,sTemp,4,4); sprintf(sTemp,"<--"); showButton(0,3,sTemp,4,4); sprintf(sTemp,"-->"); showButton(2,3,sTemp,4,4); sprintf(sTemp,"rtn"); showButton(3,3,sTemp,4,4); default: break; } } void showButton(unsigned char column, unsigned char row, char * text, unsigned char columns, unsigned char rows){ unsigned short x1,x2,y1,y2; x1=column*(320/columns)+btnGap/2; x2=(column+1)*(320/columns)-btnGap/2; y1=row*(240/rows)+btnGap/2; y2=(row+1)*(240/rows)-btnGap/2; tt.fillrect(x1,y1,x2,y2,DarkCyan); tt.locate(x1+btnGap,y1+btnGap); printf("%s\n",text); }