Mario Poneder / TFT_TouchPanel
Committer:
MarioPoneder
Date:
Tue Jan 28 10:55:53 2014 +0000
Revision:
0:e38c94c549f4
Child:
1:007113101ef7
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MarioPoneder 0:e38c94c549f4 1 /***************************************************************************//**
MarioPoneder 0:e38c94c549f4 2 * @file TouchPanel.cpp
MarioPoneder 0:e38c94c549f4 3 * @brief Implementation of the touch panel driver for the
MarioPoneder 0:e38c94c549f4 4 * TFT color display MI0283QT-9A (320x240).
MarioPoneder 0:e38c94c549f4 5 * @author Mario Poneder
MarioPoneder 0:e38c94c549f4 6 * @date 28/01/2013
MarioPoneder 0:e38c94c549f4 7 *******************************************************************************/
MarioPoneder 0:e38c94c549f4 8
MarioPoneder 0:e38c94c549f4 9 /******************************************************************************/
MarioPoneder 0:e38c94c549f4 10 /***************************** Include Files **********************************/
MarioPoneder 0:e38c94c549f4 11 /******************************************************************************/
MarioPoneder 0:e38c94c549f4 12 #include "TouchPanel.h"
MarioPoneder 0:e38c94c549f4 13
MarioPoneder 0:e38c94c549f4 14 /***************************************************************************//**
MarioPoneder 0:e38c94c549f4 15 * @brief Creates an instance of the TouchPanel class. Each of the following
MarioPoneder 0:e38c94c549f4 16 * pins has to be connected to an AnalogIn pin.
MarioPoneder 0:e38c94c549f4 17 *
MarioPoneder 0:e38c94c549f4 18 * @param xPos X+
MarioPoneder 0:e38c94c549f4 19 * @param xNeg X-
MarioPoneder 0:e38c94c549f4 20 * @param yPos Y+
MarioPoneder 0:e38c94c549f4 21 * @param yNeg Y-
MarioPoneder 0:e38c94c549f4 22 *******************************************************************************/
MarioPoneder 0:e38c94c549f4 23 TouchPanel::TouchPanel(PinName xPos, PinName xNeg, PinName yPos, PinName yNeg)
MarioPoneder 0:e38c94c549f4 24 {
MarioPoneder 0:e38c94c549f4 25 this->xPos = xPos;
MarioPoneder 0:e38c94c549f4 26 this->xNeg = xNeg;
MarioPoneder 0:e38c94c549f4 27 this->yPos = yPos;
MarioPoneder 0:e38c94c549f4 28 this->yNeg = yNeg;
MarioPoneder 0:e38c94c549f4 29 this->xy = true;
MarioPoneder 0:e38c94c549f4 30 }
MarioPoneder 0:e38c94c549f4 31
MarioPoneder 0:e38c94c549f4 32 /***************************************************************************//**
MarioPoneder 0:e38c94c549f4 33 * @brief Calls the PollPanel method in specified intervals.
MarioPoneder 0:e38c94c549f4 34 *
MarioPoneder 0:e38c94c549f4 35 * @param touchCallbackFunction Pointer to the touch callback function,
MarioPoneder 0:e38c94c549f4 36 * which has to take the parameters 'x' and
MarioPoneder 0:e38c94c549f4 37 * 'y' and gets called when a touch was detected.
MarioPoneder 0:e38c94c549f4 38 *
MarioPoneder 0:e38c94c549f4 39 * @return None.
MarioPoneder 0:e38c94c549f4 40 *******************************************************************************/
MarioPoneder 0:e38c94c549f4 41 void TouchPanel::SetTouchCallbackFunction(pTouchCallback_t touchCallbackFunction)
MarioPoneder 0:e38c94c549f4 42 {
MarioPoneder 0:e38c94c549f4 43 this->touchCallbackFunction = touchCallbackFunction;
MarioPoneder 0:e38c94c549f4 44 this->PrepareYRead();
MarioPoneder 0:e38c94c549f4 45 this->pollPanelTicker.attach(this, &TouchPanel::PollPanel, POLLING_INVERVAL);
MarioPoneder 0:e38c94c549f4 46 }
MarioPoneder 0:e38c94c549f4 47
MarioPoneder 0:e38c94c549f4 48 /***************************************************************************//**
MarioPoneder 0:e38c94c549f4 49 * @brief Prepares the touch panel and the software in order read the
MarioPoneder 0:e38c94c549f4 50 * Y coordinate.
MarioPoneder 0:e38c94c549f4 51 *
MarioPoneder 0:e38c94c549f4 52 * @return None.
MarioPoneder 0:e38c94c549f4 53 *******************************************************************************/
MarioPoneder 0:e38c94c549f4 54 void TouchPanel::PrepareYRead(void)
MarioPoneder 0:e38c94c549f4 55 {
MarioPoneder 0:e38c94c549f4 56 delete yPosOut;
MarioPoneder 0:e38c94c549f4 57 delete yNegOut;
MarioPoneder 0:e38c94c549f4 58 delete xPosIn;
MarioPoneder 0:e38c94c549f4 59 delete xNegIn;
MarioPoneder 0:e38c94c549f4 60 xPosOut = new DigitalOut(xPos);
MarioPoneder 0:e38c94c549f4 61 xNegOut = new DigitalOut(xNeg);
MarioPoneder 0:e38c94c549f4 62 xPosOut->write(1);
MarioPoneder 0:e38c94c549f4 63 xNegOut->write(0);
MarioPoneder 0:e38c94c549f4 64 yPosIn = new AnalogIn(yPos);
MarioPoneder 0:e38c94c549f4 65 yNegIn = new AnalogIn(yNeg);
MarioPoneder 0:e38c94c549f4 66 }
MarioPoneder 0:e38c94c549f4 67
MarioPoneder 0:e38c94c549f4 68 /***************************************************************************//**
MarioPoneder 0:e38c94c549f4 69 * @brief Prepares the touch panel and the software in order read the
MarioPoneder 0:e38c94c549f4 70 * X coordinate.
MarioPoneder 0:e38c94c549f4 71 *
MarioPoneder 0:e38c94c549f4 72 * @return None.
MarioPoneder 0:e38c94c549f4 73 *******************************************************************************/
MarioPoneder 0:e38c94c549f4 74 void TouchPanel::PrepareXRead(void)
MarioPoneder 0:e38c94c549f4 75 {
MarioPoneder 0:e38c94c549f4 76 delete xPosOut;
MarioPoneder 0:e38c94c549f4 77 delete xNegOut;
MarioPoneder 0:e38c94c549f4 78 delete yPosIn;
MarioPoneder 0:e38c94c549f4 79 delete yNegIn;
MarioPoneder 0:e38c94c549f4 80 yPosOut = new DigitalOut(yPos);
MarioPoneder 0:e38c94c549f4 81 yNegOut = new DigitalOut(yNeg);
MarioPoneder 0:e38c94c549f4 82 yPosOut->write(1);
MarioPoneder 0:e38c94c549f4 83 yNegOut->write(0);
MarioPoneder 0:e38c94c549f4 84 xPosIn = new AnalogIn(xPos);
MarioPoneder 0:e38c94c549f4 85 xNegIn = new AnalogIn(xNeg);
MarioPoneder 0:e38c94c549f4 86 }
MarioPoneder 0:e38c94c549f4 87
MarioPoneder 0:e38c94c549f4 88 /***************************************************************************//**
MarioPoneder 0:e38c94c549f4 89 * @brief Alternately reads the touch panel's X or Y coordinate and calls the
MarioPoneder 0:e38c94c549f4 90 * touch callback function, which has to take the parameters
MarioPoneder 0:e38c94c549f4 91 * 'x' and 'y', when a touch was detected.
MarioPoneder 0:e38c94c549f4 92 *
MarioPoneder 0:e38c94c549f4 93 * @return None.
MarioPoneder 0:e38c94c549f4 94 *******************************************************************************/
MarioPoneder 0:e38c94c549f4 95 void TouchPanel::PollPanel(void)
MarioPoneder 0:e38c94c549f4 96 {
MarioPoneder 0:e38c94c549f4 97 static float yp, yn, xp, xn;
MarioPoneder 0:e38c94c549f4 98 static unsigned short x = NO_TOUCH_VAL;
MarioPoneder 0:e38c94c549f4 99 static unsigned short y = NO_TOUCH_VAL;
MarioPoneder 0:e38c94c549f4 100 static bool newTouch = true;
MarioPoneder 0:e38c94c549f4 101
MarioPoneder 0:e38c94c549f4 102 if(this->xy) {
MarioPoneder 0:e38c94c549f4 103 yp = yPosIn->read();
MarioPoneder 0:e38c94c549f4 104 yn = yNegIn->read();
MarioPoneder 0:e38c94c549f4 105 this->PrepareXRead();
MarioPoneder 0:e38c94c549f4 106 if(fabs(yp - yn) < TOUCH_THRESHOLD) {
MarioPoneder 0:e38c94c549f4 107 yp = HEIGHT * (1 - (yp - BOTTOM) / (TOP - BOTTOM));
MarioPoneder 0:e38c94c549f4 108 if(yp < 0) {
MarioPoneder 0:e38c94c549f4 109 y = 0;
MarioPoneder 0:e38c94c549f4 110 } else if(yp > HEIGHT) {
MarioPoneder 0:e38c94c549f4 111 y = HEIGHT;
MarioPoneder 0:e38c94c549f4 112 } else {
MarioPoneder 0:e38c94c549f4 113 y = yp;
MarioPoneder 0:e38c94c549f4 114 }
MarioPoneder 0:e38c94c549f4 115 } else {
MarioPoneder 0:e38c94c549f4 116 y = NO_TOUCH_VAL;
MarioPoneder 0:e38c94c549f4 117 newTouch = true;
MarioPoneder 0:e38c94c549f4 118 }
MarioPoneder 0:e38c94c549f4 119 } else {
MarioPoneder 0:e38c94c549f4 120 xp = xPosIn->read();
MarioPoneder 0:e38c94c549f4 121 xn = xNegIn->read();
MarioPoneder 0:e38c94c549f4 122 this->PrepareYRead();
MarioPoneder 0:e38c94c549f4 123 if(fabs(xp - xn) < TOUCH_THRESHOLD) {
MarioPoneder 0:e38c94c549f4 124 xp = WIDTH * (xp - LEFT) / (RIGHT - LEFT);
MarioPoneder 0:e38c94c549f4 125 if(xp < 0) {
MarioPoneder 0:e38c94c549f4 126 x = 0;
MarioPoneder 0:e38c94c549f4 127 } else if(xp > WIDTH) {
MarioPoneder 0:e38c94c549f4 128 x = WIDTH;
MarioPoneder 0:e38c94c549f4 129 } else {
MarioPoneder 0:e38c94c549f4 130 x = xp;
MarioPoneder 0:e38c94c549f4 131 }
MarioPoneder 0:e38c94c549f4 132 } else {
MarioPoneder 0:e38c94c549f4 133 x = NO_TOUCH_VAL;
MarioPoneder 0:e38c94c549f4 134 newTouch = true;
MarioPoneder 0:e38c94c549f4 135 }
MarioPoneder 0:e38c94c549f4 136 }
MarioPoneder 0:e38c94c549f4 137 this->xy = !this->xy;
MarioPoneder 0:e38c94c549f4 138 if(x != NO_TOUCH_VAL && y != NO_TOUCH_VAL && newTouch && x > 0) {
MarioPoneder 0:e38c94c549f4 139 newTouch = false;
MarioPoneder 0:e38c94c549f4 140 this->touchCallbackFunction(x, y);
MarioPoneder 0:e38c94c549f4 141 }
MarioPoneder 0:e38c94c549f4 142 }