Basically i glued Peter Drescher and Simon Ford libs in a GraphicsDisplay class, then derived TFT or LCD class (which inherits Protocols class), then the most derived ones (Inits), which are per-display and are the only part needed to be adapted to diff hw.

Fork of UniGraphic by GraphicsDisplay

Committer:
rakware
Date:
Wed May 06 16:52:07 2015 +0000
Revision:
22:62f3bed03503
added touch for ADS7843 bound to TFT class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rakware 22:62f3bed03503 1 /**************************************************************************************************
rakware 22:62f3bed03503 2 ***** *****
rakware 22:62f3bed03503 3 ***** Name: Touch.cpp *****
rakware 22:62f3bed03503 4 ***** Ver.: 1.0 *****
rakware 22:62f3bed03503 5 ***** Date: 04/01/2013 *****
rakware 22:62f3bed03503 6 ***** Auth: Frank Vannieuwkerke *****
rakware 22:62f3bed03503 7 ***** Erik Olieman *****
rakware 22:62f3bed03503 8 ***** Func: Touch driver for use with ADS7843 *****
rakware 22:62f3bed03503 9 ***** *****
rakware 22:62f3bed03503 10 ***** Code based on Carlos E. Vidales tutorial : *****
rakware 22:62f3bed03503 11 ***** How To Calibrate Touch Screens *****
rakware 22:62f3bed03503 12 ***** www.embedded.com/design/configurable-systems/4023968/How-To-Calibrate-Touch-Screens *****
rakware 22:62f3bed03503 13 ***** *****
rakware 22:62f3bed03503 14 **************************************************************************************************/
rakware 22:62f3bed03503 15
rakware 22:62f3bed03503 16 #include "Touch.h"
rakware 22:62f3bed03503 17 #include "mbed.h"
rakware 22:62f3bed03503 18 #include "Arial12x12.h"
rakware 22:62f3bed03503 19
rakware 22:62f3bed03503 20 #define THRESHOLD 2
rakware 22:62f3bed03503 21
rakware 22:62f3bed03503 22 TouchScreenADS7843::TouchScreenADS7843(PinName tp_mosi, PinName tp_miso, PinName tp_sclk, PinName tp_cs, PinName tp_irq, TFT *_LCD)
rakware 22:62f3bed03503 23 : LCD(_LCD), _tp_spi(tp_mosi, tp_miso, tp_sclk), _tp_cs(tp_cs), _tp_irq(tp_irq)
rakware 22:62f3bed03503 24 {
rakware 22:62f3bed03503 25 DisplaySample[0].x=45;
rakware 22:62f3bed03503 26 DisplaySample[0].y=45;
rakware 22:62f3bed03503 27 DisplaySample[1].x=45;
rakware 22:62f3bed03503 28 DisplaySample[1].y=270;
rakware 22:62f3bed03503 29 DisplaySample[2].x=190;
rakware 22:62f3bed03503 30 DisplaySample[2].y=190;
rakware 22:62f3bed03503 31 ScreenSample[0].x=45;
rakware 22:62f3bed03503 32 ScreenSample[0].y=45;
rakware 22:62f3bed03503 33 ScreenSample[1].x=45;
rakware 22:62f3bed03503 34 ScreenSample[1].y=270;
rakware 22:62f3bed03503 35 ScreenSample[2].x=190;
rakware 22:62f3bed03503 36 ScreenSample[2].y=190;
rakware 22:62f3bed03503 37 _tp_cs=1;
rakware 22:62f3bed03503 38 _tp_spi.frequency(500000);
rakware 22:62f3bed03503 39 _tp_spi.format(8,0); // 8 bit spi mode 0
rakware 22:62f3bed03503 40 }
rakware 22:62f3bed03503 41
rakware 22:62f3bed03503 42 int TouchScreenADS7843::Read_XY(unsigned char XY)
rakware 22:62f3bed03503 43 {
rakware 22:62f3bed03503 44 unsigned char msb, lsb;
rakware 22:62f3bed03503 45 unsigned int Temp;
rakware 22:62f3bed03503 46
rakware 22:62f3bed03503 47 Temp=0;
rakware 22:62f3bed03503 48 _tp_cs=0;
rakware 22:62f3bed03503 49 wait_us(SPI_RD_DELAY);
rakware 22:62f3bed03503 50 _tp_spi.write(XY);
rakware 22:62f3bed03503 51 wait_us(SPI_RD_DELAY);
rakware 22:62f3bed03503 52 msb = _tp_spi.write(0x00); // msb
rakware 22:62f3bed03503 53 wait_us(SPI_RD_DELAY);
rakware 22:62f3bed03503 54 lsb = _tp_spi.write(0x00); // lsb
rakware 22:62f3bed03503 55 _tp_cs=1;
rakware 22:62f3bed03503 56 Temp = ((msb << 8 ) | lsb);
rakware 22:62f3bed03503 57 Temp >>= 3;
rakware 22:62f3bed03503 58 Temp &= 0xfff;
rakware 22:62f3bed03503 59 Temp /= 4; // Scaling : return value range must be between 0 and 1024
rakware 22:62f3bed03503 60 return(Temp);
rakware 22:62f3bed03503 61 }
rakware 22:62f3bed03503 62
rakware 22:62f3bed03503 63
rakware 22:62f3bed03503 64 void TouchScreenADS7843::TP_GetAdXY(int *x,int *y)
rakware 22:62f3bed03503 65 {
rakware 22:62f3bed03503 66 int adx,ady;
rakware 22:62f3bed03503 67 adx = Read_XY(CHX);
rakware 22:62f3bed03503 68 wait_us(1);
rakware 22:62f3bed03503 69 ady = Read_XY(CHY);
rakware 22:62f3bed03503 70 *x = adx;
rakware 22:62f3bed03503 71 *y = ady;
rakware 22:62f3bed03503 72 }
rakware 22:62f3bed03503 73
rakware 22:62f3bed03503 74 void TouchScreenADS7843::TP_DrawPoint(unsigned int Xpos,unsigned int Ypos, unsigned int color)
rakware 22:62f3bed03503 75 {
rakware 22:62f3bed03503 76 // LCD->wr_reg(0x03, 0x1030);
rakware 22:62f3bed03503 77 // LCD->WindowMax();
rakware 22:62f3bed03503 78 LCD->pixel(Xpos,Ypos,color);
rakware 22:62f3bed03503 79 LCD->pixel(Xpos+1,Ypos,color);
rakware 22:62f3bed03503 80 LCD->pixel(Xpos,Ypos+1,color);
rakware 22:62f3bed03503 81 LCD->pixel(Xpos+1,Ypos+1,color);
rakware 22:62f3bed03503 82 }
rakware 22:62f3bed03503 83
rakware 22:62f3bed03503 84 void TouchScreenADS7843::DrawCross(unsigned int Xpos,unsigned int Ypos)
rakware 22:62f3bed03503 85 {
rakware 22:62f3bed03503 86 // LCD->rect(Xpos-7,Ypos+7,Xpos+7,Ypos-7, Red);
rakware 22:62f3bed03503 87
rakware 22:62f3bed03503 88 LCD->line(Xpos-15,Ypos,Xpos-2,Ypos,White); //left
rakware 22:62f3bed03503 89 LCD->line(Xpos+2,Ypos,Xpos+15,Ypos,White);
rakware 22:62f3bed03503 90 LCD->line(Xpos,Ypos-15,Xpos,Ypos-2,White);
rakware 22:62f3bed03503 91 LCD->line(Xpos,Ypos+2,Xpos,Ypos+15,White);
rakware 22:62f3bed03503 92
rakware 22:62f3bed03503 93 LCD->line(Xpos-15,Ypos+15,Xpos-7,Ypos+15,DarkGrey);
rakware 22:62f3bed03503 94 LCD->line(Xpos-15,Ypos+7,Xpos-15,Ypos+15,DarkGrey);
rakware 22:62f3bed03503 95
rakware 22:62f3bed03503 96 LCD->line(Xpos-15,Ypos-15,Xpos-7,Ypos-15,DarkGrey);
rakware 22:62f3bed03503 97 LCD->line(Xpos-15,Ypos-7,Xpos-15,Ypos-15,DarkGrey);
rakware 22:62f3bed03503 98
rakware 22:62f3bed03503 99 LCD->line(Xpos+7,Ypos+15,Xpos+15,Ypos+15,DarkGrey);
rakware 22:62f3bed03503 100 LCD->line(Xpos+15,Ypos+7,Xpos+15,Ypos+15,DarkGrey);
rakware 22:62f3bed03503 101
rakware 22:62f3bed03503 102 LCD->line(Xpos+7,Ypos-15,Xpos+15,Ypos-15,DarkGrey);
rakware 22:62f3bed03503 103 LCD->line(Xpos+15,Ypos-15,Xpos+15,Ypos-7,DarkGrey);
rakware 22:62f3bed03503 104 }
rakware 22:62f3bed03503 105
rakware 22:62f3bed03503 106 unsigned char TouchScreenADS7843::Read_Ads7843(Coordinate * screenPtr)
rakware 22:62f3bed03503 107 {
rakware 22:62f3bed03503 108 int m0,m1,m2,TP_X[1],TP_Y[1],temp[3];
rakware 22:62f3bed03503 109 uint8_t count=0;
rakware 22:62f3bed03503 110 int buffer[2][9]={{0},{0}};
rakware 22:62f3bed03503 111 if (screenPtr == NULL) screenPtr = &screen;
rakware 22:62f3bed03503 112 do
rakware 22:62f3bed03503 113 {
rakware 22:62f3bed03503 114 TP_GetAdXY(TP_X,TP_Y);
rakware 22:62f3bed03503 115 buffer[0][count]=TP_X[0];
rakware 22:62f3bed03503 116 buffer[1][count]=TP_Y[0];
rakware 22:62f3bed03503 117 count++;
rakware 22:62f3bed03503 118 }
rakware 22:62f3bed03503 119 while(!_tp_irq && (count < 9));
rakware 22:62f3bed03503 120 if(count==9)
rakware 22:62f3bed03503 121 {
rakware 22:62f3bed03503 122 temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3;
rakware 22:62f3bed03503 123 temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3;
rakware 22:62f3bed03503 124 temp[2]=(buffer[0][6]+buffer[0][7]+buffer[0][8])/3;
rakware 22:62f3bed03503 125 m0=temp[0]-temp[1];
rakware 22:62f3bed03503 126 m1=temp[1]-temp[2];
rakware 22:62f3bed03503 127 m2=temp[2]-temp[0];
rakware 22:62f3bed03503 128 m0=m0>0?m0:(-m0);
rakware 22:62f3bed03503 129 m1=m1>0?m1:(-m1);
rakware 22:62f3bed03503 130 m2=m2>0?m2:(-m2);
rakware 22:62f3bed03503 131 if( (m0>THRESHOLD) && (m1>THRESHOLD) && (m2>THRESHOLD) ) return 0;
rakware 22:62f3bed03503 132 if(m0<m1)
rakware 22:62f3bed03503 133 {
rakware 22:62f3bed03503 134 if(m2<m0)
rakware 22:62f3bed03503 135 screenPtr->x=(temp[0]+temp[2])/2;
rakware 22:62f3bed03503 136 else
rakware 22:62f3bed03503 137 screenPtr->x=(temp[0]+temp[1])/2;
rakware 22:62f3bed03503 138 }
rakware 22:62f3bed03503 139 else if(m2<m1)
rakware 22:62f3bed03503 140 screenPtr->x=(temp[0]+temp[2])/2;
rakware 22:62f3bed03503 141 else
rakware 22:62f3bed03503 142 screenPtr->x=(temp[1]+temp[2])/2;
rakware 22:62f3bed03503 143
rakware 22:62f3bed03503 144 temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3;
rakware 22:62f3bed03503 145 temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3;
rakware 22:62f3bed03503 146 temp[2]=(buffer[1][6]+buffer[1][7]+buffer[1][8])/3;
rakware 22:62f3bed03503 147 m0=temp[0]-temp[1];
rakware 22:62f3bed03503 148 m1=temp[1]-temp[2];
rakware 22:62f3bed03503 149 m2=temp[2]-temp[0];
rakware 22:62f3bed03503 150 m0=m0>0?m0:(-m0);
rakware 22:62f3bed03503 151 m1=m1>0?m1:(-m1);
rakware 22:62f3bed03503 152 m2=m2>0?m2:(-m2);
rakware 22:62f3bed03503 153 if( (m0>THRESHOLD) && (m1>THRESHOLD) && (m2>THRESHOLD) ) return 0;
rakware 22:62f3bed03503 154
rakware 22:62f3bed03503 155 if(m0<m1)
rakware 22:62f3bed03503 156 {
rakware 22:62f3bed03503 157 if(m2<m0)
rakware 22:62f3bed03503 158 screenPtr->y=(temp[0]+temp[2])/2;
rakware 22:62f3bed03503 159 else
rakware 22:62f3bed03503 160 screenPtr->y=(temp[0]+temp[1])/2;
rakware 22:62f3bed03503 161 }
rakware 22:62f3bed03503 162 else if(m2<m1)
rakware 22:62f3bed03503 163 screenPtr->y=(temp[0]+temp[2])/2;
rakware 22:62f3bed03503 164 else
rakware 22:62f3bed03503 165 screenPtr->y=(temp[1]+temp[2])/2;
rakware 22:62f3bed03503 166 return 1;
rakware 22:62f3bed03503 167 }
rakware 22:62f3bed03503 168 return 0;
rakware 22:62f3bed03503 169 }
rakware 22:62f3bed03503 170
rakware 22:62f3bed03503 171 uint8_t TouchScreenADS7843::setCalibrationMatrix( Coordinate * displayPtr,
rakware 22:62f3bed03503 172 Coordinate * screenPtr,
rakware 22:62f3bed03503 173 Matrix * matrixPtr)
rakware 22:62f3bed03503 174 {
rakware 22:62f3bed03503 175 uint8_t retTHRESHOLD = 0 ;
rakware 22:62f3bed03503 176 // K = (Xs0 - Xs2)*(Ys1 - Ys2) - (Xs1 - Xs2)*(Ys0 - Ys2)
rakware 22:62f3bed03503 177 matrixPtr->Divider = ((screenPtr[0].x - screenPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -
rakware 22:62f3bed03503 178 ((screenPtr[1].x - screenPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
rakware 22:62f3bed03503 179 if( matrixPtr->Divider == 0 )
rakware 22:62f3bed03503 180 {
rakware 22:62f3bed03503 181 retTHRESHOLD = 1;
rakware 22:62f3bed03503 182 }
rakware 22:62f3bed03503 183 else
rakware 22:62f3bed03503 184 {
rakware 22:62f3bed03503 185 // (Xd0 - Xd2)*(Ys1 - Ys2) - (Xd1 - Xd2)*(Ys0 - Ys2)
rakware 22:62f3bed03503 186 // A = ---------------------------------------------------
rakware 22:62f3bed03503 187 // K
rakware 22:62f3bed03503 188 matrixPtr->An = ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -
rakware 22:62f3bed03503 189 ((displayPtr[1].x - displayPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
rakware 22:62f3bed03503 190 // (Xs0 - Xs2)*(Xd1 - Xd2) - (Xd0 - Xd2)*(Xs1 - Xs2)
rakware 22:62f3bed03503 191 // B = ---------------------------------------------------
rakware 22:62f3bed03503 192 // K
rakware 22:62f3bed03503 193 matrixPtr->Bn = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].x - displayPtr[2].x)) -
rakware 22:62f3bed03503 194 ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].x - screenPtr[2].x)) ;
rakware 22:62f3bed03503 195 // Ys0*(Xs2*Xd1 - Xs1*Xd2) + Ys1*(Xs0*Xd2 - Xs2*Xd0) + Ys2*(Xs1*Xd0 - Xs0*Xd1)
rakware 22:62f3bed03503 196 // C = ----------------------------------------------------------------------------
rakware 22:62f3bed03503 197 // K
rakware 22:62f3bed03503 198 matrixPtr->Cn = (screenPtr[2].x * displayPtr[1].x - screenPtr[1].x * displayPtr[2].x) * screenPtr[0].y +
rakware 22:62f3bed03503 199 (screenPtr[0].x * displayPtr[2].x - screenPtr[2].x * displayPtr[0].x) * screenPtr[1].y +
rakware 22:62f3bed03503 200 (screenPtr[1].x * displayPtr[0].x - screenPtr[0].x * displayPtr[1].x) * screenPtr[2].y ;
rakware 22:62f3bed03503 201 // (Yd0 - Yd2)*(Ys1 - Ys2) - (Yd1 - Yd2)*(Ys0 - Ys2)
rakware 22:62f3bed03503 202 // D = ---------------------------------------------------
rakware 22:62f3bed03503 203 // K
rakware 22:62f3bed03503 204 matrixPtr->Dn = ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].y - screenPtr[2].y)) -
rakware 22:62f3bed03503 205 ((displayPtr[1].y - displayPtr[2].y) * (screenPtr[0].y - screenPtr[2].y)) ;
rakware 22:62f3bed03503 206 // (Xs0 - Xs2)*(Yd1 - Yd2) - (Yd0 - Yd2)*(Xs1 - Xs2)
rakware 22:62f3bed03503 207 // E = ---------------------------------------------------
rakware 22:62f3bed03503 208 // K
rakware 22:62f3bed03503 209 matrixPtr->En = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].y - displayPtr[2].y)) -
rakware 22:62f3bed03503 210 ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].x - screenPtr[2].x)) ;
rakware 22:62f3bed03503 211 // Ys0*(Xs2*Yd1 - Xs1*Yd2) + Ys1*(Xs0*Yd2 - Xs2*Yd0) + Ys2*(Xs1*Yd0 - Xs0*Yd1)
rakware 22:62f3bed03503 212 // F = ----------------------------------------------------------------------------
rakware 22:62f3bed03503 213 // K
rakware 22:62f3bed03503 214 matrixPtr->Fn = (screenPtr[2].x * displayPtr[1].y - screenPtr[1].x * displayPtr[2].y) * screenPtr[0].y +
rakware 22:62f3bed03503 215 (screenPtr[0].x * displayPtr[2].y - screenPtr[2].x * displayPtr[0].y) * screenPtr[1].y +
rakware 22:62f3bed03503 216 (screenPtr[1].x * displayPtr[0].y - screenPtr[0].x * displayPtr[1].y) * screenPtr[2].y ;
rakware 22:62f3bed03503 217 }
rakware 22:62f3bed03503 218 return( retTHRESHOLD ) ;
rakware 22:62f3bed03503 219 }
rakware 22:62f3bed03503 220
rakware 22:62f3bed03503 221 uint8_t TouchScreenADS7843::getDisplayPoint(void)
rakware 22:62f3bed03503 222 {
rakware 22:62f3bed03503 223 uint8_t retTHRESHOLD = 0 ;
rakware 22:62f3bed03503 224
rakware 22:62f3bed03503 225 if( matrix.Divider != 0 )
rakware 22:62f3bed03503 226 {
rakware 22:62f3bed03503 227 // XD = AX+BY+C
rakware 22:62f3bed03503 228 display.x = ( (matrix.An * screen.x) +
rakware 22:62f3bed03503 229 (matrix.Bn * screen.y) +
rakware 22:62f3bed03503 230 matrix.Cn
rakware 22:62f3bed03503 231 ) / matrix.Divider ;
rakware 22:62f3bed03503 232 // YD = DX+EY+F
rakware 22:62f3bed03503 233 display.y = ( (matrix.Dn * screen.x) +
rakware 22:62f3bed03503 234 (matrix.En * screen.y) +
rakware 22:62f3bed03503 235 matrix.Fn
rakware 22:62f3bed03503 236 ) / matrix.Divider ;
rakware 22:62f3bed03503 237 }
rakware 22:62f3bed03503 238 else
rakware 22:62f3bed03503 239 {
rakware 22:62f3bed03503 240 retTHRESHOLD = 1;
rakware 22:62f3bed03503 241 }
rakware 22:62f3bed03503 242 return(retTHRESHOLD);
rakware 22:62f3bed03503 243 }
rakware 22:62f3bed03503 244
rakware 22:62f3bed03503 245 void TouchScreenADS7843::TouchPanel_Calibrate(void)
rakware 22:62f3bed03503 246 {
rakware 22:62f3bed03503 247 uint8_t i;
rakware 22:62f3bed03503 248 Coordinate screen_cal;
rakware 22:62f3bed03503 249 setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ;
rakware 22:62f3bed03503 250 LCD->set_font((unsigned char*) Arial12x12);
rakware 22:62f3bed03503 251 for(i=0;i<3;i++)
rakware 22:62f3bed03503 252 {
rakware 22:62f3bed03503 253 LCD->cls();
rakware 22:62f3bed03503 254 LCD->locate(10,10);
rakware 22:62f3bed03503 255 LCD->printf("Touch crosshair to calibrate");
rakware 22:62f3bed03503 256 wait_ms(500);
rakware 22:62f3bed03503 257 DrawCross(DisplaySample[i].x,DisplaySample[i].y);
rakware 22:62f3bed03503 258 do {} while (!Read_Ads7843(&screen_cal));
rakware 22:62f3bed03503 259 ScreenSample[i].x= screen_cal.x;ScreenSample[i].y= screen_cal.y;
rakware 22:62f3bed03503 260 }
rakware 22:62f3bed03503 261 setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ;
rakware 22:62f3bed03503 262 LCD->cls();
rakware 22:62f3bed03503 263 }
rakware 22:62f3bed03503 264
rakware 22:62f3bed03503 265 void TouchScreenADS7843::GetCalibration(Matrix * matrixPtr, Coordinate * screenPtr)
rakware 22:62f3bed03503 266 {
rakware 22:62f3bed03503 267 uint8_t i;
rakware 22:62f3bed03503 268 Matrix * mp1;
rakware 22:62f3bed03503 269 mp1 = &matrix;
rakware 22:62f3bed03503 270 *matrixPtr = *mp1;
rakware 22:62f3bed03503 271 for(i=0;i<3;i++)
rakware 22:62f3bed03503 272 {
rakware 22:62f3bed03503 273 screenPtr[i].x = ScreenSample[i].x;
rakware 22:62f3bed03503 274 screenPtr[i].y = ScreenSample[i].y;
rakware 22:62f3bed03503 275 }
rakware 22:62f3bed03503 276 }
rakware 22:62f3bed03503 277
rakware 22:62f3bed03503 278 void TouchScreenADS7843::SetCalibration(Matrix * matrixPtr, Coordinate * screenPtr)
rakware 22:62f3bed03503 279 {
rakware 22:62f3bed03503 280 uint8_t i;
rakware 22:62f3bed03503 281 Matrix * mp1;
rakware 22:62f3bed03503 282 mp1 = &matrix;
rakware 22:62f3bed03503 283 *mp1 = *matrixPtr;
rakware 22:62f3bed03503 284 for(i=0;i<3;i++)
rakware 22:62f3bed03503 285 {
rakware 22:62f3bed03503 286 ScreenSample[i].x = screenPtr[i].x;
rakware 22:62f3bed03503 287 ScreenSample[i].y = screenPtr[i].y;
rakware 22:62f3bed03503 288 }
rakware 22:62f3bed03503 289 setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ;
rakware 22:62f3bed03503 290 }