Fork with support for ILI9341 controller

Dependents:   CANary_9341 CANary

Fork of TOUCH_TFTx2 by Tick Tock

Committer:
TickTock
Date:
Thu Feb 14 00:26:54 2013 +0000
Revision:
5:a9890c586a64
Parent:
4:a3cd26c97b76
Child:
6:a91b668b058a
Cleaned up noise and corrected calibration

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:d78b00f167cb 1 /* mbed library for resistive touch pads
dreschpe 0:d78b00f167cb 2 * uses 4 pins - 2 IO and 2 Analog
dreschpe 0:d78b00f167cb 3
dreschpe 0:d78b00f167cb 4 * c 2011 Peter Drescher - DC2PD
dreschpe 0:d78b00f167cb 5 *
dreschpe 0:d78b00f167cb 6 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dreschpe 0:d78b00f167cb 7 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dreschpe 0:d78b00f167cb 8 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dreschpe 0:d78b00f167cb 9 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dreschpe 0:d78b00f167cb 10 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dreschpe 0:d78b00f167cb 11 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dreschpe 0:d78b00f167cb 12 * THE SOFTWARE.
dreschpe 0:d78b00f167cb 13 */
dreschpe 0:d78b00f167cb 14
dreschpe 0:d78b00f167cb 15
TickTock 3:3db7309b6146 16 #include "TOUCH_TFTx2.h"
dreschpe 0:d78b00f167cb 17 #include "mbed.h"
dreschpe 0:d78b00f167cb 18
TickTock 5:a9890c586a64 19 #define threshold 0x1000 // threshold to detect pressed
TickTock 5:a9890c586a64 20 #define accuracy 300 // noise filter
TickTock 5:a9890c586a64 21 #define numsamp 16 // number of averaging samples
dreschpe 0:d78b00f167cb 22
TickTock 3:3db7309b6146 23 TOUCH_TFTx2::TOUCH_TFTx2(PinName xp, PinName xm, PinName yp, PinName ym,
TickTock 3:3db7309b6146 24 PinName mosi, PinName miso, PinName sclk, PinName cs0, PinName cs1, PinName reset,const char* name):
dreschpe 0:d78b00f167cb 25 _xp(xp),_xm(xm),_yp(yp),_ym(ym),_ax(xp),_ay(yp),
TickTock 3:3db7309b6146 26 SPI_TFTx2(mosi,miso,sclk,cs0,cs1,reset,name) {
dreschpe 0:d78b00f167cb 27 xa = xp;
dreschpe 0:d78b00f167cb 28 ya = yp;
dreschpe 0:d78b00f167cb 29
dreschpe 0:d78b00f167cb 30 }
dreschpe 0:d78b00f167cb 31
TickTock 3:3db7309b6146 32 point TOUCH_TFTx2::get_touch() {
TickTock 5:a9890c586a64 33 unsigned short x1, x2, y1, y2, i=0, j=0, k;
TickTock 5:a9890c586a64 34 unsigned long dy , dx, xs1=0, ys1=0, xs2=0, ys2=0;
dreschpe 0:d78b00f167cb 35 point p;
dreschpe 0:d78b00f167cb 36
TickTock 5:a9890c586a64 37 for (k=0; j<numsamp; k++) {
dreschpe 0:d78b00f167cb 38 // read y voltage
TickTock 4:a3cd26c97b76 39 _ym.input(); //LAJ y- has to be passive
TickTock 4:a3cd26c97b76 40 _yp.input(); //LAJ y+ has to be passive
dreschpe 0:d78b00f167cb 41 _xp.output();
dreschpe 0:d78b00f167cb 42 _xm.output();
dreschpe 0:d78b00f167cb 43 switch (orientation) {
dreschpe 0:d78b00f167cb 44 case(0):
dreschpe 0:d78b00f167cb 45 case(3):
dreschpe 0:d78b00f167cb 46 _xp = 1;
dreschpe 0:d78b00f167cb 47 _xm = 0;
dreschpe 0:d78b00f167cb 48 break;
dreschpe 0:d78b00f167cb 49 case(1):
dreschpe 0:d78b00f167cb 50 case(2):
dreschpe 0:d78b00f167cb 51 _xp = 0;
dreschpe 0:d78b00f167cb 52 _xm = 1;
dreschpe 0:d78b00f167cb 53 break;
dreschpe 0:d78b00f167cb 54 }
dreschpe 0:d78b00f167cb 55 AnalogIn Ay(ya); // we have to call the constructor to switch to analog mode
dreschpe 0:d78b00f167cb 56 wait_us(10);
dreschpe 0:d78b00f167cb 57 y1 = Ay.read_u16(); // get y voltage
TickTock 5:a9890c586a64 58 dy = (y1 > y2)? (y1-y2) : (y2-y1);
dreschpe 0:d78b00f167cb 59 y2 = y1;
dreschpe 0:d78b00f167cb 60
dreschpe 0:d78b00f167cb 61 // read x voltage
TickTock 4:a3cd26c97b76 62 _xm.input(); //LAJ x- has to be passive
TickTock 4:a3cd26c97b76 63 _xp.input(); //LAJ x+ has to be passive
dreschpe 0:d78b00f167cb 64 _yp.output();
dreschpe 0:d78b00f167cb 65 _ym.output();
dreschpe 0:d78b00f167cb 66 switch (orientation) {
dreschpe 0:d78b00f167cb 67 case(0):
dreschpe 0:d78b00f167cb 68 case(1):
dreschpe 0:d78b00f167cb 69 _yp = 1;
dreschpe 0:d78b00f167cb 70 _ym = 0;
dreschpe 0:d78b00f167cb 71 break;
dreschpe 0:d78b00f167cb 72 case(2):
dreschpe 0:d78b00f167cb 73 case(3):
dreschpe 0:d78b00f167cb 74 _yp = 0;
dreschpe 0:d78b00f167cb 75 _ym = 1;
dreschpe 0:d78b00f167cb 76 break;
dreschpe 0:d78b00f167cb 77 }
dreschpe 0:d78b00f167cb 78 AnalogIn Ax(xa); // we have to call the constructor to switch to analog mode
dreschpe 0:d78b00f167cb 79 wait_us(10);
dreschpe 0:d78b00f167cb 80 x1 = Ax.read_u16(); // get x voltage
TickTock 5:a9890c586a64 81 dx = (x1 > x2)? (x1-x2) : (x2-x1);
dreschpe 0:d78b00f167cb 82 x2 = x1;
TickTock 5:a9890c586a64 83 if(dy<accuracy && dx<accuracy) {
TickTock 5:a9890c586a64 84 if(k<8){
TickTock 5:a9890c586a64 85 xs1 += x1;
TickTock 5:a9890c586a64 86 ys1 += y1;
TickTock 5:a9890c586a64 87 i++;
TickTock 5:a9890c586a64 88 } else {
TickTock 5:a9890c586a64 89 xs2 += x1;
TickTock 5:a9890c586a64 90 ys2 += y1;
TickTock 5:a9890c586a64 91 j++;
TickTock 5:a9890c586a64 92 }
TickTock 5:a9890c586a64 93 }
TickTock 5:a9890c586a64 94 } // for:next
TickTock 5:a9890c586a64 95 xs1 = xs1 / i;
TickTock 5:a9890c586a64 96 ys1 = ys1 / i;
TickTock 5:a9890c586a64 97 xs2 = xs2 / j;
TickTock 5:a9890c586a64 98 ys2 = ys2 / j;
TickTock 5:a9890c586a64 99 dy = (ys1 > ys2)? (ys1-ys2) : (ys2-ys1);
TickTock 5:a9890c586a64 100 dx = (xs1 > xs2)? (xs1-xs2) : (xs2-xs1);
TickTock 5:a9890c586a64 101 if(dy<accuracy && dx<accuracy) {
TickTock 5:a9890c586a64 102
TickTock 5:a9890c586a64 103 switch (orientation) {
TickTock 5:a9890c586a64 104 case(0):
TickTock 5:a9890c586a64 105 case(2):
TickTock 5:a9890c586a64 106 p.y = (xs1+xs2) / 2; // average
TickTock 5:a9890c586a64 107 p.x = (ys1+ys2) / 2;
TickTock 5:a9890c586a64 108 break;
TickTock 5:a9890c586a64 109 case(1):
TickTock 5:a9890c586a64 110 case(3):
TickTock 5:a9890c586a64 111 p.x = (xs1+xs2) / 2; // average
TickTock 5:a9890c586a64 112 p.y = (ys1+ys2) / 2;
TickTock 5:a9890c586a64 113 break;
TickTock 5:a9890c586a64 114 }
TickTock 5:a9890c586a64 115 } else { // sample average moved too much so discard
TickTock 5:a9890c586a64 116 p.x = 0;
TickTock 5:a9890c586a64 117 p.y = 0;
dreschpe 0:d78b00f167cb 118 }
TickTock 5:a9890c586a64 119 // debug
TickTock 5:a9890c586a64 120 //locate(1,80);
TickTock 5:a9890c586a64 121 //printf("d: %4d y: %5d",dy,p.y);
TickTock 5:a9890c586a64 122 //locate(1,100);
TickTock 5:a9890c586a64 123 //printf("d: %4d x: %5d",dx,p.x);
TickTock 5:a9890c586a64 124 //wait(0.25);
dreschpe 0:d78b00f167cb 125 return(p);
TickTock 5:a9890c586a64 126 }//*/
dreschpe 0:d78b00f167cb 127
TickTock 3:3db7309b6146 128 void TOUCH_TFTx2::calibrate(void) {
dreschpe 0:d78b00f167cb 129 int i;
TickTock 5:a9890c586a64 130 int ulx0 = 0, uly0 = 0, brx0 = 0, bry0 = 0;
TickTock 5:a9890c586a64 131 int ulx1 = 0, uly1 = 0, brx1 = 0, bry1 = 0;
dreschpe 2:ef7972c29c0e 132 int pos_x, pos_y;
dreschpe 0:d78b00f167cb 133 point p;
dreschpe 0:d78b00f167cb 134
TickTock 4:a3cd26c97b76 135 seldisp=1; // select right display
dreschpe 0:d78b00f167cb 136 cls();
dreschpe 0:d78b00f167cb 137 line(0,3,6,3,White);
dreschpe 0:d78b00f167cb 138 line(3,0,3,6,White);
dreschpe 2:ef7972c29c0e 139
dreschpe 2:ef7972c29c0e 140 // get the center of the screen
dreschpe 2:ef7972c29c0e 141 pos_x = columns() / 2 - 3;
dreschpe 2:ef7972c29c0e 142 pos_x = pos_x * font[1];
dreschpe 2:ef7972c29c0e 143 pos_y = (rows() / 2) - 1;
dreschpe 2:ef7972c29c0e 144 pos_y = pos_y * font[2];
TickTock 5:a9890c586a64 145
TickTock 5:a9890c586a64 146 //calibrate right screen
dreschpe 2:ef7972c29c0e 147 locate(pos_x,pos_y);
dreschpe 0:d78b00f167cb 148 printf("press cross");
dreschpe 2:ef7972c29c0e 149 locate(pos_x,pos_y + font[2]);
dreschpe 0:d78b00f167cb 150 printf("to calibrate");
TickTock 4:a3cd26c97b76 151 do {
TickTock 4:a3cd26c97b76 152 wait(0.1);
TickTock 5:a9890c586a64 153 } while (!is_touched()); //Wait for touch
dreschpe 0:d78b00f167cb 154 for (i=0; i<5; i++) {
TickTock 5:a9890c586a64 155 do {
TickTock 5:a9890c586a64 156 p = get_touch();
TickTock 5:a9890c586a64 157 } while (p.x==0 && p.y==0);
TickTock 5:a9890c586a64 158 ulx1 += p.x;
TickTock 5:a9890c586a64 159 uly1 += p.y;
dreschpe 0:d78b00f167cb 160 }
TickTock 5:a9890c586a64 161 ulx1 /= 5;
TickTock 5:a9890c586a64 162 uly1 /= 5;
dreschpe 2:ef7972c29c0e 163 locate(pos_x,pos_y);
dreschpe 0:d78b00f167cb 164 printf("OK ");
TickTock 5:a9890c586a64 165 printf(" ");
dreschpe 0:d78b00f167cb 166 do {
TickTock 4:a3cd26c97b76 167 wait(0.1);
TickTock 5:a9890c586a64 168 } while (is_touched()); //Wait for no touch
dreschpe 0:d78b00f167cb 169
dreschpe 0:d78b00f167cb 170 cls();
TickTock 5:a9890c586a64 171 line(width() -1, height() - 4,width() - 7,height() -4,White); // paint cross
TickTock 5:a9890c586a64 172 line(width() - 4,height() - 1,width() - 4,height() - 7,White);
dreschpe 2:ef7972c29c0e 173 locate(pos_x,pos_y);
dreschpe 0:d78b00f167cb 174 printf("press cross");
dreschpe 2:ef7972c29c0e 175 locate(pos_x,pos_y + font[2]);
dreschpe 0:d78b00f167cb 176 printf("to calibrate");
TickTock 4:a3cd26c97b76 177 do {
TickTock 4:a3cd26c97b76 178 wait(0.1);
TickTock 5:a9890c586a64 179 } while (!is_touched()); //Wait for touch
dreschpe 0:d78b00f167cb 180 for (i=0; i<5; i++) {
TickTock 5:a9890c586a64 181 do {
TickTock 5:a9890c586a64 182 p = get_touch();
TickTock 5:a9890c586a64 183 } while (p.x==0 && p.y==0); p = get_touch();
TickTock 5:a9890c586a64 184 brx1 += p.x;
TickTock 5:a9890c586a64 185 bry1 += p.y;
TickTock 4:a3cd26c97b76 186 }
TickTock 5:a9890c586a64 187 brx1 /= 5;
TickTock 5:a9890c586a64 188 bry1 /= 5;
TickTock 4:a3cd26c97b76 189
TickTock 4:a3cd26c97b76 190 locate(pos_x, pos_y);
TickTock 4:a3cd26c97b76 191 printf("OK ");
TickTock 5:a9890c586a64 192 printf(" ");
TickTock 4:a3cd26c97b76 193 do {
TickTock 4:a3cd26c97b76 194 wait(0.1);
TickTock 5:a9890c586a64 195 } while (is_touched()); //Wait for no touch
TickTock 4:a3cd26c97b76 196
TickTock 4:a3cd26c97b76 197 cls();
TickTock 4:a3cd26c97b76 198 seldisp=0; // select left display
TickTock 4:a3cd26c97b76 199 cls();
TickTock 4:a3cd26c97b76 200 line(0,3,6,3,White);
TickTock 4:a3cd26c97b76 201 line(3,0,3,6,White);
TickTock 4:a3cd26c97b76 202
TickTock 5:a9890c586a64 203 // now calibrate left screen
TickTock 4:a3cd26c97b76 204 locate(pos_x,pos_y);
TickTock 4:a3cd26c97b76 205 printf("press cross");
TickTock 4:a3cd26c97b76 206 locate(pos_x,pos_y + font[2]);
TickTock 4:a3cd26c97b76 207 printf("to calibrate");
TickTock 4:a3cd26c97b76 208 do {
TickTock 4:a3cd26c97b76 209 wait(0.1);
TickTock 5:a9890c586a64 210 } while (!is_touched()); //Wait for touch
TickTock 4:a3cd26c97b76 211 for (i=0; i<5; i++) {
TickTock 5:a9890c586a64 212 do {
TickTock 5:a9890c586a64 213 p = get_touch();
TickTock 5:a9890c586a64 214 } while (p.x==0 && p.y==0);
TickTock 5:a9890c586a64 215 ulx0 += p.x;
TickTock 5:a9890c586a64 216 uly0 += p.y;
TickTock 4:a3cd26c97b76 217 }
TickTock 5:a9890c586a64 218 ulx0 /= 5;
TickTock 5:a9890c586a64 219 uly0 /= 5;
TickTock 4:a3cd26c97b76 220 locate(pos_x,pos_y);
TickTock 4:a3cd26c97b76 221 printf("OK ");
TickTock 5:a9890c586a64 222 printf(" ");
TickTock 4:a3cd26c97b76 223 do {
TickTock 4:a3cd26c97b76 224 wait(0.1);
TickTock 5:a9890c586a64 225 } while (is_touched()); //Wait for no touch
TickTock 5:a9890c586a64 226
TickTock 4:a3cd26c97b76 227 cls();
TickTock 5:a9890c586a64 228 line(width() -1, height() - 4,width() - 7,height() -4,White); // paint cross
TickTock 5:a9890c586a64 229 line(width() - 4,height() - 1,width() - 4,height() - 7,White);
TickTock 4:a3cd26c97b76 230 locate(pos_x,pos_y);
TickTock 4:a3cd26c97b76 231 printf("press cross");
TickTock 4:a3cd26c97b76 232 locate(pos_x,pos_y + font[2]);
TickTock 4:a3cd26c97b76 233 printf("to calibrate");
TickTock 4:a3cd26c97b76 234 do {
TickTock 4:a3cd26c97b76 235 wait(0.1);
TickTock 5:a9890c586a64 236 } while (!is_touched()); //Wait for touch
TickTock 4:a3cd26c97b76 237 for (i=0; i<5; i++) {
TickTock 5:a9890c586a64 238 do {
TickTock 5:a9890c586a64 239 p = get_touch();
TickTock 5:a9890c586a64 240 } while (p.x==0 && p.y==0);
TickTock 5:a9890c586a64 241 brx0 += p.x;
TickTock 5:a9890c586a64 242 bry0 += p.y;
dreschpe 0:d78b00f167cb 243 }
TickTock 5:a9890c586a64 244 brx0 /= 5;
TickTock 5:a9890c586a64 245 bry0 /= 5;
dreschpe 0:d78b00f167cb 246
dreschpe 2:ef7972c29c0e 247 locate(pos_x, pos_y);
dreschpe 0:d78b00f167cb 248 printf("OK ");
TickTock 5:a9890c586a64 249 printf(" ");
dreschpe 0:d78b00f167cb 250 do {
TickTock 4:a3cd26c97b76 251 wait(0.1);
TickTock 5:a9890c586a64 252 } while (is_touched()); //Wait for no touch
dreschpe 0:d78b00f167cb 253
dreschpe 0:d78b00f167cb 254 cls();
dreschpe 0:d78b00f167cb 255
TickTock 5:a9890c586a64 256 x0_off = ulx0;
TickTock 5:a9890c586a64 257 y0_off = uly0;
TickTock 5:a9890c586a64 258 x0_pp = (brx0-ulx0) / (width() - 6);
TickTock 5:a9890c586a64 259 y0_pp = (bry0-uly0) / (height() - 6);
TickTock 5:a9890c586a64 260
TickTock 5:a9890c586a64 261
TickTock 5:a9890c586a64 262 x1_off = ulx1;
TickTock 5:a9890c586a64 263 y1_off = uly1;
TickTock 5:a9890c586a64 264 x1_pp = (brx1-ulx1) / (width() - 6);
TickTock 5:a9890c586a64 265 y1_pp = (bry1-uly1) / (height() - 6);
TickTock 5:a9890c586a64 266 x_mid = (brx0 + ulx1) / 2;
dreschpe 0:d78b00f167cb 267
dreschpe 0:d78b00f167cb 268 }
dreschpe 0:d78b00f167cb 269
dreschpe 0:d78b00f167cb 270
TickTock 3:3db7309b6146 271 point TOUCH_TFTx2::to_pixel(point a_point) {
dreschpe 0:d78b00f167cb 272 point p;
dreschpe 0:d78b00f167cb 273
TickTock 5:a9890c586a64 274 if (a_point.x < x_mid) { // left screen
TickTock 5:a9890c586a64 275 p.x = (a_point.x - x0_off) / x0_pp + 3;
TickTock 5:a9890c586a64 276 if (p.x > width()-1) p.x = width()-1;
TickTock 5:a9890c586a64 277 p.y = (a_point.y - y0_off) / y0_pp + 3;
TickTock 5:a9890c586a64 278 }else{ // right screen
TickTock 5:a9890c586a64 279 p.x = (a_point.x - x1_off) / x1_pp + 3;
TickTock 5:a9890c586a64 280 if (p.x > width()-1) p.x = 2*width()-1;
TickTock 5:a9890c586a64 281 else p.x += width(); // add width to indicate right screen
TickTock 5:a9890c586a64 282 p.y = (a_point.y - y1_off) / y1_pp + 3;
TickTock 5:a9890c586a64 283 }
TickTock 5:a9890c586a64 284 if (p.x<0) p.x=0;
TickTock 5:a9890c586a64 285 if (p.y<0) p.y=0;
TickTock 5:a9890c586a64 286 if (p.y > height()-1) p.y = height()-1;
TickTock 4:a3cd26c97b76 287 //locate(1,60); //debug
TickTock 4:a3cd26c97b76 288 //printf("x: %d\ty: %d",p.x,p.y);
dreschpe 0:d78b00f167cb 289 return (p);
dreschpe 0:d78b00f167cb 290 }
dreschpe 0:d78b00f167cb 291
TickTock 4:a3cd26c97b76 292 bool TOUCH_TFTx2::is_touched(void) {
TickTock 4:a3cd26c97b76 293 unsigned short y1;
TickTock 4:a3cd26c97b76 294 // read y voltage
TickTock 4:a3cd26c97b76 295 _ym.input(); //y- has to be passive
TickTock 4:a3cd26c97b76 296 _yp.input(); //y+ has to be passive
TickTock 4:a3cd26c97b76 297 _ym.mode(PullUp);
TickTock 4:a3cd26c97b76 298 _yp.mode(PullUp);
TickTock 4:a3cd26c97b76 299 _xp.output();
TickTock 4:a3cd26c97b76 300 _xm.output();
TickTock 4:a3cd26c97b76 301 _xp = 0; //drive x+ low
TickTock 4:a3cd26c97b76 302 _xm = 0; //drive x- low
TickTock 4:a3cd26c97b76 303 AnalogIn Ay(ya); // we have to call the constructor to switch to analog mode
TickTock 4:a3cd26c97b76 304 wait_us(10);
TickTock 4:a3cd26c97b76 305 y1 = Ay.read_u16(); // get y voltage
TickTock 4:a3cd26c97b76 306 return (y1<threshold);
dreschpe 0:d78b00f167cb 307 }