Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TouchPanel.cpp@1:007113101ef7, 2014-01-28 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |