Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.

Dependents:   FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more

Fork of SPI_TFT by Peter Drescher

See Components - RA8875 Based Display

Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.

Offline Help Manual (Windows chm)

/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)

Committer:
WiredHome
Date:
Sun Apr 04 20:14:06 2021 +0000
Revision:
209:08fc22dea762
Parent:
206:83edda283d90
Fix a long-standing defect in the FT5206 where it reported 'touch' code even for hold and release events.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 78:faf49c381591 1 /// This file contains the RA8875 Touch panel methods.
WiredHome 78:faf49c381591 2 ///
WiredHome 124:1690a7ae871c 3 /// It combines both resistive and capacitive touch methods, and tries
WiredHome 124:1690a7ae871c 4 /// to make them nearly transparent alternates for each other.
WiredHome 124:1690a7ae871c 5 ///
WiredHome 78:faf49c381591 6 #include "RA8875.h"
WiredHome 165:695c24cc5197 7 #include "RA8875_Touch_FT5206.h"
WiredHome 165:695c24cc5197 8 #include "RA8875_Touch_GSL1680.h"
WiredHome 78:faf49c381591 9
WiredHome 83:7bad0068cca0 10 #define NOTOUCH_TIMEOUT_uS 100000
WiredHome 83:7bad0068cca0 11 #define TOUCH_TICKER_uS 1000
WiredHome 83:7bad0068cca0 12
WiredHome 171:f92c0f1f6db4 13 //#define DEBUG "TUCH"
WiredHome 154:ad2450fc3dc3 14 // ...
WiredHome 154:ad2450fc3dc3 15 // INFO("Stuff to show %d", var); // new-line is automatically appended
WiredHome 154:ad2450fc3dc3 16 //
WiredHome 154:ad2450fc3dc3 17 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 197:853d08e2fb53 18 #define INFO(x, ...) std::printf("[INF %s %4d] " x "\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 197:853d08e2fb53 19 #define WARN(x, ...) std::printf("[WRN %s %4d] " x "\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 197:853d08e2fb53 20 #define ERR(x, ...) std::printf("[ERR %s %4d] " x "\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 154:ad2450fc3dc3 21 static void HexDump(const char * title, const uint8_t * p, int count)
WiredHome 154:ad2450fc3dc3 22 {
WiredHome 154:ad2450fc3dc3 23 int i;
WiredHome 154:ad2450fc3dc3 24 char buf[100] = "0000: ";
WiredHome 154:ad2450fc3dc3 25
WiredHome 154:ad2450fc3dc3 26 if (*title)
WiredHome 154:ad2450fc3dc3 27 INFO("%s", title);
WiredHome 154:ad2450fc3dc3 28 for (i=0; i<count; ) {
WiredHome 154:ad2450fc3dc3 29 sprintf(buf + strlen(buf), "%02X ", *(p+i));
WiredHome 154:ad2450fc3dc3 30 if ((++i & 0x0F) == 0x00) {
WiredHome 154:ad2450fc3dc3 31 INFO("%s", buf);
WiredHome 154:ad2450fc3dc3 32 if (i < count)
WiredHome 154:ad2450fc3dc3 33 sprintf(buf, "%04X: ", i);
WiredHome 154:ad2450fc3dc3 34 else
WiredHome 154:ad2450fc3dc3 35 buf[0] = '\0';
WiredHome 154:ad2450fc3dc3 36 }
WiredHome 154:ad2450fc3dc3 37 }
WiredHome 154:ad2450fc3dc3 38 if (strlen(buf))
WiredHome 154:ad2450fc3dc3 39 INFO("%s", buf);
WiredHome 154:ad2450fc3dc3 40 }
WiredHome 154:ad2450fc3dc3 41 #else
WiredHome 154:ad2450fc3dc3 42 #define INFO(x, ...)
WiredHome 154:ad2450fc3dc3 43 #define WARN(x, ...)
WiredHome 154:ad2450fc3dc3 44 #define ERR(x, ...)
WiredHome 154:ad2450fc3dc3 45 #define HexDump(a, b, c)
WiredHome 154:ad2450fc3dc3 46 #endif
WiredHome 154:ad2450fc3dc3 47
WiredHome 124:1690a7ae871c 48
WiredHome 78:faf49c381591 49 RetCode_t RA8875::TouchPanelInit(void)
WiredHome 78:faf49c381591 50 {
WiredHome 157:1565f38ca44b 51 RetCode_t r = noerror;
WiredHome 190:3132b7dfad82 52
WiredHome 205:f215dc32736b 53 m_irq->disable_irq(); // ensure disabled while configuring it
WiredHome 124:1690a7ae871c 54 panelTouched = false;
WiredHome 165:695c24cc5197 55 if (useTouchPanel == TP_GSL1680) {
WiredHome 165:695c24cc5197 56 INFO("TouchPanelInit: TP_GSL1680");
WiredHome 169:1c1a495983bc 57 r = GSL1680_Init();
WiredHome 165:695c24cc5197 58 } else if (useTouchPanel == TP_FT5206) {
WiredHome 124:1690a7ae871c 59 // Set to normal mode
WiredHome 165:695c24cc5197 60 INFO("TouchPanelInit: TP_FT5206");
WiredHome 165:695c24cc5197 61 r = FT5206_Init();
WiredHome 124:1690a7ae871c 62 } else {
WiredHome 155:b3f225ae572c 63 INFO("TouchPanelInit: TP_RES");
WiredHome 197:853d08e2fb53 64 //RA8875_TPCR0: Set enable bit, default sample time, wakeup, and ADC clock
WiredHome 193:74f80834d59d 65 WriteCommand(RA8875_TPCR0, TP_ENABLE | TP_ADC_SAMPLE_DEFAULT_CLKS | TP_ADC_CLKDIV_DEFAULT);
WiredHome 197:853d08e2fb53 66 // RA8875_TPCR1: Set auto/manual, Ref voltage, debounce, manual mode params
WiredHome 193:74f80834d59d 67 WriteCommand(RA8875_TPCR1, TP_MODE_DEFAULT | TP_DEBOUNCE_DEFAULT);
WiredHome 193:74f80834d59d 68 WriteCommand(RA8875_INTC1, ReadCommand(RA8875_INTC1) | RA8875_INT_TP); // reg RA8875_INTC1: Enable Touch Panel Interrupts (D2 = 1)
WiredHome 193:74f80834d59d 69 WriteCommand(RA8875_INTC2, RA8875_INT_TP); // reg RA8875_INTC2: Clear any TP interrupt flag
WiredHome 124:1690a7ae871c 70 touchSample = 0;
WiredHome 124:1690a7ae871c 71 touchState = no_cal;
WiredHome 193:74f80834d59d 72 #if 0
WiredHome 181:0032d1b8f5d4 73 #if (MBED_MAJOR_VERSION >= 5) || (MBED_LIBRARY_VERSION > 127)
WiredHome 145:5eb2492acdda 74 touchTicker.attach_us(callback(this, &RA8875::_TouchTicker), TOUCH_TICKER_uS);
WiredHome 150:35a4db3081c1 75 #else
WiredHome 150:35a4db3081c1 76 touchTicker.attach_us(this, &RA8875::_TouchTicker, TOUCH_TICKER_uS);
WiredHome 150:35a4db3081c1 77 #endif
WiredHome 193:74f80834d59d 78 #endif
WiredHome 165:695c24cc5197 79 timeSinceTouch.start();
WiredHome 165:695c24cc5197 80 timeSinceTouch.reset();
WiredHome 157:1565f38ca44b 81 r = _internal_ts_cal();
WiredHome 83:7bad0068cca0 82 }
WiredHome 205:f215dc32736b 83 m_irq->enable_irq();
WiredHome 157:1565f38ca44b 84 return r;
WiredHome 78:faf49c381591 85 }
WiredHome 78:faf49c381591 86
WiredHome 124:1690a7ae871c 87
WiredHome 124:1690a7ae871c 88 RetCode_t RA8875::TouchPanelInit(uint8_t bTpEnable, uint8_t bTpAutoManual, uint8_t bTpDebounce, uint8_t bTpManualMode, uint8_t bTpAdcClkDiv, uint8_t bTpAdcSampleTime)
WiredHome 124:1690a7ae871c 89 {
WiredHome 165:695c24cc5197 90 if (useTouchPanel == TP_GSL1680) {
WiredHome 165:695c24cc5197 91 INFO("TouchPanelInit: TP_GSL1680");
WiredHome 165:695c24cc5197 92 } else if (useTouchPanel == TP_FT5206) {
WiredHome 165:695c24cc5197 93 INFO("TouchPanelInit: TP_FT5206");
WiredHome 124:1690a7ae871c 94 TouchPanelInit();
WiredHome 124:1690a7ae871c 95 } else {
WiredHome 155:b3f225ae572c 96 INFO("TouchPanelInit: TP_RES");
WiredHome 205:f215dc32736b 97 m_irq->disable_irq(); // ensure disabled while configuring it
WiredHome 124:1690a7ae871c 98 // Parameter bounds check
WiredHome 124:1690a7ae871c 99 if( \
WiredHome 124:1690a7ae871c 100 !(bTpEnable == TP_ENABLE || bTpEnable == TP_ENABLE) || \
WiredHome 124:1690a7ae871c 101 !(bTpAutoManual == TP_MODE_AUTO || bTpAutoManual == TP_MODE_MANUAL) || \
WiredHome 124:1690a7ae871c 102 !(bTpDebounce == TP_DEBOUNCE_OFF || bTpDebounce == TP_DEBOUNCE_ON) || \
WiredHome 124:1690a7ae871c 103 !(bTpManualMode <= TP_MANUAL_LATCH_Y) || \
WiredHome 124:1690a7ae871c 104 !(bTpAdcClkDiv <= TP_ADC_CLKDIV_128) || \
WiredHome 124:1690a7ae871c 105 !(bTpAdcSampleTime <= TP_ADC_SAMPLE_65536_CLKS) \
WiredHome 124:1690a7ae871c 106 ) return bad_parameter;
WiredHome 197:853d08e2fb53 107 // Construct the config byte for RA8875_TPCR0 and write them
WiredHome 193:74f80834d59d 108 WriteCommand(RA8875_TPCR0, bTpEnable | bTpAdcClkDiv | bTpAdcSampleTime); // Note: Wakeup is never enabled
WiredHome 197:853d08e2fb53 109 // Construct the config byte for RA8875_TPCR1 and write them
WiredHome 193:74f80834d59d 110 WriteCommand(RA8875_TPCR1, bTpDebounce | bTpManualMode); // Note: Always uses internal Vref.
WiredHome 124:1690a7ae871c 111 // Set up the interrupt flag and enable bits
WiredHome 193:74f80834d59d 112 WriteCommand(RA8875_INTC1, ReadCommand(RA8875_INTC1) | RA8875_INT_TP); // reg RA8875_INTC1: Enable Touch Panel Interrupts (D2 = 1)
WiredHome 193:74f80834d59d 113 WriteCommand(RA8875_INTC2, RA8875_INT_TP); // reg RA8875_INTC2: Clear any TP interrupt flag
WiredHome 124:1690a7ae871c 114 touchSample = 0;
WiredHome 124:1690a7ae871c 115 touchState = no_cal;
WiredHome 124:1690a7ae871c 116 if (bTpEnable == TP_ENABLE) {
WiredHome 150:35a4db3081c1 117 //touchTicker.attach_us(callback(this, &RA8875::_TouchTicker), TOUCH_TICKER_uS);
WiredHome 181:0032d1b8f5d4 118 #if (MBED_MAJOR_VERSION >= 5) || (MBED_LIBRARY_VERSION > 127)
WiredHome 145:5eb2492acdda 119 touchTicker.attach_us(callback(this, &RA8875::_TouchTicker), TOUCH_TICKER_uS);
WiredHome 150:35a4db3081c1 120 #else
WiredHome 150:35a4db3081c1 121 touchTicker.attach_us(this, &RA8875::_TouchTicker, TOUCH_TICKER_uS);
WiredHome 150:35a4db3081c1 122 #endif
WiredHome 150:35a4db3081c1 123
WiredHome 165:695c24cc5197 124 timeSinceTouch.start();
WiredHome 165:695c24cc5197 125 timeSinceTouch.reset();
WiredHome 124:1690a7ae871c 126 } else {
WiredHome 124:1690a7ae871c 127 touchTicker.detach();
WiredHome 165:695c24cc5197 128 timeSinceTouch.stop();
WiredHome 124:1690a7ae871c 129 }
WiredHome 157:1565f38ca44b 130 _internal_ts_cal();
WiredHome 205:f215dc32736b 131 m_irq->enable_irq();
WiredHome 124:1690a7ae871c 132 }
WiredHome 124:1690a7ae871c 133 return noerror;
WiredHome 124:1690a7ae871c 134 }
WiredHome 124:1690a7ae871c 135
WiredHome 124:1690a7ae871c 136
WiredHome 124:1690a7ae871c 137 int RA8875::TouchChannels(void)
WiredHome 124:1690a7ae871c 138 {
WiredHome 165:695c24cc5197 139 if (useTouchPanel == TP_GSL1680) {
WiredHome 176:4ab96d33a8ec 140 return GSL1680_TOUCH_POINTS; // based on TP_GSL1680 firmware
WiredHome 165:695c24cc5197 141 } else if (useTouchPanel == TP_FT5206) {
WiredHome 176:4ab96d33a8ec 142 return FT5206_TOUCH_POINTS; // based on the FT5206 hardware
WiredHome 124:1690a7ae871c 143 } else if (useTouchPanel == TP_RES) {
WiredHome 176:4ab96d33a8ec 144 return RESISTIVE_TOUCH_POINTS; // based on the RA8875 resistive touch driver
WiredHome 124:1690a7ae871c 145 } else {
WiredHome 124:1690a7ae871c 146 return 0; // it isn't enabled, so there are none.
WiredHome 124:1690a7ae871c 147 }
WiredHome 124:1690a7ae871c 148 }
WiredHome 124:1690a7ae871c 149
WiredHome 124:1690a7ae871c 150
WiredHome 124:1690a7ae871c 151 // +----------------------------------------------------+
WiredHome 124:1690a7ae871c 152 // | |
WiredHome 124:1690a7ae871c 153 // | 1 |
WiredHome 124:1690a7ae871c 154 // | |
WiredHome 124:1690a7ae871c 155 // | |
WiredHome 124:1690a7ae871c 156 // | 2 |
WiredHome 124:1690a7ae871c 157 // | |
WiredHome 124:1690a7ae871c 158 // | |
WiredHome 124:1690a7ae871c 159 // | 3 |
WiredHome 124:1690a7ae871c 160 // | |
WiredHome 124:1690a7ae871c 161 // +----------------------------------------------------+
WiredHome 81:01da2e34283d 162
WiredHome 81:01da2e34283d 163 RetCode_t RA8875::TouchPanelCalibrate(tpMatrix_t * matrix)
WiredHome 81:01da2e34283d 164 {
WiredHome 81:01da2e34283d 165 return TouchPanelCalibrate(NULL, matrix);
WiredHome 81:01da2e34283d 166 }
WiredHome 81:01da2e34283d 167
WiredHome 88:bfddef6ec836 168 RetCode_t RA8875::TouchPanelCalibrate(const char * msg, tpMatrix_t * matrix, int maxwait_s)
WiredHome 81:01da2e34283d 169 {
WiredHome 81:01da2e34283d 170 point_t pTest[3];
WiredHome 81:01da2e34283d 171 point_t pSample[3];
WiredHome 83:7bad0068cca0 172 int x,y;
WiredHome 88:bfddef6ec836 173 Timer timeout; // timeout guards for not-installed, stuck, user not present...
WiredHome 124:1690a7ae871c 174
WiredHome 88:bfddef6ec836 175 timeout.start();
WiredHome 123:2f45e80fec5f 176 while (TouchPanelA2DFiltered(&x, &y) && timeout.read() < maxwait_s) {
WiredHome 197:853d08e2fb53 177 wait_us(20000);
WiredHome 123:2f45e80fec5f 178 if (idle_callback) {
WiredHome 149:c62c4b2d6a15 179 if (external_abort == (*idle_callback)(touchcal_wait, 0)) {
WiredHome 123:2f45e80fec5f 180 return external_abort;
WiredHome 123:2f45e80fec5f 181 }
WiredHome 123:2f45e80fec5f 182 }
WiredHome 123:2f45e80fec5f 183 }
WiredHome 81:01da2e34283d 184 cls();
WiredHome 157:1565f38ca44b 185 if (msg) { // User defines the message
WiredHome 157:1565f38ca44b 186 if (*msg) puts(msg); // If any
WiredHome 157:1565f38ca44b 187 } else { // Default message
WiredHome 157:1565f38ca44b 188 puts("Touch '+' to calibrate the touch panel");
WiredHome 157:1565f38ca44b 189 }
WiredHome 81:01da2e34283d 190 SetTextCursor(0,height()/2);
WiredHome 124:1690a7ae871c 191 pTest[0].x = 50;
WiredHome 124:1690a7ae871c 192 pTest[0].y = 50;
WiredHome 124:1690a7ae871c 193 pTest[1].x = width() - 50;
WiredHome 124:1690a7ae871c 194 pTest[1].y = height()/2;
WiredHome 124:1690a7ae871c 195 pTest[2].x = width()/2;
WiredHome 124:1690a7ae871c 196 pTest[2].y = height() - 50;
WiredHome 88:bfddef6ec836 197
WiredHome 81:01da2e34283d 198 for (int i=0; i<3; i++) {
WiredHome 81:01da2e34283d 199 foreground(Blue);
WiredHome 81:01da2e34283d 200 printf(" (%3d,%3d) => ", pTest[i].x, pTest[i].y);
WiredHome 157:1565f38ca44b 201 fillcircle(pTest[i].x,pTest[i].y, 20, White);
WiredHome 157:1565f38ca44b 202 line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, Blue);
WiredHome 157:1565f38ca44b 203 line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, Blue);
WiredHome 123:2f45e80fec5f 204 while (!TouchPanelA2DFiltered(&x, &y) && timeout.read() < maxwait_s) {
WiredHome 197:853d08e2fb53 205 wait_us(20000);
WiredHome 123:2f45e80fec5f 206 if (idle_callback) {
WiredHome 149:c62c4b2d6a15 207 if (external_abort == (*idle_callback)(touchcal_wait, 0)) {
WiredHome 123:2f45e80fec5f 208 return external_abort;
WiredHome 123:2f45e80fec5f 209 }
WiredHome 123:2f45e80fec5f 210 }
WiredHome 123:2f45e80fec5f 211 }
WiredHome 81:01da2e34283d 212 pSample[i].x = x;
WiredHome 81:01da2e34283d 213 pSample[i].y = y;
WiredHome 157:1565f38ca44b 214 fillcircle(pTest[i].x,pTest[i].y, 20, Black); // Erase the target
WiredHome 157:1565f38ca44b 215 //line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, Black);
WiredHome 157:1565f38ca44b 216 //line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, Black);
WiredHome 81:01da2e34283d 217 foreground(Blue);
WiredHome 81:01da2e34283d 218 printf(" (%4d,%4d)\r\n", x,y);
WiredHome 123:2f45e80fec5f 219 while (TouchPanelA2DFiltered(&x, &y) && timeout.read() < maxwait_s) {
WiredHome 197:853d08e2fb53 220 wait_us(20000);
WiredHome 123:2f45e80fec5f 221 if (idle_callback) {
WiredHome 149:c62c4b2d6a15 222 if (external_abort == (*idle_callback)(touchcal_wait, 0)) {
WiredHome 123:2f45e80fec5f 223 return external_abort;
WiredHome 123:2f45e80fec5f 224 }
WiredHome 123:2f45e80fec5f 225 }
WiredHome 123:2f45e80fec5f 226 }
WiredHome 123:2f45e80fec5f 227 for (int t=0; t<100; t++) {
WiredHome 197:853d08e2fb53 228 wait_us(20000);
WiredHome 123:2f45e80fec5f 229 if (idle_callback) {
WiredHome 149:c62c4b2d6a15 230 if (external_abort == (*idle_callback)(touchcal_wait, 0)) {
WiredHome 123:2f45e80fec5f 231 return external_abort;
WiredHome 123:2f45e80fec5f 232 }
WiredHome 123:2f45e80fec5f 233 }
WiredHome 123:2f45e80fec5f 234 }
WiredHome 81:01da2e34283d 235 }
WiredHome 88:bfddef6ec836 236 if (timeout.read() >= maxwait_s)
WiredHome 88:bfddef6ec836 237 return touch_cal_timeout;
WiredHome 88:bfddef6ec836 238 else
WiredHome 88:bfddef6ec836 239 return TouchPanelComputeCalibration(pTest, pSample, matrix);
WiredHome 81:01da2e34283d 240 }
WiredHome 81:01da2e34283d 241
WiredHome 81:01da2e34283d 242
WiredHome 81:01da2e34283d 243 /**********************************************************************
WiredHome 81:01da2e34283d 244 *
WiredHome 123:2f45e80fec5f 245 * Function: TouchPanelReadable()
WiredHome 81:01da2e34283d 246 *
WiredHome 81:01da2e34283d 247 */
WiredHome 83:7bad0068cca0 248 TouchCode_t RA8875::TouchPanelReadable(point_t * TouchPoint)
WiredHome 81:01da2e34283d 249 {
WiredHome 124:1690a7ae871c 250 TouchCode_t ts = no_touch;
WiredHome 124:1690a7ae871c 251
WiredHome 165:695c24cc5197 252 if (useTouchPanel == TP_FT5206) {
WiredHome 198:9b6851107426 253 //INFO("TP_FT5206");
WiredHome 165:695c24cc5197 254 } else if (useTouchPanel == TP_GSL1680) {
WiredHome 198:9b6851107426 255 //INFO("TP_GSL1680");
WiredHome 165:695c24cc5197 256 } else if (useTouchPanel == TP_RES) {
WiredHome 198:9b6851107426 257 ReadResistive();
WiredHome 124:1690a7ae871c 258 }
WiredHome 165:695c24cc5197 259 // For Resistive touch, panelTouched is computed above.
WiredHome 165:695c24cc5197 260 // For Cap Sense, panelTouched is set in another process
WiredHome 124:1690a7ae871c 261 if (panelTouched == true) {
WiredHome 124:1690a7ae871c 262 panelTouched = false;
WiredHome 124:1690a7ae871c 263 if (TouchPoint) {
WiredHome 202:a22cbc04f332 264 *TouchPoint = touchInfo[0].coordinates;
WiredHome 124:1690a7ae871c 265 ts = touchInfo[0].touchCode;
WiredHome 209:08fc22dea762 266 INFO("ts %d", ts);
WiredHome 193:74f80834d59d 267 #ifdef DEBUG
WiredHome 193:74f80834d59d 268 static TouchCode_t lastTS = no_touch;
WiredHome 193:74f80834d59d 269 if (lastTS != ts)
WiredHome 197:853d08e2fb53 270 INFO("Touch[0] %2d (%4d,%4d)", touchInfo[0].touchCode,
WiredHome 197:853d08e2fb53 271 touchInfo[0].coordinates.x, touchInfo[0].coordinates.y);
WiredHome 193:74f80834d59d 272 lastTS = ts;
WiredHome 193:74f80834d59d 273 #endif
WiredHome 130:d633e80840e0 274 } else {
WiredHome 209:08fc22dea762 275 ts = touchInfo[0].touchCode;
WiredHome 209:08fc22dea762 276 INFO("ts %d", ts);
WiredHome 124:1690a7ae871c 277 }
WiredHome 81:01da2e34283d 278 }
WiredHome 83:7bad0068cca0 279 return ts;
WiredHome 81:01da2e34283d 280 }
WiredHome 81:01da2e34283d 281
WiredHome 190:3132b7dfad82 282 uint8_t RA8875::TouchID(uint8_t channel)
WiredHome 166:53fd4a876dac 283 {
WiredHome 166:53fd4a876dac 284 if (channel >= TouchChannels())
WiredHome 166:53fd4a876dac 285 channel = 0;
WiredHome 190:3132b7dfad82 286 return touchInfo[channel].touchID;
WiredHome 166:53fd4a876dac 287 }
WiredHome 166:53fd4a876dac 288
WiredHome 190:3132b7dfad82 289 TouchCode_t RA8875::TouchCode(uint8_t channel)
WiredHome 190:3132b7dfad82 290 {
WiredHome 166:53fd4a876dac 291 if (channel >= TouchChannels())
WiredHome 166:53fd4a876dac 292 channel = 0;
WiredHome 181:0032d1b8f5d4 293 INFO("TouchCode[%d] = %d", channel, touchInfo[channel].touchCode);
WiredHome 181:0032d1b8f5d4 294 return touchInfo[channel].touchCode;
WiredHome 166:53fd4a876dac 295 }
WiredHome 166:53fd4a876dac 296
WiredHome 166:53fd4a876dac 297 point_t RA8875::TouchCoordinates(uint8_t channel)
WiredHome 166:53fd4a876dac 298 {
WiredHome 166:53fd4a876dac 299 if (channel >= TouchChannels())
WiredHome 166:53fd4a876dac 300 channel = 0;
WiredHome 203:704df2dbd3e6 301 return touchInfo[channel].coordinates;
WiredHome 166:53fd4a876dac 302 }
WiredHome 81:01da2e34283d 303
WiredHome 85:022bba13c5c4 304 TouchCode_t RA8875::TouchPanelGet(point_t * TouchPoint)
WiredHome 85:022bba13c5c4 305 {
WiredHome 123:2f45e80fec5f 306 TouchCode_t t = no_touch;
WiredHome 124:1690a7ae871c 307
WiredHome 123:2f45e80fec5f 308 while (true) {
WiredHome 85:022bba13c5c4 309 t = TouchPanelReadable(TouchPoint);
WiredHome 123:2f45e80fec5f 310 if (t != no_touch)
WiredHome 123:2f45e80fec5f 311 break;
WiredHome 123:2f45e80fec5f 312 if (idle_callback) {
WiredHome 149:c62c4b2d6a15 313 if (external_abort == (*idle_callback)(touch_wait, 0)) {
WiredHome 123:2f45e80fec5f 314 return no_touch;
WiredHome 123:2f45e80fec5f 315 }
WiredHome 123:2f45e80fec5f 316 }
WiredHome 123:2f45e80fec5f 317 }
WiredHome 85:022bba13c5c4 318 return t;
WiredHome 85:022bba13c5c4 319 }
WiredHome 85:022bba13c5c4 320
WiredHome 123:2f45e80fec5f 321 // Below here are primarily "helper" functions. While many are accessible
WiredHome 123:2f45e80fec5f 322 // to the user code, they usually don't need to be called.
WiredHome 123:2f45e80fec5f 323
WiredHome 81:01da2e34283d 324 RetCode_t RA8875::TouchPanelSetMatrix(tpMatrix_t * matrixPtr)
WiredHome 81:01da2e34283d 325 {
WiredHome 81:01da2e34283d 326 if (matrixPtr == NULL || matrixPtr->Divider == 0)
WiredHome 81:01da2e34283d 327 return bad_parameter;
WiredHome 81:01da2e34283d 328 memcpy(&tpMatrix, matrixPtr, sizeof(tpMatrix_t));
WiredHome 83:7bad0068cca0 329 touchState = no_touch;
WiredHome 81:01da2e34283d 330 return noerror;
WiredHome 81:01da2e34283d 331 }
WiredHome 81:01da2e34283d 332
WiredHome 157:1565f38ca44b 333 const tpMatrix_t * RA8875::TouchPanelGetMatrix()
WiredHome 157:1565f38ca44b 334 {
WiredHome 157:1565f38ca44b 335 return &tpMatrix;
WiredHome 157:1565f38ca44b 336 }
WiredHome 157:1565f38ca44b 337
WiredHome 157:1565f38ca44b 338
WiredHome 83:7bad0068cca0 339 static void InsertionSort(int * buf, int bufsize)
WiredHome 83:7bad0068cca0 340 {
WiredHome 83:7bad0068cca0 341 int i, j;
WiredHome 83:7bad0068cca0 342 int temp;
WiredHome 124:1690a7ae871c 343
WiredHome 108:7415c405ee08 344 for(i = 1; i < bufsize; i++) {
WiredHome 83:7bad0068cca0 345 temp = buf[i];
WiredHome 83:7bad0068cca0 346 j = i;
WiredHome 83:7bad0068cca0 347 while( j && (buf[j-1] > temp) ) {
WiredHome 83:7bad0068cca0 348 buf[j] = buf[j-1];
WiredHome 83:7bad0068cca0 349 j = j-1;
WiredHome 83:7bad0068cca0 350 }
WiredHome 83:7bad0068cca0 351 buf[j] = temp;
WiredHome 83:7bad0068cca0 352 } // End of sort
WiredHome 83:7bad0068cca0 353 }
WiredHome 83:7bad0068cca0 354
WiredHome 83:7bad0068cca0 355
WiredHome 83:7bad0068cca0 356 void RA8875::_TouchTicker(void)
WiredHome 78:faf49c381591 357 {
WiredHome 197:853d08e2fb53 358 //INFO("_TouchTicker()");
WiredHome 165:695c24cc5197 359 if (timeSinceTouch.read_us() > NOTOUCH_TIMEOUT_uS) {
WiredHome 83:7bad0068cca0 360 touchSample = 0;
WiredHome 193:74f80834d59d 361 if (touchState == held) {
WiredHome 83:7bad0068cca0 362 touchState = release;
WiredHome 193:74f80834d59d 363 INFO("release %d", touchState);
WiredHome 193:74f80834d59d 364 } else {
WiredHome 193:74f80834d59d 365 INFO("!= held %d", touchState);
WiredHome 83:7bad0068cca0 366 touchState = no_touch;
WiredHome 193:74f80834d59d 367 }
WiredHome 165:695c24cc5197 368 timeSinceTouch.reset();
WiredHome 83:7bad0068cca0 369 }
WiredHome 83:7bad0068cca0 370 }
WiredHome 83:7bad0068cca0 371
WiredHome 198:9b6851107426 372
WiredHome 198:9b6851107426 373 // Description: Given a valid set of calibration factors and a point
WiredHome 198:9b6851107426 374 // value reported by the touch screen, this function
WiredHome 198:9b6851107426 375 // calculates and returns the true (or closest to true)
WiredHome 198:9b6851107426 376 // display point below the spot where the touch screen
WiredHome 198:9b6851107426 377 // was touched.
WiredHome 198:9b6851107426 378 //
WiredHome 198:9b6851107426 379 // Argument(s): displayPtr (output) - Pointer to the calculated
WiredHome 198:9b6851107426 380 // (true) display point.
WiredHome 198:9b6851107426 381 // screenPtr (input) - Pointer to the reported touch
WiredHome 198:9b6851107426 382 // screen point.
WiredHome 198:9b6851107426 383 // matrixPtr (input) - Pointer to calibration factors
WiredHome 198:9b6851107426 384 // matrix previously calculated
WiredHome 198:9b6851107426 385 // from a call to
WiredHome 198:9b6851107426 386 // setCalibrationMatrix()
WiredHome 198:9b6851107426 387 //
WiredHome 198:9b6851107426 388 // The function simply solves for Xd and Yd by implementing the
WiredHome 198:9b6851107426 389 // computations required by the translation matrix.
WiredHome 198:9b6851107426 390 //
WiredHome 198:9b6851107426 391 // /- -\ //
WiredHome 198:9b6851107426 392 // /- -\ /- -\ | | //
WiredHome 198:9b6851107426 393 // | | | | | Xs | //
WiredHome 198:9b6851107426 394 // | Xd | | A B C | | | //
WiredHome 198:9b6851107426 395 // | | = | | * | Ys | //
WiredHome 198:9b6851107426 396 // | Yd | | D E F | | | //
WiredHome 198:9b6851107426 397 // | | | | | 1 | //
WiredHome 198:9b6851107426 398 // \- -/ \- -/ | | //
WiredHome 198:9b6851107426 399 // \- -/ //
WiredHome 198:9b6851107426 400 //
WiredHome 198:9b6851107426 401 // It must be kept brief to avoid consuming CPU cycles.
WiredHome 198:9b6851107426 402 //
WiredHome 198:9b6851107426 403 // Return: OK - the display point was correctly calculated
WiredHome 198:9b6851107426 404 // and its value is in the output argument.
WiredHome 198:9b6851107426 405 // NOT_OK - an error was detected and the function
WiredHome 198:9b6851107426 406 // failed to return a valid point.
WiredHome 198:9b6851107426 407 //
WiredHome 198:9b6851107426 408 // NOTE! NOTE! NOTE!
WiredHome 198:9b6851107426 409 //
WiredHome 198:9b6851107426 410 // setCalibrationMatrix() and getDisplayPoint() will do fine
WiredHome 198:9b6851107426 411 // for you as they are, provided that your digitizer
WiredHome 198:9b6851107426 412 // resolution does not exceed 10 bits (1024 values). Higher
WiredHome 198:9b6851107426 413 // resolutions may cause the integer operations to overflow
WiredHome 198:9b6851107426 414 // and return incorrect values. If you wish to use these
WiredHome 198:9b6851107426 415 // functions with digitizer resolutions of 12 bits (4096
WiredHome 198:9b6851107426 416 // values) you will either have to a) use 64-bit signed
WiredHome 198:9b6851107426 417 // integer variables and math, or b) judiciously modify the
WiredHome 198:9b6851107426 418 // operations to scale results by a factor of 2 or even 4.
WiredHome 198:9b6851107426 419 //
WiredHome 198:9b6851107426 420 void RA8875::ReadResistive() {
WiredHome 198:9b6851107426 421 TouchCode_t ts = no_touch;
WiredHome 198:9b6851107426 422 int a2dX = 0;
WiredHome 198:9b6851107426 423 int a2dY = 0;
WiredHome 198:9b6851107426 424
WiredHome 198:9b6851107426 425 touchInfo[0].touchID = 0;
WiredHome 198:9b6851107426 426 ts = TouchPanelA2DFiltered(&a2dX, &a2dY);
WiredHome 198:9b6851107426 427 if (ts != no_touch) {
WiredHome 198:9b6851107426 428 panelTouched = true;
WiredHome 198:9b6851107426 429 numberOfTouchPoints = 1;
WiredHome 198:9b6851107426 430
WiredHome 198:9b6851107426 431 if (tpMatrix.Divider != 0) {
WiredHome 198:9b6851107426 432 /* Operation order is important since we are doing integer */
WiredHome 198:9b6851107426 433 /* math. Make sure you add all terms together before */
WiredHome 198:9b6851107426 434 /* dividing, so that the remainder is not rounded off */
WiredHome 198:9b6851107426 435 /* prematurely. */
WiredHome 202:a22cbc04f332 436 touchInfo[0].coordinates = TranslateOrientation(
WiredHome 202:a22cbc04f332 437 ((tpMatrix.An * a2dX) + (tpMatrix.Bn * a2dY) + tpMatrix.Cn) / tpMatrix.Divider,
WiredHome 202:a22cbc04f332 438 ((tpMatrix.Dn * a2dX) + (tpMatrix.En * a2dY) + tpMatrix.Fn) / tpMatrix.Divider );
WiredHome 198:9b6851107426 439 } else {
WiredHome 198:9b6851107426 440 ts = no_cal;
WiredHome 198:9b6851107426 441 }
WiredHome 198:9b6851107426 442 } else {
WiredHome 198:9b6851107426 443 numberOfTouchPoints = 0;
WiredHome 198:9b6851107426 444 }
WiredHome 198:9b6851107426 445 touchInfo[0].touchCode = ts;
WiredHome 198:9b6851107426 446 }
WiredHome 198:9b6851107426 447
WiredHome 198:9b6851107426 448
WiredHome 83:7bad0068cca0 449 TouchCode_t RA8875::TouchPanelA2DRaw(int *x, int *y)
WiredHome 83:7bad0068cca0 450 {
WiredHome 154:ad2450fc3dc3 451 INFO("A2Raw");
WiredHome 193:74f80834d59d 452 if( (ReadCommand(RA8875_INTC2) & RA8875_INT_TP) ) { // Test for TP Interrupt pending in register RA8875_INTC2
WiredHome 154:ad2450fc3dc3 453 INFO("Int pending");
WiredHome 165:695c24cc5197 454 timeSinceTouch.reset();
WiredHome 193:74f80834d59d 455 *y = ReadCommand(RA8875_TPYH) << 2 | ( (ReadCommand(RA8875_TPXYL) & 0xC) >> 2 ); // D[9:2] from reg RA8875_TPYH, D[1:0] from reg RA8875_TPXYL[3:2]
WiredHome 193:74f80834d59d 456 *x = ReadCommand(RA8875_TPXH) << 2 | ( (ReadCommand(RA8875_TPXYL) & 0x3) ); // D[9:2] from reg RA8875_TPXH, D[1:0] from reg RA8875_TPXYL[1:0]
WiredHome 193:74f80834d59d 457 INFO("(x,y) = (%d,%d)", *x, *y);
WiredHome 193:74f80834d59d 458 WriteCommand(RA8875_INTC2, RA8875_INT_TP); // reg RA8875_INTC2: Clear that TP interrupt flag
WiredHome 83:7bad0068cca0 459 touchState = touch;
WiredHome 193:74f80834d59d 460 } else if (ReadCommand(RA8875_TPXYL) & RA8875_TPXYL_ADET) {
WiredHome 193:74f80834d59d 461 INFO("held");
WiredHome 193:74f80834d59d 462 touchState = held;
WiredHome 83:7bad0068cca0 463 } else {
WiredHome 154:ad2450fc3dc3 464 INFO("no touch");
WiredHome 83:7bad0068cca0 465 touchState = no_touch;
WiredHome 83:7bad0068cca0 466 }
WiredHome 83:7bad0068cca0 467 return touchState;
WiredHome 83:7bad0068cca0 468 }
WiredHome 83:7bad0068cca0 469
WiredHome 83:7bad0068cca0 470 TouchCode_t RA8875::TouchPanelA2DFiltered(int *x, int *y)
WiredHome 83:7bad0068cca0 471 {
WiredHome 83:7bad0068cca0 472 static int xbuf[TPBUFSIZE], ybuf[TPBUFSIZE];
WiredHome 83:7bad0068cca0 473 static int lastX, lastY;
WiredHome 83:7bad0068cca0 474 int i, j;
WiredHome 83:7bad0068cca0 475 TouchCode_t ret = touchState;
WiredHome 78:faf49c381591 476
WiredHome 193:74f80834d59d 477 if ( (ReadCommand(RA8875_INTC2) & RA8875_INT_TP) ) { // Test for TP Interrupt pending in register RA8875_INTC2
WiredHome 165:695c24cc5197 478 timeSinceTouch.reset();
WiredHome 78:faf49c381591 479 // Get the next data samples
WiredHome 193:74f80834d59d 480 ybuf[touchSample] = ReadCommand(RA8875_TPYH) << 2 | ( (ReadCommand(RA8875_TPXYL) & 0xC) >> 2 ); // D[9:2] from reg RA8875_TPYH, D[1:0] from reg RA8875_TPXYL[3:2]
WiredHome 193:74f80834d59d 481 xbuf[touchSample] = ReadCommand(RA8875_TPXH) << 2 | ( (ReadCommand(RA8875_TPXYL) & 0x3) ); // D[9:2] from reg RA8875_TPXH, D[1:0] from reg RA8875_TPXYL[1:0]
WiredHome 78:faf49c381591 482 // Check for a complete set
WiredHome 197:853d08e2fb53 483 if (++touchSample == TPBUFSIZE) {
WiredHome 78:faf49c381591 484 // Buffers are full, so process them using Finn's method described in Analog Dialogue No. 44, Feb 2010
WiredHome 78:faf49c381591 485 // This requires sorting the samples in order of size, then discarding the top 25% and
WiredHome 78:faf49c381591 486 // bottom 25% as noise spikes. Finally, the middle 50% of the values are averaged to
WiredHome 78:faf49c381591 487 // reduce Gaussian noise.
WiredHome 83:7bad0068cca0 488 InsertionSort(ybuf, TPBUFSIZE);
WiredHome 83:7bad0068cca0 489 InsertionSort(xbuf, TPBUFSIZE);
WiredHome 78:faf49c381591 490 // Average the middle half of the Y values and report them
WiredHome 78:faf49c381591 491 j = 0;
WiredHome 197:853d08e2fb53 492 for (i = (TPBUFSIZE/4) - 1; i < TPBUFSIZE - TPBUFSIZE/4; i++ ) {
WiredHome 78:faf49c381591 493 j += ybuf[i];
WiredHome 78:faf49c381591 494 }
WiredHome 83:7bad0068cca0 495 *y = lastY = j * (float)2/TPBUFSIZE; // This is the average
WiredHome 78:faf49c381591 496 // Average the middle half of the X values and report them
WiredHome 78:faf49c381591 497 j = 0;
WiredHome 78:faf49c381591 498 for(i = (TPBUFSIZE/4) - 1; i < TPBUFSIZE - TPBUFSIZE/4; i++ ) {
WiredHome 78:faf49c381591 499 j += xbuf[i];
WiredHome 78:faf49c381591 500 }
WiredHome 83:7bad0068cca0 501 *x = lastX = j * (float)2/TPBUFSIZE; // This is the average
WiredHome 78:faf49c381591 502 // Tidy up and return
WiredHome 193:74f80834d59d 503 if (touchState == touch || touchState == held) {
WiredHome 83:7bad0068cca0 504 touchState = held;
WiredHome 197:853d08e2fb53 505 //INFO("held");
WiredHome 193:74f80834d59d 506 } else {
WiredHome 83:7bad0068cca0 507 touchState = touch;
WiredHome 197:853d08e2fb53 508 //INFO("touch");
WiredHome 193:74f80834d59d 509 }
WiredHome 83:7bad0068cca0 510 ret = touchState;
WiredHome 83:7bad0068cca0 511 touchSample = 0; // Ready to start on the next set of data samples
WiredHome 78:faf49c381591 512 } else {
WiredHome 78:faf49c381591 513 // Buffer not yet full, so do not return any results yet
WiredHome 83:7bad0068cca0 514 if (touchState == touch || touchState == held) {
WiredHome 83:7bad0068cca0 515 *x = lastX;
WiredHome 83:7bad0068cca0 516 *y = lastY;
WiredHome 197:853d08e2fb53 517 #ifdef DEBUG
WiredHome 193:74f80834d59d 518 {
WiredHome 193:74f80834d59d 519 static TouchCode_t lastTC = no_touch;
WiredHome 193:74f80834d59d 520 if (lastTC != touchState)
WiredHome 197:853d08e2fb53 521 //INFO("held");
WiredHome 193:74f80834d59d 522 lastTC = touchState;
WiredHome 193:74f80834d59d 523 }
WiredHome 197:853d08e2fb53 524 #endif
WiredHome 83:7bad0068cca0 525 ret = touchState = held;
WiredHome 193:74f80834d59d 526 } else {
WiredHome 193:74f80834d59d 527 INFO("else %d, %d", touchState, touchSample);
WiredHome 83:7bad0068cca0 528 }
WiredHome 78:faf49c381591 529 }
WiredHome 193:74f80834d59d 530 WriteCommand(RA8875_INTC2, RA8875_INT_TP); // reg RA8875_INTC2: Clear that TP interrupt flag
WiredHome 193:74f80834d59d 531 } else if (0 == (ReadCommand(RA8875_TPXYL) & RA8875_TPXYL_ADET)) {
WiredHome 193:74f80834d59d 532 INFO("held");
WiredHome 193:74f80834d59d 533 *x = lastX;
WiredHome 193:74f80834d59d 534 *y = lastY;
WiredHome 193:74f80834d59d 535 ret = touchState = held;
WiredHome 193:74f80834d59d 536 } else if (timeSinceTouch.read_ms() < 20) {
WiredHome 193:74f80834d59d 537 *x = lastX;
WiredHome 193:74f80834d59d 538 *y = lastY;
WiredHome 193:74f80834d59d 539 //ret = touchState;
WiredHome 193:74f80834d59d 540 } else {
WiredHome 193:74f80834d59d 541 //INFO("touchState %d", touchState);
WiredHome 193:74f80834d59d 542 //touchSample = 0;
WiredHome 193:74f80834d59d 543 *x = lastX;
WiredHome 193:74f80834d59d 544 *y = lastY;
WiredHome 193:74f80834d59d 545 if (touchState == no_touch || touchState == release) {
WiredHome 193:74f80834d59d 546 ret = touchState = no_touch;
WiredHome 193:74f80834d59d 547 } else {
WiredHome 193:74f80834d59d 548 INFO("release");
WiredHome 193:74f80834d59d 549 touchSample = 0;
WiredHome 193:74f80834d59d 550 touchState = no_touch;
WiredHome 193:74f80834d59d 551 ret = release;
WiredHome 193:74f80834d59d 552 }
WiredHome 193:74f80834d59d 553 #if 0
WiredHome 83:7bad0068cca0 554 if (touchState == touch || touchState == held) {
WiredHome 83:7bad0068cca0 555 *x = lastX;
WiredHome 83:7bad0068cca0 556 *y = lastY;
WiredHome 83:7bad0068cca0 557 ret = touchState = held;
WiredHome 193:74f80834d59d 558 INFO("held");
WiredHome 83:7bad0068cca0 559 } else if (touchState == release) {
WiredHome 83:7bad0068cca0 560 *x = lastX;
WiredHome 83:7bad0068cca0 561 *y = lastY;
WiredHome 83:7bad0068cca0 562 ret = release;
WiredHome 83:7bad0068cca0 563 touchState = no_touch;
WiredHome 193:74f80834d59d 564 INFO("release");
WiredHome 83:7bad0068cca0 565 }
WiredHome 193:74f80834d59d 566 #endif
WiredHome 83:7bad0068cca0 567 }
WiredHome 83:7bad0068cca0 568 return ret;
WiredHome 78:faf49c381591 569 }
WiredHome 78:faf49c381591 570
WiredHome 167:8aa3fb2a5a31 571 /// The following section is derived from Carlos E. Vidales.
WiredHome 167:8aa3fb2a5a31 572 ///
WiredHome 167:8aa3fb2a5a31 573 /// @copyright &copy; 2001, Carlos E. Vidales. All rights reserved.
WiredHome 167:8aa3fb2a5a31 574 ///
WiredHome 167:8aa3fb2a5a31 575 /// This sample program was written and put in the public domain
WiredHome 167:8aa3fb2a5a31 576 /// by Carlos E. Vidales. The program is provided "as is"
WiredHome 167:8aa3fb2a5a31 577 /// without warranty of any kind, either expressed or implied.
WiredHome 167:8aa3fb2a5a31 578 /// If you choose to use the program within your own products
WiredHome 167:8aa3fb2a5a31 579 /// you do so at your own risk, and assume the responsibility
WiredHome 167:8aa3fb2a5a31 580 /// for servicing, repairing or correcting the program should
WiredHome 167:8aa3fb2a5a31 581 /// it prove defective in any manner.
WiredHome 167:8aa3fb2a5a31 582 /// You may copy and distribute the program's source code in any
WiredHome 167:8aa3fb2a5a31 583 /// medium, provided that you also include in each copy an
WiredHome 167:8aa3fb2a5a31 584 /// appropriate copyright notice and disclaimer of warranty.
WiredHome 167:8aa3fb2a5a31 585 /// You may also modify this program and distribute copies of
WiredHome 167:8aa3fb2a5a31 586 /// it provided that you include prominent notices stating
WiredHome 167:8aa3fb2a5a31 587 /// that you changed the file(s) and the date of any change,
WiredHome 167:8aa3fb2a5a31 588 /// and that you do not charge any royalties or licenses for
WiredHome 167:8aa3fb2a5a31 589 /// its use.
WiredHome 167:8aa3fb2a5a31 590 ///
WiredHome 167:8aa3fb2a5a31 591 /// This file contains functions that implement calculations
WiredHome 167:8aa3fb2a5a31 592 /// necessary to obtain calibration factors for a touch screen
WiredHome 167:8aa3fb2a5a31 593 /// that suffers from multiple distortion effects: namely,
WiredHome 167:8aa3fb2a5a31 594 /// translation, scaling and rotation.
WiredHome 167:8aa3fb2a5a31 595 ///
WiredHome 167:8aa3fb2a5a31 596 /// The following set of equations represent a valid display
WiredHome 167:8aa3fb2a5a31 597 /// point given a corresponding set of touch screen points:
WiredHome 167:8aa3fb2a5a31 598 ///
WiredHome 167:8aa3fb2a5a31 599 /// <pre>
WiredHome 190:3132b7dfad82 600 /// /- -\ //
WiredHome 190:3132b7dfad82 601 /// /- -\ /- -\ | | //
WiredHome 190:3132b7dfad82 602 /// | | | | | Xs | //
WiredHome 190:3132b7dfad82 603 /// | Xd | | A B C | | | //
WiredHome 190:3132b7dfad82 604 /// | | = | | * | Ys | //
WiredHome 190:3132b7dfad82 605 /// | Yd | | D E F | | | //
WiredHome 190:3132b7dfad82 606 /// | | | | | 1 | //
WiredHome 190:3132b7dfad82 607 /// \- -/ \- -/ | | //
WiredHome 190:3132b7dfad82 608 /// \- -/ //
WiredHome 167:8aa3fb2a5a31 609 /// where:
WiredHome 167:8aa3fb2a5a31 610 /// (Xd,Yd) represents the desired display point
WiredHome 167:8aa3fb2a5a31 611 /// coordinates,
WiredHome 167:8aa3fb2a5a31 612 /// (Xs,Ys) represents the available touch screen
WiredHome 167:8aa3fb2a5a31 613 /// coordinates, and the matrix
WiredHome 190:3132b7dfad82 614 /// /- -\ represents the factors used to translate
WiredHome 190:3132b7dfad82 615 /// |A,B,C| the available touch screen point values
WiredHome 190:3132b7dfad82 616 /// |D,E,F| into the corresponding display
WiredHome 190:3132b7dfad82 617 /// \- -/ coordinates.
WiredHome 190:3132b7dfad82 618 ///
WiredHome 167:8aa3fb2a5a31 619 /// Note that for practical considerations, the utilities
WiredHome 167:8aa3fb2a5a31 620 /// within this file do not use the matrix coefficients as
WiredHome 167:8aa3fb2a5a31 621 /// defined above, but instead use the following
WiredHome 167:8aa3fb2a5a31 622 /// equivalents, since floating point math is not used:
WiredHome 167:8aa3fb2a5a31 623 /// A = An/Divider
WiredHome 167:8aa3fb2a5a31 624 /// B = Bn/Divider
WiredHome 167:8aa3fb2a5a31 625 /// C = Cn/Divider
WiredHome 167:8aa3fb2a5a31 626 /// D = Dn/Divider
WiredHome 167:8aa3fb2a5a31 627 /// E = En/Divider
WiredHome 167:8aa3fb2a5a31 628 /// F = Fn/Divider
WiredHome 167:8aa3fb2a5a31 629 /// The functions provided within this file are:
WiredHome 167:8aa3fb2a5a31 630 /// setCalibrationMatrix() - calculates the set of factors
WiredHome 167:8aa3fb2a5a31 631 /// in the above equation, given
WiredHome 167:8aa3fb2a5a31 632 /// three sets of test points.
WiredHome 167:8aa3fb2a5a31 633 /// getDisplayPoint() - returns the actual display
WiredHome 167:8aa3fb2a5a31 634 /// coordinates, given a set of
WiredHome 167:8aa3fb2a5a31 635 /// touch screen coordinates.
WiredHome 167:8aa3fb2a5a31 636 /// translateRawScreenCoordinates() - helper function to transform
WiredHome 167:8aa3fb2a5a31 637 /// raw screen points into values
WiredHome 167:8aa3fb2a5a31 638 /// scaled to the desired display
WiredHome 167:8aa3fb2a5a31 639 /// resolution.
WiredHome 167:8aa3fb2a5a31 640 ///
WiredHome 167:8aa3fb2a5a31 641 ///
WiredHome 167:8aa3fb2a5a31 642 /// Function: setCalibrationMatrix()
WiredHome 167:8aa3fb2a5a31 643 ///
WiredHome 167:8aa3fb2a5a31 644 /// Description: Calling this function with valid input data
WiredHome 167:8aa3fb2a5a31 645 /// in the display and screen input arguments
WiredHome 167:8aa3fb2a5a31 646 /// causes the calibration factors between the
WiredHome 167:8aa3fb2a5a31 647 /// screen and display points to be calculated,
WiredHome 167:8aa3fb2a5a31 648 /// and the output argument - matrixPtr - to be
WiredHome 167:8aa3fb2a5a31 649 /// populated.
WiredHome 167:8aa3fb2a5a31 650 ///
WiredHome 167:8aa3fb2a5a31 651 /// This function needs to be called only when new
WiredHome 167:8aa3fb2a5a31 652 /// calibration factors are desired.
WiredHome 167:8aa3fb2a5a31 653 ///
WiredHome 167:8aa3fb2a5a31 654 ///
WiredHome 167:8aa3fb2a5a31 655 /// Argument(s): displayPtr (input) - Pointer to an array of three
WiredHome 167:8aa3fb2a5a31 656 /// sample, reference points.
WiredHome 167:8aa3fb2a5a31 657 /// screenPtr (input) - Pointer to the array of touch
WiredHome 167:8aa3fb2a5a31 658 /// screen points corresponding
WiredHome 167:8aa3fb2a5a31 659 /// to the reference display points.
WiredHome 167:8aa3fb2a5a31 660 /// matrixPtr (output) - Pointer to the calibration
WiredHome 167:8aa3fb2a5a31 661 /// matrix computed for the set
WiredHome 167:8aa3fb2a5a31 662 /// of points being provided.
WiredHome 167:8aa3fb2a5a31 663 ///
WiredHome 167:8aa3fb2a5a31 664 ///
WiredHome 167:8aa3fb2a5a31 665 /// From the article text, recall that the matrix coefficients are
WiredHome 167:8aa3fb2a5a31 666 /// resolved to be the following:
WiredHome 167:8aa3fb2a5a31 667 ///
WiredHome 167:8aa3fb2a5a31 668 ///
WiredHome 167:8aa3fb2a5a31 669 /// Divider = (Xs0 - Xs2)*(Ys1 - Ys2) - (Xs1 - Xs2)*(Ys0 - Ys2)
WiredHome 167:8aa3fb2a5a31 670 ///
WiredHome 167:8aa3fb2a5a31 671 ///
WiredHome 167:8aa3fb2a5a31 672 ///
WiredHome 167:8aa3fb2a5a31 673 /// (Xd0 - Xd2)*(Ys1 - Ys2) - (Xd1 - Xd2)*(Ys0 - Ys2)
WiredHome 167:8aa3fb2a5a31 674 /// A = ---------------------------------------------------
WiredHome 167:8aa3fb2a5a31 675 /// Divider
WiredHome 167:8aa3fb2a5a31 676 ///
WiredHome 167:8aa3fb2a5a31 677 ///
WiredHome 167:8aa3fb2a5a31 678 /// (Xs0 - Xs2)*(Xd1 - Xd2) - (Xd0 - Xd2)*(Xs1 - Xs2)
WiredHome 167:8aa3fb2a5a31 679 /// B = ---------------------------------------------------
WiredHome 167:8aa3fb2a5a31 680 /// Divider
WiredHome 167:8aa3fb2a5a31 681 ///
WiredHome 167:8aa3fb2a5a31 682 ///
WiredHome 167:8aa3fb2a5a31 683 /// Ys0*(Xs2*Xd1 - Xs1*Xd2) +
WiredHome 167:8aa3fb2a5a31 684 /// Ys1*(Xs0*Xd2 - Xs2*Xd0) +
WiredHome 167:8aa3fb2a5a31 685 /// Ys2*(Xs1*Xd0 - Xs0*Xd1)
WiredHome 167:8aa3fb2a5a31 686 /// C = ---------------------------------------------------
WiredHome 167:8aa3fb2a5a31 687 /// Divider
WiredHome 167:8aa3fb2a5a31 688 ///
WiredHome 167:8aa3fb2a5a31 689 ///
WiredHome 167:8aa3fb2a5a31 690 /// (Yd0 - Yd2)*(Ys1 - Ys2) - (Yd1 - Yd2)*(Ys0 - Ys2)
WiredHome 167:8aa3fb2a5a31 691 /// D = ---------------------------------------------------
WiredHome 167:8aa3fb2a5a31 692 /// Divider
WiredHome 167:8aa3fb2a5a31 693 ///
WiredHome 167:8aa3fb2a5a31 694 ///
WiredHome 167:8aa3fb2a5a31 695 /// (Xs0 - Xs2)*(Yd1 - Yd2) - (Yd0 - Yd2)*(Xs1 - Xs2)
WiredHome 167:8aa3fb2a5a31 696 /// E = ---------------------------------------------------
WiredHome 167:8aa3fb2a5a31 697 /// Divider
WiredHome 167:8aa3fb2a5a31 698 ///
WiredHome 167:8aa3fb2a5a31 699 ///
WiredHome 167:8aa3fb2a5a31 700 /// Ys0*(Xs2*Yd1 - Xs1*Yd2) +
WiredHome 167:8aa3fb2a5a31 701 /// Ys1*(Xs0*Yd2 - Xs2*Yd0) +
WiredHome 167:8aa3fb2a5a31 702 /// Ys2*(Xs1*Yd0 - Xs0*Yd1)
WiredHome 167:8aa3fb2a5a31 703 /// F = ---------------------------------------------------
WiredHome 167:8aa3fb2a5a31 704 /// Divider
WiredHome 167:8aa3fb2a5a31 705 ///
WiredHome 167:8aa3fb2a5a31 706 ///
WiredHome 167:8aa3fb2a5a31 707 /// Return: OK - the calibration matrix was correctly
WiredHome 167:8aa3fb2a5a31 708 /// calculated and its value is in the
WiredHome 167:8aa3fb2a5a31 709 /// output argument.
WiredHome 167:8aa3fb2a5a31 710 /// NOT_OK - an error was detected and the
WiredHome 167:8aa3fb2a5a31 711 /// function failed to return a valid
WiredHome 167:8aa3fb2a5a31 712 /// set of matrix values.
WiredHome 167:8aa3fb2a5a31 713 /// The only time this sample code returns
WiredHome 167:8aa3fb2a5a31 714 /// NOT_OK is when Divider == 0
WiredHome 167:8aa3fb2a5a31 715 ///
WiredHome 167:8aa3fb2a5a31 716 ///
WiredHome 167:8aa3fb2a5a31 717 ///
WiredHome 167:8aa3fb2a5a31 718 /// NOTE! NOTE! NOTE!
WiredHome 167:8aa3fb2a5a31 719 ///
WiredHome 167:8aa3fb2a5a31 720 /// setCalibrationMatrix() and getDisplayPoint() will do fine
WiredHome 167:8aa3fb2a5a31 721 /// for you as they are, provided that your digitizer
WiredHome 167:8aa3fb2a5a31 722 /// resolution does not exceed 10 bits (1024 values). Higher
WiredHome 167:8aa3fb2a5a31 723 /// resolutions may cause the integer operations to overflow
WiredHome 167:8aa3fb2a5a31 724 /// and return incorrect values. If you wish to use these
WiredHome 167:8aa3fb2a5a31 725 /// functions with digitizer resolutions of 12 bits (4096
WiredHome 167:8aa3fb2a5a31 726 /// values) you will either have to a) use 64-bit signed
WiredHome 167:8aa3fb2a5a31 727 /// integer variables and math, or b) judiciously modify the
WiredHome 167:8aa3fb2a5a31 728 /// operations to scale results by a factor of 2 or even 4.
WiredHome 167:8aa3fb2a5a31 729 ///
WiredHome 167:8aa3fb2a5a31 730 /// </pre>
WiredHome 167:8aa3fb2a5a31 731 ///
WiredHome 81:01da2e34283d 732 RetCode_t RA8875::TouchPanelComputeCalibration(point_t * displayPtr, point_t * screenPtr, tpMatrix_t * matrixPtr)
WiredHome 78:faf49c381591 733 {
WiredHome 78:faf49c381591 734 RetCode_t retValue = noerror;
WiredHome 78:faf49c381591 735
WiredHome 78:faf49c381591 736 tpMatrix.Divider = ((screenPtr[0].x - screenPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -
WiredHome 78:faf49c381591 737 ((screenPtr[1].x - screenPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
WiredHome 78:faf49c381591 738
WiredHome 78:faf49c381591 739 if( tpMatrix.Divider == 0 ) {
WiredHome 78:faf49c381591 740 retValue = bad_parameter;
WiredHome 78:faf49c381591 741 } else {
WiredHome 78:faf49c381591 742 tpMatrix.An = ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -
WiredHome 78:faf49c381591 743 ((displayPtr[1].x - displayPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
WiredHome 78:faf49c381591 744
WiredHome 78:faf49c381591 745 tpMatrix.Bn = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].x - displayPtr[2].x)) -
WiredHome 78:faf49c381591 746 ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].x - screenPtr[2].x)) ;
WiredHome 78:faf49c381591 747
WiredHome 78:faf49c381591 748 tpMatrix.Cn = (screenPtr[2].x * displayPtr[1].x - screenPtr[1].x * displayPtr[2].x) * screenPtr[0].y +
WiredHome 78:faf49c381591 749 (screenPtr[0].x * displayPtr[2].x - screenPtr[2].x * displayPtr[0].x) * screenPtr[1].y +
WiredHome 78:faf49c381591 750 (screenPtr[1].x * displayPtr[0].x - screenPtr[0].x * displayPtr[1].x) * screenPtr[2].y ;
WiredHome 78:faf49c381591 751
WiredHome 78:faf49c381591 752 tpMatrix.Dn = ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].y - screenPtr[2].y)) -
WiredHome 78:faf49c381591 753 ((displayPtr[1].y - displayPtr[2].y) * (screenPtr[0].y - screenPtr[2].y)) ;
WiredHome 78:faf49c381591 754
WiredHome 78:faf49c381591 755 tpMatrix.En = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].y - displayPtr[2].y)) -
WiredHome 78:faf49c381591 756 ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].x - screenPtr[2].x)) ;
WiredHome 78:faf49c381591 757
WiredHome 78:faf49c381591 758 tpMatrix.Fn = (screenPtr[2].x * displayPtr[1].y - screenPtr[1].x * displayPtr[2].y) * screenPtr[0].y +
WiredHome 78:faf49c381591 759 (screenPtr[0].x * displayPtr[2].y - screenPtr[2].x * displayPtr[0].y) * screenPtr[1].y +
WiredHome 78:faf49c381591 760 (screenPtr[1].x * displayPtr[0].y - screenPtr[0].x * displayPtr[1].y) * screenPtr[2].y ;
WiredHome 83:7bad0068cca0 761 touchState = no_touch;
WiredHome 78:faf49c381591 762 if (matrixPtr)
WiredHome 78:faf49c381591 763 memcpy(matrixPtr, &tpMatrix, sizeof(tpMatrix_t));
WiredHome 78:faf49c381591 764 }
WiredHome 78:faf49c381591 765 return( retValue ) ;
WiredHome 78:faf49c381591 766 }
WiredHome 78:faf49c381591 767
WiredHome 157:1565f38ca44b 768 void RA8875::ResTouchPanelCfg(const char * _tpFQFN, const char * _tpCalMessage)
WiredHome 157:1565f38ca44b 769 {
WiredHome 157:1565f38ca44b 770 tpFQFN = _tpFQFN;
WiredHome 157:1565f38ca44b 771 tpCalMessage = _tpCalMessage;
WiredHome 157:1565f38ca44b 772 }
WiredHome 157:1565f38ca44b 773
WiredHome 157:1565f38ca44b 774
WiredHome 157:1565f38ca44b 775 RetCode_t RA8875::_internal_ts_cal()
WiredHome 157:1565f38ca44b 776 {
WiredHome 157:1565f38ca44b 777 FILE * fh;
WiredHome 157:1565f38ca44b 778 tpMatrix_t matrix;
WiredHome 157:1565f38ca44b 779 RetCode_t r = noerror;
WiredHome 190:3132b7dfad82 780
WiredHome 157:1565f38ca44b 781 if (tpFQFN) {
WiredHome 157:1565f38ca44b 782 fh = fopen(tpFQFN, "rb");
WiredHome 157:1565f38ca44b 783 if (fh) {
WiredHome 157:1565f38ca44b 784 fread(&matrix, sizeof(tpMatrix_t), 1, fh);
WiredHome 157:1565f38ca44b 785 fclose(fh);
WiredHome 157:1565f38ca44b 786 TouchPanelSetMatrix(&matrix);
WiredHome 157:1565f38ca44b 787 } else {
WiredHome 157:1565f38ca44b 788 r = TouchPanelCalibrate(tpCalMessage, &matrix);
WiredHome 157:1565f38ca44b 789 if (r == noerror) {
WiredHome 157:1565f38ca44b 790 fh = fopen(tpFQFN, "wb");
WiredHome 157:1565f38ca44b 791 if (fh) {
WiredHome 157:1565f38ca44b 792 fwrite(&matrix, sizeof(tpMatrix_t), 1, fh);
WiredHome 157:1565f38ca44b 793 fclose(fh);
WiredHome 157:1565f38ca44b 794 INFO(" tp cal written to '%s'.", tpFQFN);
WiredHome 157:1565f38ca44b 795 } else {
WiredHome 157:1565f38ca44b 796 ERR(" couldn't open tpcal file '%s'.", tpFQFN);
WiredHome 157:1565f38ca44b 797 r = file_not_found;
WiredHome 157:1565f38ca44b 798 }
WiredHome 157:1565f38ca44b 799 } else {
WiredHome 157:1565f38ca44b 800 ERR("error return: %d", r);
WiredHome 157:1565f38ca44b 801 }
WiredHome 157:1565f38ca44b 802 HexDump("TPCal", (const uint8_t *)&matrix, sizeof(tpMatrix_t));
WiredHome 157:1565f38ca44b 803 cls();
WiredHome 157:1565f38ca44b 804 }
WiredHome 157:1565f38ca44b 805 }
WiredHome 157:1565f38ca44b 806 return r;
WiredHome 157:1565f38ca44b 807 }
WiredHome 157:1565f38ca44b 808
WiredHome 157:1565f38ca44b 809
WiredHome 157:1565f38ca44b 810
WiredHome 124:1690a7ae871c 811 ////////////////// Capacitive Touch Panel
WiredHome 124:1690a7ae871c 812
WiredHome 165:695c24cc5197 813 uint8_t RA8875::FT5206_ReadRegU8(uint8_t reg) {
WiredHome 124:1690a7ae871c 814 char val;
WiredHome 190:3132b7dfad82 815
WiredHome 124:1690a7ae871c 816 m_i2c->write(m_addr, (const char *)&reg, 1);
WiredHome 124:1690a7ae871c 817 m_i2c->read(m_addr, &val, 1);
WiredHome 181:0032d1b8f5d4 818 //INFO("ReadReg %02X, Val %02X", reg, val);
WiredHome 124:1690a7ae871c 819 return (uint8_t)val;
WiredHome 124:1690a7ae871c 820 }
WiredHome 124:1690a7ae871c 821
WiredHome 124:1690a7ae871c 822 // Interrupt for touch detection
WiredHome 124:1690a7ae871c 823 void RA8875::TouchPanelISR(void)
WiredHome 124:1690a7ae871c 824 {
WiredHome 165:695c24cc5197 825 if (useTouchPanel == TP_FT5206) {
WiredHome 206:83edda283d90 826 FT5206_TouchPositions(); // Picks up the final release
WiredHome 206:83edda283d90 827 panelTouched = true;
WiredHome 206:83edda283d90 828 timeSinceTouch.reset();
WiredHome 165:695c24cc5197 829 } else if (useTouchPanel == TP_GSL1680) {
WiredHome 206:83edda283d90 830 GSL1680_TouchPositions();
WiredHome 206:83edda283d90 831 panelTouched = true;
WiredHome 206:83edda283d90 832 timeSinceTouch.reset();
WiredHome 165:695c24cc5197 833 }
WiredHome 124:1690a7ae871c 834 }
WiredHome 124:1690a7ae871c 835
WiredHome 78:faf49c381591 836 // #### end of touch panel code additions