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:
Thu Jan 21 16:40:25 2016 +0000
Revision:
1:852bf4b0714f
Parent:
0:fd018d3e7dab
Completed modifications on remaining panel types.

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