seed
Fork of SeeedStudioTFTv2 by
Diff: SeeedStudioTFTv2.cpp
- Revision:
- 4:4542d1ff81e4
- Child:
- 5:366bdc7a8315
diff -r 1e05b273008a -r 4542d1ff81e4 SeeedStudioTFTv2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SeeedStudioTFTv2.cpp Sat Oct 19 20:51:48 2013 +0000 @@ -0,0 +1,193 @@ +/* mbed library for resistive touch pads + * uses 4 pins - 2 IO and 2 Analog + + * c 2011 Peter Drescher - DC2PD + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "mbed.h" +#include "SeeedStudioTFTv2.h" + +SeeedStudioTFTv2::SeeedStudioTFTv2(PinName xp, PinName xm, PinName yp, PinName ym, + PinName mosi, PinName miso, PinName sclk, + PinName csTft, PinName rstTft, PinName dcTft, PinName blTft, + PinName csSd): + SPI_TFT_ILI9341(mosi,miso,sclk,csTft,rstTft,dcTft, "tft") +#ifdef USE_SDCARD + ,SDFileSystem(mosi,miso,sclk,csSd, "sdc") +#endif +{ +#ifndef USE_SDCARD + // sd card + DigitalOut cs(csSd); + cs = 1; +#endif + // backlight + DigitalOut bl(blTft); + bl = 1; + // touch screen pins + _xp = xp; + _yp = yp; + _xm = xm; + _ym = ym; + // default touch calibration + // orientation // 0 1 2 3 + x_off = 108000; // 17252 16605 108755 108000 + y_off = 22000; // 22330 105819 97167 22000 + pp_tx = -291; // 378 289 -390 -291 + pp_ty = 356; // 261 -355 -239 356 +} + +int SeeedStudioTFTv2::readTouch(PinName p, PinName m, PinName a, PinName i) +{ + DigitalOut _p(p); + _p = 1; + DigitalOut _m(m); + _m = 0; + AnalogIn _a(a); + DigitalIn _i(i); + wait_us(10); + return _a.read_u16(); +} + +SeeedStudioTFTv2::TOUCH SeeedStudioTFTv2::getTouch(point& p) +{ + int y2 = readTouch(_xp,_xm,_yp,_ym); + int x2 = readTouch(_yp,_ym,_xp,_xm); + int y1 = readTouch(_xp,_xm,_yp,_ym); + int x1 = readTouch(_yp,_ym,_xp,_xm); + int xd = x1 - x2; + int yd = y1 - y2; + xd = (xd > 0) ? xd : -xd; + yd = (yd > 0) ? xd : -xd; + p.x = x1 + x2; + p.y = y1 + y2; +#if 0 + DigitalOut _p(_xp); + _p = 1; + DigitalOut _m(_ym); + _m = 0; + AnalogIn _ax(_xm); + AnalogIn _ay(_yp); + wait_us(20); + int ax = _ax.read_u16(); + int ay = _ay.read_u16(); + float z = 0; + z = (float)ay / ax / x / 2 * 0x10000; +#endif + const int th = 8000; + const int df = 100; + TOUCH touch; + if (x1 < th || x2 < th || + y1 < th || y2 < th) { + p.x = 0; + p.y = 0; + touch = NO; + } else if (xd > df || yd > df) { + touch = MAYBE; + } else { + touch = YES; + } + //locate(0,50); + //printf("x: %6i y: %6i",p.x,p.y); + return touch; +} + +void SeeedStudioTFTv2::calibrate(void) +{ + int i; + int a = 0,b = 0,c = 0, d = 0; + int pos_x, pos_y; + point p; + + cls(); + foreground(White); // set chars to white + line(0,3,6,3,White); + line(3,0,3,6,White); + // get the center of the screen + pos_x = columns() / 2 - 3; + pos_x = pos_x * font[1]; + pos_y = (rows() / 2) - 1; + pos_y = pos_y * font[2]; + locate(pos_x,pos_y); + printf("press cross "); + locate(pos_x,pos_y + font[2]); + printf("to calibrate "); + for (i=0; i<5; i++) { + while (getTouch(p) != YES) + /*nothing*/; + a += p.x; + b += p.y; + } + a = a / 5; + b = b / 5; + locate(pos_x,pos_y); + printf("ok "); + locate(pos_x,pos_y + font[2]); + printf("release touch "); + while (getTouch(p) != NO) + /*nothing*/; + cls(); + line(width() -5, height() - 8,width() - 5,height() -1,White); // paint cross + line(width() - 8,height() - 5,width() - 1,height() - 5,White); + locate(pos_x,pos_y); + printf("press cross "); + locate(pos_x,pos_y + font[2]); + printf("to calibrate "); + for (i=0; i<5; i++) { + while (getTouch(p) != YES) + /*nothing*/; + c+= p.x; + d+= p.y; + } + c = c / 5; + d = d / 5; + locate(pos_x, pos_y); + + x_off = a; + y_off = b; + i = c-a; // delta x + pp_tx = i / (width() - 6); + i = d-b; // delta y + pp_ty = i / (height() - 6); + + locate(pos_x,pos_y); + printf("Calibrated "); + locate(pos_x,pos_y + font[2]); + printf("x %6i %4i", x_off, pp_tx); + locate(pos_x,pos_y + 2*font[2]); + printf("y %6i %4i", y_off, pp_ty); + while (getTouch(p) != NO) + /*nothing*/; + cls(); +} + +point SeeedStudioTFTv2::toPixel(point p) +{ + p.x -= x_off; + p.x /= pp_tx; + int w = width(); + if (p.x > w) p.x = w; + if (p.x < 0) p.x = 0; + p.y -= y_off; + p.y /= pp_ty; + int h = height(); + if (p.y > h) p.y = h; + if (p.y < 0) p.y = 0; + return (p); +} + +bool SeeedStudioTFTv2::getPixel(point& p) +{ + TOUCH touch = getTouch(p); + p = toPixel(p); + return touch == YES; +}