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-04-02
- Revision:
- 47:9cc7d876dd6d
- Parent:
- 44:6262a9fd1e56
- Child:
- 48:d1ce92104a1f
File content as of revision 47:9cc7d876dd6d:
//displayModes.cpp #include "displayModes.h" char sTemp1[40]; char sTemp2[16]; void printLast (bool force, bool showButtons){ 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]); } if((sMode==1)&&showButtons){ tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp1,"<up>"); sprintf(sTemp2,""); showButton(0,0,sTemp1,sTemp2,3,3); sprintf(sTemp1,"<down>"); showButton(2,0,sTemp1,sTemp2,3,3); } } void printChanged (bool force, bool showButtons){ 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); if((sMode==1)&&showButtons){ tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp1,"<up>"); sprintf(sTemp2,""); showButton(0,0,sTemp1,sTemp2,3,3); sprintf(sTemp1," <down>"); showButton(2,0,sTemp1,sTemp2,3,3); sprintf(sTemp1," Reset"); sprintf(sTemp2," Baseline"); showButton(1,0,sTemp1,sTemp2,3,3); } } void printLog (bool force, bool showButtons){ 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 mainDisplay (bool force, bool showButtons){ unsigned short gids, SOC, packV; static unsigned short lgids=0, lSOC=0, lpackV=0; static float lkW=0, laccV=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); tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); if(force) tt.cls(); if(force||gids!=lgids){ tt.locate(10,10); printf("%4d gids \n",gids); tt.locate(20,40); printf("%4.1f kWh \n",(float)gids*0.08); tt.set_font((unsigned char*) SCProSB31x55); tt.foreground(Green); tt.locate(60,96); printf("%4.1f mi \n",(float)(gids-5)*0.31); // Approx for now lgids=gids; tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); } if(force||SOC!=lSOC){ tt.locate(200,10); printf("%4.1f%s\n",(float)SOC/10,"% "); lSOC=SOC; } if(force||packV!=lpackV){ tt.locate(200,200); printf("%4.1fV \n",(float)packV/2); lpackV=packV; } if(force||accV!=laccV){ tt.locate(20,200); printf("%3.1fV \n",accV); laccV=accV; } if(force||kW!=lkW){ tt.locate(180,40); printf("%3.2fkW \n",kW); lkW=kW; } } void braking (bool force, bool showButtons, bool prdata=false){ unsigned long targetBraking, regenBraking; static unsigned long maxTarget = 1000, maxRegen = 1000, tarDivReg = 1000; unsigned long temp; static unsigned char lastPressure[4] = {200,200,200,200}; unsigned char i,r,t; 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); if ((targetBraking>50)&&(regenBraking>50)){ temp = targetBraking; temp *= 1000; temp /= regenBraking; if (temp<tarDivReg) tarDivReg=temp; } if (targetBraking>maxTarget) maxTarget=targetBraking; if (regenBraking>maxRegen) maxRegen=regenBraking; 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; } 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) { 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]; } } temp = targetBraking; temp *=200; temp /= maxTarget; t = (char) temp; if (t>200) t=200; temp = regenBraking; temp *= tarDivReg; temp /= maxTarget; temp /= 5; r = (char) temp; if (r>200) r=200; if(lr!=r&&prdata){ tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); tt.locate(100,40); printf("%d %d \n",regenBraking,maxRegen); tt.locate(100,70); printf("%3.1f (%3.1f%s) \n",(float)tarDivReg/10,(float)regenBraking*tarDivReg/targetBraking/10,"%"); } if(lt!=t&&prdata){ tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); tt.locate(100,10); printf("%d %d \n",targetBraking,maxTarget); } if (r>t) t=r; //Should never happen if((lr!=r||lt!=t)&&!prdata){ 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; } void cpData(bool force, bool showButtons){ 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; } if((sMode==1)&&showButtons){ tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp1," Request"); sprintf(sTemp2," CP data"); showButton(1,0,sTemp1,sTemp2,3,3); } } //---------------- // gg - hist void cpHistogram(bool force, bool showButtons){ 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(); // show as histogram int xWinMin = 20; int xWinMax = 300; int yWinMin = 50; int yWinMax = 150; // draw the Histogram Frame, 2 pixels wide tt.rect( xWinMin-1,yWinMin-1, xWinMax+1,yWinMax+1,Red); tt.rect( xWinMin-2,yWinMin-2, xWinMax+2,yWinMax+2,Green); tt.locate( 0, yWinMax+10 ); 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]); // binning short nBin[301] ; // bins to count Min values in nBin[0], etc. int height ; int iBinIndxMax = 300 ; int iBinValMax = max - min ; // zero to N if( iBinValMax > iBinIndxMax ) iBinValMax = iBinIndxMax ; // clean the bins for(int i=0; i<=iBinIndxMax; i++) { nBin[i] = 0; } // do the bin counting for(int i=0; i<96; i++){ bd=(battData[i*2+3]<<8)+battData[i*2+4] - min ; if( bd > iBinValMax ) bd = iBinValMax ; nBin[bd] ++ ; } //---------------- if( iBinValMax == 0 ) { // for testing min = 10 ; max = 50 ; avg = ( max + min ) / 2; iBinValMax = max - min ; for(int i=0; i<=(iBinValMax/2); i++) { nBin[i] = i ; nBin[iBinValMax-i] = i ; } } //--------------- // show the bars int nBarWidth = 3 ; int nBarSpace = 1 ; // 1 for testing int xPos = (xWinMin + xWinMax) / 2 ; xPos -= (avg-min) * (nBarWidth + nBarSpace) ; for( int i=0; i<=iBinValMax; i++) { height = 4 * nBin[i] ; if( height > 100 ) height = 100 ; // clip tops // if inside the window, draw the bar if( ( xPos + nBarWidth < xWinMax ) && ( xPos > xWinMin ) ) tt.fillrect( xPos,yWinMax-height, xPos+nBarWidth-1,yWinMax, Green); // step to the next bar position xPos += nBarWidth + nBarSpace ; } showCP=false; } // handle the button if(sMode==1&&showButtons){ tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp1," Request"); sprintf(sTemp2," CP data"); showButton(1,0,sTemp1,sTemp2,3,3); } } void config1(bool force, bool showButtons){ if (force) { tt.background(Black); tt.cls(); } tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp1," Calibrate"); sprintf(sTemp2," Touch"); showButton(0,0,sTemp1,sTemp2,3,3); sprintf(sTemp1," Reset"); sprintf(sTemp2,""); showButton(1,0,sTemp1,sTemp2,3,3); sprintf(sTemp1," Save"); sprintf(sTemp2," Config"); showButton(2,0,sTemp1,sTemp2,3,3); if (logEn) { sprintf(sTemp1," Disable"); } else { sprintf(sTemp1," Enable"); } sprintf(sTemp2," Logging"); showButton(0,1,sTemp1,sTemp2,3,3); if (repeatPoll) { sprintf(sTemp1," Disable"); } else { sprintf(sTemp1," Enable"); } sprintf(sTemp2," Auto CP"); showButton(1,1,sTemp1,sTemp2,3,3); } void pbScreen(bool force, bool showButtons){ if (force) { tt.background(Black); tt.cls(); } tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); if(playbackOpen){ sprintf(sTemp1,"Slower"); sprintf(sTemp2," <--"); showButton(0,0,sTemp1,sTemp2,3,3); if(playbackEn){ sprintf(sTemp1," Pause"); }else{ sprintf(sTemp1," Run"); } sprintf(sTemp2," %4.3f ",playbackInt); showButton(1,0,sTemp1,sTemp2,3,3); sprintf(sTemp1,"Faster"); sprintf(sTemp2," -->"); showButton(2,0,sTemp1,sTemp2,3,3); } if(playbackOpen){ sprintf(sTemp1," Stop"); }else{ sprintf(sTemp1," Start"); } sprintf(sTemp2,"Playback"); showButton(1,1,sTemp1,sTemp2,3,3); } void showDateTime(bool force, bool showButtons){ struct tm t; // pointer to a static tm structure time_t seconds ; tt.foreground(Yellow); tt.background(Black); if (force) { tt.cls(); seconds = time(NULL); t = *localtime(&seconds) ; tt.locate(10,10); tt.set_font((unsigned char*) Arial12x12); strftime(sTemp1, 32, "%a %m/%d/%Y %X \n", &t); printf("%s",sTemp1); if((sMode==1)&&showButtons){ sprintf(sTemp2,""); switch(dtMode){ case 0: sprintf(sTemp1,"Year"); break; case 1: sprintf(sTemp1,"Month"); break; case 2: sprintf(sTemp1,"Day"); break; case 3: sprintf(sTemp1,"Hour"); break; case 4: sprintf(sTemp1,"Minute"); break; case 5: sprintf(sTemp1,"Second"); break; case 6: sprintf(sTemp1,"Select"); break; default: break; } tt.background(DarkCyan); showButton(0,1,sTemp1,sTemp2,3,3); sprintf(sTemp1," UP"); showButton(1,1,sTemp1,sTemp2,3,3); sprintf(sTemp1," DOWN"); showButton(2,1,sTemp1,sTemp2,3,3); } } } void dteDisplay(bool force, bool showButtons){ static float lmpkWh=0; static float lMPH=0; tt.background(Navy); if(force) tt.cls(); if(force||mpkWh!=lmpkWh||MPH!=lMPH){ tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); tt.locate(10,200); printf("%3.1f \n",MPH); tt.locate(200,200); printf("%3.1f \n",mpkWh); lmpkWh=mpkWh; lMPH=MPH; } } void updateDisplay(char display){ bool changed; changed = dMode[display]!=lastDMode[display]; tt.set_display(display); switch (dMode[display]) { case logScreen: printLog(changed,(display==whichTouched)); break; case mainScreen: mainDisplay(changed,(display==whichTouched)); break; case brakeScreen: braking(changed,(display==whichTouched)); break; case dteScreen: dteDisplay(changed,(display==whichTouched)); break; case monitorScreen: printLast(changed,(display==whichTouched)); break; case changedScreen: printChanged(changed,(display==whichTouched)); break; case cpScreen: cpData(changed||showCP,(display==whichTouched)); break; case config1Screen: config1(changed,(display==whichTouched)); break; case playbackScreen: pbScreen(changed,(display==whichTouched)); break; case dateScreen: showDateTime(changed,(display==whichTouched)); break; case cpHistScreen: // gg - hist cpHistogram(changed||showCP,(display==whichTouched)); break; default: if (changed){ tt.background(Black); tt.cls(); } break; } lastDMode[display]=dMode[display]; if(display==whichTouched){ switch (sMode) { case 1: // Select screens tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial12x12); sprintf(sTemp1,"<-Prev"); sprintf(sTemp2,""); showButton(0,2,sTemp1,sTemp2,3,3); sprintf(sTemp1," Next->"); showButton(2,2,sTemp1,sTemp2,3,3); sprintf(sTemp1," Select"); switch (dMode[display]) { case offScreen: sprintf(sTemp2," Off"); break; case logScreen: sprintf(sTemp2," Log"); break; case mainScreen: sprintf(sTemp2," Main"); break; case brakeScreen: sprintf(sTemp2," Braking"); break; case dteScreen: sprintf(sTemp2," DTE"); break; case monitorScreen: sprintf(sTemp2," Monitor"); break; case changedScreen: sprintf(sTemp2,"Delta Mon"); break; case cpScreen: sprintf(sTemp2," Cell Pair"); break; case config1Screen: sprintf(sTemp2," Config"); break; case playbackScreen: sprintf(sTemp2," Playback"); break; case dateScreen: sprintf(sTemp2," Set Time"); break; case cpHistScreen: // gg - hist sprintf(sTemp2," CP Hist"); break; } showButton(1,2,sTemp1,sTemp2,3,3); wait_ms(100); // pause a moment to reduce flicker break; case 2: // numpad sprintf(sTemp2,""); tt.foreground(Yellow); tt.background(DarkCyan); tt.set_font((unsigned char*) Arial24x23); sprintf(sTemp1," 1"); showButton(0,0,sTemp1,sTemp2,4,4); sprintf(sTemp1," 2"); showButton(1,0,sTemp1,sTemp2,4,4); sprintf(sTemp1," 3"); showButton(2,0,sTemp1,sTemp2,4,4); sprintf(sTemp1," 4"); showButton(0,1,sTemp1,sTemp2,4,4); sprintf(sTemp1," 5"); showButton(1,1,sTemp1,sTemp2,4,4); sprintf(sTemp1," 6"); showButton(2,1,sTemp1,sTemp2,4,4); sprintf(sTemp1," 7"); showButton(0,2,sTemp1,sTemp2,4,4); sprintf(sTemp1," 8"); showButton(1,2,sTemp1,sTemp2,4,4); sprintf(sTemp1," 9"); showButton(2,2,sTemp1,sTemp2,4,4); sprintf(sTemp1," 0"); showButton(1,3,sTemp1,sTemp2,4,4); sprintf(sTemp1,"<--"); showButton(0,3,sTemp1,sTemp2,4,4); sprintf(sTemp1,"-->"); showButton(2,3,sTemp1,sTemp2,4,4); sprintf(sTemp1,"return"); showButton(3,3,sTemp1,sTemp2,4,4); case 3: break; default: break; } } } void showButton(unsigned char column, unsigned char row, char * text1, char * text2, 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",text1); tt.locate(x1+btnGap,y1+btnGap+30); printf("%s\n",text2); } // below is braking screen normalized to power rather than force // changed to force since power had too large a dynamic range /*void braking (bool force, bool showButtons, bool prdata=false){ unsigned long targetBraking, regenBraking, speed; static unsigned long maxTarget = 20000, maxRegen = 20000, tarDivReg = 1000; 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); 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 if ((targetBraking>2039)||(speed>200)) { //Filter weird messages targetBraking = 0; regenBraking = 0; } else { if ((targetBraking>50)&&(regenBraking>50)){ temp = targetBraking; temp *= 1000; temp /= regenBraking; if (temp<tarDivReg) tarDivReg=temp; } targetBraking *= speed; regenBraking *= speed; if (targetBraking>maxTarget) maxTarget=targetBraking; if (regenBraking>maxRegen) maxRegen=regenBraking; } 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]; } } temp = targetBraking; temp *=200; temp /= maxTarget; t = (char) temp; if (t>200) t=200; temp = regenBraking; temp *= tarDivReg; temp /= maxTarget; temp /= 5; r = (char) temp; if (r>200) r=200; if(lr!=r&&prdata){ tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); tt.locate(100,40); printf("%d %d \n",regenBraking,maxRegen); tt.locate(100,70); printf("%3.1f (%3.1f%s) \n",(float)tarDivReg/10,(float)regenBraking*tarDivReg/targetBraking/10,"%"); } if(lt!=t&&prdata){ tt.foreground(Yellow); tt.set_font((unsigned char*) Arial28x28); tt.locate(100,10); printf("%d %d \n",targetBraking,maxTarget); } 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); } lt=t; lr=r; }*/