27.03.2019. revision New stuff added: -New CANlibrary -RPM LED -minor tweaks and changes

Dependencies:   mbed LCD_DISCO_F469NIa SD_DISCO_F469NI BSP_DISCO_F469NIa EEPROM_DISCO_F469NI

Committer:
Stefan_Sofijanic
Date:
Wed Mar 27 09:37:17 2019 +0000
Revision:
0:bcb81d0218cf
27.03.2019. revision; New stuff added:; -New CANlibrary; -RPM LED; -minor tweaks and changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Stefan_Sofijanic 0:bcb81d0218cf 1 #include "draw_print_library.h"
Stefan_Sofijanic 0:bcb81d0218cf 2 #include "gears.h"
Stefan_Sofijanic 0:bcb81d0218cf 3 #include "font100.h"
Stefan_Sofijanic 0:bcb81d0218cf 4 #include "font50.h"
Stefan_Sofijanic 0:bcb81d0218cf 5
Stefan_Sofijanic 0:bcb81d0218cf 6 extern LCD_DISCO_F469NI lcd;
Stefan_Sofijanic 0:bcb81d0218cf 7 extern SD_DISCO_F469NI sd;
Stefan_Sofijanic 0:bcb81d0218cf 8 extern Serial pc;
Stefan_Sofijanic 0:bcb81d0218cf 9
Stefan_Sofijanic 0:bcb81d0218cf 10 extern uint8_t lvdtref;
Stefan_Sofijanic 0:bcb81d0218cf 11 extern int FL_LVDT_Ref,FR_LVDT_Ref,RL_LVDT_Ref,RR_LVDT_Ref;
Stefan_Sofijanic 0:bcb81d0218cf 12
Stefan_Sofijanic 0:bcb81d0218cf 13 //Gears
Stefan_Sofijanic 0:bcb81d0218cf 14 GEAR Idle{'0',256,384,idleBitmap};
Stefan_Sofijanic 0:bcb81d0218cf 15 GEAR Gear1{'1',256,384,gear1Bitmap};
Stefan_Sofijanic 0:bcb81d0218cf 16 GEAR Gear2{'2',256,384,gear2Bitmap};
Stefan_Sofijanic 0:bcb81d0218cf 17 GEAR Gear3{'3',256,384,gear3Bitmap};
Stefan_Sofijanic 0:bcb81d0218cf 18 GEAR Gear4{'4',256,384,gear4Bitmap};
Stefan_Sofijanic 0:bcb81d0218cf 19 GEAR Gear5{'5',256,384,gear5Bitmap};
Stefan_Sofijanic 0:bcb81d0218cf 20 GEAR Gear6{'6',256,384,gear6Bitmap};
Stefan_Sofijanic 0:bcb81d0218cf 21 GEAR *Gears[7]={&Idle,&Gear1,&Gear2,&Gear3,&Gear4,&Gear5,&Gear6}; //Gears array
Stefan_Sofijanic 0:bcb81d0218cf 22 IMAGE LogoBig{800,480,LOGOBIG_START_ADDR}; //Big Logo
Stefan_Sofijanic 0:bcb81d0218cf 23 IMAGE LogoSmall{160,64,LOGOSMALL_START_ADDR}; //Small Logo
Stefan_Sofijanic 0:bcb81d0218cf 24 IMAGE Branko{250,480,1576960}; //Branko
Stefan_Sofijanic 0:bcb81d0218cf 25 IMAGE NewYearCongat{800,480,NEW_YEAR_CONGAT_START_ADDR};
Stefan_Sofijanic 0:bcb81d0218cf 26 //IMAGE Miljana[250,480,---};
Stefan_Sofijanic 0:bcb81d0218cf 27
Stefan_Sofijanic 0:bcb81d0218cf 28 void DrawSpeedMeter(){
Stefan_Sofijanic 0:bcb81d0218cf 29 uint16_t x1,y1,x2,y2,x3,y3,x4,y4;
Stefan_Sofijanic 0:bcb81d0218cf 30 double THETA1=PHI,THETA2;
Stefan_Sofijanic 0:bcb81d0218cf 31
Stefan_Sofijanic 0:bcb81d0218cf 32 //Set starting point for drawing
Stefan_Sofijanic 0:bcb81d0218cf 33 x1=(int)(400-530*cos(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 34 y1=(int)(550-530*sin(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 35 x2=(int)(400-500*cos(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 36 y2=(int)(550-500*sin(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 37
Stefan_Sofijanic 0:bcb81d0218cf 38 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 39 for (int V=0;V<=150;V++){ //Draw from 0 to 150
Stefan_Sofijanic 0:bcb81d0218cf 40 //Set angle for next speed scale value
Stefan_Sofijanic 0:bcb81d0218cf 41 THETA2=THETA1+ALPHA/Vmax;
Stefan_Sofijanic 0:bcb81d0218cf 42 x3=(int)(400-530*cos(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 43 y3=(int)(550-530*sin(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 44 x4=(int)(400-500*cos(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 45 y4=(int)(550-500*sin(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 46 if(V<150){ //Draw arch section
Stefan_Sofijanic 0:bcb81d0218cf 47 lcd.DrawLine(x1,y1,x3,y3);
Stefan_Sofijanic 0:bcb81d0218cf 48 lcd.DrawLine(x2,y2,x4,y4);
Stefan_Sofijanic 0:bcb81d0218cf 49 };
Stefan_Sofijanic 0:bcb81d0218cf 50 lcd.SetFont(&Font20);
Stefan_Sofijanic 0:bcb81d0218cf 51 if(V%10==0){ //Print round values (0,10,20,...)
Stefan_Sofijanic 0:bcb81d0218cf 52 lcd.DrawLine(x1,y1,x2,y2); //Draw round scale value
Stefan_Sofijanic 0:bcb81d0218cf 53 char Vchar[3];
Stefan_Sofijanic 0:bcb81d0218cf 54 sprintf(Vchar,"%d",(int)V);
Stefan_Sofijanic 0:bcb81d0218cf 55 uint16_t xnum=x2,ynum=y2;
Stefan_Sofijanic 0:bcb81d0218cf 56 if (V==0 | V==10 | V==20 | V==30){ //Position of printed value
Stefan_Sofijanic 0:bcb81d0218cf 57 xnum=x2,ynum=y2+5;
Stefan_Sofijanic 0:bcb81d0218cf 58 }else if (V==40 | V==50 | V==60){
Stefan_Sofijanic 0:bcb81d0218cf 59 xnum=x2-3,ynum=y2+5;
Stefan_Sofijanic 0:bcb81d0218cf 60 }else if (V==70 | V==80){
Stefan_Sofijanic 0:bcb81d0218cf 61 xnum=x2-14,ynum=y2+5;
Stefan_Sofijanic 0:bcb81d0218cf 62 }else if (V==90){
Stefan_Sofijanic 0:bcb81d0218cf 63 xnum=x2-20,ynum=y2+5;
Stefan_Sofijanic 0:bcb81d0218cf 64 }else if (V==100 | V==110 | V==120) {
Stefan_Sofijanic 0:bcb81d0218cf 65 xnum=x2-35,ynum=y2+4;
Stefan_Sofijanic 0:bcb81d0218cf 66 }else if (V==130 | V==140 | V==150){
Stefan_Sofijanic 0:bcb81d0218cf 67 xnum=x2-35,ynum=y2+5;
Stefan_Sofijanic 0:bcb81d0218cf 68 };
Stefan_Sofijanic 0:bcb81d0218cf 69 lcd.DisplayStringAt(xnum,ynum,(uint8_t*)Vchar,LEFT_MODE);
Stefan_Sofijanic 0:bcb81d0218cf 70 };
Stefan_Sofijanic 0:bcb81d0218cf 71 x1=x3,y1=y3,x2=x4,y2=y4; //Increment position
Stefan_Sofijanic 0:bcb81d0218cf 72 THETA1=THETA2;
Stefan_Sofijanic 0:bcb81d0218cf 73 };
Stefan_Sofijanic 0:bcb81d0218cf 74 };
Stefan_Sofijanic 0:bcb81d0218cf 75
Stefan_Sofijanic 0:bcb81d0218cf 76 void PrintChar(CHAR Char,uint16_t StartXPos,uint16_t StartYPos,uint32_t TextColor){
Stefan_Sofijanic 0:bcb81d0218cf 77 uint16_t width=Char.width;
Stefan_Sofijanic 0:bcb81d0218cf 78 uint16_t height=Char.height;
Stefan_Sofijanic 0:bcb81d0218cf 79 uint16_t horpos,vertpos;
Stefan_Sofijanic 0:bcb81d0218cf 80 uint16_t bitloc;
Stefan_Sofijanic 0:bcb81d0218cf 81 uint32_t DrawColor;
Stefan_Sofijanic 0:bcb81d0218cf 82 char pos[9];
Stefan_Sofijanic 0:bcb81d0218cf 83 //uint8_t dbg[50];
Stefan_Sofijanic 0:bcb81d0218cf 84 for(horpos=0;horpos<width;horpos++){ //Bitmaps are row after row
Stefan_Sofijanic 0:bcb81d0218cf 85 for(vertpos=0;vertpos<height/8;vertpos++){
Stefan_Sofijanic 0:bcb81d0218cf 86 sprintf(pos,BYTE_TO_BINARY_PATTERN,BYTE_TO_BINARY(Char.bitmap[horpos*height/8+vertpos])); //Convert uint8_t from hex to binary. 1 to fill, 0 to skip
Stefan_Sofijanic 0:bcb81d0218cf 87 //pc.printf("%d. %s\n",horpos*height/8+vertpos,pos);
Stefan_Sofijanic 0:bcb81d0218cf 88 for(bitloc=0;bitloc<8;bitloc++) {
Stefan_Sofijanic 0:bcb81d0218cf 89 if (pos[bitloc]=='1') {
Stefan_Sofijanic 0:bcb81d0218cf 90 DrawColor=TextColor;
Stefan_Sofijanic 0:bcb81d0218cf 91 }
Stefan_Sofijanic 0:bcb81d0218cf 92 else{
Stefan_Sofijanic 0:bcb81d0218cf 93 DrawColor=lcd.GetBackColor();
Stefan_Sofijanic 0:bcb81d0218cf 94 };
Stefan_Sofijanic 0:bcb81d0218cf 95 lcd.DrawPixel(StartXPos+horpos,StartYPos+vertpos*8+bitloc,DrawColor);
Stefan_Sofijanic 0:bcb81d0218cf 96 //pc.printf("%d,%d\n",StartXPos+horpos,StartYPos+vertpos*8+bitloc);
Stefan_Sofijanic 0:bcb81d0218cf 97 }
Stefan_Sofijanic 0:bcb81d0218cf 98 }
Stefan_Sofijanic 0:bcb81d0218cf 99 }
Stefan_Sofijanic 0:bcb81d0218cf 100 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 101 };
Stefan_Sofijanic 0:bcb81d0218cf 102
Stefan_Sofijanic 0:bcb81d0218cf 103 void PrintString(char str[],int font,uint16_t StartXPos,uint16_t StartYPos,uint32_t TextColor){
Stefan_Sofijanic 0:bcb81d0218cf 104 //pc.printf("Function activated.\n");
Stefan_Sofijanic 0:bcb81d0218cf 105 char *a=str;
Stefan_Sofijanic 0:bcb81d0218cf 106 int p=0;
Stefan_Sofijanic 0:bcb81d0218cf 107 while(a[p]){
Stefan_Sofijanic 0:bcb81d0218cf 108 //pc.printf("Searching char: %c\n",a[p]);
Stefan_Sofijanic 0:bcb81d0218cf 109 for(int k=0;k<68;k++){
Stefan_Sofijanic 0:bcb81d0218cf 110 //pc.printf("Character %c\n",(*font50[k]).name);
Stefan_Sofijanic 0:bcb81d0218cf 111 if((*font50[k]).name==a[p]){
Stefan_Sofijanic 0:bcb81d0218cf 112 // pc.printf("Found!\n");
Stefan_Sofijanic 0:bcb81d0218cf 113 PrintChar(*font50[k],StartXPos,StartYPos,TextColor);
Stefan_Sofijanic 0:bcb81d0218cf 114 StartXPos+=(*font50[k]).width;
Stefan_Sofijanic 0:bcb81d0218cf 115 k=100;
Stefan_Sofijanic 0:bcb81d0218cf 116 };
Stefan_Sofijanic 0:bcb81d0218cf 117 };
Stefan_Sofijanic 0:bcb81d0218cf 118 //pc.printf("End.\n");
Stefan_Sofijanic 0:bcb81d0218cf 119 p++;
Stefan_Sofijanic 0:bcb81d0218cf 120 };
Stefan_Sofijanic 0:bcb81d0218cf 121 };
Stefan_Sofijanic 0:bcb81d0218cf 122
Stefan_Sofijanic 0:bcb81d0218cf 123
Stefan_Sofijanic 0:bcb81d0218cf 124
Stefan_Sofijanic 0:bcb81d0218cf 125
Stefan_Sofijanic 0:bcb81d0218cf 126 void ChangeNumber(int num,int num0,int Font,uint16_t StartXPos,uint16_t StartYPos, int digits, int dec_point, int sign){
Stefan_Sofijanic 0:bcb81d0218cf 127 //Function only changes the decimals that change. If number changes from 146 to 147, it only changes 6 to 7.
Stefan_Sofijanic 0:bcb81d0218cf 128 int digit[digits],digit0[digits];
Stefan_Sofijanic 0:bcb81d0218cf 129 int sum=0,sum0=0,k,aux=0;
Stefan_Sofijanic 0:bcb81d0218cf 130 CHAR **font;
Stefan_Sofijanic 0:bcb81d0218cf 131 if(abs(num)<pow(float(10),digits)){
Stefan_Sofijanic 0:bcb81d0218cf 132 digit[0]=abs(num)/pow((float)10,(float)(digits-1));
Stefan_Sofijanic 0:bcb81d0218cf 133 digit0[0]=abs(num0)/pow((float)10,(float)(digits-1));
Stefan_Sofijanic 0:bcb81d0218cf 134 for(k=1;k<digits;k++){
Stefan_Sofijanic 0:bcb81d0218cf 135 sum=(sum+digit[k-1])*10;
Stefan_Sofijanic 0:bcb81d0218cf 136 digit[k]=abs(num)/pow((float)10,(float)(digits-1-k))-sum;
Stefan_Sofijanic 0:bcb81d0218cf 137 sum0=(sum0+digit0[k-1])*10;
Stefan_Sofijanic 0:bcb81d0218cf 138 digit0[k]=abs(num0)/pow(10,(float)(digits-1-k))-sum0;
Stefan_Sofijanic 0:bcb81d0218cf 139 };
Stefan_Sofijanic 0:bcb81d0218cf 140
Stefan_Sofijanic 0:bcb81d0218cf 141 if (Font==50){
Stefan_Sofijanic 0:bcb81d0218cf 142 font=font50;
Stefan_Sofijanic 0:bcb81d0218cf 143 }else if (Font==100){
Stefan_Sofijanic 0:bcb81d0218cf 144 font=font100;
Stefan_Sofijanic 0:bcb81d0218cf 145 };
Stefan_Sofijanic 0:bcb81d0218cf 146
Stefan_Sofijanic 0:bcb81d0218cf 147 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 148 uint8_t char_width=(*font[0]).width;
Stefan_Sofijanic 0:bcb81d0218cf 149
Stefan_Sofijanic 0:bcb81d0218cf 150 if (sign==1){
Stefan_Sofijanic 0:bcb81d0218cf 151 if(num<0 & num0>=0){ //Print minus if number lower than 0
Stefan_Sofijanic 0:bcb81d0218cf 152 PrintChar(*font[10],StartXPos,StartYPos,lcd.GetTextColor());
Stefan_Sofijanic 0:bcb81d0218cf 153 }else if(num>=0 & num0<0){ //Print blank if number lower than 0
Stefan_Sofijanic 0:bcb81d0218cf 154 lcd.SetTextColor(LCD_COLOR_WHITE);
Stefan_Sofijanic 0:bcb81d0218cf 155 lcd.FillRect(StartXPos,StartYPos,(*font[10]).width,(*font[10]).height);
Stefan_Sofijanic 0:bcb81d0218cf 156 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 157 };
Stefan_Sofijanic 0:bcb81d0218cf 158 aux+=(*font[10]).width;
Stefan_Sofijanic 0:bcb81d0218cf 159 };
Stefan_Sofijanic 0:bcb81d0218cf 160
Stefan_Sofijanic 0:bcb81d0218cf 161 for(k=0;k<digits;k++){
Stefan_Sofijanic 0:bcb81d0218cf 162 if(dec_point==k & dec_point>0){ //Default is for font50. This is not an universal solution, but it is in use because all font 100 infos are integers
Stefan_Sofijanic 0:bcb81d0218cf 163 PrintChar(Chardot_50,StartXPos+dec_point*char_width,StartYPos,lcd.GetTextColor());
Stefan_Sofijanic 0:bcb81d0218cf 164 aux+=Chardot_50.width;
Stefan_Sofijanic 0:bcb81d0218cf 165 };
Stefan_Sofijanic 0:bcb81d0218cf 166 if(digit[k]!=digit0[k]){
Stefan_Sofijanic 0:bcb81d0218cf 167 PrintChar(*font[digit[k]],StartXPos+k*char_width+aux,StartYPos,lcd.GetTextColor());
Stefan_Sofijanic 0:bcb81d0218cf 168 };
Stefan_Sofijanic 0:bcb81d0218cf 169 };
Stefan_Sofijanic 0:bcb81d0218cf 170 };
Stefan_Sofijanic 0:bcb81d0218cf 171 };
Stefan_Sofijanic 0:bcb81d0218cf 172
Stefan_Sofijanic 0:bcb81d0218cf 173 void SetNumber(int num,int Font,uint16_t StartXPos,uint16_t StartYPos, int digits, int dec_point, int sign){
Stefan_Sofijanic 0:bcb81d0218cf 174 int digit[3],sum=0,k,aux=0;
Stefan_Sofijanic 0:bcb81d0218cf 175 CHAR **font;
Stefan_Sofijanic 0:bcb81d0218cf 176
Stefan_Sofijanic 0:bcb81d0218cf 177 if (Font==50){
Stefan_Sofijanic 0:bcb81d0218cf 178 font=font50;
Stefan_Sofijanic 0:bcb81d0218cf 179 }else if (Font==100){
Stefan_Sofijanic 0:bcb81d0218cf 180 font=font100;
Stefan_Sofijanic 0:bcb81d0218cf 181 };
Stefan_Sofijanic 0:bcb81d0218cf 182
Stefan_Sofijanic 0:bcb81d0218cf 183 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 184 uint8_t char_width=(*font[0]).width;
Stefan_Sofijanic 0:bcb81d0218cf 185
Stefan_Sofijanic 0:bcb81d0218cf 186 if(num<pow(float(10),digits)){
Stefan_Sofijanic 0:bcb81d0218cf 187 digit[0]=abs(num)/pow((float)10,(float)(digits-1));
Stefan_Sofijanic 0:bcb81d0218cf 188 for(k=1;k<digits;k++){
Stefan_Sofijanic 0:bcb81d0218cf 189 sum=(sum+digit[k-1])*10;
Stefan_Sofijanic 0:bcb81d0218cf 190 digit[k]=abs(num)/pow((float)10,(float)(digits-1-k))-sum;
Stefan_Sofijanic 0:bcb81d0218cf 191 };
Stefan_Sofijanic 0:bcb81d0218cf 192
Stefan_Sofijanic 0:bcb81d0218cf 193 if(sign==1){
Stefan_Sofijanic 0:bcb81d0218cf 194 if(num<0){ //Print minus if number lower than 0
Stefan_Sofijanic 0:bcb81d0218cf 195 PrintChar(*font[10],StartXPos,StartYPos,lcd.GetTextColor());
Stefan_Sofijanic 0:bcb81d0218cf 196 }else if(num>=0){ //Print blank if number lower than 0
Stefan_Sofijanic 0:bcb81d0218cf 197 lcd.SetTextColor(LCD_COLOR_WHITE);
Stefan_Sofijanic 0:bcb81d0218cf 198 lcd.FillRect(StartXPos,StartYPos,(*font[10]).width,(*font[10]).height);
Stefan_Sofijanic 0:bcb81d0218cf 199 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 200 };
Stefan_Sofijanic 0:bcb81d0218cf 201 aux+=(*font[10]).width;
Stefan_Sofijanic 0:bcb81d0218cf 202 };
Stefan_Sofijanic 0:bcb81d0218cf 203
Stefan_Sofijanic 0:bcb81d0218cf 204 for(k=0;k<digits;k++){
Stefan_Sofijanic 0:bcb81d0218cf 205 if(dec_point==k & dec_point>0){ //Default is for font50. This is not an universal solution, but it is in use because all font 100 infos are integers
Stefan_Sofijanic 0:bcb81d0218cf 206 PrintChar(Chardot_50,StartXPos+dec_point*char_width,StartYPos,lcd.GetTextColor());
Stefan_Sofijanic 0:bcb81d0218cf 207 aux+=Chardot_50.width;
Stefan_Sofijanic 0:bcb81d0218cf 208 };
Stefan_Sofijanic 0:bcb81d0218cf 209 PrintChar(*font[digit[k]],StartXPos+k*char_width+aux,StartYPos,lcd.GetTextColor());
Stefan_Sofijanic 0:bcb81d0218cf 210 };
Stefan_Sofijanic 0:bcb81d0218cf 211 };
Stefan_Sofijanic 0:bcb81d0218cf 212 };
Stefan_Sofijanic 0:bcb81d0218cf 213
Stefan_Sofijanic 0:bcb81d0218cf 214 void DrawRGBImage(IMAGE Image,uint16_t StartXPos,uint16_t StartYPos){
Stefan_Sofijanic 0:bcb81d0218cf 215 uint32_t p,q;
Stefan_Sofijanic 0:bcb81d0218cf 216 uint32_t BlockBuffer[128];
Stefan_Sofijanic 0:bcb81d0218cf 217 uint16_t xpos=0,ypos=0;
Stefan_Sofijanic 0:bcb81d0218cf 218 for(p=0;p<Image.width*Image.height/128;p++){
Stefan_Sofijanic 0:bcb81d0218cf 219 sd.ReadBlocks(BlockBuffer,Image.START_ADDR+p*512,1,SD_DATATIMEOUT);
Stefan_Sofijanic 0:bcb81d0218cf 220 for(q=0;q<128;q++){
Stefan_Sofijanic 0:bcb81d0218cf 221 if(ypos<Image.height){
Stefan_Sofijanic 0:bcb81d0218cf 222 lcd.DrawPixel(StartXPos+xpos,StartYPos+ypos,BlockBuffer[q]);
Stefan_Sofijanic 0:bcb81d0218cf 223 }
Stefan_Sofijanic 0:bcb81d0218cf 224 else{
Stefan_Sofijanic 0:bcb81d0218cf 225 xpos++;
Stefan_Sofijanic 0:bcb81d0218cf 226 ypos=0;
Stefan_Sofijanic 0:bcb81d0218cf 227 lcd.DrawPixel(StartXPos+xpos,StartYPos+ypos,BlockBuffer[q]);
Stefan_Sofijanic 0:bcb81d0218cf 228 }
Stefan_Sofijanic 0:bcb81d0218cf 229 ypos++;
Stefan_Sofijanic 0:bcb81d0218cf 230 };
Stefan_Sofijanic 0:bcb81d0218cf 231 };
Stefan_Sofijanic 0:bcb81d0218cf 232 };
Stefan_Sofijanic 0:bcb81d0218cf 233
Stefan_Sofijanic 0:bcb81d0218cf 234
Stefan_Sofijanic 0:bcb81d0218cf 235 void UpdateSpeedMeter(int V, int dV){
Stefan_Sofijanic 0:bcb81d0218cf 236 //Prednost koda je sto se docrtava samo onaj deo koji se menja. Tako ako sa 55 kmh prelazimo na 57 khm on obradjuje samo polja 55 i 56.
Stefan_Sofijanic 0:bcb81d0218cf 237 //Kada bi se samo brisala stara i crtala nova vrednost na baru ukupno bi morali da obradimo 55+57=112 umesto samo 2 bara.
Stefan_Sofijanic 0:bcb81d0218cf 238 uint32_t OldColor,RewriteColor;
Stefan_Sofijanic 0:bcb81d0218cf 239 double THETA1,THETA2;
Stefan_Sofijanic 0:bcb81d0218cf 240 uint16_t x1,y1,x2,y2,x3,y3,x4,y4;
Stefan_Sofijanic 0:bcb81d0218cf 241 uint16_t startx,starty,leftupx,rightupx,leftdownx,rightdownx,ypos;
Stefan_Sofijanic 0:bcb81d0218cf 242
Stefan_Sofijanic 0:bcb81d0218cf 243 //Obradjivanje polje po polje. Svako polje prestavlja odredjenu vrednost kmh.
Stefan_Sofijanic 0:bcb81d0218cf 244 for(int k=1;k<=abs(dV);k++){
Stefan_Sofijanic 0:bcb81d0218cf 245 //Uokviravanje polja koje se trenutno obradjuje. Granice su crne kako bi se jasno razgranicilo polje od ostatka bara.
Stefan_Sofijanic 0:bcb81d0218cf 246 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 247 THETA1=PHI+((double)V)*ALPHA/Vmax;
Stefan_Sofijanic 0:bcb81d0218cf 248 x1=(int)(400-530*cos(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 249 y1=(int)(550-530*sin(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 250 x2=(int)(400-500*cos(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 251 y2=(int)(550-500*sin(THETA1));
Stefan_Sofijanic 0:bcb81d0218cf 252 THETA2=PHI+((double)(V+dV/abs(dV)))*ALPHA/Vmax;
Stefan_Sofijanic 0:bcb81d0218cf 253 x3=(int)(400-530*cos(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 254 y3=(int)(550-530*sin(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 255 x4=(int)(400-500*cos(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 256 y4=(int)(550-500*sin(THETA2));
Stefan_Sofijanic 0:bcb81d0218cf 257 lcd.DrawLine(x1,y1,x2,y2);
Stefan_Sofijanic 0:bcb81d0218cf 258 lcd.DrawLine(x3,y3,x4,y4);
Stefan_Sofijanic 0:bcb81d0218cf 259 lcd.DrawLine(x1,y1,x3,y3);
Stefan_Sofijanic 0:bcb81d0218cf 260 lcd.DrawLine(x2,y2,x4,y4);
Stefan_Sofijanic 0:bcb81d0218cf 261
Stefan_Sofijanic 0:bcb81d0218cf 262 //Odredjivanje pocetnih koordinata i kojom bojom ce se polje bojiti.
Stefan_Sofijanic 0:bcb81d0218cf 263 if(dV>0){
Stefan_Sofijanic 0:bcb81d0218cf 264 startx=(x2+x3)/2;
Stefan_Sofijanic 0:bcb81d0218cf 265 starty=(y2+y3)/2;
Stefan_Sofijanic 0:bcb81d0218cf 266 if(V+1<=50){
Stefan_Sofijanic 0:bcb81d0218cf 267 RewriteColor=LCD_COLOR_GREEN;
Stefan_Sofijanic 0:bcb81d0218cf 268 }else if (V+1>50 & V+1<=100){
Stefan_Sofijanic 0:bcb81d0218cf 269 RewriteColor=LCD_COLOR_BLUE;
Stefan_Sofijanic 0:bcb81d0218cf 270 }else{
Stefan_Sofijanic 0:bcb81d0218cf 271 RewriteColor=LCD_COLOR_RED;
Stefan_Sofijanic 0:bcb81d0218cf 272 };
Stefan_Sofijanic 0:bcb81d0218cf 273 OldColor=LCD_COLOR_WHITE;
Stefan_Sofijanic 0:bcb81d0218cf 274 }else{
Stefan_Sofijanic 0:bcb81d0218cf 275 startx=(x1+x4)/2;
Stefan_Sofijanic 0:bcb81d0218cf 276 starty=(y1+y4)/2;
Stefan_Sofijanic 0:bcb81d0218cf 277 if(V<=50){
Stefan_Sofijanic 0:bcb81d0218cf 278 OldColor=LCD_COLOR_GREEN;
Stefan_Sofijanic 0:bcb81d0218cf 279 }else if (V>50 & V<=100){
Stefan_Sofijanic 0:bcb81d0218cf 280 OldColor=LCD_COLOR_BLUE;
Stefan_Sofijanic 0:bcb81d0218cf 281 }else{
Stefan_Sofijanic 0:bcb81d0218cf 282 OldColor=LCD_COLOR_RED;
Stefan_Sofijanic 0:bcb81d0218cf 283 };
Stefan_Sofijanic 0:bcb81d0218cf 284 RewriteColor=LCD_COLOR_WHITE;
Stefan_Sofijanic 0:bcb81d0218cf 285 };
Stefan_Sofijanic 0:bcb81d0218cf 286 lcd.SetTextColor(RewriteColor);
Stefan_Sofijanic 0:bcb81d0218cf 287
Stefan_Sofijanic 0:bcb81d0218cf 288 //Odredjivanje pocetnog piksela odakle ce bojenje poceti. Kako bi se svaki piksel obojio pocetni se postavlja u centru polja i krece se najpre
Stefan_Sofijanic 0:bcb81d0218cf 289 //na gore pa zatim od sredine na dole.
Stefan_Sofijanic 0:bcb81d0218cf 290 leftupx=startx;
Stefan_Sofijanic 0:bcb81d0218cf 291 rightupx=startx+1;
Stefan_Sofijanic 0:bcb81d0218cf 292 ypos=starty;
Stefan_Sofijanic 0:bcb81d0218cf 293 while(leftupx<rightupx){
Stefan_Sofijanic 0:bcb81d0218cf 294
Stefan_Sofijanic 0:bcb81d0218cf 295 ypos--;
Stefan_Sofijanic 0:bcb81d0218cf 296 if(lcd.ReadPixel(leftupx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 297 while(lcd.ReadPixel(leftupx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 298 leftupx++;
Stefan_Sofijanic 0:bcb81d0218cf 299 }
Stefan_Sofijanic 0:bcb81d0218cf 300 } else {
Stefan_Sofijanic 0:bcb81d0218cf 301 while(lcd.ReadPixel(leftupx,ypos)==OldColor){
Stefan_Sofijanic 0:bcb81d0218cf 302 leftupx--;
Stefan_Sofijanic 0:bcb81d0218cf 303 };
Stefan_Sofijanic 0:bcb81d0218cf 304 leftupx++;
Stefan_Sofijanic 0:bcb81d0218cf 305 };
Stefan_Sofijanic 0:bcb81d0218cf 306 if(lcd.ReadPixel(rightupx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 307 while(lcd.ReadPixel(rightupx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 308 rightupx--;
Stefan_Sofijanic 0:bcb81d0218cf 309 }
Stefan_Sofijanic 0:bcb81d0218cf 310 } else {
Stefan_Sofijanic 0:bcb81d0218cf 311 while(lcd.ReadPixel(rightupx,ypos)==OldColor){
Stefan_Sofijanic 0:bcb81d0218cf 312 rightupx++;
Stefan_Sofijanic 0:bcb81d0218cf 313 };
Stefan_Sofijanic 0:bcb81d0218cf 314 rightupx--;
Stefan_Sofijanic 0:bcb81d0218cf 315 };
Stefan_Sofijanic 0:bcb81d0218cf 316
Stefan_Sofijanic 0:bcb81d0218cf 317 if (leftupx<=rightupx){
Stefan_Sofijanic 0:bcb81d0218cf 318 lcd.DrawLine(leftupx,ypos,rightupx,ypos);
Stefan_Sofijanic 0:bcb81d0218cf 319 };
Stefan_Sofijanic 0:bcb81d0218cf 320 };
Stefan_Sofijanic 0:bcb81d0218cf 321
Stefan_Sofijanic 0:bcb81d0218cf 322 leftdownx=startx;
Stefan_Sofijanic 0:bcb81d0218cf 323 rightdownx=startx+1;
Stefan_Sofijanic 0:bcb81d0218cf 324 ypos=starty-1;
Stefan_Sofijanic 0:bcb81d0218cf 325 while(leftdownx<rightdownx){
Stefan_Sofijanic 0:bcb81d0218cf 326 ypos++;
Stefan_Sofijanic 0:bcb81d0218cf 327 if(lcd.ReadPixel(leftdownx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 328 while(lcd.ReadPixel(leftdownx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 329 leftdownx++;
Stefan_Sofijanic 0:bcb81d0218cf 330 }
Stefan_Sofijanic 0:bcb81d0218cf 331 } else {
Stefan_Sofijanic 0:bcb81d0218cf 332 while(lcd.ReadPixel(leftdownx,ypos)==OldColor){
Stefan_Sofijanic 0:bcb81d0218cf 333 leftdownx--;
Stefan_Sofijanic 0:bcb81d0218cf 334 };
Stefan_Sofijanic 0:bcb81d0218cf 335 leftdownx++;
Stefan_Sofijanic 0:bcb81d0218cf 336 };
Stefan_Sofijanic 0:bcb81d0218cf 337 if(lcd.ReadPixel(rightdownx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 338 while(lcd.ReadPixel(rightdownx,ypos)==LCD_COLOR_BLACK){
Stefan_Sofijanic 0:bcb81d0218cf 339 rightdownx--;
Stefan_Sofijanic 0:bcb81d0218cf 340 }
Stefan_Sofijanic 0:bcb81d0218cf 341 } else {
Stefan_Sofijanic 0:bcb81d0218cf 342 while(lcd.ReadPixel(rightdownx,ypos)==OldColor){
Stefan_Sofijanic 0:bcb81d0218cf 343 rightdownx++;
Stefan_Sofijanic 0:bcb81d0218cf 344 };
Stefan_Sofijanic 0:bcb81d0218cf 345 rightdownx--;
Stefan_Sofijanic 0:bcb81d0218cf 346 };
Stefan_Sofijanic 0:bcb81d0218cf 347
Stefan_Sofijanic 0:bcb81d0218cf 348 if (leftdownx<=rightdownx){
Stefan_Sofijanic 0:bcb81d0218cf 349 lcd.DrawLine(leftdownx,ypos,rightdownx,ypos);
Stefan_Sofijanic 0:bcb81d0218cf 350 };
Stefan_Sofijanic 0:bcb81d0218cf 351 };
Stefan_Sofijanic 0:bcb81d0218cf 352
Stefan_Sofijanic 0:bcb81d0218cf 353 //Brisanje granicnika. Vodi se racuna ako je granica neki od dekadnih podeoka koji treba da ostane crn.
Stefan_Sofijanic 0:bcb81d0218cf 354 if(V%10!=0){
Stefan_Sofijanic 0:bcb81d0218cf 355 lcd.DrawLine(x1,y1,x2,y2);
Stefan_Sofijanic 0:bcb81d0218cf 356 if (dV<0){
Stefan_Sofijanic 0:bcb81d0218cf 357 lcd.DrawPixel(x1,y1,LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 358 lcd.DrawPixel(x2,y2,LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 359 };
Stefan_Sofijanic 0:bcb81d0218cf 360 };
Stefan_Sofijanic 0:bcb81d0218cf 361 V+=dV/abs(dV);
Stefan_Sofijanic 0:bcb81d0218cf 362 };
Stefan_Sofijanic 0:bcb81d0218cf 363 };
Stefan_Sofijanic 0:bcb81d0218cf 364
Stefan_Sofijanic 0:bcb81d0218cf 365 void ChangeCrank(int Crank){
Stefan_Sofijanic 0:bcb81d0218cf 366 PrintString(" ",50,350,400,LCD_COLOR_GREEN);
Stefan_Sofijanic 0:bcb81d0218cf 367 if (Crank){
Stefan_Sofijanic 0:bcb81d0218cf 368 PrintString("ERROR",50,CrankXPos,CrankYPos,LCD_COLOR_RED);
Stefan_Sofijanic 0:bcb81d0218cf 369 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 370 } else {
Stefan_Sofijanic 0:bcb81d0218cf 371 PrintString("OK",50,CrankXPos,CrankYPos,LCD_COLOR_GREEN);
Stefan_Sofijanic 0:bcb81d0218cf 372 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 373 };
Stefan_Sofijanic 0:bcb81d0218cf 374 };
Stefan_Sofijanic 0:bcb81d0218cf 375
Stefan_Sofijanic 0:bcb81d0218cf 376 int UpdateLVDTScale(int H,int H0, uint16_t StartXPos, uint16_t StartYPos){
Stefan_Sofijanic 0:bcb81d0218cf 377 uint16_t BarWidth=80,BarHeight=8;
Stefan_Sofijanic 0:bcb81d0218cf 378 int YPos;
Stefan_Sofijanic 0:bcb81d0218cf 379 int D,D0,dD;
Stefan_Sofijanic 0:bcb81d0218cf 380
Stefan_Sofijanic 0:bcb81d0218cf 381 switch( ((H>=0)<<1)+(H0>0)){
Stefan_Sofijanic 0:bcb81d0218cf 382 case(0):
Stefan_Sofijanic 0:bcb81d0218cf 383 D=5-abs(H)/20;
Stefan_Sofijanic 0:bcb81d0218cf 384 D0=5-abs(H0)/20;
Stefan_Sofijanic 0:bcb81d0218cf 385 break;
Stefan_Sofijanic 0:bcb81d0218cf 386 case(1):
Stefan_Sofijanic 0:bcb81d0218cf 387 D=5-abs(H)/20;
Stefan_Sofijanic 0:bcb81d0218cf 388 D0=H0/20+5;
Stefan_Sofijanic 0:bcb81d0218cf 389 break;
Stefan_Sofijanic 0:bcb81d0218cf 390 case(2):
Stefan_Sofijanic 0:bcb81d0218cf 391 D=H/20+5;
Stefan_Sofijanic 0:bcb81d0218cf 392 D0=5-abs(H0)/20;
Stefan_Sofijanic 0:bcb81d0218cf 393 break;
Stefan_Sofijanic 0:bcb81d0218cf 394 case(3):
Stefan_Sofijanic 0:bcb81d0218cf 395 D=H/20+5;
Stefan_Sofijanic 0:bcb81d0218cf 396 D0=H0/20+5;
Stefan_Sofijanic 0:bcb81d0218cf 397 break;
Stefan_Sofijanic 0:bcb81d0218cf 398 };
Stefan_Sofijanic 0:bcb81d0218cf 399 dD=D-D0;
Stefan_Sofijanic 0:bcb81d0218cf 400
Stefan_Sofijanic 0:bcb81d0218cf 401 if (dD>0){
Stefan_Sofijanic 0:bcb81d0218cf 402 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 403 YPos=StartYPos-10*(D0+1);
Stefan_Sofijanic 0:bcb81d0218cf 404 }else{
Stefan_Sofijanic 0:bcb81d0218cf 405 lcd.SetTextColor(LCD_COLOR_WHITE);
Stefan_Sofijanic 0:bcb81d0218cf 406 YPos=StartYPos-D0*10;
Stefan_Sofijanic 0:bcb81d0218cf 407 };
Stefan_Sofijanic 0:bcb81d0218cf 408 for (int k=1;k<=abs(dD);k++){
Stefan_Sofijanic 0:bcb81d0218cf 409 lcd.FillRect(StartXPos,YPos,BarWidth,BarHeight);
Stefan_Sofijanic 0:bcb81d0218cf 410 YPos-=10*(dD/abs(dD));
Stefan_Sofijanic 0:bcb81d0218cf 411 };
Stefan_Sofijanic 0:bcb81d0218cf 412 lcd.SetTextColor(LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 413 return 1;
Stefan_Sofijanic 0:bcb81d0218cf 414 };
Stefan_Sofijanic 0:bcb81d0218cf 415
Stefan_Sofijanic 0:bcb81d0218cf 416
Stefan_Sofijanic 0:bcb81d0218cf 417 void BrakeSignal(uint16_t brake){
Stefan_Sofijanic 0:bcb81d0218cf 418 if (brake!=0){
Stefan_Sofijanic 0:bcb81d0218cf 419 lcd.SetTextColor(LCD_COLOR_RED);
Stefan_Sofijanic 0:bcb81d0218cf 420 lcd.SetBackColor(LCD_COLOR_RED);
Stefan_Sofijanic 0:bcb81d0218cf 421 lcd.FillRect(560,340,230,68);
Stefan_Sofijanic 0:bcb81d0218cf 422 PrintString("BRAKE",50,575,350,LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 423 }else {
Stefan_Sofijanic 0:bcb81d0218cf 424 lcd.SetTextColor(LCD_COLOR_DARKRED);
Stefan_Sofijanic 0:bcb81d0218cf 425 lcd.SetBackColor(LCD_COLOR_DARKRED);
Stefan_Sofijanic 0:bcb81d0218cf 426 lcd.FillRect(560,340,230,68);
Stefan_Sofijanic 0:bcb81d0218cf 427 PrintString("BRAKE",50,575,350,LCD_COLOR_BLACK);
Stefan_Sofijanic 0:bcb81d0218cf 428 };
Stefan_Sofijanic 0:bcb81d0218cf 429 lcd.SetBackColor(LCD_COLOR_WHITE);
Stefan_Sofijanic 0:bcb81d0218cf 430 };
Stefan_Sofijanic 0:bcb81d0218cf 431
Stefan_Sofijanic 0:bcb81d0218cf 432
Stefan_Sofijanic 0:bcb81d0218cf 433 void TestFont(){
Stefan_Sofijanic 0:bcb81d0218cf 434 uint16_t XPos=0,YPos=120;
Stefan_Sofijanic 0:bcb81d0218cf 435 for(int k=0;k<68;k++){
Stefan_Sofijanic 0:bcb81d0218cf 436 PrintChar(*font50[k],XPos,YPos,lcd.GetTextColor());
Stefan_Sofijanic 0:bcb81d0218cf 437 XPos=XPos+(*font50[k]).width;
Stefan_Sofijanic 0:bcb81d0218cf 438 wait(0.1);
Stefan_Sofijanic 0:bcb81d0218cf 439 //pc.printf("%d",k);
Stefan_Sofijanic 0:bcb81d0218cf 440 };
Stefan_Sofijanic 0:bcb81d0218cf 441 };