Mario Poneder / TFT_TouchPanel
Committer:
MarioPoneder
Date:
Tue Jan 28 13:16:36 2014 +0000
Revision:
1:007113101ef7
Parent:
0:e38c94c549f4
good doc

Who changed what in which revision?

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