Library for SeeedStudioTFTv2 2.8 Zoll 240x360 pixel touch SD card

Dependencies:   SPI_TFT_ILI9341

Dependents:   SeeedStudioTFTv2_HelloWorld SeeedTouchLCD Seeed_TFT_Touch_Shield_v2_HelloWorld

Fork of SeeedStudioTFTv2 by Michael Ammann

Revision:
4:4542d1ff81e4
Child:
5:366bdc7a8315
--- /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;
+}