Fork with support for ILI9341 controller

Dependents:   CANary_9341 CANary

Fork of TOUCH_TFTx2 by Tick Tock

Committer:
TickTock
Date:
Sun Feb 17 16:44:06 2013 +0000
Revision:
6:a91b668b058a
Parent:
5:a9890c586a64
Child:
7:9cc43f20e365
Added colors and interrupt driven touch support;

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 6:a91b668b058a 19 #define threshold 0x8000 // 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);
TickTock 6:a91b668b058a 125 wfi(); //enable touchpad input
dreschpe 0:d78b00f167cb 126 return(p);
TickTock 5:a9890c586a64 127 }//*/
dreschpe 0:d78b00f167cb 128
TickTock 3:3db7309b6146 129 void TOUCH_TFTx2::calibrate(void) {
dreschpe 0:d78b00f167cb 130 int i;
TickTock 5:a9890c586a64 131 int ulx0 = 0, uly0 = 0, brx0 = 0, bry0 = 0;
TickTock 5:a9890c586a64 132 int ulx1 = 0, uly1 = 0, brx1 = 0, bry1 = 0;
dreschpe 2:ef7972c29c0e 133 int pos_x, pos_y;
dreschpe 0:d78b00f167cb 134 point p;
TickTock 6:a91b668b058a 135 if(true){ //skip cal for me
TickTock 6:a91b668b058a 136 x0_off = 5570;
TickTock 6:a91b668b058a 137 y0_off = 34030;
TickTock 6:a91b668b058a 138 x0_pp = 80;
TickTock 6:a91b668b058a 139 y0_pp = 108;
TickTock 6:a91b668b058a 140 x1_off = 33700;
TickTock 6:a91b668b058a 141 y1_off = 5780;
TickTock 6:a91b668b058a 142 x1_pp = 82;
TickTock 6:a91b668b058a 143 y1_pp = 108;
TickTock 6:a91b668b058a 144 x_mid = 32500;
TickTock 6:a91b668b058a 145 } else {
TickTock 6:a91b668b058a 146 seldisp=1; // select right display
TickTock 6:a91b668b058a 147 cls();
TickTock 6:a91b668b058a 148 line(0,3,6,3,White);
TickTock 6:a91b668b058a 149 line(3,0,3,6,White);
TickTock 5:a9890c586a64 150
TickTock 6:a91b668b058a 151 // get the center of the screen
TickTock 6:a91b668b058a 152 pos_x = columns() / 2 - 3;
TickTock 6:a91b668b058a 153 pos_x = pos_x * font[1];
TickTock 6:a91b668b058a 154 pos_y = (rows() / 2) - 1;
TickTock 6:a91b668b058a 155 pos_y = pos_y * font[2];
TickTock 6:a91b668b058a 156
TickTock 6:a91b668b058a 157 //calibrate right screen
TickTock 6:a91b668b058a 158 locate(pos_x,pos_y);
TickTock 6:a91b668b058a 159 printf("press cross");
TickTock 6:a91b668b058a 160 locate(pos_x,pos_y + font[2]);
TickTock 6:a91b668b058a 161 printf("to calibrate");
TickTock 6:a91b668b058a 162 do {
TickTock 6:a91b668b058a 163 wait(0.1);
TickTock 6:a91b668b058a 164 } while (!is_touched()); //Wait for touch
TickTock 6:a91b668b058a 165 for (i=0; i<5; i++) {
TickTock 6:a91b668b058a 166 do {
TickTock 6:a91b668b058a 167 p = get_touch();
TickTock 6:a91b668b058a 168 } while (p.x==0 && p.y==0);
TickTock 6:a91b668b058a 169 ulx1 += p.x;
TickTock 6:a91b668b058a 170 uly1 += p.y;
TickTock 6:a91b668b058a 171 }
TickTock 6:a91b668b058a 172 ulx1 /= 5;
TickTock 6:a91b668b058a 173 uly1 /= 5;
TickTock 6:a91b668b058a 174 locate(pos_x,pos_y);
TickTock 6:a91b668b058a 175 printf("OK ");
TickTock 6:a91b668b058a 176 printf(" ");
TickTock 6:a91b668b058a 177 do {
TickTock 6:a91b668b058a 178 wait(0.1);
TickTock 6:a91b668b058a 179 } while (is_touched()); //Wait for no touch
TickTock 6:a91b668b058a 180
TickTock 6:a91b668b058a 181 cls();
TickTock 6:a91b668b058a 182 line(width() -1, height() - 4,width() - 7,height() -4,White); // paint cross
TickTock 6:a91b668b058a 183 line(width() - 4,height() - 1,width() - 4,height() - 7,White);
TickTock 6:a91b668b058a 184 locate(pos_x,pos_y);
TickTock 6:a91b668b058a 185 printf("press cross");
TickTock 6:a91b668b058a 186 locate(pos_x,pos_y + font[2]);
TickTock 6:a91b668b058a 187 printf("to calibrate");
TickTock 6:a91b668b058a 188 do {
TickTock 6:a91b668b058a 189 wait(0.1);
TickTock 6:a91b668b058a 190 } while (!is_touched()); //Wait for touch
TickTock 6:a91b668b058a 191 for (i=0; i<5; i++) {
TickTock 6:a91b668b058a 192 do {
TickTock 6:a91b668b058a 193 p = get_touch();
TickTock 6:a91b668b058a 194 } while (p.x==0 && p.y==0); p = get_touch();
TickTock 6:a91b668b058a 195 brx1 += p.x;
TickTock 6:a91b668b058a 196 bry1 += p.y;
TickTock 6:a91b668b058a 197 }
TickTock 6:a91b668b058a 198 brx1 /= 5;
TickTock 6:a91b668b058a 199 bry1 /= 5;
TickTock 6:a91b668b058a 200
TickTock 6:a91b668b058a 201 locate(pos_x, pos_y);
TickTock 6:a91b668b058a 202 printf("OK ");
TickTock 6:a91b668b058a 203 printf(" ");
TickTock 5:a9890c586a64 204 do {
TickTock 6:a91b668b058a 205 wait(0.1);
TickTock 6:a91b668b058a 206 } while (is_touched()); //Wait for no touch
TickTock 6:a91b668b058a 207
TickTock 6:a91b668b058a 208 cls();
TickTock 6:a91b668b058a 209 seldisp=0; // select left display
TickTock 6:a91b668b058a 210 cls();
TickTock 6:a91b668b058a 211 line(0,3,6,3,White);
TickTock 6:a91b668b058a 212 line(3,0,3,6,White);
TickTock 6:a91b668b058a 213
TickTock 6:a91b668b058a 214 // now calibrate left screen
TickTock 6:a91b668b058a 215 locate(pos_x,pos_y);
TickTock 6:a91b668b058a 216 printf("press cross");
TickTock 6:a91b668b058a 217 locate(pos_x,pos_y + font[2]);
TickTock 6:a91b668b058a 218 printf("to calibrate");
TickTock 6:a91b668b058a 219 do {
TickTock 6:a91b668b058a 220 wait(0.1);
TickTock 6:a91b668b058a 221 } while (!is_touched()); //Wait for touch
TickTock 6:a91b668b058a 222 for (i=0; i<5; i++) {
TickTock 6:a91b668b058a 223 do {
TickTock 6:a91b668b058a 224 p = get_touch();
TickTock 6:a91b668b058a 225 } while (p.x==0 && p.y==0);
TickTock 6:a91b668b058a 226 ulx0 += p.x;
TickTock 6:a91b668b058a 227 uly0 += p.y;
TickTock 6:a91b668b058a 228 }
TickTock 6:a91b668b058a 229 ulx0 /= 5;
TickTock 6:a91b668b058a 230 uly0 /= 5;
TickTock 6:a91b668b058a 231 locate(pos_x,pos_y);
TickTock 6:a91b668b058a 232 printf("OK ");
TickTock 6:a91b668b058a 233 printf(" ");
TickTock 5:a9890c586a64 234 do {
TickTock 6:a91b668b058a 235 wait(0.1);
TickTock 6:a91b668b058a 236 } while (is_touched()); //Wait for no touch
TickTock 6:a91b668b058a 237
TickTock 6:a91b668b058a 238 cls();
TickTock 6:a91b668b058a 239 line(width() -1, height() - 4,width() - 7,height() -4,White); // paint cross
TickTock 6:a91b668b058a 240 line(width() - 4,height() - 1,width() - 4,height() - 7,White);
TickTock 6:a91b668b058a 241 locate(pos_x,pos_y);
TickTock 6:a91b668b058a 242 printf("press cross");
TickTock 6:a91b668b058a 243 locate(pos_x,pos_y + font[2]);
TickTock 6:a91b668b058a 244 printf("to calibrate");
TickTock 6:a91b668b058a 245 do {
TickTock 6:a91b668b058a 246 wait(0.1);
TickTock 6:a91b668b058a 247 } while (!is_touched()); //Wait for touch
TickTock 6:a91b668b058a 248 for (i=0; i<5; i++) {
TickTock 6:a91b668b058a 249 do {
TickTock 6:a91b668b058a 250 p = get_touch();
TickTock 6:a91b668b058a 251 } while (p.x==0 && p.y==0);
TickTock 6:a91b668b058a 252 brx0 += p.x;
TickTock 6:a91b668b058a 253 bry0 += p.y;
TickTock 6:a91b668b058a 254 }
TickTock 6:a91b668b058a 255 brx0 /= 5;
TickTock 6:a91b668b058a 256 bry0 /= 5;
TickTock 6:a91b668b058a 257
TickTock 6:a91b668b058a 258 locate(pos_x, pos_y);
TickTock 6:a91b668b058a 259 printf("OK ");
TickTock 6:a91b668b058a 260 printf(" ");
TickTock 6:a91b668b058a 261 do {
TickTock 6:a91b668b058a 262 wait(0.1);
TickTock 6:a91b668b058a 263 } while (is_touched()); //Wait for no touch
TickTock 6:a91b668b058a 264
TickTock 6:a91b668b058a 265 cls();
TickTock 6:a91b668b058a 266
TickTock 6:a91b668b058a 267 x0_off = ulx0;
TickTock 6:a91b668b058a 268 y0_off = uly0;
TickTock 6:a91b668b058a 269 x0_pp = (brx0-ulx0) / (width() - 6);
TickTock 6:a91b668b058a 270 y0_pp = (bry0-uly0) / (height() - 6);
TickTock 6:a91b668b058a 271
TickTock 6:a91b668b058a 272
TickTock 6:a91b668b058a 273 x1_off = ulx1;
TickTock 6:a91b668b058a 274 y1_off = uly1;
TickTock 6:a91b668b058a 275 x1_pp = (brx1-ulx1) / (width() - 6);
TickTock 6:a91b668b058a 276 y1_pp = (bry1-uly1) / (height() - 6);
TickTock 6:a91b668b058a 277 x_mid = (brx0 + ulx1) / 2;
TickTock 6:a91b668b058a 278 //debug
TickTock 6:a91b668b058a 279 printf("x0_off:%d y0_off:%d x0_pp:%d y0_pp:%d\n",x0_off,y0_off,x0_pp,y0_pp);
TickTock 6:a91b668b058a 280 printf("x1_off:%d y1_off:%d x1_pp:%d y1_pp:%d\n",x1_off,y1_off,x1_pp,y1_pp);
TickTock 6:a91b668b058a 281 printf("x_mid:%d\n",x_mid);
TickTock 4:a3cd26c97b76 282 }
dreschpe 0:d78b00f167cb 283 }
dreschpe 0:d78b00f167cb 284
dreschpe 0:d78b00f167cb 285
TickTock 3:3db7309b6146 286 point TOUCH_TFTx2::to_pixel(point a_point) {
dreschpe 0:d78b00f167cb 287 point p;
dreschpe 0:d78b00f167cb 288
TickTock 5:a9890c586a64 289 if (a_point.x < x_mid) { // left screen
TickTock 5:a9890c586a64 290 p.x = (a_point.x - x0_off) / x0_pp + 3;
TickTock 5:a9890c586a64 291 if (p.x > width()-1) p.x = width()-1;
TickTock 5:a9890c586a64 292 p.y = (a_point.y - y0_off) / y0_pp + 3;
TickTock 5:a9890c586a64 293 }else{ // right screen
TickTock 5:a9890c586a64 294 p.x = (a_point.x - x1_off) / x1_pp + 3;
TickTock 5:a9890c586a64 295 if (p.x > width()-1) p.x = 2*width()-1;
TickTock 5:a9890c586a64 296 else p.x += width(); // add width to indicate right screen
TickTock 5:a9890c586a64 297 p.y = (a_point.y - y1_off) / y1_pp + 3;
TickTock 5:a9890c586a64 298 }
TickTock 5:a9890c586a64 299 if (p.x<0) p.x=0;
TickTock 5:a9890c586a64 300 if (p.y<0) p.y=0;
TickTock 5:a9890c586a64 301 if (p.y > height()-1) p.y = height()-1;
TickTock 4:a3cd26c97b76 302 //locate(1,60); //debug
TickTock 4:a3cd26c97b76 303 //printf("x: %d\ty: %d",p.x,p.y);
dreschpe 0:d78b00f167cb 304 return (p);
dreschpe 0:d78b00f167cb 305 }
dreschpe 0:d78b00f167cb 306
TickTock 4:a3cd26c97b76 307 bool TOUCH_TFTx2::is_touched(void) {
TickTock 4:a3cd26c97b76 308 unsigned short y1;
TickTock 4:a3cd26c97b76 309 // read y voltage
TickTock 6:a91b668b058a 310 _xm.input(); //x- has to be passive
TickTock 6:a91b668b058a 311 _xp.input(); //x+ has to be passive
TickTock 6:a91b668b058a 312 _xm.mode(PullDown);
TickTock 6:a91b668b058a 313 _xp.mode(PullDown);
TickTock 6:a91b668b058a 314 _yp.output();
TickTock 6:a91b668b058a 315 _ym.output();
TickTock 6:a91b668b058a 316 _yp = 1; //drive y+ high
TickTock 6:a91b668b058a 317 _ym = 1; //drive y- high
TickTock 6:a91b668b058a 318 AnalogIn Ay(xa); // we have to call the constructor to switch to analog mode
TickTock 4:a3cd26c97b76 319 wait_us(10);
TickTock 4:a3cd26c97b76 320 y1 = Ay.read_u16(); // get y voltage
TickTock 6:a91b668b058a 321 return (y1>threshold);
dreschpe 0:d78b00f167cb 322 }
TickTock 6:a91b668b058a 323
TickTock 6:a91b668b058a 324 void TOUCH_TFTx2::wfi(void) {
TickTock 6:a91b668b058a 325 _xm.input(); //x- has to be passive
TickTock 6:a91b668b058a 326 _xp.input(); //x+ has to be passive
TickTock 6:a91b668b058a 327 _xm.mode(PullDown);
TickTock 6:a91b668b058a 328 _xp.mode(PullDown);
TickTock 6:a91b668b058a 329 _yp.output();
TickTock 6:a91b668b058a 330 _ym.output();
TickTock 6:a91b668b058a 331 _yp = 1; //drive y+ high
TickTock 6:a91b668b058a 332 _ym = 1; //drive y- high
TickTock 6:a91b668b058a 333 }