A general demonstration color etch-a-sketch program using the QVGA TFT with HX8347D controller, Orange Board. Saves touchscreen calibaration data saved in tft.ini. Creates /local/tft.ini if missing. Also included is an Ethernet NTP client to update the RTC. Assumes all other Orange Board devices attached: Text LCD, SDHC Flash, Ethernet.

Dependencies:   EthernetNetIf TextLCD mbed

Committer:
loopsva
Date:
Mon Aug 01 16:29:58 2011 +0000
Revision:
0:e065ca40f28a
Inititial Release

Who changed what in which revision?

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