Driver Library for our displays

Dependents:   dm_bubbles dm_calc dm_paint dm_sdcard_with_adapter ... more

Committer:
displaymodule
Date:
Wed Jan 21 13:56:51 2015 +0000
Revision:
11:264e19992620
Parent:
10:d263094e666d
Child:
14:2db7065edbec
add DM_TFT43_108, DM_TFT50_111 based on new lib drv: DmTftRa8875

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