Modified copy of Peter Dresche lib using fewer analogue pins for touch panel
touch_tft.cpp@0:ab6e91032412, 2012-08-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |