Driver Library for our displays

Dependents:   dm_bubbles dm_calc dm_paint dm_sdcard_with_adapter ... more

Committer:
displaymodule
Date:
Mon Oct 12 08:35:35 2015 +0000
Revision:
14:2db7065edbec
Parent:
11:264e19992620
Important updates, compatible with the new mbed library?more platforms support. Recommended updates.

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 14:2db7065edbec 12 // Tested with Xpt2046 and RA8875
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 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 25 // disp - which display is used
displaymodule 7:6cd8c36cbdb3 26 // spiMode - How to read SPI-data, Software, Hardware or Auto
displaymodule 14:2db7065edbec 27 DmTouch::DmTouch(Display disp, PinName mosi, PinName miso, PinName clk)
displaymodule 7:6cd8c36cbdb3 28 #endif
displaymodule 0:d6ff5fa503e8 29 {
displaymodule 10:d263094e666d 30 _disp = disp;
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 10:d263094e666d 40 _width = 240;
displaymodule 10:d263094e666d 41 _height = 320;
displaymodule 7:6cd8c36cbdb3 42 _hardwareSpi = false;
displaymodule 11:264e19992620 43 _touch_id = IC_2046;
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 11:264e19992620 55 _touch_id = IC_2046;
displaymodule 0:d6ff5fa503e8 56 break;
displaymodule 0:d6ff5fa503e8 57
displaymodule 0:d6ff5fa503e8 58 case DmTouch::DM_TFT35_107:
displaymodule 11:264e19992620 59 _cs = D4;
displaymodule 11:264e19992620 60 _irq = D2;
displaymodule 11:264e19992620 61 _clk = D13;
displaymodule 11:264e19992620 62 _mosi = D11;
displaymodule 11:264e19992620 63 _miso = D12;
displaymodule 11:264e19992620 64 _width = 320;
displaymodule 11:264e19992620 65 _height = 240;
displaymodule 11:264e19992620 66 _hardwareSpi = true;
displaymodule 11:264e19992620 67 _touch_id = IC_2046;
displaymodule 11:264e19992620 68 break;
displaymodule 11:264e19992620 69
displaymodule 11:264e19992620 70 case DmTouch::DM_TFT43_108: // or DM_TFT43_110
displaymodule 11:264e19992620 71 _cs = D10;
displaymodule 11:264e19992620 72 _irq = D2;
displaymodule 11:264e19992620 73 _clk = D13;
displaymodule 11:264e19992620 74 _mosi = D11;
displaymodule 11:264e19992620 75 _miso = D12;
displaymodule 11:264e19992620 76 _width = 480;
displaymodule 11:264e19992620 77 _height = 272;
displaymodule 11:264e19992620 78 _hardwareSpi = true;
displaymodule 11:264e19992620 79 _touch_id = IC_8875;
displaymodule 11:264e19992620 80 break;
displaymodule 11:264e19992620 81
displaymodule 11:264e19992620 82 case DmTouch::DM_TFT50_111: // or DM_TFT50_112
displaymodule 11:264e19992620 83 _cs = D10;
displaymodule 11:264e19992620 84 _irq = D2;
displaymodule 11:264e19992620 85 _clk = D13;
displaymodule 11:264e19992620 86 _mosi = D11;
displaymodule 11:264e19992620 87 _miso = D12;
displaymodule 11:264e19992620 88 _width = 800;
displaymodule 11:264e19992620 89 _height = 480;
displaymodule 11:264e19992620 90 _hardwareSpi = true;
displaymodule 11:264e19992620 91 _touch_id = IC_8875;
displaymodule 11:264e19992620 92 break;
displaymodule 11:264e19992620 93
displaymodule 0:d6ff5fa503e8 94 default:
displaymodule 0:d6ff5fa503e8 95 _cs = D4;
displaymodule 0:d6ff5fa503e8 96 _irq = D2;
displaymodule 0:d6ff5fa503e8 97 _clk = D13;
displaymodule 0:d6ff5fa503e8 98 _mosi = D11;
displaymodule 0:d6ff5fa503e8 99 _miso = D12;
displaymodule 10:d263094e666d 100 _width = 320;
displaymodule 10:d263094e666d 101 _height = 240;
displaymodule 7:6cd8c36cbdb3 102 _hardwareSpi = true;
displaymodule 11:264e19992620 103 _touch_id = IC_2046;
displaymodule 0:d6ff5fa503e8 104 break;
displaymodule 0:d6ff5fa503e8 105 }
displaymodule 7:6cd8c36cbdb3 106
displaymodule 7:6cd8c36cbdb3 107 setCalibrationMatrix(DmTouchCalibration::getDefaultCalibrationData(disp));
displaymodule 0:d6ff5fa503e8 108
displaymodule 7:6cd8c36cbdb3 109 _samplesPerMeasurement = 3;
displaymodule 0:d6ff5fa503e8 110 }
displaymodule 0:d6ff5fa503e8 111
displaymodule 0:d6ff5fa503e8 112 void DmTouch::init() {
displaymodule 0:d6ff5fa503e8 113 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 114 pinMode(_cs, OUTPUT);
displaymodule 0:d6ff5fa503e8 115 _pinCS = portOutputRegister(digitalPinToPort(_cs));
displaymodule 0:d6ff5fa503e8 116 _bitmaskCS = digitalPinToBitMask(_cs);
displaymodule 0:d6ff5fa503e8 117
displaymodule 0:d6ff5fa503e8 118 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 119 SPI.begin();
displaymodule 7:6cd8c36cbdb3 120 SPI.setClockDivider(SPI_CLOCK_DIV32);
displaymodule 0:d6ff5fa503e8 121 SPI.setBitOrder(MSBFIRST);
displaymodule 0:d6ff5fa503e8 122 SPI.setDataMode(SPI_MODE0);
displaymodule 0:d6ff5fa503e8 123 _spiSettings = SPCR;
displaymodule 0:d6ff5fa503e8 124 }
displaymodule 0:d6ff5fa503e8 125 else {
displaymodule 0:d6ff5fa503e8 126 pinMode(_clk, OUTPUT);
displaymodule 0:d6ff5fa503e8 127 pinMode(_mosi, OUTPUT);
displaymodule 0:d6ff5fa503e8 128 pinMode(_miso, INPUT);
displaymodule 0:d6ff5fa503e8 129 _pinCLK = portOutputRegister(digitalPinToPort(_clk));
displaymodule 0:d6ff5fa503e8 130 _bitmaskCLK = digitalPinToBitMask(_clk);
displaymodule 0:d6ff5fa503e8 131 _pinMOSI = portOutputRegister(digitalPinToPort(_mosi));
displaymodule 0:d6ff5fa503e8 132 _bitmaskMOSI = digitalPinToBitMask(_mosi);
displaymodule 0:d6ff5fa503e8 133 _pinMISO = portInputRegister(digitalPinToPort(_miso));
displaymodule 0:d6ff5fa503e8 134 _bitmaskMISO = digitalPinToBitMask(_miso);
displaymodule 0:d6ff5fa503e8 135 }
displaymodule 0:d6ff5fa503e8 136 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 14:2db7065edbec 137 _pinCS = new DigitalOut(_cs);
displaymodule 0:d6ff5fa503e8 138 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 139 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 140 _spi = new SPI((PinName)_mosi, (PinName)_miso, (PinName)_clk);
displaymodule 0:d6ff5fa503e8 141 _spi->format(8,0);
displaymodule 14:2db7065edbec 142 _spi->frequency(2000000); // Max SPI speed
displaymodule 0:d6ff5fa503e8 143 } else {
displaymodule 14:2db7065edbec 144 _pinCLK = new DigitalOut(_clk);
displaymodule 14:2db7065edbec 145 _pinMISO = new DigitalIn(_miso);
displaymodule 14:2db7065edbec 146 _pinMOSI = new DigitalOut(_mosi);
displaymodule 3:02c19cbc707c 147 sbi(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 148 }
displaymodule 0:d6ff5fa503e8 149 #endif
displaymodule 0:d6ff5fa503e8 150
displaymodule 14:2db7065edbec 151 if (_irq != NC) { // We will use Touch IRQ
displaymodule 0:d6ff5fa503e8 152 enableIrq();
displaymodule 0:d6ff5fa503e8 153 }
displaymodule 0:d6ff5fa503e8 154 }
displaymodule 0:d6ff5fa503e8 155
displaymodule 0:d6ff5fa503e8 156 void DmTouch::enableIrq() {
displaymodule 0:d6ff5fa503e8 157 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 158 pinMode(_irq, INPUT);
displaymodule 0:d6ff5fa503e8 159 _pinIrq = portInputRegister(digitalPinToPort(_irq));
displaymodule 0:d6ff5fa503e8 160 _bitmaskIrq = digitalPinToBitMask(_irq);
displaymodule 0:d6ff5fa503e8 161
displaymodule 0:d6ff5fa503e8 162 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 163 spiWrite(0x80); // Enable PENIRQ
displaymodule 0:d6ff5fa503e8 164 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 165 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 11:264e19992620 166 _pinIrq = new DigitalIn((PinName)_irq);
displaymodule 11:264e19992620 167 _pinIrq->mode(PullUp);
displaymodule 8:b24f01d148c4 168 #endif
displaymodule 11:264e19992620 169 if(_touch_id == IC_8875) {
displaymodule 11:264e19992620 170 // enable touch panel
displaymodule 11:264e19992620 171 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 172 spiWrite(0x80);
displaymodule 11:264e19992620 173 spiWrite(0x70);
displaymodule 11:264e19992620 174 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 175
displaymodule 11:264e19992620 176 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 177 spiWrite(0x00);
displaymodule 11:264e19992620 178 spiWrite(0xB3);
displaymodule 11:264e19992620 179 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 180
displaymodule 11:264e19992620 181 // set auto mode
displaymodule 11:264e19992620 182 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 183 spiWrite(0x80);
displaymodule 11:264e19992620 184 spiWrite(0x71);
displaymodule 11:264e19992620 185 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 186
displaymodule 11:264e19992620 187 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 188 spiWrite(0x00);
displaymodule 11:264e19992620 189 spiWrite(0x04);
displaymodule 11:264e19992620 190 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 191
displaymodule 11:264e19992620 192 // enable touch panel interrupt
displaymodule 11:264e19992620 193 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 194 spiWrite(0x80);
displaymodule 11:264e19992620 195 spiWrite(0xF0);
displaymodule 11:264e19992620 196 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 197
displaymodule 11:264e19992620 198 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 199 uint8_t temp;
displaymodule 11:264e19992620 200 spiWrite(0x40);
displaymodule 11:264e19992620 201 temp = spiRead();
displaymodule 11:264e19992620 202 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 203
displaymodule 11:264e19992620 204 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 205 spiWrite(0x80);
displaymodule 11:264e19992620 206 spiWrite(0xF0);
displaymodule 11:264e19992620 207 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 208
displaymodule 11:264e19992620 209 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 210 spiWrite(0x00);
displaymodule 11:264e19992620 211 spiWrite(temp | 0x04);
displaymodule 11:264e19992620 212 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 213
displaymodule 11:264e19992620 214 // Clear TP INT Status
displaymodule 11:264e19992620 215 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 216 spiWrite(0x80);
displaymodule 11:264e19992620 217 spiWrite(0xF1);
displaymodule 11:264e19992620 218 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 219
displaymodule 11:264e19992620 220 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 221 spiWrite(0x00);
displaymodule 11:264e19992620 222 spiWrite(0x04);
displaymodule 11:264e19992620 223 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 224 }
displaymodule 14:2db7065edbec 225 else{
displaymodule 14:2db7065edbec 226 cbi(_pinCS, _bitmaskCS);
displaymodule 14:2db7065edbec 227 spiWrite(0x80); // Enable PENIRQ
displaymodule 14:2db7065edbec 228 sbi(_pinCS, _bitmaskCS);
displaymodule 14:2db7065edbec 229 }
displaymodule 0:d6ff5fa503e8 230 }
displaymodule 0:d6ff5fa503e8 231
displaymodule 0:d6ff5fa503e8 232 void DmTouch::spiWrite(uint8_t data) {
displaymodule 7:6cd8c36cbdb3 233 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 234 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 235 SPCR = _spiSettings; // SPI Control Register
displaymodule 0:d6ff5fa503e8 236 SPDR = data; // SPI Data Register
displaymodule 0:d6ff5fa503e8 237 while(!(SPSR & _BV(SPIF))); // SPI Status Register Wait for transmission to finish
displaymodule 0:d6ff5fa503e8 238 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 239 _spi->write(data);
displaymodule 7:6cd8c36cbdb3 240 #endif
displaymodule 0:d6ff5fa503e8 241 }
displaymodule 0:d6ff5fa503e8 242 else {
displaymodule 0:d6ff5fa503e8 243 uint8_t count=0;
displaymodule 0:d6ff5fa503e8 244 uint8_t temp = data;
displaymodule 7:6cd8c36cbdb3 245 delay(1);
displaymodule 7:6cd8c36cbdb3 246 cbi(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 247 for(count=0;count<8;count++) {
displaymodule 0:d6ff5fa503e8 248 if(temp&0x80) {
displaymodule 0:d6ff5fa503e8 249 sbi(_pinMOSI, _bitmaskMOSI);
displaymodule 0:d6ff5fa503e8 250 }
displaymodule 0:d6ff5fa503e8 251 else {
displaymodule 0:d6ff5fa503e8 252 cbi(_pinMOSI, _bitmaskMOSI);
displaymodule 0:d6ff5fa503e8 253 }
displaymodule 0:d6ff5fa503e8 254
displaymodule 0:d6ff5fa503e8 255 temp=temp<<1;
displaymodule 0:d6ff5fa503e8 256
displaymodule 6:fde03297017b 257 slow_pulse_low(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 258 }
displaymodule 0:d6ff5fa503e8 259 }
displaymodule 0:d6ff5fa503e8 260 }
displaymodule 0:d6ff5fa503e8 261
displaymodule 0:d6ff5fa503e8 262 uint8_t DmTouch::spiRead() {// Only used for Hardware SPI
displaymodule 0:d6ff5fa503e8 263 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 264 uint8_t data;
displaymodule 0:d6ff5fa503e8 265 SPCR = _spiSettings;
displaymodule 0:d6ff5fa503e8 266 spiWrite(0x00);
displaymodule 0:d6ff5fa503e8 267 data = SPDR;
displaymodule 0:d6ff5fa503e8 268
displaymodule 0:d6ff5fa503e8 269 return data;
displaymodule 0:d6ff5fa503e8 270 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 271 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 272 return _spi->write(0x00); // dummy byte to read
displaymodule 0:d6ff5fa503e8 273 } else {
displaymodule 0:d6ff5fa503e8 274 uint8_t count=0;
displaymodule 0:d6ff5fa503e8 275 uint8_t temp=0;
displaymodule 7:6cd8c36cbdb3 276 cbi(_pinCLK, _bitmaskCLK);
displaymodule 3:02c19cbc707c 277 cbi(_pinMOSI, _bitmaskMOSI); // same as using 0x00 as dummy byte
displaymodule 0:d6ff5fa503e8 278 for(count=0;count<8;count++) {
displaymodule 0:d6ff5fa503e8 279
displaymodule 0:d6ff5fa503e8 280 pulse_low(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 281 temp = temp<<1;
displaymodule 0:d6ff5fa503e8 282 temp |= _pinMISO->read();
displaymodule 0:d6ff5fa503e8 283 }
displaymodule 0:d6ff5fa503e8 284 return temp;
displaymodule 0:d6ff5fa503e8 285 }
displaymodule 0:d6ff5fa503e8 286 #endif
displaymodule 0:d6ff5fa503e8 287 }
displaymodule 0:d6ff5fa503e8 288
displaymodule 0:d6ff5fa503e8 289 uint16_t DmTouch::readData12(uint8_t command) {
displaymodule 0:d6ff5fa503e8 290 uint8_t temp = 0;
displaymodule 0:d6ff5fa503e8 291 uint16_t value = 0;
displaymodule 0:d6ff5fa503e8 292
displaymodule 0:d6ff5fa503e8 293 spiWrite(command); // Send command
displaymodule 7:6cd8c36cbdb3 294
displaymodule 0:d6ff5fa503e8 295 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 296 if (_hardwareSpi) {
displaymodule 0:d6ff5fa503e8 297 // We use 7-bits from the first byte and 5-bit from the second byte
displaymodule 0:d6ff5fa503e8 298 temp = spiRead();
displaymodule 0:d6ff5fa503e8 299 value = temp<<8;
displaymodule 0:d6ff5fa503e8 300 temp = spiRead();
displaymodule 7:6cd8c36cbdb3 301
displaymodule 7:6cd8c36cbdb3 302 value |= temp;
displaymodule 0:d6ff5fa503e8 303 value >>=3;
displaymodule 0:d6ff5fa503e8 304 value &= 0xFFF;
displaymodule 7:6cd8c36cbdb3 305 } else {
displaymodule 0:d6ff5fa503e8 306 pulse_high(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 307 unsigned nop;
displaymodule 0:d6ff5fa503e8 308 uint8_t count=0;
displaymodule 0:d6ff5fa503e8 309 for(count=0;count<12;count++) {
displaymodule 0:d6ff5fa503e8 310 value<<=1;
displaymodule 0:d6ff5fa503e8 311 pulse_high(_pinCLK, _bitmaskCLK);
displaymodule 0:d6ff5fa503e8 312 if ( gbi(_pinMISO, _bitmaskMISO) ) {
displaymodule 0:d6ff5fa503e8 313 value++;
displaymodule 0:d6ff5fa503e8 314 }
displaymodule 0:d6ff5fa503e8 315 }
displaymodule 0:d6ff5fa503e8 316 }
displaymodule 0:d6ff5fa503e8 317 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 318 // We use 7-bits from the first byte and 5-bit from the second byte
displaymodule 0:d6ff5fa503e8 319 temp = spiRead();
displaymodule 0:d6ff5fa503e8 320 value = temp<<8;
displaymodule 0:d6ff5fa503e8 321 temp = spiRead();
displaymodule 0:d6ff5fa503e8 322 value |= temp;
displaymodule 0:d6ff5fa503e8 323 value >>=3;
displaymodule 0:d6ff5fa503e8 324 value &= 0xFFF;
displaymodule 0:d6ff5fa503e8 325 #endif
displaymodule 0:d6ff5fa503e8 326 return value;
displaymodule 0:d6ff5fa503e8 327 }
displaymodule 0:d6ff5fa503e8 328
displaymodule 7:6cd8c36cbdb3 329 void DmTouch::readRawData(uint16_t &x, uint16_t &y) {
displaymodule 11:264e19992620 330 if(_touch_id == IC_8875){
displaymodule 11:264e19992620 331 uint16_t tx, ty;
displaymodule 11:264e19992620 332 uint8_t temp;
displaymodule 11:264e19992620 333
displaymodule 11:264e19992620 334 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 335 spiWrite(0x80);
displaymodule 11:264e19992620 336 spiWrite(0x72);
displaymodule 11:264e19992620 337 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 338
displaymodule 11:264e19992620 339 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 340 spiWrite(0x40);
displaymodule 11:264e19992620 341 tx = spiRead();
displaymodule 11:264e19992620 342 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 343
displaymodule 11:264e19992620 344 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 345 spiWrite(0x80);
displaymodule 11:264e19992620 346 spiWrite(0x73);
displaymodule 11:264e19992620 347 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 348
displaymodule 11:264e19992620 349 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 350 spiWrite(0x40);
displaymodule 11:264e19992620 351 ty = spiRead();
displaymodule 11:264e19992620 352 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 353
displaymodule 11:264e19992620 354 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 355 spiWrite(0x80);
displaymodule 11:264e19992620 356 spiWrite(0x74);
displaymodule 11:264e19992620 357 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 358
displaymodule 11:264e19992620 359 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 360 spiWrite(0x40);
displaymodule 11:264e19992620 361 temp = spiRead();
displaymodule 11:264e19992620 362 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 363
displaymodule 11:264e19992620 364 tx <<= 2;
displaymodule 11:264e19992620 365 ty <<= 2;
displaymodule 11:264e19992620 366 tx |= temp & 0x03; // get the bottom x bits
displaymodule 11:264e19992620 367 ty |= (temp >> 2) & 0x03; // get the bottom y bits
displaymodule 11:264e19992620 368
displaymodule 11:264e19992620 369 x = tx;
displaymodule 11:264e19992620 370 y = ty;
displaymodule 11:264e19992620 371
displaymodule 11:264e19992620 372 // Clear TP INT Status
displaymodule 11:264e19992620 373 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 374 spiWrite(0x80);
displaymodule 11:264e19992620 375 spiWrite(0xF1);
displaymodule 11:264e19992620 376 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 377
displaymodule 11:264e19992620 378 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 379 spiWrite(0x00);
displaymodule 11:264e19992620 380 spiWrite(0x04);
displaymodule 11:264e19992620 381 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 382 }
displaymodule 11:264e19992620 383 else{
displaymodule 11:264e19992620 384 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 385 x = readData12(0xD0);
displaymodule 11:264e19992620 386 y = readData12(0x90);
displaymodule 11:264e19992620 387 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 388 }
displaymodule 7:6cd8c36cbdb3 389 }
displaymodule 7:6cd8c36cbdb3 390
displaymodule 7:6cd8c36cbdb3 391 void DmTouch::readTouchData(uint16_t& posX, uint16_t& posY, bool& touching) {
displaymodule 7:6cd8c36cbdb3 392 uint16_t touchX, touchY;
displaymodule 7:6cd8c36cbdb3 393 getMiddleXY(touchX,touchY);
displaymodule 0:d6ff5fa503e8 394
displaymodule 7:6cd8c36cbdb3 395 posX = getDisplayCoordinateX(touchX, touchY);
displaymodule 7:6cd8c36cbdb3 396 posY = getDisplayCoordinateY(touchX, touchY);
displaymodule 8:b24f01d148c4 397 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 7:6cd8c36cbdb3 398 touching = isTouched();
displaymodule 8:b24f01d148c4 399 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 11:264e19992620 400 if(_touch_id == IC_8875) {
displaymodule 11:264e19992620 401 touching = isTouched() && (posX < _width && posY < _height);
displaymodule 11:264e19992620 402 }
displaymodule 11:264e19992620 403 else{
displaymodule 11:264e19992620 404 touching = (posX < _width && posY < _height);
displaymodule 11:264e19992620 405 }
displaymodule 8:b24f01d148c4 406 #endif
displaymodule 0:d6ff5fa503e8 407 }
displaymodule 0:d6ff5fa503e8 408
displaymodule 7:6cd8c36cbdb3 409 bool DmTouch::isSampleValid() {
displaymodule 7:6cd8c36cbdb3 410 uint16_t sampleX,sampleY;
displaymodule 7:6cd8c36cbdb3 411 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 412 if (sampleX > 0 && sampleX < 4095 && sampleY > 0 && sampleY < 4095) {
displaymodule 7:6cd8c36cbdb3 413 return true;
displaymodule 7:6cd8c36cbdb3 414 } else {
displaymodule 7:6cd8c36cbdb3 415 return false;
displaymodule 7:6cd8c36cbdb3 416 }
displaymodule 7:6cd8c36cbdb3 417 }
displaymodule 7:6cd8c36cbdb3 418
displaymodule 7:6cd8c36cbdb3 419 bool DmTouch::isTouched() {
displaymodule 0:d6ff5fa503e8 420 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 421 if (_irq == -1) {
displaymodule 7:6cd8c36cbdb3 422 return isSampleValid();
displaymodule 0:d6ff5fa503e8 423 }
displaymodule 0:d6ff5fa503e8 424
displaymodule 0:d6ff5fa503e8 425 if ( !gbi(_pinIrq, _bitmaskIrq) ) {
displaymodule 11:264e19992620 426 if(_touch_id == IC_8875){
displaymodule 11:264e19992620 427 // Clear TP INT Status
displaymodule 11:264e19992620 428 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 429 spiWrite(0x80);
displaymodule 11:264e19992620 430 spiWrite(0xF1);
displaymodule 11:264e19992620 431 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 432
displaymodule 11:264e19992620 433 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 434 spiWrite(0x00);
displaymodule 11:264e19992620 435 spiWrite(0x04);
displaymodule 11:264e19992620 436 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 437 }
displaymodule 0:d6ff5fa503e8 438 return true;
displaymodule 0:d6ff5fa503e8 439 }
displaymodule 0:d6ff5fa503e8 440
displaymodule 0:d6ff5fa503e8 441 return false;
displaymodule 0:d6ff5fa503e8 442 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 11:264e19992620 443 if(_touch_id == IC_8875) {
displaymodule 11:264e19992620 444 delay(1);
displaymodule 11:264e19992620 445 if (!_pinIrq->read()) {
displaymodule 11:264e19992620 446 // Clear TP INT Status
displaymodule 11:264e19992620 447 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 448 spiWrite(0x80);
displaymodule 11:264e19992620 449 spiWrite(0xF1);
displaymodule 11:264e19992620 450 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 451
displaymodule 11:264e19992620 452 cbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 453 spiWrite(0x00);
displaymodule 11:264e19992620 454 spiWrite(0x04);
displaymodule 11:264e19992620 455 sbi(_pinCS, _bitmaskCS);
displaymodule 11:264e19992620 456 return true;
displaymodule 11:264e19992620 457 } else {
displaymodule 11:264e19992620 458 return false;
displaymodule 11:264e19992620 459 }
displaymodule 11:264e19992620 460 }
displaymodule 8:b24f01d148c4 461 return isSampleValid();
displaymodule 0:d6ff5fa503e8 462 #endif
displaymodule 0:d6ff5fa503e8 463 }
displaymodule 7:6cd8c36cbdb3 464
displaymodule 7:6cd8c36cbdb3 465 bool DmTouch::getMiddleXY(uint16_t &x, uint16_t &y) {
displaymodule 7:6cd8c36cbdb3 466 bool haveAllMeasurements = true;
displaymodule 7:6cd8c36cbdb3 467 uint16_t valuesX[MEASUREMENTS];
displaymodule 7:6cd8c36cbdb3 468 uint16_t valuesY[MEASUREMENTS];
displaymodule 7:6cd8c36cbdb3 469 uint8_t nbrOfMeasurements = 0;
displaymodule 7:6cd8c36cbdb3 470
displaymodule 7:6cd8c36cbdb3 471 for (int i=0; i<MEASUREMENTS; i++) {
displaymodule 11:264e19992620 472 getAverageXY(valuesX[i], valuesY[i]);
displaymodule 7:6cd8c36cbdb3 473 nbrOfMeasurements++;
displaymodule 11:264e19992620 474 if(_touch_id != IC_8875) {
displaymodule 11:264e19992620 475 if (!isTouched()) {
displaymodule 11:264e19992620 476 haveAllMeasurements = false;
displaymodule 11:264e19992620 477 break;
displaymodule 11:264e19992620 478 }
displaymodule 7:6cd8c36cbdb3 479 }
displaymodule 7:6cd8c36cbdb3 480 }
displaymodule 9:bac5439e3c1c 481 if (haveAllMeasurements) {
displaymodule 9:bac5439e3c1c 482 x = calculateMiddleValue(valuesX, nbrOfMeasurements);
displaymodule 9:bac5439e3c1c 483 y = calculateMiddleValue(valuesY, nbrOfMeasurements);
displaymodule 9:bac5439e3c1c 484 }
displaymodule 7:6cd8c36cbdb3 485
displaymodule 7:6cd8c36cbdb3 486 return haveAllMeasurements;
displaymodule 7:6cd8c36cbdb3 487 }
displaymodule 7:6cd8c36cbdb3 488
displaymodule 7:6cd8c36cbdb3 489 void DmTouch::getAverageXY(uint16_t &x, uint16_t &y) {
displaymodule 7:6cd8c36cbdb3 490 uint32_t sumX = 0;
displaymodule 7:6cd8c36cbdb3 491 uint32_t sumY = 0;
displaymodule 7:6cd8c36cbdb3 492 uint16_t sampleX,sampleY;
displaymodule 7:6cd8c36cbdb3 493 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 494
displaymodule 7:6cd8c36cbdb3 495 for (int i=0; i<_samplesPerMeasurement; i++) {
displaymodule 7:6cd8c36cbdb3 496 readRawData(sampleX,sampleY);
displaymodule 7:6cd8c36cbdb3 497 sumX += sampleX;
displaymodule 7:6cd8c36cbdb3 498 sumY += sampleY;
displaymodule 7:6cd8c36cbdb3 499 }
displaymodule 7:6cd8c36cbdb3 500
displaymodule 7:6cd8c36cbdb3 501 x = (uint32_t)sumX/_samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 502 y = (uint32_t)sumY/_samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 503 }
displaymodule 7:6cd8c36cbdb3 504
displaymodule 7:6cd8c36cbdb3 505 // Total number of samples = MEASUREMENTS * _samplesPerMeasurement
displaymodule 7:6cd8c36cbdb3 506 void DmTouch::setPrecison(uint8_t samplesPerMeasurement) {
displaymodule 7:6cd8c36cbdb3 507 _samplesPerMeasurement = samplesPerMeasurement;
displaymodule 7:6cd8c36cbdb3 508 }
displaymodule 7:6cd8c36cbdb3 509
displaymodule 7:6cd8c36cbdb3 510 void DmTouch::setCalibrationMatrix(CalibrationMatrix calibrationMatrix) {
displaymodule 7:6cd8c36cbdb3 511 _calibrationMatrix = calibrationMatrix;
displaymodule 7:6cd8c36cbdb3 512 }
displaymodule 7:6cd8c36cbdb3 513
displaymodule 7:6cd8c36cbdb3 514 void DmTouch::waitForTouch() {
displaymodule 7:6cd8c36cbdb3 515 while(!isTouched()) {}
displaymodule 7:6cd8c36cbdb3 516 }
displaymodule 7:6cd8c36cbdb3 517
displaymodule 7:6cd8c36cbdb3 518 void DmTouch::waitForTouchRelease() {
displaymodule 7:6cd8c36cbdb3 519 while(isTouched()) {}
displaymodule 7:6cd8c36cbdb3 520 }
displaymodule 7:6cd8c36cbdb3 521
displaymodule 7:6cd8c36cbdb3 522 uint16_t DmTouch::getDisplayCoordinateX(uint16_t x_touch, uint16_t y_touch) {
displaymodule 7:6cd8c36cbdb3 523 uint16_t Xd;
displaymodule 7:6cd8c36cbdb3 524 float temp;
displaymodule 7:6cd8c36cbdb3 525 temp = (_calibrationMatrix.a * x_touch + _calibrationMatrix.b * y_touch + _calibrationMatrix.c) / rescaleFactor();
displaymodule 7:6cd8c36cbdb3 526 Xd = (uint16_t)(temp);
displaymodule 7:6cd8c36cbdb3 527 if (Xd > 60000) {
displaymodule 7:6cd8c36cbdb3 528 Xd = 0;
displaymodule 7:6cd8c36cbdb3 529 }
displaymodule 7:6cd8c36cbdb3 530 return Xd;
displaymodule 7:6cd8c36cbdb3 531 }
displaymodule 7:6cd8c36cbdb3 532
displaymodule 7:6cd8c36cbdb3 533 uint16_t DmTouch::getDisplayCoordinateY(uint16_t x_touch, uint16_t y_touch) {
displaymodule 7:6cd8c36cbdb3 534 uint16_t Yd;
displaymodule 7:6cd8c36cbdb3 535 float temp;
displaymodule 7:6cd8c36cbdb3 536 temp = (_calibrationMatrix.d * x_touch + _calibrationMatrix.e * y_touch + _calibrationMatrix.f) / rescaleFactor();
displaymodule 7:6cd8c36cbdb3 537 Yd = (uint16_t)(temp);
displaymodule 7:6cd8c36cbdb3 538 if (Yd > 60000) {
displaymodule 7:6cd8c36cbdb3 539 Yd = 0;
displaymodule 7:6cd8c36cbdb3 540 }
displaymodule 7:6cd8c36cbdb3 541 return Yd;
displaymodule 7:6cd8c36cbdb3 542 }
displaymodule 7:6cd8c36cbdb3 543
displaymodule 7:6cd8c36cbdb3 544 uint16_t DmTouch::calculateMiddleValue(uint16_t values[], uint8_t count) {
displaymodule 7:6cd8c36cbdb3 545 uint16_t temp;
displaymodule 7:6cd8c36cbdb3 546
displaymodule 7:6cd8c36cbdb3 547 for(uint8_t i=0; i<count-1; i++) {
displaymodule 7:6cd8c36cbdb3 548 for(uint8_t j=i+1; j<count; j++) {
displaymodule 7:6cd8c36cbdb3 549 if(values[j] < values[i]) {
displaymodule 7:6cd8c36cbdb3 550 temp = values[i];
displaymodule 7:6cd8c36cbdb3 551 values[i] = values[j];
displaymodule 7:6cd8c36cbdb3 552 values[j] = temp;
displaymodule 7:6cd8c36cbdb3 553 }
displaymodule 7:6cd8c36cbdb3 554 }
displaymodule 7:6cd8c36cbdb3 555 }
displaymodule 7:6cd8c36cbdb3 556
displaymodule 7:6cd8c36cbdb3 557 if(count%2==0) {
displaymodule 7:6cd8c36cbdb3 558 return((values[count/2] + values[count/2 - 1]) / 2.0);
displaymodule 7:6cd8c36cbdb3 559 } else {
displaymodule 7:6cd8c36cbdb3 560 return values[count/2];
displaymodule 7:6cd8c36cbdb3 561 }
displaymodule 7:6cd8c36cbdb3 562 }