Conversion of DisplayModule's DmTouch to work with UniGraphics as display driver rather than their own DmTftLib.
Fork of DmTouch_UniGraphic by
DmTouch.cpp@0:fd018d3e7dab, 2016-01-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |