Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TouchPanel.cpp@1:e7ae315a1ceb, 2013-09-14 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |