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:
displaymodule
Date:
Fri Jul 04 09:26:32 2014 +0000
Revision:
7:6cd8c36cbdb3
Parent:
6:fde03297017b
Child:
8:b24f01d148c4
Improved handling of touch calibration

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