FT6206 Library for Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch

Dependents:   ArchPro_TFT ATT_AWS_IoT_demo_v06 ArchPro_TFT TermProject

Committer:
JackB
Date:
Mon Mar 23 19:54:30 2015 +0000
Revision:
1:43274ec89d1a
Parent:
0:d146e986a07f
Child:
2:35e21af6733c
Usage comment added in cpp file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 0:d146e986a07f 1 /***************************************************
JackB 0:d146e986a07f 2 This is a library for the Adafruit Capacitive Touch Screens
JackB 0:d146e986a07f 3
JackB 0:d146e986a07f 4 ----> http://www.adafruit.com/products/1947
JackB 0:d146e986a07f 5
JackB 0:d146e986a07f 6 Check out the links above for our tutorials and wiring diagrams
JackB 0:d146e986a07f 7 This chipset uses I2C to communicate
JackB 0:d146e986a07f 8
JackB 0:d146e986a07f 9 Adafruit invests time and resources providing this open source code,
JackB 0:d146e986a07f 10 please support Adafruit and open-source hardware by purchasing
JackB 0:d146e986a07f 11 products from Adafruit!
JackB 0:d146e986a07f 12
JackB 0:d146e986a07f 13 Written by Limor Fried/Ladyada for Adafruit Industries.
JackB 0:d146e986a07f 14 MIT license, all text above must be included in any redistribution
JackB 0:d146e986a07f 15 ****************************************************/
JackB 1:43274ec89d1a 16 /*
JackB 1:43274ec89d1a 17 Ussage:
JackB 1:43274ec89d1a 18
JackB 1:43274ec89d1a 19 while(1) {
JackB 1:43274ec89d1a 20 // if (FT6206.touched()) {
JackB 1:43274ec89d1a 21 if (FT6206.dataReceived()) {
JackB 1:43274ec89d1a 22 // Retrieve a point
JackB 1:43274ec89d1a 23 TS_Point p = FT6206.getPoint();
JackB 1:43274ec89d1a 24 printf("Touch %3d %3d\n", p.x, p.y);
JackB 1:43274ec89d1a 25 }
JackB 1:43274ec89d1a 26 }
JackB 1:43274ec89d1a 27 */
JackB 0:d146e986a07f 28
JackB 0:d146e986a07f 29 #include "FT6206.h"
JackB 0:d146e986a07f 30
JackB 0:d146e986a07f 31 FT6206::FT6206(PinName sda, PinName scl, PinName interrupt) : m_i2c(sda, scl), m_interrupt(interrupt)
JackB 0:d146e986a07f 32 {
JackB 0:d146e986a07f 33 m_addr = (FT6206_ADDR << 1);
JackB 0:d146e986a07f 34 m_i2c.frequency(FT6206_I2C_FREQUENCY);
JackB 0:d146e986a07f 35 m_interrupt.mode(PullUp);
JackB 0:d146e986a07f 36 }
JackB 0:d146e986a07f 37
JackB 0:d146e986a07f 38
JackB 0:d146e986a07f 39 /**************************************************************************/
JackB 0:d146e986a07f 40 /*!
JackB 0:d146e986a07f 41 @brief Setups the HW
JackB 0:d146e986a07f 42 */
JackB 0:d146e986a07f 43 /**************************************************************************/
JackB 0:d146e986a07f 44 bool FT6206::begin(uint8_t threshhold) {
JackB 0:d146e986a07f 45 //// Wire.begin();
JackB 0:d146e986a07f 46
JackB 0:d146e986a07f 47 // change threshhold to be higher/lower
JackB 0:d146e986a07f 48 writeRegister8(FT6206_REG_THRESHHOLD, threshhold);
JackB 0:d146e986a07f 49
JackB 0:d146e986a07f 50 if (readRegister8(FT6206_REG_VENDID) != 17)
JackB 0:d146e986a07f 51 return false;
JackB 0:d146e986a07f 52
JackB 0:d146e986a07f 53 if (readRegister8(FT6206_REG_CHIPID) != 6)
JackB 0:d146e986a07f 54 return false;
JackB 0:d146e986a07f 55 /*
JackB 0:d146e986a07f 56 printf("Vend ID: %d\n", readRegister8(FT6206_REG_VENDID));
JackB 0:d146e986a07f 57 printf("Chip ID: %d\n", readRegister8(FT6206_REG_CHIPID));
JackB 0:d146e986a07f 58 printf("Firm V: %d\n", readRegister8(FT6206_REG_FIRMVERS));
JackB 0:d146e986a07f 59 printf("Rate Hz: %d\n", readRegister8(FT6206_REG_POINTRATE));
JackB 0:d146e986a07f 60 printf("Thresh: %d\n", readRegister8(FT6206_REG_THRESHHOLD));
JackB 0:d146e986a07f 61 */
JackB 0:d146e986a07f 62 // dump all registers
JackB 0:d146e986a07f 63 /*
JackB 0:d146e986a07f 64 for (int16_t i=0; i<0x20; i++) {
JackB 0:d146e986a07f 65 printf("I2C $%02x = 0x %02x\n", i, readRegister8(i));
JackB 0:d146e986a07f 66 }
JackB 0:d146e986a07f 67 */
JackB 0:d146e986a07f 68 return true;
JackB 0:d146e986a07f 69 }
JackB 0:d146e986a07f 70
JackB 0:d146e986a07f 71 bool FT6206::touched(void) {
JackB 0:d146e986a07f 72 uint8_t n = readRegister8(FT6206_REG_NUMTOUCHES);
JackB 0:d146e986a07f 73 if ((n == 1) || (n == 2))
JackB 0:d146e986a07f 74 return true;
JackB 0:d146e986a07f 75 return false;
JackB 0:d146e986a07f 76 }
JackB 0:d146e986a07f 77
JackB 0:d146e986a07f 78 /*****************************/
JackB 0:d146e986a07f 79
JackB 0:d146e986a07f 80 void FT6206::readData(uint16_t *x, uint16_t *y) {
JackB 0:d146e986a07f 81 char i2cdat[16];
JackB 0:d146e986a07f 82
JackB 0:d146e986a07f 83 m_i2c.write(m_addr, 0x00, 1);
JackB 0:d146e986a07f 84 m_i2c.read(m_addr, i2cdat, 16);
JackB 0:d146e986a07f 85
JackB 0:d146e986a07f 86 /*
JackB 0:d146e986a07f 87 for (int16_t i=0; i<0x20; i++) {
JackB 0:d146e986a07f 88 printf("I2C %02x = %02x\n", i, i2cdat[i]);;
JackB 0:d146e986a07f 89 }
JackB 0:d146e986a07f 90 */
JackB 0:d146e986a07f 91
JackB 0:d146e986a07f 92 touches = i2cdat[0x02];
JackB 0:d146e986a07f 93
JackB 0:d146e986a07f 94 // printf("touches: %d\n", touches);
JackB 0:d146e986a07f 95 if (touches > 2) {
JackB 0:d146e986a07f 96 touches = 0;
JackB 0:d146e986a07f 97 *x = *y = 0;
JackB 0:d146e986a07f 98 }
JackB 0:d146e986a07f 99 if (touches == 0) {
JackB 0:d146e986a07f 100 *x = *y = 0;
JackB 0:d146e986a07f 101 return;
JackB 0:d146e986a07f 102 }
JackB 0:d146e986a07f 103
JackB 0:d146e986a07f 104 /*
JackB 0:d146e986a07f 105 if (touches == 2) Serial.print('2');
JackB 0:d146e986a07f 106 for (uint8_t i=0; i<16; i++) {
JackB 0:d146e986a07f 107 printf("%02x ", i2cdat[i]);
JackB 0:d146e986a07f 108 }
JackB 0:d146e986a07f 109 printf("\n");
JackB 0:d146e986a07f 110 */
JackB 0:d146e986a07f 111
JackB 0:d146e986a07f 112 /*
JackB 0:d146e986a07f 113 printf("\n");
JackB 0:d146e986a07f 114 if (i2cdat[0x01] != 0x00) {
JackB 0:d146e986a07f 115 printf("Gesture #%d\n", i2cdat[0x01]);
JackB 0:d146e986a07f 116 }
JackB 0:d146e986a07f 117 */
JackB 0:d146e986a07f 118
JackB 0:d146e986a07f 119 //printf("# Touches: %d", touches);
JackB 0:d146e986a07f 120 for (uint8_t i=0; i<2; i++) {
JackB 0:d146e986a07f 121 touchY[i] = i2cdat[0x03 + i*6] & 0x0F;
JackB 0:d146e986a07f 122 touchY[i] <<= 8;
JackB 0:d146e986a07f 123 touchY[i] |= i2cdat[0x04 + i*6];
JackB 0:d146e986a07f 124 touchX[i] = i2cdat[0x05 + i*6] & 0x0F;
JackB 0:d146e986a07f 125 touchX[i] <<= 8;
JackB 0:d146e986a07f 126 touchX[i] |= i2cdat[0x06 + i*6];
JackB 0:d146e986a07f 127 touchID[i] = i2cdat[0x05 + i*6] >> 4;
JackB 0:d146e986a07f 128 }
JackB 0:d146e986a07f 129 /*
JackB 0:d146e986a07f 130 for (uint8_t i=0; i<touches; i++) {
JackB 0:d146e986a07f 131 printf("ID #%d (%d, %d", touchID[i], touchX[i], touchY[i]);
JackB 0:d146e986a07f 132 printf(")\n");
JackB 0:d146e986a07f 133 }
JackB 0:d146e986a07f 134 */
JackB 0:d146e986a07f 135 *x = ILI9341_TFTWIDTH - touchX[0];
JackB 0:d146e986a07f 136 *y = touchY[0];
JackB 0:d146e986a07f 137 }
JackB 0:d146e986a07f 138
JackB 0:d146e986a07f 139 TS_Point FT6206::getPoint(void) {
JackB 0:d146e986a07f 140 uint16_t x, y;
JackB 0:d146e986a07f 141 readData(&x, &y);
JackB 0:d146e986a07f 142 return TS_Point(x, y, 1);
JackB 0:d146e986a07f 143 }
JackB 0:d146e986a07f 144
JackB 0:d146e986a07f 145 char FT6206::readRegister8(char reg) {
JackB 0:d146e986a07f 146 char val;
JackB 0:d146e986a07f 147 m_i2c.write(m_addr, &reg, 1);
JackB 0:d146e986a07f 148 m_i2c.read(m_addr, &val, 1);
JackB 0:d146e986a07f 149 return val;
JackB 0:d146e986a07f 150 }
JackB 0:d146e986a07f 151
JackB 0:d146e986a07f 152 void FT6206::writeRegister8(char reg, char val) {
JackB 0:d146e986a07f 153 char data[2];
JackB 0:d146e986a07f 154 data[0] = reg;
JackB 0:d146e986a07f 155 data[1] = val;
JackB 0:d146e986a07f 156 m_i2c.write((int)FT6206_ADDR, data, 2);
JackB 0:d146e986a07f 157 }
JackB 0:d146e986a07f 158
JackB 0:d146e986a07f 159 char FT6206::dataReceived(void) {
JackB 0:d146e986a07f 160 return !m_interrupt;
JackB 0:d146e986a07f 161 }
JackB 0:d146e986a07f 162
JackB 0:d146e986a07f 163 /****************/
JackB 0:d146e986a07f 164
JackB 0:d146e986a07f 165 TS_Point::TS_Point(void) {
JackB 0:d146e986a07f 166 x = y = 0;
JackB 0:d146e986a07f 167 }
JackB 0:d146e986a07f 168
JackB 0:d146e986a07f 169 TS_Point::TS_Point(int16_t x0, int16_t y0, int16_t z0) {
JackB 0:d146e986a07f 170 x = x0;
JackB 0:d146e986a07f 171 y = y0;
JackB 0:d146e986a07f 172 z = z0;
JackB 0:d146e986a07f 173 }
JackB 0:d146e986a07f 174
JackB 0:d146e986a07f 175 bool TS_Point::operator==(TS_Point p1) {
JackB 0:d146e986a07f 176 return ((p1.x == x) && (p1.y == y) && (p1.z == z));
JackB 0:d146e986a07f 177 }
JackB 0:d146e986a07f 178
JackB 0:d146e986a07f 179 bool TS_Point::operator!=(TS_Point p1) {
JackB 0:d146e986a07f 180 return ((p1.x != x) || (p1.y != y) || (p1.z != z));
JackB 0:d146e986a07f 181 }