Modified copy of Peter Dresche lib using fewer analogue pins for touch panel

Committer:
JonFreeman
Date:
Sat Aug 11 15:30:10 2012 +0000
Revision:
0:ab6e91032412
[mbed] converted /energy_saver/Touch_tft

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 0:ab6e91032412 1 /* mbed library for resistive touch pads
JonFreeman 0:ab6e91032412 2 * uses 4 pins - 2 IO and 2 Analog
JonFreeman 0:ab6e91032412 3
JonFreeman 0:ab6e91032412 4 * c 2011 Peter Drescher - DC2PD
JonFreeman 0:ab6e91032412 5 *
JonFreeman 0:ab6e91032412 6 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
JonFreeman 0:ab6e91032412 7 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
JonFreeman 0:ab6e91032412 8 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
JonFreeman 0:ab6e91032412 9 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
JonFreeman 0:ab6e91032412 10 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
JonFreeman 0:ab6e91032412 11 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
JonFreeman 0:ab6e91032412 12 * THE SOFTWARE.
JonFreeman 0:ab6e91032412 13 */
JonFreeman 0:ab6e91032412 14
JonFreeman 0:ab6e91032412 15
JonFreeman 0:ab6e91032412 16 #include "touch_tft.h"
JonFreeman 0:ab6e91032412 17 #include "mbed.h"
JonFreeman 0:ab6e91032412 18
JonFreeman 0:ab6e91032412 19 #define threshold 0x2000 // threshold to detect pressed
JonFreeman 0:ab6e91032412 20
JonFreeman 0:ab6e91032412 21 touch_tft::touch_tft(PinName xp, PinName xm, PinName yp, PinName ym,
JonFreeman 0:ab6e91032412 22 PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset,const char* name):
JonFreeman 0:ab6e91032412 23 _xp(xp),_xm(xm),_yp(yp),_ym(ym),_ax(xp),_ay(yp),
JonFreeman 0:ab6e91032412 24 SPI_TFT(mosi,miso,sclk,cs,reset,name) {
JonFreeman 0:ab6e91032412 25 xa = xp;
JonFreeman 0:ab6e91032412 26 ya = yp;
JonFreeman 0:ab6e91032412 27
JonFreeman 0:ab6e91032412 28 }
JonFreeman 0:ab6e91032412 29
JonFreeman 0:ab6e91032412 30 point touch_tft::get_touch() {
JonFreeman 0:ab6e91032412 31 unsigned short x1 = 0,x2 = 0, y1 = 0, y2 = 0;
JonFreeman 0:ab6e91032412 32 unsigned int s1 = 0,s2 = 0,d1 , d2;
JonFreeman 0:ab6e91032412 33 point p;
JonFreeman 0:ab6e91032412 34
JonFreeman 0:ab6e91032412 35 do {
JonFreeman 0:ab6e91032412 36 // read y voltage
JonFreeman 0:ab6e91032412 37 _xp.output();
JonFreeman 0:ab6e91032412 38 _xm.output();
JonFreeman 0:ab6e91032412 39 switch (orientation) {
JonFreeman 0:ab6e91032412 40 case(0):
JonFreeman 0:ab6e91032412 41 case(3):
JonFreeman 0:ab6e91032412 42 _xp = 1;
JonFreeman 0:ab6e91032412 43 _xm = 0;
JonFreeman 0:ab6e91032412 44 break;
JonFreeman 0:ab6e91032412 45 case(1):
JonFreeman 0:ab6e91032412 46 case(2):
JonFreeman 0:ab6e91032412 47 _xp = 0;
JonFreeman 0:ab6e91032412 48 _xm = 1;
JonFreeman 0:ab6e91032412 49 break;
JonFreeman 0:ab6e91032412 50 }
JonFreeman 0:ab6e91032412 51 _ym.input(); // y- have to be passive
JonFreeman 0:ab6e91032412 52 AnalogIn Ay(ya); // we have to call the constructor to switch to analog mode
JonFreeman 0:ab6e91032412 53 wait_us(10);
JonFreeman 0:ab6e91032412 54 // y1 = Ay.read_u16(); // get y voltage
JonFreeman 0:ab6e91032412 55 NVIC_DisableIRQ(TIMER3_IRQn);
JonFreeman 0:ab6e91032412 56 y1 = Ay.read_u16(); // get y voltage
JonFreeman 0:ab6e91032412 57 NVIC_EnableIRQ(TIMER3_IRQn);
JonFreeman 0:ab6e91032412 58 d1 = (y1 > y2)? (y1-y2) : (y2-y1);
JonFreeman 0:ab6e91032412 59 if (((y1 < 8000) && (d1 < 2000)) || ((y1 > 8000) && (d1 < 150))) s1 ++;
JonFreeman 0:ab6e91032412 60 else {
JonFreeman 0:ab6e91032412 61 if (s1 > 0) s1 --;
JonFreeman 0:ab6e91032412 62 }
JonFreeman 0:ab6e91032412 63 y2 = y1;
JonFreeman 0:ab6e91032412 64 // debug
JonFreeman 0:ab6e91032412 65 //locate(1,7);
JonFreeman 0:ab6e91032412 66 //printf("d: %4d y: %5d s1: %4d",d1,y1,s1);
JonFreeman 0:ab6e91032412 67
JonFreeman 0:ab6e91032412 68 // read x voltage
JonFreeman 0:ab6e91032412 69 _yp.output();
JonFreeman 0:ab6e91032412 70 _ym.output();
JonFreeman 0:ab6e91032412 71 switch (orientation) {
JonFreeman 0:ab6e91032412 72 case(0):
JonFreeman 0:ab6e91032412 73 case(1):
JonFreeman 0:ab6e91032412 74 _yp = 1;
JonFreeman 0:ab6e91032412 75 _ym = 0;
JonFreeman 0:ab6e91032412 76 break;
JonFreeman 0:ab6e91032412 77 case(2):
JonFreeman 0:ab6e91032412 78 case(3):
JonFreeman 0:ab6e91032412 79 _yp = 0;
JonFreeman 0:ab6e91032412 80 _ym = 1;
JonFreeman 0:ab6e91032412 81 break;
JonFreeman 0:ab6e91032412 82 }
JonFreeman 0:ab6e91032412 83 _xm.input(); // x- have to be passive
JonFreeman 0:ab6e91032412 84 AnalogIn Ax(xa); // we have to call the constructor to switch to analog mode
JonFreeman 0:ab6e91032412 85 wait_us(10);
JonFreeman 0:ab6e91032412 86 // x1 = Ax.read_u16(); // get x voltage
JonFreeman 0:ab6e91032412 87 NVIC_DisableIRQ(TIMER3_IRQn);
JonFreeman 0:ab6e91032412 88 x1 = Ax.read_u16(); // get x voltage
JonFreeman 0:ab6e91032412 89 NVIC_EnableIRQ(TIMER3_IRQn);
JonFreeman 0:ab6e91032412 90 d2 = (x1 > x2)? (x1-x2) : (x2-x1);
JonFreeman 0:ab6e91032412 91 if (((x1 < 8000) && (d2 < 2000)) || ((x1 > 8000) && (d2 < 150))) s2 ++;
JonFreeman 0:ab6e91032412 92 else {
JonFreeman 0:ab6e91032412 93 if (s2 > 0) s2 --;
JonFreeman 0:ab6e91032412 94 }
JonFreeman 0:ab6e91032412 95 x2 = x1;
JonFreeman 0:ab6e91032412 96 // debug
JonFreeman 0:ab6e91032412 97 //locate(1,8);
JonFreeman 0:ab6e91032412 98 //printf("d: %4d x: %5d s2: %4d",d2,x1,s2);
JonFreeman 0:ab6e91032412 99
JonFreeman 0:ab6e91032412 100 } while (s1 < 3 || s2 < 3); // read until we have three samples close together
JonFreeman 0:ab6e91032412 101 switch (orientation) {
JonFreeman 0:ab6e91032412 102 case(0):
JonFreeman 0:ab6e91032412 103 case(2):
JonFreeman 0:ab6e91032412 104 p.y = (x1+x2) / 2; // average of two sample
JonFreeman 0:ab6e91032412 105 p.x = (y1+y2) / 2;
JonFreeman 0:ab6e91032412 106 break;
JonFreeman 0:ab6e91032412 107 case(1):
JonFreeman 0:ab6e91032412 108 case(3):
JonFreeman 0:ab6e91032412 109 p.x = (x1+x2) / 2; // average of two sample
JonFreeman 0:ab6e91032412 110 p.y = (y1+y2) / 2;
JonFreeman 0:ab6e91032412 111 break;
JonFreeman 0:ab6e91032412 112 }
JonFreeman 0:ab6e91032412 113 return(p);
JonFreeman 0:ab6e91032412 114 }
JonFreeman 0:ab6e91032412 115
JonFreeman 0:ab6e91032412 116 void touch_tft::calibrate(void) { // Swap names of calibrate and noncalibrate
JonFreeman 0:ab6e91032412 117 // locate (60,60);
JonFreeman 0:ab6e91032412 118 // printf("x_off %d, y_off %d", x_off, y_off);
JonFreeman 0:ab6e91032412 119 // locate (60,80);
JonFreeman 0:ab6e91032412 120 // printf("pp_tx %d, pp_ty %d", pp_tx, pp_ty);
JonFreeman 0:ab6e91032412 121 x_off = 9344;
JonFreeman 0:ab6e91032412 122 y_off = 9105;
JonFreeman 0:ab6e91032412 123 pp_tx = 145;
JonFreeman 0:ab6e91032412 124 pp_ty = 194;
JonFreeman 0:ab6e91032412 125 }
JonFreeman 0:ab6e91032412 126
JonFreeman 0:ab6e91032412 127 void touch_tft::noncalibrate(void) {
JonFreeman 0:ab6e91032412 128 int i;
JonFreeman 0:ab6e91032412 129 int a = 0,b = 0,c = 0, d = 0;
JonFreeman 0:ab6e91032412 130 int pos_x, pos_y;
JonFreeman 0:ab6e91032412 131 point p;
JonFreeman 0:ab6e91032412 132
JonFreeman 0:ab6e91032412 133 cls();
JonFreeman 0:ab6e91032412 134 line(0,3,6,3,White);
JonFreeman 0:ab6e91032412 135 line(3,0,3,6,White);
JonFreeman 0:ab6e91032412 136
JonFreeman 0:ab6e91032412 137 // get the center of the screen
JonFreeman 0:ab6e91032412 138 pos_x = columns() / 2 - 3;
JonFreeman 0:ab6e91032412 139 pos_x = pos_x * font[1];
JonFreeman 0:ab6e91032412 140 pos_y = (rows() / 2) - 1;
JonFreeman 0:ab6e91032412 141 pos_y = pos_y * font[2];
JonFreeman 0:ab6e91032412 142
JonFreeman 0:ab6e91032412 143 locate(pos_x,pos_y);
JonFreeman 0:ab6e91032412 144 printf("press cross");
JonFreeman 0:ab6e91032412 145 locate(pos_x,pos_y + font[2]);
JonFreeman 0:ab6e91032412 146 printf("to calibrate");
JonFreeman 0:ab6e91032412 147 for (i=0; i<5; i++) {
JonFreeman 0:ab6e91032412 148 do {
JonFreeman 0:ab6e91032412 149 p = get_touch();
JonFreeman 0:ab6e91032412 150 } while (p.x < 0x2000 | p.y < 0x2000); // wait for touch
JonFreeman 0:ab6e91032412 151 a += p.x;
JonFreeman 0:ab6e91032412 152 b += p.y;
JonFreeman 0:ab6e91032412 153 }
JonFreeman 0:ab6e91032412 154 a = a / 5;
JonFreeman 0:ab6e91032412 155 b = b / 5;
JonFreeman 0:ab6e91032412 156 locate(pos_x,pos_y);
JonFreeman 0:ab6e91032412 157 printf("OK ");
JonFreeman 0:ab6e91032412 158 do {
JonFreeman 0:ab6e91032412 159 p = get_touch();
JonFreeman 0:ab6e91032412 160 } while (p.y > 0x2000 | p.x > 0x2000); // wait for no touch
JonFreeman 0:ab6e91032412 161
JonFreeman 0:ab6e91032412 162 cls();
JonFreeman 0:ab6e91032412 163 line(width() -5, height() - 8,width() - 5,height() -1,White); // paint cross
JonFreeman 0:ab6e91032412 164 line(width() - 8,height() - 5,width() - 1,height() - 5,White);
JonFreeman 0:ab6e91032412 165 locate(pos_x,pos_y);
JonFreeman 0:ab6e91032412 166 printf("press cross");
JonFreeman 0:ab6e91032412 167 locate(pos_x,pos_y + font[2]);
JonFreeman 0:ab6e91032412 168 printf("to calibrate");
JonFreeman 0:ab6e91032412 169 for (i=0; i<5; i++) {
JonFreeman 0:ab6e91032412 170 do {
JonFreeman 0:ab6e91032412 171 p = get_touch();
JonFreeman 0:ab6e91032412 172 } while (p.y < 0x2000 | p.x < 0x2000); // wait for touch
JonFreeman 0:ab6e91032412 173 c+= p.x;
JonFreeman 0:ab6e91032412 174 d+= p.y;
JonFreeman 0:ab6e91032412 175 }
JonFreeman 0:ab6e91032412 176 c = c / 5;
JonFreeman 0:ab6e91032412 177 d = d / 5;
JonFreeman 0:ab6e91032412 178
JonFreeman 0:ab6e91032412 179 locate(pos_x, pos_y);
JonFreeman 0:ab6e91032412 180 printf("OK ");
JonFreeman 0:ab6e91032412 181 do {
JonFreeman 0:ab6e91032412 182 p = get_touch();
JonFreeman 0:ab6e91032412 183 } while (p.y > 0x2000 | p.x > 0x2000); // wait for no touch
JonFreeman 0:ab6e91032412 184
JonFreeman 0:ab6e91032412 185 x_off = a;
JonFreeman 0:ab6e91032412 186 y_off = b;
JonFreeman 0:ab6e91032412 187
JonFreeman 0:ab6e91032412 188 i = c-a; // delta x
JonFreeman 0:ab6e91032412 189 pp_tx = i / (width() - 6);
JonFreeman 0:ab6e91032412 190
JonFreeman 0:ab6e91032412 191 i = d-b; // delta y
JonFreeman 0:ab6e91032412 192 pp_ty = i / (height() - 6);
JonFreeman 0:ab6e91032412 193
JonFreeman 0:ab6e91032412 194 // locate (60,60);
JonFreeman 0:ab6e91032412 195 // printf("x_off %d, y_off %d", x_off, y_off);
JonFreeman 0:ab6e91032412 196 // locate (60,80);
JonFreeman 0:ab6e91032412 197 // printf("pp_tx %d, pp_ty %d", pp_tx, pp_ty);
JonFreeman 0:ab6e91032412 198 // wait (15);
JonFreeman 0:ab6e91032412 199
JonFreeman 0:ab6e91032412 200 // cls();
JonFreeman 0:ab6e91032412 201 }
JonFreeman 0:ab6e91032412 202
JonFreeman 0:ab6e91032412 203
JonFreeman 0:ab6e91032412 204 point touch_tft::to_pixel(point a_point) {
JonFreeman 0:ab6e91032412 205 point p;
JonFreeman 0:ab6e91032412 206
JonFreeman 0:ab6e91032412 207 p.x = (a_point.x - x_off) / pp_tx;
JonFreeman 0:ab6e91032412 208 if (p.x > width()) p.x = width();
JonFreeman 0:ab6e91032412 209 p.y = (a_point.y - y_off) / pp_ty;
JonFreeman 0:ab6e91032412 210 if (p.y > height()) p.y = height();
JonFreeman 0:ab6e91032412 211 return (p);
JonFreeman 0:ab6e91032412 212 }
JonFreeman 0:ab6e91032412 213
JonFreeman 0:ab6e91032412 214 bool touch_tft::is_touched(point a) {
JonFreeman 0:ab6e91032412 215 if (a.x > threshold & a.y > threshold) return(true);
JonFreeman 0:ab6e91032412 216 else return(false);
JonFreeman 0:ab6e91032412 217 }