Vlad Craciun / SSD1289_TouchScreen
Committer:
vcraciun
Date:
Sat Sep 14 13:03:33 2013 +0000
Revision:
2:a31069f27cd5
Parent:
1:e7ae315a1ceb
added experimental calibration method

Who changed what in which revision?

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