Modified to work with two displays

Dependents:   touch2 default CANary_9341_test CANary_merge

Fork of Touch_tft by Peter Drescher

Committer:
TickTock
Date:
Sat Mar 02 15:09:10 2013 +0000
Revision:
9:b322eddc57c7
Parent:
8:fd0abf6a7f59
Removed cal bypass for public consumption

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