Vlad Craciun / SSD1289_TouchScreen
Committer:
vcraciun
Date:
Sat Sep 14 11:48:46 2013 +0000
Revision:
1:e7ae315a1ceb
Parent:
0:55a3f0eda74d
Child:
2:a31069f27cd5
small updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcraciun 0:55a3f0eda74d 1 #include "TouchPanel.h"
vcraciun 0:55a3f0eda74d 2
vcraciun 0:55a3f0eda74d 3 Matrix matrix ;
vcraciun 0:55a3f0eda74d 4 Coordinate display ;
vcraciun 0:55a3f0eda74d 5 Coordinate ScreenSample[3];
vcraciun 0:55a3f0eda74d 6 Coordinate DisplaySample[3] = {{30, 45},
vcraciun 0:55a3f0eda74d 7 {250, 70},
vcraciun 0:55a3f0eda74d 8 {160,210}};
vcraciun 0:55a3f0eda74d 9
vcraciun 0:55a3f0eda74d 10 Touch::Touch(SSD1289_LCD *lcd,SPI *spi, DigitalOut *cs, DigitalIn *irq)
vcraciun 0:55a3f0eda74d 11 {
vcraciun 0:55a3f0eda74d 12 _cs=cs;
vcraciun 0:55a3f0eda74d 13 *_cs=1;
vcraciun 0:55a3f0eda74d 14 _spi=spi;
vcraciun 0:55a3f0eda74d 15 _irq=irq;
vcraciun 0:55a3f0eda74d 16 _lcd=lcd;
vcraciun 0:55a3f0eda74d 17 }
vcraciun 0:55a3f0eda74d 18
vcraciun 0:55a3f0eda74d 19 void Touch::InitializeTouch()
vcraciun 0:55a3f0eda74d 20 {
vcraciun 0:55a3f0eda74d 21 _spi->format(8,0);
vcraciun 0:55a3f0eda74d 22 _spi->frequency(100000);
vcraciun 0:55a3f0eda74d 23 *_cs = 1;
vcraciun 0:55a3f0eda74d 24 }
vcraciun 0:55a3f0eda74d 25
vcraciun 1:e7ae315a1ceb 26 int Touch::RDAD(void)
vcraciun 0:55a3f0eda74d 27 {
vcraciun 0:55a3f0eda74d 28 unsigned short buf,temp;
vcraciun 0:55a3f0eda74d 29
vcraciun 0:55a3f0eda74d 30 temp=_spi->write(0);
vcraciun 0:55a3f0eda74d 31 buf=temp<<8;
vcraciun 0:55a3f0eda74d 32 temp=_spi->write(0);
vcraciun 0:55a3f0eda74d 33 buf|=temp;
vcraciun 0:55a3f0eda74d 34 buf>>=3;
vcraciun 0:55a3f0eda74d 35 buf&=0xFFF;
vcraciun 0:55a3f0eda74d 36 return buf;
vcraciun 0:55a3f0eda74d 37 }
vcraciun 0:55a3f0eda74d 38
vcraciun 1:e7ae315a1ceb 39 int Touch::ReadX(void)
vcraciun 0:55a3f0eda74d 40 {
vcraciun 0:55a3f0eda74d 41 int i;
vcraciun 0:55a3f0eda74d 42 *_cs=0;
vcraciun 0:55a3f0eda74d 43 wait(0.000001);
vcraciun 0:55a3f0eda74d 44 _spi->write(CHX);
vcraciun 0:55a3f0eda74d 45 wait(0.000001);
vcraciun 1:e7ae315a1ceb 46 i=RDAD();
vcraciun 0:55a3f0eda74d 47 *_cs=1;
vcraciun 0:55a3f0eda74d 48 return i;
vcraciun 0:55a3f0eda74d 49 }
vcraciun 0:55a3f0eda74d 50
vcraciun 1:e7ae315a1ceb 51 int Touch::ReadY(void)
vcraciun 0:55a3f0eda74d 52 {
vcraciun 0:55a3f0eda74d 53 int i;
vcraciun 0:55a3f0eda74d 54 *_cs=0;
vcraciun 0:55a3f0eda74d 55 wait(0.000001);
vcraciun 0:55a3f0eda74d 56 _spi->write(CHY);
vcraciun 0:55a3f0eda74d 57 wait(0.000001);
vcraciun 1:e7ae315a1ceb 58 i=RDAD();
vcraciun 0:55a3f0eda74d 59 *_cs=1;
vcraciun 0:55a3f0eda74d 60 return i;
vcraciun 0:55a3f0eda74d 61 }
vcraciun 0:55a3f0eda74d 62
vcraciun 1:e7ae315a1ceb 63 void Touch::GetAdXY(int *x,int *y)
vcraciun 0:55a3f0eda74d 64 {
vcraciun 0:55a3f0eda74d 65 int adx,ady;
vcraciun 1:e7ae315a1ceb 66 adx=ReadX();
vcraciun 0:55a3f0eda74d 67 wait(0.000001);
vcraciun 1:e7ae315a1ceb 68 ady=ReadY();
vcraciun 0:55a3f0eda74d 69 *x=adx;
vcraciun 0:55a3f0eda74d 70 *y=ady;
vcraciun 0:55a3f0eda74d 71 }
vcraciun 0:55a3f0eda74d 72
vcraciun 1:e7ae315a1ceb 73 void Touch::DrawPoint(int Xpos,int Ypos)
vcraciun 0:55a3f0eda74d 74 {
vcraciun 0:55a3f0eda74d 75 _lcd->DrawPixel(Xpos,Ypos,COLOR_BLUE);
vcraciun 0:55a3f0eda74d 76 _lcd->DrawPixel(Xpos+1,Ypos,COLOR_BLUE);
vcraciun 0:55a3f0eda74d 77 _lcd->DrawPixel(Xpos,Ypos+1,COLOR_BLUE);
vcraciun 0:55a3f0eda74d 78 _lcd->DrawPixel(Xpos+1,Ypos+1,COLOR_BLUE);
vcraciun 0:55a3f0eda74d 79 }
vcraciun 0:55a3f0eda74d 80
vcraciun 0:55a3f0eda74d 81 void Touch::DrawCross(int Xpos,int Ypos)
vcraciun 0:55a3f0eda74d 82 {
vcraciun 0:55a3f0eda74d 83 _lcd->DrawLine(Xpos-15,Ypos,Xpos-2,Ypos,COLOR_WHITE);
vcraciun 0:55a3f0eda74d 84 _lcd->DrawLine(Xpos+2,Ypos,Xpos+15,Ypos,COLOR_WHITE);
vcraciun 0:55a3f0eda74d 85 _lcd->DrawLine(Xpos,Ypos-15,Xpos,Ypos-2,COLOR_WHITE);
vcraciun 0:55a3f0eda74d 86 _lcd->DrawLine(Xpos,Ypos+2,Xpos,Ypos+15,COLOR_WHITE);
vcraciun 0:55a3f0eda74d 87
vcraciun 0:55a3f0eda74d 88 _lcd->DrawLine(Xpos-15,Ypos+15,Xpos-7,Ypos+15,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 89 _lcd->DrawLine(Xpos-15,Ypos+7,Xpos-15,Ypos+15,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 90
vcraciun 0:55a3f0eda74d 91 _lcd->DrawLine(Xpos-15,Ypos-15,Xpos-7,Ypos-15,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 92 _lcd->DrawLine(Xpos-15,Ypos-7,Xpos-15,Ypos-15,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 93
vcraciun 0:55a3f0eda74d 94 _lcd->DrawLine(Xpos+7,Ypos+15,Xpos+15,Ypos+15,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 95 _lcd->DrawLine(Xpos+15,Ypos+7,Xpos+15,Ypos+15,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 96
vcraciun 0:55a3f0eda74d 97 _lcd->DrawLine(Xpos+7,Ypos-15,Xpos+15,Ypos-15,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 98 _lcd->DrawLine(Xpos+15,Ypos-15,Xpos+15,Ypos-7,RGB(184,158,131));
vcraciun 0:55a3f0eda74d 99 }
vcraciun 0:55a3f0eda74d 100
vcraciun 1:e7ae315a1ceb 101 Coordinate *Touch::ReadAds7846(void)
vcraciun 0:55a3f0eda74d 102 {
vcraciun 0:55a3f0eda74d 103 static Coordinate screen;
vcraciun 0:55a3f0eda74d 104 int m0,m1,m2,TP_X[1],TP_Y[1],temp[3];
vcraciun 0:55a3f0eda74d 105 uint8_t count=0;
vcraciun 0:55a3f0eda74d 106 int buffer[2][9]={{0},{0}};
vcraciun 0:55a3f0eda74d 107
vcraciun 0:55a3f0eda74d 108 do
vcraciun 0:55a3f0eda74d 109 {
vcraciun 1:e7ae315a1ceb 110 GetAdXY(TP_X,TP_Y);
vcraciun 0:55a3f0eda74d 111 buffer[0][count]=TP_X[0];
vcraciun 0:55a3f0eda74d 112 buffer[1][count]=TP_Y[0];
vcraciun 0:55a3f0eda74d 113 count++;
vcraciun 0:55a3f0eda74d 114 }
vcraciun 0:55a3f0eda74d 115
vcraciun 0:55a3f0eda74d 116 while((!_irq->read()) && count<9)
vcraciun 0:55a3f0eda74d 117 ;
vcraciun 0:55a3f0eda74d 118
vcraciun 0:55a3f0eda74d 119 if(count==9)
vcraciun 0:55a3f0eda74d 120 {
vcraciun 0:55a3f0eda74d 121 temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3;
vcraciun 0:55a3f0eda74d 122 temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3;
vcraciun 0:55a3f0eda74d 123 temp[2]=(buffer[0][6]+buffer[0][7]+buffer[0][8])/3;
vcraciun 0:55a3f0eda74d 124
vcraciun 0:55a3f0eda74d 125 m0=temp[0]-temp[1];
vcraciun 0:55a3f0eda74d 126 m1=temp[1]-temp[2];
vcraciun 0:55a3f0eda74d 127 m2=temp[2]-temp[0];
vcraciun 0:55a3f0eda74d 128
vcraciun 0:55a3f0eda74d 129 m0=m0>0?m0:(-m0);
vcraciun 0:55a3f0eda74d 130 m1=m1>0?m1:(-m1);
vcraciun 0:55a3f0eda74d 131 m2=m2>0?m2:(-m2);
vcraciun 0:55a3f0eda74d 132
vcraciun 0:55a3f0eda74d 133 if( m0>THRESHOLD && m1>THRESHOLD && m2>THRESHOLD )
vcraciun 0:55a3f0eda74d 134 return 0;
vcraciun 0:55a3f0eda74d 135
vcraciun 0:55a3f0eda74d 136 if(m0<m1)
vcraciun 0:55a3f0eda74d 137 {
vcraciun 0:55a3f0eda74d 138 if(m2<m0)
vcraciun 0:55a3f0eda74d 139 screen.x=(temp[0]+temp[2])/2;
vcraciun 0:55a3f0eda74d 140 else
vcraciun 0:55a3f0eda74d 141 screen.x=(temp[0]+temp[1])/2;
vcraciun 0:55a3f0eda74d 142 }
vcraciun 0:55a3f0eda74d 143 else if(m2<m1)
vcraciun 0:55a3f0eda74d 144 screen.x=(temp[0]+temp[2])/2;
vcraciun 0:55a3f0eda74d 145 else
vcraciun 0:55a3f0eda74d 146 screen.x=(temp[1]+temp[2])/2;
vcraciun 0:55a3f0eda74d 147
vcraciun 0:55a3f0eda74d 148 temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3;
vcraciun 0:55a3f0eda74d 149 temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3;
vcraciun 0:55a3f0eda74d 150 temp[2]=(buffer[1][6]+buffer[1][7]+buffer[1][8])/3;
vcraciun 0:55a3f0eda74d 151
vcraciun 0:55a3f0eda74d 152 m0=temp[0]-temp[1];
vcraciun 0:55a3f0eda74d 153 m1=temp[1]-temp[2];
vcraciun 0:55a3f0eda74d 154 m2=temp[2]-temp[0];
vcraciun 0:55a3f0eda74d 155
vcraciun 0:55a3f0eda74d 156 m0=m0>0?m0:(-m0);
vcraciun 0:55a3f0eda74d 157 m1=m1>0?m1:(-m1);
vcraciun 0:55a3f0eda74d 158 m2=m2>0?m2:(-m2);
vcraciun 0:55a3f0eda74d 159
vcraciun 0:55a3f0eda74d 160 if(m0>THRESHOLD&&m1>THRESHOLD&&m2>THRESHOLD)
vcraciun 0:55a3f0eda74d 161 return 0;
vcraciun 0:55a3f0eda74d 162
vcraciun 0:55a3f0eda74d 163 if(m0<m1)
vcraciun 0:55a3f0eda74d 164 {
vcraciun 0:55a3f0eda74d 165 if(m2<m0)
vcraciun 0:55a3f0eda74d 166 screen.y=(temp[0]+temp[2])/2;
vcraciun 0:55a3f0eda74d 167 else
vcraciun 0:55a3f0eda74d 168 screen.y=(temp[0]+temp[1])/2;
vcraciun 0:55a3f0eda74d 169 }
vcraciun 0:55a3f0eda74d 170 else if(m2<m1)
vcraciun 0:55a3f0eda74d 171 screen.y=(temp[0]+temp[2])/2;
vcraciun 0:55a3f0eda74d 172 else
vcraciun 0:55a3f0eda74d 173 screen.y=(temp[1]+temp[2])/2;
vcraciun 0:55a3f0eda74d 174
vcraciun 0:55a3f0eda74d 175 return &screen;
vcraciun 0:55a3f0eda74d 176 }
vcraciun 0:55a3f0eda74d 177 return 0;
vcraciun 0:55a3f0eda74d 178 }
vcraciun 0:55a3f0eda74d 179
vcraciun 0:55a3f0eda74d 180 bool Touch::setCalibrationMatrix( Coordinate * displayPtr, Coordinate * screenPtr, Matrix * matrixPtr)
vcraciun 0:55a3f0eda74d 181 {
vcraciun 0:55a3f0eda74d 182 bool retTHRESHOLD = true ;
vcraciun 0:55a3f0eda74d 183
vcraciun 0:55a3f0eda74d 184 matrixPtr->Divider = ((screenPtr[0].x - screenPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) - ((screenPtr[1].x - screenPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
vcraciun 0:55a3f0eda74d 185 if( matrixPtr->Divider == 0 )
vcraciun 0:55a3f0eda74d 186 {
vcraciun 0:55a3f0eda74d 187 retTHRESHOLD = false;
vcraciun 0:55a3f0eda74d 188 }
vcraciun 0:55a3f0eda74d 189 else
vcraciun 0:55a3f0eda74d 190 {
vcraciun 0:55a3f0eda74d 191 matrixPtr->An = ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) - ((displayPtr[1].x - displayPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
vcraciun 0:55a3f0eda74d 192 matrixPtr->Bn = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].x - displayPtr[2].x)) - ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].x - screenPtr[2].x)) ;
vcraciun 0:55a3f0eda74d 193 matrixPtr->Cn = (screenPtr[2].x * displayPtr[1].x - screenPtr[1].x * displayPtr[2].x) * screenPtr[0].y + (screenPtr[0].x * displayPtr[2].x - screenPtr[2].x * displayPtr[0].x) * screenPtr[1].y + (screenPtr[1].x * displayPtr[0].x - screenPtr[0].x * displayPtr[1].x) * screenPtr[2].y ;
vcraciun 0:55a3f0eda74d 194 matrixPtr->Dn = ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].y - screenPtr[2].y)) - ((displayPtr[1].y - displayPtr[2].y) * (screenPtr[0].y - screenPtr[2].y)) ;
vcraciun 0:55a3f0eda74d 195 matrixPtr->En = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].y - displayPtr[2].y)) - ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].x - screenPtr[2].x)) ;
vcraciun 0:55a3f0eda74d 196 matrixPtr->Fn = (screenPtr[2].x * displayPtr[1].y - screenPtr[1].x * displayPtr[2].y) * screenPtr[0].y + (screenPtr[0].x * displayPtr[2].y - screenPtr[2].x * displayPtr[0].y) * screenPtr[1].y + (screenPtr[1].x * displayPtr[0].y - screenPtr[0].x * displayPtr[1].y) * screenPtr[2].y ;
vcraciun 0:55a3f0eda74d 197 }
vcraciun 0:55a3f0eda74d 198 return( retTHRESHOLD ) ;
vcraciun 0:55a3f0eda74d 199 }
vcraciun 0:55a3f0eda74d 200
vcraciun 0:55a3f0eda74d 201 void Touch::TouchPanel_Calibrate(void)
vcraciun 0:55a3f0eda74d 202 {
vcraciun 0:55a3f0eda74d 203 uint8_t i;
vcraciun 0:55a3f0eda74d 204 Coordinate * Ptr;
vcraciun 0:55a3f0eda74d 205
vcraciun 0:55a3f0eda74d 206 for(i=0;i<3;i++)
vcraciun 0:55a3f0eda74d 207 {
vcraciun 0:55a3f0eda74d 208 _lcd->ClearScreen();
vcraciun 0:55a3f0eda74d 209 _lcd->SetFont( &Font8x16 );
vcraciun 0:55a3f0eda74d 210 _lcd->Print("Calibrare Touch-Screen",CENTER,10,COLOR_WHITE,COLOR_BLACK,0);
vcraciun 0:55a3f0eda74d 211 wait(0.3);
vcraciun 0:55a3f0eda74d 212 DrawCross(DisplaySample[i].x,DisplaySample[i].y);
vcraciun 0:55a3f0eda74d 213 do
vcraciun 0:55a3f0eda74d 214 {
vcraciun 1:e7ae315a1ceb 215 Ptr=ReadAds7846();
vcraciun 0:55a3f0eda74d 216 }
vcraciun 0:55a3f0eda74d 217 while( Ptr == (void*)0 );
vcraciun 0:55a3f0eda74d 218 ScreenSample[i].x= Ptr->x; ScreenSample[i].y= Ptr->y;
vcraciun 0:55a3f0eda74d 219 }
vcraciun 0:55a3f0eda74d 220 setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix );
vcraciun 0:55a3f0eda74d 221 }