for 522 mbed basic operate
Diff: DmTpFt6x06.cpp
- Revision:
- 13:6ff2649b6c27
- Child:
- 14:2db7065edbec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DmTpFt6x06.cpp Fri Sep 18 14:59:13 2015 +0000 @@ -0,0 +1,216 @@ +/********************************************************************************************** + Copyright (c) 2015 DisplayModule. All rights reserved. + + Redistribution and use of this source code, part of this source code or any compiled binary + based on this source code is permitted as long as the above copyright notice and following + disclaimer is retained. + + DISCLAIMER: + THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES + NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE. + ********************************************************************************************/ +// Tested with FT6X06 + +#include "DmTpFt6x06.h" +//#define log(...) Serial.println(__VA_ARGS__) +#define log(...) + +#if defined(DM_TOOLCHAIN_ARDUINO) +// disp - which display is used +// useIrq - Enable IRQ or disable IRQ +DmTpFt6x06::DmTpFt6x06(Display disp, bool useIrq) +#elif defined (DM_TOOLCHAIN_MBED) +// disp - which display is used +// &i2c - I2C class +// useIrq - Enable IRQ or disable IRQ +DmTpFt6x06::DmTpFt6x06(Display disp, I2C &i2c, bool useIrq) +#endif +{ + switch (disp) { + case DmTpFt6x06::DM_TFT28_116: + _irq = D2; + break; + default: + _irq = D2; + break; + } + + if (!useIrq) { + _irq = -1; + } +#if defined (DM_TOOLCHAIN_MBED) + _i2c = &i2c; +#endif +} + +void DmTpFt6x06::init() { + log("enter init()"); + +#if defined (DM_TOOLCHAIN_ARDUINO) + Wire.begin(); + Serial.print("Panel ID: "); Serial.println(readRegister8(FT6x06_FOCALTECH_ID)); + Serial.print("Chip ID: "); Serial.println(readRegister8(FT6x06_CHIPER)); + Serial.print("Firmware V: "); Serial.println(readRegister8(FT6x06_FIRMID)); + Serial.print("Point Rate Hz: "); Serial.println(readRegister8(FT6x06_PERIODACTIVE)); + Serial.print("Threshold: "); Serial.println(readRegister8(FT6x06_TH_GROUP)); +#elif defined (DM_TOOLCHAIN_MBED) + _i2c->frequency(400000); +#endif + if (_irq != -1) { // We will use Touch IRQ + enableIrq(); + } + + + log("exit init()"); +} + +void DmTpFt6x06::enableIrq() { + log("enter enableIrq()"); + +#if defined (DM_TOOLCHAIN_ARDUINO) + pinMode(_irq, INPUT); + _pinIrq = portInputRegister(digitalPinToPort(_irq)); + _bitmaskIrq = digitalPinToBitMask(_irq); +#elif defined (DM_TOOLCHAIN_MBED) + _pinIrq = new DigitalIn((PinName)_irq); + _pinIrq->mode(PullUp); +#endif + + log("exit enableIrq()"); +} + +uint8_t DmTpFt6x06::readRegister8(uint8_t reg) { +#if defined (DM_TOOLCHAIN_ARDUINO) + uint8_t x ; + Wire.beginTransmission(FT6x06_ADDR); + Wire.write((byte)reg); + Wire.endTransmission(); + Wire.beginTransmission(FT6x06_ADDR); + Wire.requestFrom((byte)FT6x06_ADDR, (byte)1); + x = Wire.read(); + Wire.endTransmission(); + return x; +#elif defined (DM_TOOLCHAIN_MBED) + char buf[1] = {reg}, data = 0; + _i2c->write(FT6x06_ADDR, buf, 1, true); + _i2c->read(FT6x06_ADDR, &data, 1); + return data; +#endif +} + +void DmTpFt6x06::writeRegister8(uint8_t reg, uint8_t val) { +#if defined (DM_TOOLCHAIN_ARDUINO) + Wire.beginTransmission(FT6x06_ADDR); + Wire.write((byte)reg); + Wire.write((byte)val); + Wire.endTransmission(); +#elif defined (DM_TOOLCHAIN_MBED) + char buf[2] = {reg, val}; + _i2c->write(FT6x06_ADDR, buf, 2); +#endif +} + + +bool DmTpFt6x06::isTouched() { + if (_irq == -1) { + uint8_t val; + val = readRegister8(FT6x06_TD_STATUS); + if ((val == 1) || (val == 2)) return true; + return false; + } + +#if defined (DM_TOOLCHAIN_ARDUINO) + if ( !gbi(_pinIrq, _bitmaskIrq) ) { + return true; + } + return false; +#elif defined (DM_TOOLCHAIN_MBED) + if (!_pinIrq->read()) { + return true; + } + return false; +#endif +} + + +void DmTpFt6x06::readTouchData(uint16_t& posX, uint16_t& posY, bool& touching) { +#if defined (DM_TOOLCHAIN_ARDUINO) + uint8_t buf[16]; + Wire.beginTransmission(FT6x06_ADDR); + Wire.write((byte)0); + Wire.endTransmission(); + Wire.beginTransmission(FT6x06_ADDR); + Wire.requestFrom((byte)FT6x06_ADDR, (byte)16); + for (uint8_t i=0; i<16; i++) + buf[i] = Wire.read(); + Wire.endTransmission(); + + posX = buf[3] & 0x0F; + posX <<= 8; + posX |= buf[4]; + posY = buf[5] & 0x0F; + posY <<= 8; + posY |= buf[6]; +#elif defined (DM_TOOLCHAIN_MBED) + posX = readRegister8(0x03) & 0x0F; + posX <<= 8; + posX |= readRegister8(0x04); + posY = readRegister8(0x05) & 0x0F; + posY <<= 8; + posY |= readRegister8(0x06); + + posX = map(posX, 0, 240, 240, 0); + posY = map(posY, 0, 320, 320, 0); +#endif + touching = isTouched(); +} + +bool DmTpFt6x06::readTouchData(uint16_t& posX, uint16_t& posY) { +#if defined (DM_TOOLCHAIN_ARDUINO) + uint8_t buf[16]; + Wire.beginTransmission(FT6x06_ADDR); + Wire.write((byte)0); + Wire.endTransmission(); + Wire.beginTransmission(FT6x06_ADDR); + Wire.requestFrom((byte)FT6x06_ADDR, (byte)16); + for (uint8_t i=0; i<16; i++) + buf[i] = Wire.read(); + Wire.endTransmission(); + + if(buf[2] > 2){ + posX = 0; + posY = 0; + return false; + } + posX = buf[3] & 0x0F; + posX <<= 8; + posX |= buf[4]; + posY = buf[5] & 0x0F; + posY <<= 8; + posY |= buf[6]; + return true; +#elif defined (DM_TOOLCHAIN_MBED) + if(readRegister8(0x03) > 2){ + posX = 0; + posY = 0; + return false; + } + + posX = readRegister8(0x03) & 0x0F; + posX <<= 8; + posX |= readRegister8(0x04); + posY = readRegister8(0x05) & 0x0F; + posY <<= 8; + posY |= readRegister8(0x06); + + posX = map(posX, 0, 240, 240, 0); + posY = map(posY, 0, 320, 320, 0); + return true; +#endif +} + +long DmTpFt6x06::map(long x, long in_min, long in_max, long out_min, long out_max) +{ + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} +