Driver Library for our displays

Dependents:   dm_bubbles dm_calc dm_paint dm_sdcard_with_adapter ... more

Committer:
displaymodule
Date:
Wed Jul 09 08:31:34 2014 +0000
Revision:
10:d263094e666d
Parent:
9:bac5439e3c1c
Child:
11:264e19992620
Added better out-of-bounds checks for touch. If the coordinate is outside the display area then it is considered as not touching.

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;
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 8:b24f01d148c4 257 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 7:6cd8c36cbdb3 258 touching = isTouched();
displaymodule 8:b24f01d148c4 259 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 10:d263094e666d 260 touching = (posX < _width && posY < _height);
displaymodule 8:b24f01d148c4 261 #endif
displaymodule 0:d6ff5fa503e8 262 }
displaymodule 0:d6ff5fa503e8 263
displaymodule 7:6cd8c36cbdb3 264 bool DmTouch::isSampleValid() {
displaymodule 7:6cd8c36cbdb3 265 uint16_t sampleX,sampleY;
displaymodule 7:6cd8c36cbdb3 266 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 267 if (sampleX > 0 && sampleX < 4095 && sampleY > 0 && sampleY < 4095) {
displaymodule 7:6cd8c36cbdb3 268 return true;
displaymodule 7:6cd8c36cbdb3 269 } else {
displaymodule 7:6cd8c36cbdb3 270 return false;
displaymodule 7:6cd8c36cbdb3 271 }
displaymodule 7:6cd8c36cbdb3 272 }
displaymodule 7:6cd8c36cbdb3 273
displaymodule 7:6cd8c36cbdb3 274 bool DmTouch::isTouched() {
displaymodule 0:d6ff5fa503e8 275 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 276 if (_irq == -1) {
displaymodule 7:6cd8c36cbdb3 277 return isSampleValid();
displaymodule 0:d6ff5fa503e8 278 }
displaymodule 0:d6ff5fa503e8 279
displaymodule 0:d6ff5fa503e8 280 if ( !gbi(_pinIrq, _bitmaskIrq) ) {
displaymodule 0:d6ff5fa503e8 281 return true;
displaymodule 0:d6ff5fa503e8 282 }
displaymodule 0:d6ff5fa503e8 283
displaymodule 0:d6ff5fa503e8 284 return false;
displaymodule 0:d6ff5fa503e8 285 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 8:b24f01d148c4 286 return isSampleValid();
displaymodule 0:d6ff5fa503e8 287 #endif
displaymodule 0:d6ff5fa503e8 288 }
displaymodule 7:6cd8c36cbdb3 289
displaymodule 7:6cd8c36cbdb3 290 bool DmTouch::getMiddleXY(uint16_t &x, uint16_t &y) {
displaymodule 7:6cd8c36cbdb3 291 bool haveAllMeasurements = true;
displaymodule 7:6cd8c36cbdb3 292 uint16_t valuesX[MEASUREMENTS];
displaymodule 7:6cd8c36cbdb3 293 uint16_t valuesY[MEASUREMENTS];
displaymodule 7:6cd8c36cbdb3 294 uint8_t nbrOfMeasurements = 0;
displaymodule 7:6cd8c36cbdb3 295
displaymodule 7:6cd8c36cbdb3 296 for (int i=0; i<MEASUREMENTS; i++) {
displaymodule 7:6cd8c36cbdb3 297 getAverageXY(valuesX[i], valuesY[i]);
displaymodule 7:6cd8c36cbdb3 298 nbrOfMeasurements++;
displaymodule 7:6cd8c36cbdb3 299 if (!isTouched()) {
displaymodule 7:6cd8c36cbdb3 300 haveAllMeasurements = false;
displaymodule 7:6cd8c36cbdb3 301 break;
displaymodule 7:6cd8c36cbdb3 302 }
displaymodule 7:6cd8c36cbdb3 303 }
displaymodule 9:bac5439e3c1c 304 if (haveAllMeasurements) {
displaymodule 9:bac5439e3c1c 305 x = calculateMiddleValue(valuesX, nbrOfMeasurements);
displaymodule 9:bac5439e3c1c 306 y = calculateMiddleValue(valuesY, nbrOfMeasurements);
displaymodule 9:bac5439e3c1c 307 }
displaymodule 7:6cd8c36cbdb3 308
displaymodule 7:6cd8c36cbdb3 309 return haveAllMeasurements;
displaymodule 7:6cd8c36cbdb3 310 }
displaymodule 7:6cd8c36cbdb3 311
displaymodule 7:6cd8c36cbdb3 312 void DmTouch::getAverageXY(uint16_t &x, uint16_t &y) {
displaymodule 7:6cd8c36cbdb3 313 uint32_t sumX = 0;
displaymodule 7:6cd8c36cbdb3 314 uint32_t sumY = 0;
displaymodule 7:6cd8c36cbdb3 315 uint16_t sampleX,sampleY;
displaymodule 7:6cd8c36cbdb3 316 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 317
displaymodule 7:6cd8c36cbdb3 318 for (int i=0; i<_samplesPerMeasurement; i++) {
displaymodule 7:6cd8c36cbdb3 319 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 320 sumX += sampleX;
displaymodule 7:6cd8c36cbdb3 321 sumY += sampleY;
displaymodule 7:6cd8c36cbdb3 322 }
displaymodule 7:6cd8c36cbdb3 323
displaymodule 7:6cd8c36cbdb3 324 x = (uint32_t)sumX/_samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 325 y = (uint32_t)sumY/_samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 326 }
displaymodule 7:6cd8c36cbdb3 327
displaymodule 7:6cd8c36cbdb3 328 // Total number of samples = MEASUREMENTS * _samplesPerMeasurement
displaymodule 7:6cd8c36cbdb3 329 void DmTouch::setPrecison(uint8_t samplesPerMeasurement) {
displaymodule 7:6cd8c36cbdb3 330 _samplesPerMeasurement = samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 331 }
displaymodule 7:6cd8c36cbdb3 332
displaymodule 7:6cd8c36cbdb3 333 void DmTouch::setCalibrationMatrix(CalibrationMatrix calibrationMatrix) {
displaymodule 7:6cd8c36cbdb3 334 _calibrationMatrix = calibrationMatrix;
displaymodule 7:6cd8c36cbdb3 335 }
displaymodule 7:6cd8c36cbdb3 336
displaymodule 7:6cd8c36cbdb3 337 void DmTouch::waitForTouch() {
displaymodule 7:6cd8c36cbdb3 338 while(!isTouched()) {}
displaymodule 7:6cd8c36cbdb3 339 }
displaymodule 7:6cd8c36cbdb3 340
displaymodule 7:6cd8c36cbdb3 341 void DmTouch::waitForTouchRelease() {
displaymodule 7:6cd8c36cbdb3 342 while(isTouched()) {}
displaymodule 7:6cd8c36cbdb3 343 }
displaymodule 7:6cd8c36cbdb3 344
displaymodule 7:6cd8c36cbdb3 345 uint16_t DmTouch::getDisplayCoordinateX(uint16_t x_touch, uint16_t y_touch) {
displaymodule 7:6cd8c36cbdb3 346 uint16_t Xd;
displaymodule 7:6cd8c36cbdb3 347 float temp;
displaymodule 7:6cd8c36cbdb3 348 temp = (_calibrationMatrix.a * x_touch + _calibrationMatrix.b * y_touch + _calibrationMatrix.c) / rescaleFactor();
displaymodule 7:6cd8c36cbdb3 349 Xd = (uint16_t)(temp);
displaymodule 7:6cd8c36cbdb3 350 if (Xd > 60000) {
displaymodule 7:6cd8c36cbdb3 351 Xd = 0;
displaymodule 7:6cd8c36cbdb3 352 }
displaymodule 7:6cd8c36cbdb3 353 return Xd;
displaymodule 7:6cd8c36cbdb3 354 }
displaymodule 7:6cd8c36cbdb3 355
displaymodule 7:6cd8c36cbdb3 356 uint16_t DmTouch::getDisplayCoordinateY(uint16_t x_touch, uint16_t y_touch) {
displaymodule 7:6cd8c36cbdb3 357 uint16_t Yd;
displaymodule 7:6cd8c36cbdb3 358 float temp;
displaymodule 7:6cd8c36cbdb3 359 temp = (_calibrationMatrix.d * x_touch + _calibrationMatrix.e * y_touch + _calibrationMatrix.f) / rescaleFactor();
displaymodule 7:6cd8c36cbdb3 360 Yd = (uint16_t)(temp);
displaymodule 7:6cd8c36cbdb3 361 if (Yd > 60000) {
displaymodule 7:6cd8c36cbdb3 362 Yd = 0;
displaymodule 7:6cd8c36cbdb3 363 }
displaymodule 7:6cd8c36cbdb3 364 return Yd;
displaymodule 7:6cd8c36cbdb3 365 }
displaymodule 7:6cd8c36cbdb3 366
displaymodule 7:6cd8c36cbdb3 367 uint16_t DmTouch::calculateMiddleValue(uint16_t values[], uint8_t count) {
displaymodule 7:6cd8c36cbdb3 368 uint16_t temp;
displaymodule 7:6cd8c36cbdb3 369
displaymodule 7:6cd8c36cbdb3 370 for(uint8_t i=0; i<count-1; i++) {
displaymodule 7:6cd8c36cbdb3 371 for(uint8_t j=i+1; j<count; j++) {
displaymodule 7:6cd8c36cbdb3 372 if(values[j] < values[i]) {
displaymodule 7:6cd8c36cbdb3 373 temp = values[i];
displaymodule 7:6cd8c36cbdb3 374 values[i] = values[j];
displaymodule 7:6cd8c36cbdb3 375 values[j] = temp;
displaymodule 7:6cd8c36cbdb3 376 }
displaymodule 7:6cd8c36cbdb3 377 }
displaymodule 7:6cd8c36cbdb3 378 }
displaymodule 7:6cd8c36cbdb3 379
displaymodule 7:6cd8c36cbdb3 380 if(count%2==0) {
displaymodule 7:6cd8c36cbdb3 381 return((values[count/2] + values[count/2 - 1]) / 2.0);
displaymodule 7:6cd8c36cbdb3 382 } else {
displaymodule 7:6cd8c36cbdb3 383 return values[count/2];
displaymodule 7:6cd8c36cbdb3 384 }
displaymodule 7:6cd8c36cbdb3 385 }