Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: dm_bubbles dm_calc dm_paint dm_sdcard_with_adapter ... more
DmTouch.cpp@7:6cd8c36cbdb3, 2014-07-04 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
DisplayModule 1.8" TFT with SPI Interface
DisplayModule 2.2" TFT with 8-bit interface
DisplayModule 2.8" 240x320 Touch TFT with 8-bit Interface
DisplayModule 2.4" 240x320 Touch TFT with 8-bit Interface
DisplayModule 2.8" 240x320 TFT LCD With Resistive Touch - SPI, 4MB Flash
DisplayModule 3.5" 320x240 TFT LCD With Resistive Touch - SPI, 4MB Flash
DisplayModule 4.3" 480x272 Arduino TFT Shield With Touch And SPI Interface
DisplayModule 5.0" 800x480 Arduino TFT Shield With Touch And SPI Interface
DisplayModule 2.8" 240x320 TFT With Capacitive Touch