LA: Adding some "Ex" features to DmTftBase
Diff: DmTouch.cpp
- Revision:
- 11:264e19992620
- Parent:
- 10:d263094e666d
- Child:
- 14:2db7065edbec
diff -r d263094e666d -r 264e19992620 DmTouch.cpp --- a/DmTouch.cpp Wed Jul 09 08:31:34 2014 +0000 +++ b/DmTouch.cpp Wed Jan 21 13:56:51 2015 +0000 @@ -41,6 +41,7 @@ _width = 240; _height = 320; _hardwareSpi = false; + _touch_id = IC_2046; break; case DmTouch::DM_TFT28_105: @@ -52,9 +53,45 @@ _width = 240; _height = 320; _hardwareSpi = true; + _touch_id = IC_2046; break; case DmTouch::DM_TFT35_107: + _cs = D4; + _irq = D2; + _clk = D13; + _mosi = D11; + _miso = D12; + _width = 320; + _height = 240; + _hardwareSpi = true; + _touch_id = IC_2046; + break; + + case DmTouch::DM_TFT43_108: // or DM_TFT43_110 + _cs = D10; + _irq = D2; + _clk = D13; + _mosi = D11; + _miso = D12; + _width = 480; + _height = 272; + _hardwareSpi = true; + _touch_id = IC_8875; + break; + + case DmTouch::DM_TFT50_111: // or DM_TFT50_112 + _cs = D10; + _irq = D2; + _clk = D13; + _mosi = D11; + _miso = D12; + _width = 800; + _height = 480; + _hardwareSpi = true; + _touch_id = IC_8875; + break; + default: _cs = D4; _irq = D2; @@ -64,6 +101,7 @@ _width = 320; _height = 240; _hardwareSpi = true; + _touch_id = IC_2046; break; } @@ -78,7 +116,9 @@ _irq = -1; } #elif defined (DM_TOOLCHAIN_MBED) - _irq = -1; + if(_touch_id != IC_8875) { + _irq = -1; + } #endif setCalibrationMatrix(DmTouchCalibration::getDefaultCalibrationData(disp)); @@ -140,7 +180,66 @@ cbi(_pinCS, _bitmaskCS); spiWrite(0x80); // Enable PENIRQ sbi(_pinCS, _bitmaskCS); +#elif defined (DM_TOOLCHAIN_MBED) + _pinIrq = new DigitalIn((PinName)_irq); + _pinIrq->mode(PullUp); #endif + if(_touch_id == IC_8875) { + // enable touch panel + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0x70); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x00); + spiWrite(0xB3); + sbi(_pinCS, _bitmaskCS); + + // set auto mode + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0x71); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x00); + spiWrite(0x04); + sbi(_pinCS, _bitmaskCS); + + // enable touch panel interrupt + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0xF0); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + uint8_t temp; + spiWrite(0x40); + temp = spiRead(); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0xF0); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x00); + spiWrite(temp | 0x04); + sbi(_pinCS, _bitmaskCS); + + // Clear TP INT Status + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0xF1); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x00); + spiWrite(0x04); + sbi(_pinCS, _bitmaskCS); + } } void DmTouch::spiWrite(uint8_t data) { @@ -241,10 +340,65 @@ } void DmTouch::readRawData(uint16_t &x, uint16_t &y) { - cbi(_pinCS, _bitmaskCS); - x = readData12(0xD0); - y = readData12(0x90); - sbi(_pinCS, _bitmaskCS); + if(_touch_id == IC_8875){ + uint16_t tx, ty; + uint8_t temp; + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0x72); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x40); + tx = spiRead(); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0x73); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x40); + ty = spiRead(); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0x74); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x40); + temp = spiRead(); + sbi(_pinCS, _bitmaskCS); + + tx <<= 2; + ty <<= 2; + tx |= temp & 0x03; // get the bottom x bits + ty |= (temp >> 2) & 0x03; // get the bottom y bits + + x = tx; + y = ty; + + // Clear TP INT Status + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0xF1); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x00); + spiWrite(0x04); + sbi(_pinCS, _bitmaskCS); + } + else{ + cbi(_pinCS, _bitmaskCS); + x = readData12(0xD0); + y = readData12(0x90); + sbi(_pinCS, _bitmaskCS); + } } void DmTouch::readTouchData(uint16_t& posX, uint16_t& posY, bool& touching) { @@ -253,11 +407,15 @@ posX = getDisplayCoordinateX(touchX, touchY); posY = getDisplayCoordinateY(touchX, touchY); - #if defined (DM_TOOLCHAIN_ARDUINO) touching = isTouched(); #elif defined (DM_TOOLCHAIN_MBED) - touching = (posX < _width && posY < _height); + if(_touch_id == IC_8875) { + touching = isTouched() && (posX < _width && posY < _height); + } + else{ + touching = (posX < _width && posY < _height); + } #endif } @@ -278,11 +436,41 @@ } if ( !gbi(_pinIrq, _bitmaskIrq) ) { + if(_touch_id == IC_8875){ + // Clear TP INT Status + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0xF1); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x00); + spiWrite(0x04); + sbi(_pinCS, _bitmaskCS); + } return true; } return false; #elif defined (DM_TOOLCHAIN_MBED) + if(_touch_id == IC_8875) { + delay(1); + if (!_pinIrq->read()) { + // Clear TP INT Status + cbi(_pinCS, _bitmaskCS); + spiWrite(0x80); + spiWrite(0xF1); + sbi(_pinCS, _bitmaskCS); + + cbi(_pinCS, _bitmaskCS); + spiWrite(0x00); + spiWrite(0x04); + sbi(_pinCS, _bitmaskCS); + return true; + } else { + return false; + } + } return isSampleValid(); #endif } @@ -294,11 +482,13 @@ uint8_t nbrOfMeasurements = 0; for (int i=0; i<MEASUREMENTS; i++) { - getAverageXY(valuesX[i], valuesY[i]); + getAverageXY(valuesX[i], valuesY[i]); nbrOfMeasurements++; - if (!isTouched()) { - haveAllMeasurements = false; - break; + if(_touch_id != IC_8875) { + if (!isTouched()) { + haveAllMeasurements = false; + break; + } } } if (haveAllMeasurements) {