Conversion of DisplayModule's DmTouch to work with UniGraphics as display driver rather than their own DmTftLib.

Fork of DmTouch_UniGraphic by Whitworth-EN173-2016

Committer:
JLarkin
Date:
Wed Jan 20 07:25:22 2016 +0000
Revision:
0:fd018d3e7dab
Child:
1:852bf4b0714f
Created DmTouch version which works with UniGraphic rather than DmTftLib.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JLarkin 0:fd018d3e7dab 1 /**********************************************************************************************
JLarkin 0:fd018d3e7dab 2 Copyright (c) 2014 DisplayModule. All rights reserved.
JLarkin 0:fd018d3e7dab 3
JLarkin 0:fd018d3e7dab 4 Redistribution and use of this source code, part of this source code or any compiled binary
JLarkin 0:fd018d3e7dab 5 based on this source code is permitted as long as the above copyright notice and following
JLarkin 0:fd018d3e7dab 6 disclaimer is retained.
JLarkin 0:fd018d3e7dab 7
JLarkin 0:fd018d3e7dab 8 DISCLAIMER:
JLarkin 0:fd018d3e7dab 9 THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES
JLarkin 0:fd018d3e7dab 10 NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE.
JLarkin 0:fd018d3e7dab 11 ********************************************************************************************/
JLarkin 0:fd018d3e7dab 12 // Tested with Xpt2046 and RA8875
JLarkin 0:fd018d3e7dab 13
JLarkin 0:fd018d3e7dab 14 /* Modified by John M. Larkin, Whitworth University, to remove Arduino code */
JLarkin 0:fd018d3e7dab 15
JLarkin 0:fd018d3e7dab 16 #include "DmTouch.h"
JLarkin 0:fd018d3e7dab 17 //#include "DmTouchCalibration.h"
JLarkin 0:fd018d3e7dab 18
JLarkin 0:fd018d3e7dab 19 #define MEASUREMENTS 10
JLarkin 0:fd018d3e7dab 20
JLarkin 0:fd018d3e7dab 21 // disp - which display is used
JLarkin 0:fd018d3e7dab 22 // spiMode - How to read SPI-data, Software, Hardware or Auto
JLarkin 0:fd018d3e7dab 23 // (JML) Modify to include cs and irq as input parameters
JLarkin 0:fd018d3e7dab 24 // (JML) Modify so doesn't assume Arduino shield
JLarkin 0:fd018d3e7dab 25 // (JML) Using with mbed so assume hardware SPI available
JLarkin 0:fd018d3e7dab 26 DmTouch::DmTouch(Display disp, PinName mosi, PinName miso, PinName clk, PinName cs, PinName irq)
JLarkin 0:fd018d3e7dab 27 {
JLarkin 0:fd018d3e7dab 28 _disp = disp;
JLarkin 0:fd018d3e7dab 29 _cs = cs;
JLarkin 0:fd018d3e7dab 30 _irq = irq;
JLarkin 0:fd018d3e7dab 31 _clk = clk;
JLarkin 0:fd018d3e7dab 32 _mosi = mosi;
JLarkin 0:fd018d3e7dab 33 _miso = miso;
JLarkin 0:fd018d3e7dab 34 _hardwareSpi = true;
JLarkin 0:fd018d3e7dab 35 switch (disp) {
JLarkin 0:fd018d3e7dab 36 // Display with 40-pin connector on top of adapter board
JLarkin 0:fd018d3e7dab 37 case DmTouch::DM_TFT28_103:
JLarkin 0:fd018d3e7dab 38 case DmTouch::DM_TFT24_104:
JLarkin 0:fd018d3e7dab 39 _width = 240;
JLarkin 0:fd018d3e7dab 40 _height = 320;
JLarkin 0:fd018d3e7dab 41 _touch_id = IC_2046;
JLarkin 0:fd018d3e7dab 42 break;
JLarkin 0:fd018d3e7dab 43
JLarkin 0:fd018d3e7dab 44 case DmTouch::DM_TFT28_105:
JLarkin 0:fd018d3e7dab 45 _cs = D4;
JLarkin 0:fd018d3e7dab 46 _irq = D2;
JLarkin 0:fd018d3e7dab 47 _clk = D13;
JLarkin 0:fd018d3e7dab 48 _mosi = D11;
JLarkin 0:fd018d3e7dab 49 _miso = D12;
JLarkin 0:fd018d3e7dab 50 _width = 240;
JLarkin 0:fd018d3e7dab 51 _height = 320;
JLarkin 0:fd018d3e7dab 52 _hardwareSpi = true;
JLarkin 0:fd018d3e7dab 53 _touch_id = IC_2046;
JLarkin 0:fd018d3e7dab 54 break;
JLarkin 0:fd018d3e7dab 55
JLarkin 0:fd018d3e7dab 56 case DmTouch::DM_TFT35_107:
JLarkin 0:fd018d3e7dab 57 _cs = D4;
JLarkin 0:fd018d3e7dab 58 _irq = D2;
JLarkin 0:fd018d3e7dab 59 _clk = D13;
JLarkin 0:fd018d3e7dab 60 _mosi = D11;
JLarkin 0:fd018d3e7dab 61 _miso = D12;
JLarkin 0:fd018d3e7dab 62 _width = 320;
JLarkin 0:fd018d3e7dab 63 _height = 240;
JLarkin 0:fd018d3e7dab 64 _hardwareSpi = true;
JLarkin 0:fd018d3e7dab 65 _touch_id = IC_2046;
JLarkin 0:fd018d3e7dab 66 break;
JLarkin 0:fd018d3e7dab 67
JLarkin 0:fd018d3e7dab 68 case DmTouch::DM_TFT43_108: // or DM_TFT43_110
JLarkin 0:fd018d3e7dab 69 _cs = D10;
JLarkin 0:fd018d3e7dab 70 _irq = D2;
JLarkin 0:fd018d3e7dab 71 _clk = D13;
JLarkin 0:fd018d3e7dab 72 _mosi = D11;
JLarkin 0:fd018d3e7dab 73 _miso = D12;
JLarkin 0:fd018d3e7dab 74 _width = 480;
JLarkin 0:fd018d3e7dab 75 _height = 272;
JLarkin 0:fd018d3e7dab 76 _hardwareSpi = true;
JLarkin 0:fd018d3e7dab 77 _touch_id = IC_8875;
JLarkin 0:fd018d3e7dab 78 break;
JLarkin 0:fd018d3e7dab 79
JLarkin 0:fd018d3e7dab 80 case DmTouch::DM_TFT50_111: // or DM_TFT50_112
JLarkin 0:fd018d3e7dab 81 _cs = D10;
JLarkin 0:fd018d3e7dab 82 _irq = D2;
JLarkin 0:fd018d3e7dab 83 _clk = D13;
JLarkin 0:fd018d3e7dab 84 _mosi = D11;
JLarkin 0:fd018d3e7dab 85 _miso = D12;
JLarkin 0:fd018d3e7dab 86 _width = 800;
JLarkin 0:fd018d3e7dab 87 _height = 480;
JLarkin 0:fd018d3e7dab 88 _hardwareSpi = true;
JLarkin 0:fd018d3e7dab 89 _touch_id = IC_8875;
JLarkin 0:fd018d3e7dab 90 break;
JLarkin 0:fd018d3e7dab 91
JLarkin 0:fd018d3e7dab 92 default:
JLarkin 0:fd018d3e7dab 93 _cs = D4;
JLarkin 0:fd018d3e7dab 94 _irq = D2;
JLarkin 0:fd018d3e7dab 95 _clk = D13;
JLarkin 0:fd018d3e7dab 96 _mosi = D11;
JLarkin 0:fd018d3e7dab 97 _miso = D12;
JLarkin 0:fd018d3e7dab 98 _width = 320;
JLarkin 0:fd018d3e7dab 99 _height = 240;
JLarkin 0:fd018d3e7dab 100 _hardwareSpi = true;
JLarkin 0:fd018d3e7dab 101 _touch_id = IC_2046;
JLarkin 0:fd018d3e7dab 102 break;
JLarkin 0:fd018d3e7dab 103 }
JLarkin 0:fd018d3e7dab 104
JLarkin 0:fd018d3e7dab 105 //setCalibrationMatrix(DmTouchCalibration::getDefaultCalibrationData(disp));
JLarkin 0:fd018d3e7dab 106 setCalibrationMatrix(DmTouch::getDefaultCalibrationData(disp)); // Use new local version
JLarkin 0:fd018d3e7dab 107
JLarkin 0:fd018d3e7dab 108 _samplesPerMeasurement = 3;
JLarkin 0:fd018d3e7dab 109 }
JLarkin 0:fd018d3e7dab 110
JLarkin 0:fd018d3e7dab 111 void DmTouch::init() {
JLarkin 0:fd018d3e7dab 112 _pinCS = new DigitalOut(_cs);
JLarkin 0:fd018d3e7dab 113 if (_hardwareSpi) {
JLarkin 0:fd018d3e7dab 114 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 115 _spi = new SPI((PinName)_mosi, (PinName)_miso, (PinName)_clk);
JLarkin 0:fd018d3e7dab 116 _spi->format(8,0);
JLarkin 0:fd018d3e7dab 117 _spi->frequency(2000000); // Max SPI speed
JLarkin 0:fd018d3e7dab 118 } else {
JLarkin 0:fd018d3e7dab 119 _pinCLK = new DigitalOut(_clk);
JLarkin 0:fd018d3e7dab 120 _pinMISO = new DigitalIn(_miso);
JLarkin 0:fd018d3e7dab 121 _pinMOSI = new DigitalOut(_mosi);
JLarkin 0:fd018d3e7dab 122 sbi(_pinCLK, _bitmaskCLK);
JLarkin 0:fd018d3e7dab 123 }
JLarkin 0:fd018d3e7dab 124
JLarkin 0:fd018d3e7dab 125 if (_irq != NC) { // We will use Touch IRQ
JLarkin 0:fd018d3e7dab 126 enableIrq();
JLarkin 0:fd018d3e7dab 127 }
JLarkin 0:fd018d3e7dab 128 }
JLarkin 0:fd018d3e7dab 129
JLarkin 0:fd018d3e7dab 130 void DmTouch::enableIrq() {
JLarkin 0:fd018d3e7dab 131 _pinIrq = new DigitalIn((PinName)_irq);
JLarkin 0:fd018d3e7dab 132 _pinIrq->mode(PullUp);
JLarkin 0:fd018d3e7dab 133 if(_touch_id == IC_8875) {
JLarkin 0:fd018d3e7dab 134 // enable touch panel
JLarkin 0:fd018d3e7dab 135 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 136 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 137 spiWrite(0x70);
JLarkin 0:fd018d3e7dab 138 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 139
JLarkin 0:fd018d3e7dab 140 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 141 spiWrite(0x00);
JLarkin 0:fd018d3e7dab 142 spiWrite(0xB3);
JLarkin 0:fd018d3e7dab 143 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 144
JLarkin 0:fd018d3e7dab 145 // set auto mode
JLarkin 0:fd018d3e7dab 146 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 147 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 148 spiWrite(0x71);
JLarkin 0:fd018d3e7dab 149 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 150
JLarkin 0:fd018d3e7dab 151 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 152 spiWrite(0x00);
JLarkin 0:fd018d3e7dab 153 spiWrite(0x04);
JLarkin 0:fd018d3e7dab 154 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 155
JLarkin 0:fd018d3e7dab 156 // enable touch panel interrupt
JLarkin 0:fd018d3e7dab 157 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 158 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 159 spiWrite(0xF0);
JLarkin 0:fd018d3e7dab 160 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 161
JLarkin 0:fd018d3e7dab 162 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 163 uint8_t temp;
JLarkin 0:fd018d3e7dab 164 spiWrite(0x40);
JLarkin 0:fd018d3e7dab 165 temp = spiRead();
JLarkin 0:fd018d3e7dab 166 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 167
JLarkin 0:fd018d3e7dab 168 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 169 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 170 spiWrite(0xF0);
JLarkin 0:fd018d3e7dab 171 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 172
JLarkin 0:fd018d3e7dab 173 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 174 spiWrite(0x00);
JLarkin 0:fd018d3e7dab 175 spiWrite(temp | 0x04);
JLarkin 0:fd018d3e7dab 176 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 177
JLarkin 0:fd018d3e7dab 178 // Clear TP INT Status
JLarkin 0:fd018d3e7dab 179 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 180 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 181 spiWrite(0xF1);
JLarkin 0:fd018d3e7dab 182 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 183
JLarkin 0:fd018d3e7dab 184 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 185 spiWrite(0x00);
JLarkin 0:fd018d3e7dab 186 spiWrite(0x04);
JLarkin 0:fd018d3e7dab 187 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 188 }
JLarkin 0:fd018d3e7dab 189 else{
JLarkin 0:fd018d3e7dab 190 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 191 spiWrite(0x80); // Enable PENIRQ
JLarkin 0:fd018d3e7dab 192 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 193 }
JLarkin 0:fd018d3e7dab 194 }
JLarkin 0:fd018d3e7dab 195
JLarkin 0:fd018d3e7dab 196 void DmTouch::spiWrite(uint8_t data) {
JLarkin 0:fd018d3e7dab 197 if (_hardwareSpi) {
JLarkin 0:fd018d3e7dab 198 _spi->write(data);
JLarkin 0:fd018d3e7dab 199 }
JLarkin 0:fd018d3e7dab 200 else {
JLarkin 0:fd018d3e7dab 201 uint8_t count=0;
JLarkin 0:fd018d3e7dab 202 uint8_t temp = data;
JLarkin 0:fd018d3e7dab 203 delay(1);
JLarkin 0:fd018d3e7dab 204 cbi(_pinCLK, _bitmaskCLK);
JLarkin 0:fd018d3e7dab 205 for(count=0;count<8;count++) {
JLarkin 0:fd018d3e7dab 206 if(temp&0x80) {
JLarkin 0:fd018d3e7dab 207 sbi(_pinMOSI, _bitmaskMOSI);
JLarkin 0:fd018d3e7dab 208 }
JLarkin 0:fd018d3e7dab 209 else {
JLarkin 0:fd018d3e7dab 210 cbi(_pinMOSI, _bitmaskMOSI);
JLarkin 0:fd018d3e7dab 211 }
JLarkin 0:fd018d3e7dab 212
JLarkin 0:fd018d3e7dab 213 temp=temp<<1;
JLarkin 0:fd018d3e7dab 214
JLarkin 0:fd018d3e7dab 215 slow_pulse_low(_pinCLK, _bitmaskCLK);
JLarkin 0:fd018d3e7dab 216 }
JLarkin 0:fd018d3e7dab 217 }
JLarkin 0:fd018d3e7dab 218 }
JLarkin 0:fd018d3e7dab 219
JLarkin 0:fd018d3e7dab 220 uint8_t DmTouch::spiRead() {// Only used for Hardware SPI
JLarkin 0:fd018d3e7dab 221 if (_hardwareSpi) {
JLarkin 0:fd018d3e7dab 222 return _spi->write(0x00); // dummy byte to read
JLarkin 0:fd018d3e7dab 223 } else {
JLarkin 0:fd018d3e7dab 224 uint8_t count=0;
JLarkin 0:fd018d3e7dab 225 uint8_t temp=0;
JLarkin 0:fd018d3e7dab 226 cbi(_pinCLK, _bitmaskCLK);
JLarkin 0:fd018d3e7dab 227 cbi(_pinMOSI, _bitmaskMOSI); // same as using 0x00 as dummy byte
JLarkin 0:fd018d3e7dab 228 for(count=0;count<8;count++) {
JLarkin 0:fd018d3e7dab 229
JLarkin 0:fd018d3e7dab 230 pulse_low(_pinCLK, _bitmaskCLK);
JLarkin 0:fd018d3e7dab 231 temp = temp<<1;
JLarkin 0:fd018d3e7dab 232 temp |= _pinMISO->read();
JLarkin 0:fd018d3e7dab 233 }
JLarkin 0:fd018d3e7dab 234 return temp;
JLarkin 0:fd018d3e7dab 235 }
JLarkin 0:fd018d3e7dab 236 }
JLarkin 0:fd018d3e7dab 237
JLarkin 0:fd018d3e7dab 238 uint16_t DmTouch::readData12(uint8_t command) {
JLarkin 0:fd018d3e7dab 239 uint8_t temp = 0;
JLarkin 0:fd018d3e7dab 240 uint16_t value = 0;
JLarkin 0:fd018d3e7dab 241
JLarkin 0:fd018d3e7dab 242 spiWrite(command); // Send command
JLarkin 0:fd018d3e7dab 243 // We use 7-bits from the first byte and 5-bit from the second byte
JLarkin 0:fd018d3e7dab 244 temp = spiRead();
JLarkin 0:fd018d3e7dab 245 value = temp<<8;
JLarkin 0:fd018d3e7dab 246 temp = spiRead();
JLarkin 0:fd018d3e7dab 247 value |= temp;
JLarkin 0:fd018d3e7dab 248 value >>=3;
JLarkin 0:fd018d3e7dab 249 value &= 0xFFF;
JLarkin 0:fd018d3e7dab 250 return value;
JLarkin 0:fd018d3e7dab 251 }
JLarkin 0:fd018d3e7dab 252
JLarkin 0:fd018d3e7dab 253 void DmTouch::readRawData(uint16_t &x, uint16_t &y) {
JLarkin 0:fd018d3e7dab 254 if(_touch_id == IC_8875){
JLarkin 0:fd018d3e7dab 255 uint16_t tx, ty;
JLarkin 0:fd018d3e7dab 256 uint8_t temp;
JLarkin 0:fd018d3e7dab 257
JLarkin 0:fd018d3e7dab 258 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 259 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 260 spiWrite(0x72);
JLarkin 0:fd018d3e7dab 261 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 262
JLarkin 0:fd018d3e7dab 263 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 264 spiWrite(0x40);
JLarkin 0:fd018d3e7dab 265 tx = spiRead();
JLarkin 0:fd018d3e7dab 266 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 267
JLarkin 0:fd018d3e7dab 268 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 269 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 270 spiWrite(0x73);
JLarkin 0:fd018d3e7dab 271 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 272
JLarkin 0:fd018d3e7dab 273 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 274 spiWrite(0x40);
JLarkin 0:fd018d3e7dab 275 ty = spiRead();
JLarkin 0:fd018d3e7dab 276 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 277
JLarkin 0:fd018d3e7dab 278 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 279 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 280 spiWrite(0x74);
JLarkin 0:fd018d3e7dab 281 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 282
JLarkin 0:fd018d3e7dab 283 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 284 spiWrite(0x40);
JLarkin 0:fd018d3e7dab 285 temp = spiRead();
JLarkin 0:fd018d3e7dab 286 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 287
JLarkin 0:fd018d3e7dab 288 tx <<= 2;
JLarkin 0:fd018d3e7dab 289 ty <<= 2;
JLarkin 0:fd018d3e7dab 290 tx |= temp & 0x03; // get the bottom x bits
JLarkin 0:fd018d3e7dab 291 ty |= (temp >> 2) & 0x03; // get the bottom y bits
JLarkin 0:fd018d3e7dab 292
JLarkin 0:fd018d3e7dab 293 x = tx;
JLarkin 0:fd018d3e7dab 294 y = ty;
JLarkin 0:fd018d3e7dab 295
JLarkin 0:fd018d3e7dab 296 // Clear TP INT Status
JLarkin 0:fd018d3e7dab 297 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 298 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 299 spiWrite(0xF1);
JLarkin 0:fd018d3e7dab 300 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 301
JLarkin 0:fd018d3e7dab 302 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 303 spiWrite(0x00);
JLarkin 0:fd018d3e7dab 304 spiWrite(0x04);
JLarkin 0:fd018d3e7dab 305 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 306 }
JLarkin 0:fd018d3e7dab 307 else{
JLarkin 0:fd018d3e7dab 308 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 309 x = readData12(0xD0);
JLarkin 0:fd018d3e7dab 310 y = readData12(0x90);
JLarkin 0:fd018d3e7dab 311 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 312 }
JLarkin 0:fd018d3e7dab 313 }
JLarkin 0:fd018d3e7dab 314
JLarkin 0:fd018d3e7dab 315 void DmTouch::readTouchData(uint16_t& posX, uint16_t& posY, bool& touching) {
JLarkin 0:fd018d3e7dab 316 uint16_t touchX, touchY;
JLarkin 0:fd018d3e7dab 317 getMiddleXY(touchX,touchY);
JLarkin 0:fd018d3e7dab 318 uint16_t screenX, screenY;
JLarkin 0:fd018d3e7dab 319
JLarkin 0:fd018d3e7dab 320 posX = getDisplayCoordinateX(touchX, touchY);
JLarkin 0:fd018d3e7dab 321 posY = getDisplayCoordinateY(touchX, touchY);
JLarkin 0:fd018d3e7dab 322 if(_touch_id == IC_8875) {
JLarkin 0:fd018d3e7dab 323 touching = isTouched() && (posX < _width && posY < _height);
JLarkin 0:fd018d3e7dab 324 }
JLarkin 0:fd018d3e7dab 325 else{
JLarkin 0:fd018d3e7dab 326 touching = (posX < _width && posY < _height);
JLarkin 0:fd018d3e7dab 327 }
JLarkin 0:fd018d3e7dab 328 // Now account for screen orientation and return in "screen coordinates"
JLarkin 0:fd018d3e7dab 329 switch(_orient) {
JLarkin 0:fd018d3e7dab 330 case 0:
JLarkin 0:fd018d3e7dab 331 screenX = posX;
JLarkin 0:fd018d3e7dab 332 screenY = posY;
JLarkin 0:fd018d3e7dab 333 break;
JLarkin 0:fd018d3e7dab 334 case 1:
JLarkin 0:fd018d3e7dab 335 screenX = posY;
JLarkin 0:fd018d3e7dab 336 screenY = _width-posX;
JLarkin 0:fd018d3e7dab 337 break;
JLarkin 0:fd018d3e7dab 338 case 2:
JLarkin 0:fd018d3e7dab 339 screenX = _width - posX;
JLarkin 0:fd018d3e7dab 340 screenY = _height - posY;
JLarkin 0:fd018d3e7dab 341 break;
JLarkin 0:fd018d3e7dab 342 case 3:
JLarkin 0:fd018d3e7dab 343 screenX = _height - posY;
JLarkin 0:fd018d3e7dab 344 screenY = posX;
JLarkin 0:fd018d3e7dab 345 break;
JLarkin 0:fd018d3e7dab 346 default:
JLarkin 0:fd018d3e7dab 347 screenX = posX;
JLarkin 0:fd018d3e7dab 348 screenY = posY;
JLarkin 0:fd018d3e7dab 349 }
JLarkin 0:fd018d3e7dab 350 posX = screenX;
JLarkin 0:fd018d3e7dab 351 posY = screenY;
JLarkin 0:fd018d3e7dab 352 }
JLarkin 0:fd018d3e7dab 353
JLarkin 0:fd018d3e7dab 354 bool DmTouch::isSampleValid() {
JLarkin 0:fd018d3e7dab 355 uint16_t sampleX,sampleY;
JLarkin 0:fd018d3e7dab 356 readRawData(sampleX,sampleY);
JLarkin 0:fd018d3e7dab 357 if (sampleX > 0 && sampleX < 4095 && sampleY > 0 && sampleY < 4095) {
JLarkin 0:fd018d3e7dab 358 return true;
JLarkin 0:fd018d3e7dab 359 } else {
JLarkin 0:fd018d3e7dab 360 return false;
JLarkin 0:fd018d3e7dab 361 }
JLarkin 0:fd018d3e7dab 362 }
JLarkin 0:fd018d3e7dab 363
JLarkin 0:fd018d3e7dab 364 bool DmTouch::isTouched() {
JLarkin 0:fd018d3e7dab 365 if(_touch_id == IC_8875) {
JLarkin 0:fd018d3e7dab 366 delay(1);
JLarkin 0:fd018d3e7dab 367 if (!_pinIrq->read()) {
JLarkin 0:fd018d3e7dab 368 // Clear TP INT Status
JLarkin 0:fd018d3e7dab 369 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 370 spiWrite(0x80);
JLarkin 0:fd018d3e7dab 371 spiWrite(0xF1);
JLarkin 0:fd018d3e7dab 372 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 373
JLarkin 0:fd018d3e7dab 374 cbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 375 spiWrite(0x00);
JLarkin 0:fd018d3e7dab 376 spiWrite(0x04);
JLarkin 0:fd018d3e7dab 377 sbi(_pinCS, _bitmaskCS);
JLarkin 0:fd018d3e7dab 378 return true;
JLarkin 0:fd018d3e7dab 379 } else {
JLarkin 0:fd018d3e7dab 380 return false;
JLarkin 0:fd018d3e7dab 381 }
JLarkin 0:fd018d3e7dab 382 }
JLarkin 0:fd018d3e7dab 383 return isSampleValid();
JLarkin 0:fd018d3e7dab 384 }
JLarkin 0:fd018d3e7dab 385
JLarkin 0:fd018d3e7dab 386 bool DmTouch::getMiddleXY(uint16_t &x, uint16_t &y) {
JLarkin 0:fd018d3e7dab 387 bool haveAllMeasurements = true;
JLarkin 0:fd018d3e7dab 388 uint16_t valuesX[MEASUREMENTS];
JLarkin 0:fd018d3e7dab 389 uint16_t valuesY[MEASUREMENTS];
JLarkin 0:fd018d3e7dab 390 uint8_t nbrOfMeasurements = 0;
JLarkin 0:fd018d3e7dab 391
JLarkin 0:fd018d3e7dab 392 for (int i=0; i<MEASUREMENTS; i++) {
JLarkin 0:fd018d3e7dab 393 getAverageXY(valuesX[i], valuesY[i]);
JLarkin 0:fd018d3e7dab 394 nbrOfMeasurements++;
JLarkin 0:fd018d3e7dab 395 if(_touch_id != IC_8875) {
JLarkin 0:fd018d3e7dab 396 if (!isTouched()) {
JLarkin 0:fd018d3e7dab 397 haveAllMeasurements = false;
JLarkin 0:fd018d3e7dab 398 break;
JLarkin 0:fd018d3e7dab 399 }
JLarkin 0:fd018d3e7dab 400 }
JLarkin 0:fd018d3e7dab 401 }
JLarkin 0:fd018d3e7dab 402 if (haveAllMeasurements) {
JLarkin 0:fd018d3e7dab 403 x = calculateMiddleValue(valuesX, nbrOfMeasurements);
JLarkin 0:fd018d3e7dab 404 y = calculateMiddleValue(valuesY, nbrOfMeasurements);
JLarkin 0:fd018d3e7dab 405 }
JLarkin 0:fd018d3e7dab 406
JLarkin 0:fd018d3e7dab 407 return haveAllMeasurements;
JLarkin 0:fd018d3e7dab 408 }
JLarkin 0:fd018d3e7dab 409
JLarkin 0:fd018d3e7dab 410 void DmTouch::getAverageXY(uint16_t &x, uint16_t &y) {
JLarkin 0:fd018d3e7dab 411 uint32_t sumX = 0;
JLarkin 0:fd018d3e7dab 412 uint32_t sumY = 0;
JLarkin 0:fd018d3e7dab 413 uint16_t sampleX,sampleY;
JLarkin 0:fd018d3e7dab 414 readRawData(sampleX,sampleY);
JLarkin 0:fd018d3e7dab 415
JLarkin 0:fd018d3e7dab 416 for (int i=0; i<_samplesPerMeasurement; i++) {
JLarkin 0:fd018d3e7dab 417 readRawData(sampleX,sampleY);
JLarkin 0:fd018d3e7dab 418 sumX += sampleX;
JLarkin 0:fd018d3e7dab 419 sumY += sampleY;
JLarkin 0:fd018d3e7dab 420 }
JLarkin 0:fd018d3e7dab 421
JLarkin 0:fd018d3e7dab 422 x = (uint32_t)sumX/_samplesPerMeasurement;
JLarkin 0:fd018d3e7dab 423 y = (uint32_t)sumY/_samplesPerMeasurement;
JLarkin 0:fd018d3e7dab 424 }
JLarkin 0:fd018d3e7dab 425
JLarkin 0:fd018d3e7dab 426 // Total number of samples = MEASUREMENTS * _samplesPerMeasurement
JLarkin 0:fd018d3e7dab 427 void DmTouch::setPrecison(uint8_t samplesPerMeasurement) {
JLarkin 0:fd018d3e7dab 428 _samplesPerMeasurement = samplesPerMeasurement;
JLarkin 0:fd018d3e7dab 429 }
JLarkin 0:fd018d3e7dab 430
JLarkin 0:fd018d3e7dab 431 void DmTouch::setCalibrationMatrix(CalibrationMatrix calibrationMatrix) {
JLarkin 0:fd018d3e7dab 432 _calibrationMatrix = calibrationMatrix;
JLarkin 0:fd018d3e7dab 433 }
JLarkin 0:fd018d3e7dab 434
JLarkin 0:fd018d3e7dab 435 void DmTouch::waitForTouch() {
JLarkin 0:fd018d3e7dab 436 while(!isTouched()) {}
JLarkin 0:fd018d3e7dab 437 }
JLarkin 0:fd018d3e7dab 438
JLarkin 0:fd018d3e7dab 439 void DmTouch::waitForTouchRelease() {
JLarkin 0:fd018d3e7dab 440 while(isTouched()) {}
JLarkin 0:fd018d3e7dab 441 }
JLarkin 0:fd018d3e7dab 442
JLarkin 0:fd018d3e7dab 443 uint16_t DmTouch::getDisplayCoordinateX(uint16_t x_touch, uint16_t y_touch) {
JLarkin 0:fd018d3e7dab 444 uint16_t Xd;
JLarkin 0:fd018d3e7dab 445 float temp;
JLarkin 0:fd018d3e7dab 446 temp = (_calibrationMatrix.a * x_touch + _calibrationMatrix.b * y_touch + _calibrationMatrix.c) / rescaleFactor();
JLarkin 0:fd018d3e7dab 447 Xd = (uint16_t)(temp);
JLarkin 0:fd018d3e7dab 448 if (Xd > 60000) {
JLarkin 0:fd018d3e7dab 449 Xd = 0;
JLarkin 0:fd018d3e7dab 450 }
JLarkin 0:fd018d3e7dab 451 return Xd;
JLarkin 0:fd018d3e7dab 452 }
JLarkin 0:fd018d3e7dab 453
JLarkin 0:fd018d3e7dab 454 uint16_t DmTouch::getDisplayCoordinateY(uint16_t x_touch, uint16_t y_touch) {
JLarkin 0:fd018d3e7dab 455 uint16_t Yd;
JLarkin 0:fd018d3e7dab 456 float temp;
JLarkin 0:fd018d3e7dab 457 temp = (_calibrationMatrix.d * x_touch + _calibrationMatrix.e * y_touch + _calibrationMatrix.f) / rescaleFactor();
JLarkin 0:fd018d3e7dab 458 Yd = (uint16_t)(temp);
JLarkin 0:fd018d3e7dab 459 if (Yd > 60000) {
JLarkin 0:fd018d3e7dab 460 Yd = 0;
JLarkin 0:fd018d3e7dab 461 }
JLarkin 0:fd018d3e7dab 462 return Yd;
JLarkin 0:fd018d3e7dab 463 }
JLarkin 0:fd018d3e7dab 464
JLarkin 0:fd018d3e7dab 465 uint16_t DmTouch::calculateMiddleValue(uint16_t values[], uint8_t count) {
JLarkin 0:fd018d3e7dab 466 uint16_t temp;
JLarkin 0:fd018d3e7dab 467
JLarkin 0:fd018d3e7dab 468 for(uint8_t i=0; i<count-1; i++) {
JLarkin 0:fd018d3e7dab 469 for(uint8_t j=i+1; j<count; j++) {
JLarkin 0:fd018d3e7dab 470 if(values[j] < values[i]) {
JLarkin 0:fd018d3e7dab 471 temp = values[i];
JLarkin 0:fd018d3e7dab 472 values[i] = values[j];
JLarkin 0:fd018d3e7dab 473 values[j] = temp;
JLarkin 0:fd018d3e7dab 474 }
JLarkin 0:fd018d3e7dab 475 }
JLarkin 0:fd018d3e7dab 476 }
JLarkin 0:fd018d3e7dab 477
JLarkin 0:fd018d3e7dab 478 if(count%2==0) {
JLarkin 0:fd018d3e7dab 479 return((values[count/2] + values[count/2 - 1]) / 2.0);
JLarkin 0:fd018d3e7dab 480 } else {
JLarkin 0:fd018d3e7dab 481 return values[count/2];
JLarkin 0:fd018d3e7dab 482 }
JLarkin 0:fd018d3e7dab 483 }
JLarkin 0:fd018d3e7dab 484
JLarkin 0:fd018d3e7dab 485 // (JML) Add a function to set screen orientation to match UniGraphics display feature
JLarkin 0:fd018d3e7dab 486 void DmTouch::setOrientation(char orient) {
JLarkin 0:fd018d3e7dab 487 _orient = orient%4;
JLarkin 0:fd018d3e7dab 488 }
JLarkin 0:fd018d3e7dab 489
JLarkin 0:fd018d3e7dab 490
JLarkin 0:fd018d3e7dab 491 /* Moved the default function to DmTouch rather than DmTouchCalibration as interim measure
JLarkin 0:fd018d3e7dab 492 */
JLarkin 0:fd018d3e7dab 493 CalibrationMatrix DmTouch::getDefaultCalibrationData(DmTouch::Display disp) {
JLarkin 0:fd018d3e7dab 494 CalibrationMatrix calibrationMatrix = {0};
JLarkin 0:fd018d3e7dab 495 switch (disp) {
JLarkin 0:fd018d3e7dab 496 case DmTouch::DM_TFT28_103:
JLarkin 0:fd018d3e7dab 497 calibrationMatrix.a = 67548; // 63787;
JLarkin 0:fd018d3e7dab 498 calibrationMatrix.b = -625; // -138;
JLarkin 0:fd018d3e7dab 499 calibrationMatrix.c = -16854644;//-15921157;
JLarkin 0:fd018d3e7dab 500 calibrationMatrix.d = 362; // -244;
JLarkin 0:fd018d3e7dab 501 calibrationMatrix.e = 89504; // 89313;
JLarkin 0:fd018d3e7dab 502 calibrationMatrix.f = -14380636;//-10726623;
JLarkin 0:fd018d3e7dab 503 break;
JLarkin 0:fd018d3e7dab 504
JLarkin 0:fd018d3e7dab 505 case DmTouch::DM_TFT24_104:
JLarkin 0:fd018d3e7dab 506 calibrationMatrix.a = -71855;
JLarkin 0:fd018d3e7dab 507 calibrationMatrix.b = 2147;
JLarkin 0:fd018d3e7dab 508 calibrationMatrix.c = 259719524;
JLarkin 0:fd018d3e7dab 509 calibrationMatrix.d = -1339;
JLarkin 0:fd018d3e7dab 510 calibrationMatrix.e = -91012;
JLarkin 0:fd018d3e7dab 511 calibrationMatrix.f = 354268832;
JLarkin 0:fd018d3e7dab 512 break;
JLarkin 0:fd018d3e7dab 513
JLarkin 0:fd018d3e7dab 514 case DmTouch::DM_TFT28_105:
JLarkin 0:fd018d3e7dab 515 calibrationMatrix.a = 65521;
JLarkin 0:fd018d3e7dab 516 calibrationMatrix.b = -253;
JLarkin 0:fd018d3e7dab 517 calibrationMatrix.c = -11813673;
JLarkin 0:fd018d3e7dab 518 calibrationMatrix.d = -439;
JLarkin 0:fd018d3e7dab 519 calibrationMatrix.e = 89201;
JLarkin 0:fd018d3e7dab 520 calibrationMatrix.f = -10450920;
JLarkin 0:fd018d3e7dab 521 break;
JLarkin 0:fd018d3e7dab 522
JLarkin 0:fd018d3e7dab 523 case DmTouch::DM_TFT35_107:
JLarkin 0:fd018d3e7dab 524 calibrationMatrix.a = 91302; // 85984;
JLarkin 0:fd018d3e7dab 525 calibrationMatrix.b = 817; // 451;
JLarkin 0:fd018d3e7dab 526 calibrationMatrix.c = -26296117;//-16494041;
JLarkin 0:fd018d3e7dab 527 calibrationMatrix.d = -1877; // 2308;
JLarkin 0:fd018d3e7dab 528 calibrationMatrix.e = 73762; // 65173;
JLarkin 0:fd018d3e7dab 529 calibrationMatrix.f = -26384255;//-19179080;
JLarkin 0:fd018d3e7dab 530 break;
JLarkin 0:fd018d3e7dab 531 case DmTouch::DM_TFT43_108: // or DM_TFT43_110
JLarkin 0:fd018d3e7dab 532 calibrationMatrix.a = 541307;
JLarkin 0:fd018d3e7dab 533 calibrationMatrix.b = -4288;
JLarkin 0:fd018d3e7dab 534 calibrationMatrix.c = -36678732;
JLarkin 0:fd018d3e7dab 535 calibrationMatrix.d = 2730;
JLarkin 0:fd018d3e7dab 536 calibrationMatrix.e = 321714;
JLarkin 0:fd018d3e7dab 537 calibrationMatrix.f = -31439472;
JLarkin 0:fd018d3e7dab 538 break;
JLarkin 0:fd018d3e7dab 539 case DmTouch::DM_TFT50_111: // or DM_TFT50_112
JLarkin 0:fd018d3e7dab 540 calibrationMatrix.a = 875894;
JLarkin 0:fd018d3e7dab 541 calibrationMatrix.b = 1655;
JLarkin 0:fd018d3e7dab 542 calibrationMatrix.c = -53695309;
JLarkin 0:fd018d3e7dab 543 calibrationMatrix.d = -993;
JLarkin 0:fd018d3e7dab 544 calibrationMatrix.e = 544421;
JLarkin 0:fd018d3e7dab 545 calibrationMatrix.f = -41496753;
JLarkin 0:fd018d3e7dab 546 break;
JLarkin 0:fd018d3e7dab 547 default:
JLarkin 0:fd018d3e7dab 548 break;
JLarkin 0:fd018d3e7dab 549 }
JLarkin 0:fd018d3e7dab 550 return calibrationMatrix;
JLarkin 0:fd018d3e7dab 551 }