Modified version of the DmTftLibrary, optimized for the LPC4088 Experiment Base Board

Dependents:   lpc4088_ebb_dm_calc lpc4088_ebb_dm_bubbles

Fork of DmTftLibrary by Display Module

Committer:
embeddedartists
Date:
Wed Sep 10 12:47:47 2014 +0000
Revision:
11:8b441dd1d470
Parent:
10:d263094e666d
Child:
12:eb97ccfe7c3f
Updated documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
displaymodule 0:d6ff5fa503e8 1 /**********************************************************************************************
displaymodule 0:d6ff5fa503e8 2 Copyright (c) 2014 DisplayModule. All rights reserved.
displaymodule 0:d6ff5fa503e8 3
displaymodule 0:d6ff5fa503e8 4 Redistribution and use of this source code, part of this source code or any compiled binary
displaymodule 0:d6ff5fa503e8 5 based on this source code is permitted as long as the above copyright notice and following
displaymodule 0:d6ff5fa503e8 6 disclaimer is retained.
displaymodule 0:d6ff5fa503e8 7
displaymodule 0:d6ff5fa503e8 8 DISCLAIMER:
displaymodule 0:d6ff5fa503e8 9 THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES
displaymodule 0:d6ff5fa503e8 10 NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE.
displaymodule 0:d6ff5fa503e8 11 ********************************************************************************************/
displaymodule 0:d6ff5fa503e8 12 // Tested with Xpt2046
displaymodule 0:d6ff5fa503e8 13
displaymodule 0:d6ff5fa503e8 14 #include "DmTouch.h"
displaymodule 7:6cd8c36cbdb3 15 #include "DmTouchCalibration.h"
displaymodule 7:6cd8c36cbdb3 16
displaymodule 7:6cd8c36cbdb3 17 #define MEASUREMENTS 10
displaymodule 0:d6ff5fa503e8 18
displaymodule 0:d6ff5fa503e8 19 #if defined(DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 20 // disp - which display is used
displaymodule 7:6cd8c36cbdb3 21 // spiMode - How to read SPI-data, Software, Hardware or Auto
displaymodule 7:6cd8c36cbdb3 22 // useIrq - Enable IRQ or disable IRQ
displaymodule 7:6cd8c36cbdb3 23 DmTouch::DmTouch(Display disp, SpiMode spiMode, bool useIrq)
displaymodule 0:d6ff5fa503e8 24
displaymodule 0:d6ff5fa503e8 25 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 26 // disp - which display is used
displaymodule 7:6cd8c36cbdb3 27 // spiMode - How to read SPI-data, Software, Hardware or Auto
displaymodule 7:6cd8c36cbdb3 28 DmTouch::DmTouch(Display disp, SpiMode spiMode)
displaymodule 7:6cd8c36cbdb3 29 #endif
displaymodule 0:d6ff5fa503e8 30 {
displaymodule 10:d263094e666d 31 _disp = disp;
displaymodule 0:d6ff5fa503e8 32 switch (disp) {
displaymodule 0:d6ff5fa503e8 33 // Display with 40-pin connector on top of adapter board
displaymodule 0:d6ff5fa503e8 34 case DmTouch::DM_TFT28_103:
displaymodule 0:d6ff5fa503e8 35 case DmTouch::DM_TFT24_104:
displaymodule 0:d6ff5fa503e8 36 _cs = D8;
displaymodule 0:d6ff5fa503e8 37 _irq = D10;
displaymodule 0:d6ff5fa503e8 38 _clk = A1;
displaymodule 0:d6ff5fa503e8 39 _mosi = A0;
displaymodule 0:d6ff5fa503e8 40 _miso = D9;
displaymodule 10:d263094e666d 41 _width = 240;
displaymodule 10:d263094e666d 42 _height = 320;
displaymodule 7:6cd8c36cbdb3 43 _hardwareSpi = false;
displaymodule 0:d6ff5fa503e8 44 break;
displaymodule 3:02c19cbc707c 45
displaymodule 0:d6ff5fa503e8 46 case DmTouch::DM_TFT28_105:
displaymodule 0:d6ff5fa503e8 47 _cs = D4;
displaymodule 0:d6ff5fa503e8 48 _irq = D2;
displaymodule 0:d6ff5fa503e8 49 _clk = D13;
displaymodule 0:d6ff5fa503e8 50 _mosi = D11;
displaymodule 0:d6ff5fa503e8 51 _miso = D12;
displaymodule 10:d263094e666d 52 _width = 240;
displaymodule 10:d263094e666d 53 _height = 320;
displaymodule 7:6cd8c36cbdb3 54 _hardwareSpi = true;
displaymodule 0:d6ff5fa503e8 55 break;
displaymodule 0:d6ff5fa503e8 56
displaymodule 0:d6ff5fa503e8 57 case DmTouch::DM_TFT35_107:
displaymodule 0:d6ff5fa503e8 58 default:
displaymodule 0:d6ff5fa503e8 59 _cs = D4;
displaymodule 0:d6ff5fa503e8 60 _irq = D2;
displaymodule 0:d6ff5fa503e8 61 _clk = D13;
displaymodule 0:d6ff5fa503e8 62 _mosi = D11;
displaymodule 0:d6ff5fa503e8 63 _miso = D12;
displaymodule 10:d263094e666d 64 _width = 320;
displaymodule 10:d263094e666d 65 _height = 240;
displaymodule 7:6cd8c36cbdb3 66 _hardwareSpi = true;
displaymodule 0:d6ff5fa503e8 67 break;
displaymodule 0:d6ff5fa503e8 68 }
displaymodule 7:6cd8c36cbdb3 69
displaymodule 7:6cd8c36cbdb3 70 if (spiMode == DmTouch::Hardware) {
displaymodule 7:6cd8c36cbdb3 71 _hardwareSpi = true;
displaymodule 7:6cd8c36cbdb3 72 } else if (spiMode == DmTouch::Software) {
displaymodule 7:6cd8c36cbdb3 73 _hardwareSpi = false;
displaymodule 7:6cd8c36cbdb3 74 }
displaymodule 7:6cd8c36cbdb3 75
displaymodule 7:6cd8c36cbdb3 76 #if defined(DM_TOOLCHAIN_ARDUINO)
displaymodule 7:6cd8c36cbdb3 77 if (!useIrq) {
displaymodule 7:6cd8c36cbdb3 78 _irq = -1;
displaymodule 7:6cd8c36cbdb3 79 }
displaymodule 8:b24f01d148c4 80 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 8:b24f01d148c4 81 _irq = -1;
displaymodule 0:d6ff5fa503e8 82 #endif
displaymodule 7:6cd8c36cbdb3 83
displaymodule 7:6cd8c36cbdb3 84 setCalibrationMatrix(DmTouchCalibration::getDefaultCalibrationData(disp));
displaymodule 0:d6ff5fa503e8 85
displaymodule 7:6cd8c36cbdb3 86 _samplesPerMeasurement = 3;
displaymodule 0:d6ff5fa503e8 87 }
displaymodule 0:d6ff5fa503e8 88
displaymodule 0:d6ff5fa503e8 89 void DmTouch::init() {
displaymodule 0:d6ff5fa503e8 90 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 91 pinMode(_cs, OUTPUT);
displaymodule 0:d6ff5fa503e8 92 _pinCS = portOutputRegister(digitalPinToPort(_cs));
displaymodule 0:d6ff5fa503e8 93 _bitmaskCS = digitalPinToBitMask(_cs);
displaymodule 0:d6ff5fa503e8 94
displaymodule 0:d6ff5fa503e8 95 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 96 SPI.begin();
displaymodule 7:6cd8c36cbdb3 97 SPI.setClockDivider(SPI_CLOCK_DIV32);
displaymodule 0:d6ff5fa503e8 98 SPI.setBitOrder(MSBFIRST);
displaymodule 0:d6ff5fa503e8 99 SPI.setDataMode(SPI_MODE0);
displaymodule 0:d6ff5fa503e8 100 _spiSettings = SPCR;
displaymodule 0:d6ff5fa503e8 101 }
displaymodule 0:d6ff5fa503e8 102 else {
displaymodule 0:d6ff5fa503e8 103 pinMode(_clk, OUTPUT);
displaymodule 0:d6ff5fa503e8 104 pinMode(_mosi, OUTPUT);
displaymodule 0:d6ff5fa503e8 105 pinMode(_miso, INPUT);
displaymodule 0:d6ff5fa503e8 106 _pinCLK = portOutputRegister(digitalPinToPort(_clk));
displaymodule 0:d6ff5fa503e8 107 _bitmaskCLK = digitalPinToBitMask(_clk);
displaymodule 0:d6ff5fa503e8 108 _pinMOSI = portOutputRegister(digitalPinToPort(_mosi));
displaymodule 0:d6ff5fa503e8 109 _bitmaskMOSI = digitalPinToBitMask(_mosi);
displaymodule 0:d6ff5fa503e8 110 _pinMISO = portInputRegister(digitalPinToPort(_miso));
displaymodule 0:d6ff5fa503e8 111 _bitmaskMISO = digitalPinToBitMask(_miso);
displaymodule 0:d6ff5fa503e8 112 }
displaymodule 0:d6ff5fa503e8 113 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 114 _pinCS = new DigitalOut((PinName)_cs);
displaymodule 0:d6ff5fa503e8 115 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 116 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 117 _spi = new SPI((PinName)_mosi, (PinName)_miso, (PinName)_clk);
displaymodule 0:d6ff5fa503e8 118 _spi->format(8,0);
displaymodule 0:d6ff5fa503e8 119 _spi->frequency(2000000); // Max SPI speed
displaymodule 0:d6ff5fa503e8 120 //cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 121 } else {
displaymodule 0:d6ff5fa503e8 122 _pinCLK = new DigitalOut((PinName)_clk);
displaymodule 3:02c19cbc707c 123 _pinMISO = new DigitalIn((PinName)_miso);
displaymodule 0:d6ff5fa503e8 124 _pinMOSI = new DigitalOut((PinName)_mosi);
displaymodule 3:02c19cbc707c 125 sbi(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 126 }
displaymodule 0:d6ff5fa503e8 127 #endif
displaymodule 0:d6ff5fa503e8 128
displaymodule 0:d6ff5fa503e8 129 if (_irq != -1) { // We will use Touch IRQ
displaymodule 0:d6ff5fa503e8 130 enableIrq();
displaymodule 0:d6ff5fa503e8 131 }
displaymodule 0:d6ff5fa503e8 132 }
displaymodule 0:d6ff5fa503e8 133
displaymodule 0:d6ff5fa503e8 134 void DmTouch::enableIrq() {
displaymodule 0:d6ff5fa503e8 135 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 136 pinMode(_irq, INPUT);
displaymodule 0:d6ff5fa503e8 137 _pinIrq = portInputRegister(digitalPinToPort(_irq));
displaymodule 0:d6ff5fa503e8 138 _bitmaskIrq = digitalPinToBitMask(_irq);
displaymodule 0:d6ff5fa503e8 139
displaymodule 0:d6ff5fa503e8 140 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 141 spiWrite(0x80); // Enable PENIRQ
displaymodule 0:d6ff5fa503e8 142 sbi(_pinCS, _bitmaskCS);
displaymodule 8:b24f01d148c4 143 #endif
displaymodule 0:d6ff5fa503e8 144 }
displaymodule 0:d6ff5fa503e8 145
displaymodule 0:d6ff5fa503e8 146 void DmTouch::spiWrite(uint8_t data) {
displaymodule 7:6cd8c36cbdb3 147 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 148 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 149 SPCR = _spiSettings; // SPI Control Register
displaymodule 0:d6ff5fa503e8 150 SPDR = data; // SPI Data Register
displaymodule 0:d6ff5fa503e8 151 while(!(SPSR & _BV(SPIF))); // SPI Status Register Wait for transmission to finish
displaymodule 0:d6ff5fa503e8 152 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 153 _spi->write(data);
displaymodule 7:6cd8c36cbdb3 154 #endif
displaymodule 0:d6ff5fa503e8 155 }
displaymodule 0:d6ff5fa503e8 156 else {
displaymodule 0:d6ff5fa503e8 157 uint8_t count=0;
displaymodule 0:d6ff5fa503e8 158 uint8_t temp = data;
displaymodule 7:6cd8c36cbdb3 159 delay(1);
displaymodule 7:6cd8c36cbdb3 160 cbi(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 161 for(count=0;count<8;count++) {
displaymodule 0:d6ff5fa503e8 162 if(temp&0x80) {
displaymodule 0:d6ff5fa503e8 163 sbi(_pinMOSI, _bitmaskMOSI);
displaymodule 0:d6ff5fa503e8 164 }
displaymodule 0:d6ff5fa503e8 165 else {
displaymodule 0:d6ff5fa503e8 166 cbi(_pinMOSI, _bitmaskMOSI);
displaymodule 0:d6ff5fa503e8 167 }
displaymodule 0:d6ff5fa503e8 168
displaymodule 0:d6ff5fa503e8 169 temp=temp<<1;
displaymodule 0:d6ff5fa503e8 170
displaymodule 6:fde03297017b 171 slow_pulse_low(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 172 }
displaymodule 0:d6ff5fa503e8 173 }
displaymodule 0:d6ff5fa503e8 174 }
displaymodule 0:d6ff5fa503e8 175
displaymodule 0:d6ff5fa503e8 176 uint8_t DmTouch::spiRead() {// Only used for Hardware SPI
displaymodule 0:d6ff5fa503e8 177 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 178 uint8_t data;
displaymodule 0:d6ff5fa503e8 179 SPCR = _spiSettings;
displaymodule 0:d6ff5fa503e8 180 spiWrite(0x00);
displaymodule 0:d6ff5fa503e8 181 data = SPDR;
displaymodule 0:d6ff5fa503e8 182
displaymodule 0:d6ff5fa503e8 183 return data;
displaymodule 0:d6ff5fa503e8 184 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 185 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 186 return _spi->write(0x00); // dummy byte to read
displaymodule 0:d6ff5fa503e8 187 } else {
displaymodule 0:d6ff5fa503e8 188 uint8_t count=0;
displaymodule 0:d6ff5fa503e8 189 uint8_t temp=0;
displaymodule 7:6cd8c36cbdb3 190 cbi(_pinCLK, _bitmaskCLK);
displaymodule 3:02c19cbc707c 191 cbi(_pinMOSI, _bitmaskMOSI); // same as using 0x00 as dummy byte
displaymodule 0:d6ff5fa503e8 192 for(count=0;count<8;count++) {
displaymodule 0:d6ff5fa503e8 193
displaymodule 0:d6ff5fa503e8 194 pulse_low(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 195 temp = temp<<1;
displaymodule 0:d6ff5fa503e8 196 temp |= _pinMISO->read();
displaymodule 0:d6ff5fa503e8 197 }
displaymodule 0:d6ff5fa503e8 198 return temp;
displaymodule 0:d6ff5fa503e8 199 }
displaymodule 0:d6ff5fa503e8 200 #endif
displaymodule 0:d6ff5fa503e8 201 }
displaymodule 0:d6ff5fa503e8 202
displaymodule 0:d6ff5fa503e8 203 uint16_t DmTouch::readData12(uint8_t command) {
displaymodule 0:d6ff5fa503e8 204 uint8_t temp = 0;
displaymodule 0:d6ff5fa503e8 205 uint16_t value = 0;
displaymodule 0:d6ff5fa503e8 206
displaymodule 0:d6ff5fa503e8 207 spiWrite(command); // Send command
displaymodule 7:6cd8c36cbdb3 208
displaymodule 0:d6ff5fa503e8 209 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 210 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 211 // We use 7-bits from the first byte and 5-bit from the second byte
displaymodule 0:d6ff5fa503e8 212 temp = spiRead();
displaymodule 0:d6ff5fa503e8 213 value = temp<<8;
displaymodule 0:d6ff5fa503e8 214 temp = spiRead();
displaymodule 7:6cd8c36cbdb3 215
displaymodule 7:6cd8c36cbdb3 216 value |= temp;
displaymodule 0:d6ff5fa503e8 217 value >>=3;
displaymodule 0:d6ff5fa503e8 218 value &= 0xFFF;
displaymodule 7:6cd8c36cbdb3 219 } else {
displaymodule 0:d6ff5fa503e8 220 pulse_high(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 221 unsigned nop;
displaymodule 0:d6ff5fa503e8 222 uint8_t count=0;
displaymodule 0:d6ff5fa503e8 223 for(count=0;count<12;count++) {
displaymodule 0:d6ff5fa503e8 224 value<<=1;
displaymodule 0:d6ff5fa503e8 225 pulse_high(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 226 if ( gbi(_pinMISO, _bitmaskMISO) ) {
displaymodule 0:d6ff5fa503e8 227 value++;
displaymodule 0:d6ff5fa503e8 228 }
displaymodule 0:d6ff5fa503e8 229 }
displaymodule 0:d6ff5fa503e8 230 }
displaymodule 0:d6ff5fa503e8 231 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 232 // We use 7-bits from the first byte and 5-bit from the second byte
displaymodule 0:d6ff5fa503e8 233 temp = spiRead();
displaymodule 0:d6ff5fa503e8 234 value = temp<<8;
displaymodule 0:d6ff5fa503e8 235 temp = spiRead();
displaymodule 0:d6ff5fa503e8 236 value |= temp;
displaymodule 0:d6ff5fa503e8 237 value >>=3;
displaymodule 0:d6ff5fa503e8 238 value &= 0xFFF;
displaymodule 0:d6ff5fa503e8 239 #endif
displaymodule 0:d6ff5fa503e8 240 return value;
displaymodule 0:d6ff5fa503e8 241 }
displaymodule 0:d6ff5fa503e8 242
displaymodule 7:6cd8c36cbdb3 243 void DmTouch::readRawData(uint16_t &x, uint16_t &y) {
displaymodule 7:6cd8c36cbdb3 244 cbi(_pinCS, _bitmaskCS);
displaymodule 7:6cd8c36cbdb3 245 x = readData12(0xD0);
displaymodule 7:6cd8c36cbdb3 246 y = readData12(0x90);
displaymodule 7:6cd8c36cbdb3 247 sbi(_pinCS, _bitmaskCS);
displaymodule 7:6cd8c36cbdb3 248 }
displaymodule 7:6cd8c36cbdb3 249
displaymodule 7:6cd8c36cbdb3 250 void DmTouch::readTouchData(uint16_t& posX, uint16_t& posY, bool& touching) {
displaymodule 7:6cd8c36cbdb3 251 uint16_t touchX, touchY;
embeddedartists 11:8b441dd1d470 252 if (!getMiddleXY(touchX,touchY)) {
embeddedartists 11:8b441dd1d470 253 touching = false;
embeddedartists 11:8b441dd1d470 254 }
displaymodule 0:d6ff5fa503e8 255
displaymodule 7:6cd8c36cbdb3 256 posX = getDisplayCoordinateX(touchX, touchY);
displaymodule 7:6cd8c36cbdb3 257 posY = getDisplayCoordinateY(touchX, touchY);
displaymodule 7:6cd8c36cbdb3 258
displaymodule 8:b24f01d148c4 259 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 7:6cd8c36cbdb3 260 touching = isTouched();
displaymodule 8:b24f01d148c4 261 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 10:d263094e666d 262 touching = (posX < _width && posY < _height);
displaymodule 8:b24f01d148c4 263 #endif
displaymodule 0:d6ff5fa503e8 264 }
displaymodule 0:d6ff5fa503e8 265
displaymodule 7:6cd8c36cbdb3 266 bool DmTouch::isSampleValid() {
displaymodule 7:6cd8c36cbdb3 267 uint16_t sampleX,sampleY;
displaymodule 7:6cd8c36cbdb3 268 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 269 if (sampleX > 0 && sampleX < 4095 && sampleY > 0 && sampleY < 4095) {
displaymodule 7:6cd8c36cbdb3 270 return true;
displaymodule 7:6cd8c36cbdb3 271 } else {
displaymodule 7:6cd8c36cbdb3 272 return false;
displaymodule 7:6cd8c36cbdb3 273 }
displaymodule 7:6cd8c36cbdb3 274 }
displaymodule 7:6cd8c36cbdb3 275
displaymodule 7:6cd8c36cbdb3 276 bool DmTouch::isTouched() {
displaymodule 0:d6ff5fa503e8 277 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 278 if (_irq == -1) {
displaymodule 7:6cd8c36cbdb3 279 return isSampleValid();
displaymodule 0:d6ff5fa503e8 280 }
displaymodule 0:d6ff5fa503e8 281
displaymodule 0:d6ff5fa503e8 282 if ( !gbi(_pinIrq, _bitmaskIrq) ) {
displaymodule 0:d6ff5fa503e8 283 return true;
displaymodule 0:d6ff5fa503e8 284 }
displaymodule 0:d6ff5fa503e8 285
displaymodule 0:d6ff5fa503e8 286 return false;
displaymodule 0:d6ff5fa503e8 287 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 8:b24f01d148c4 288 return isSampleValid();
displaymodule 0:d6ff5fa503e8 289 #endif
displaymodule 0:d6ff5fa503e8 290 }
displaymodule 7:6cd8c36cbdb3 291
displaymodule 7:6cd8c36cbdb3 292 bool DmTouch::getMiddleXY(uint16_t &x, uint16_t &y) {
displaymodule 7:6cd8c36cbdb3 293 bool haveAllMeasurements = true;
displaymodule 7:6cd8c36cbdb3 294 uint16_t valuesX[MEASUREMENTS];
displaymodule 7:6cd8c36cbdb3 295 uint16_t valuesY[MEASUREMENTS];
displaymodule 7:6cd8c36cbdb3 296 uint8_t nbrOfMeasurements = 0;
displaymodule 7:6cd8c36cbdb3 297
displaymodule 7:6cd8c36cbdb3 298 for (int i=0; i<MEASUREMENTS; i++) {
displaymodule 7:6cd8c36cbdb3 299 getAverageXY(valuesX[i], valuesY[i]);
displaymodule 7:6cd8c36cbdb3 300 nbrOfMeasurements++;
displaymodule 7:6cd8c36cbdb3 301 if (!isTouched()) {
displaymodule 7:6cd8c36cbdb3 302 haveAllMeasurements = false;
displaymodule 7:6cd8c36cbdb3 303 break;
displaymodule 7:6cd8c36cbdb3 304 }
displaymodule 7:6cd8c36cbdb3 305 }
displaymodule 9:bac5439e3c1c 306 if (haveAllMeasurements) {
displaymodule 9:bac5439e3c1c 307 x = calculateMiddleValue(valuesX, nbrOfMeasurements);
displaymodule 9:bac5439e3c1c 308 y = calculateMiddleValue(valuesY, nbrOfMeasurements);
displaymodule 9:bac5439e3c1c 309 }
displaymodule 7:6cd8c36cbdb3 310
displaymodule 7:6cd8c36cbdb3 311 return haveAllMeasurements;
displaymodule 7:6cd8c36cbdb3 312 }
displaymodule 7:6cd8c36cbdb3 313
displaymodule 7:6cd8c36cbdb3 314 void DmTouch::getAverageXY(uint16_t &x, uint16_t &y) {
displaymodule 7:6cd8c36cbdb3 315 uint32_t sumX = 0;
displaymodule 7:6cd8c36cbdb3 316 uint32_t sumY = 0;
displaymodule 7:6cd8c36cbdb3 317 uint16_t sampleX,sampleY;
displaymodule 7:6cd8c36cbdb3 318 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 319
displaymodule 7:6cd8c36cbdb3 320 for (int i=0; i<_samplesPerMeasurement; i++) {
displaymodule 7:6cd8c36cbdb3 321 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 322 sumX += sampleX;
displaymodule 7:6cd8c36cbdb3 323 sumY += sampleY;
displaymodule 7:6cd8c36cbdb3 324 }
displaymodule 7:6cd8c36cbdb3 325
displaymodule 7:6cd8c36cbdb3 326 x = (uint32_t)sumX/_samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 327 y = (uint32_t)sumY/_samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 328 }
displaymodule 7:6cd8c36cbdb3 329
displaymodule 7:6cd8c36cbdb3 330 // Total number of samples = MEASUREMENTS * _samplesPerMeasurement
displaymodule 7:6cd8c36cbdb3 331 void DmTouch::setPrecison(uint8_t samplesPerMeasurement) {
displaymodule 7:6cd8c36cbdb3 332 _samplesPerMeasurement = samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 333 }
displaymodule 7:6cd8c36cbdb3 334
displaymodule 7:6cd8c36cbdb3 335 void DmTouch::setCalibrationMatrix(CalibrationMatrix calibrationMatrix) {
displaymodule 7:6cd8c36cbdb3 336 _calibrationMatrix = calibrationMatrix;
displaymodule 7:6cd8c36cbdb3 337 }
displaymodule 7:6cd8c36cbdb3 338
displaymodule 7:6cd8c36cbdb3 339 void DmTouch::waitForTouch() {
displaymodule 7:6cd8c36cbdb3 340 while(!isTouched()) {}
displaymodule 7:6cd8c36cbdb3 341 }
displaymodule 7:6cd8c36cbdb3 342
displaymodule 7:6cd8c36cbdb3 343 void DmTouch::waitForTouchRelease() {
displaymodule 7:6cd8c36cbdb3 344 while(isTouched()) {}
displaymodule 7:6cd8c36cbdb3 345 }
displaymodule 7:6cd8c36cbdb3 346
displaymodule 7:6cd8c36cbdb3 347 uint16_t DmTouch::getDisplayCoordinateX(uint16_t x_touch, uint16_t y_touch) {
displaymodule 7:6cd8c36cbdb3 348 uint16_t Xd;
displaymodule 7:6cd8c36cbdb3 349 float temp;
displaymodule 7:6cd8c36cbdb3 350 temp = (_calibrationMatrix.a * x_touch + _calibrationMatrix.b * y_touch + _calibrationMatrix.c) / rescaleFactor();
displaymodule 7:6cd8c36cbdb3 351 Xd = (uint16_t)(temp);
displaymodule 7:6cd8c36cbdb3 352 if (Xd > 60000) {
displaymodule 7:6cd8c36cbdb3 353 Xd = 0;
displaymodule 7:6cd8c36cbdb3 354 }
displaymodule 7:6cd8c36cbdb3 355 return Xd;
displaymodule 7:6cd8c36cbdb3 356 }
displaymodule 7:6cd8c36cbdb3 357
displaymodule 7:6cd8c36cbdb3 358 uint16_t DmTouch::getDisplayCoordinateY(uint16_t x_touch, uint16_t y_touch) {
displaymodule 7:6cd8c36cbdb3 359 uint16_t Yd;
displaymodule 7:6cd8c36cbdb3 360 float temp;
displaymodule 7:6cd8c36cbdb3 361 temp = (_calibrationMatrix.d * x_touch + _calibrationMatrix.e * y_touch + _calibrationMatrix.f) / rescaleFactor();
displaymodule 7:6cd8c36cbdb3 362 Yd = (uint16_t)(temp);
displaymodule 7:6cd8c36cbdb3 363 if (Yd > 60000) {
displaymodule 7:6cd8c36cbdb3 364 Yd = 0;
displaymodule 7:6cd8c36cbdb3 365 }
displaymodule 7:6cd8c36cbdb3 366 return Yd;
displaymodule 7:6cd8c36cbdb3 367 }
displaymodule 7:6cd8c36cbdb3 368
displaymodule 7:6cd8c36cbdb3 369 uint16_t DmTouch::calculateMiddleValue(uint16_t values[], uint8_t count) {
displaymodule 7:6cd8c36cbdb3 370 uint16_t temp;
displaymodule 7:6cd8c36cbdb3 371
displaymodule 7:6cd8c36cbdb3 372 for(uint8_t i=0; i<count-1; i++) {
displaymodule 7:6cd8c36cbdb3 373 for(uint8_t j=i+1; j<count; j++) {
displaymodule 7:6cd8c36cbdb3 374 if(values[j] < values[i]) {
displaymodule 7:6cd8c36cbdb3 375 temp = values[i];
displaymodule 7:6cd8c36cbdb3 376 values[i] = values[j];
displaymodule 7:6cd8c36cbdb3 377 values[j] = temp;
displaymodule 7:6cd8c36cbdb3 378 }
displaymodule 7:6cd8c36cbdb3 379 }
displaymodule 7:6cd8c36cbdb3 380 }
displaymodule 7:6cd8c36cbdb3 381
displaymodule 7:6cd8c36cbdb3 382 if(count%2==0) {
displaymodule 7:6cd8c36cbdb3 383 return((values[count/2] + values[count/2 - 1]) / 2.0);
displaymodule 7:6cd8c36cbdb3 384 } else {
displaymodule 7:6cd8c36cbdb3 385 return values[count/2];
displaymodule 7:6cd8c36cbdb3 386 }
displaymodule 7:6cd8c36cbdb3 387 }