FT5206 capacitive Touch Panel driver for 7 inch BuyDisplay LCD, with 5-point touch.
FT5206.cpp@0:19406ff51058, 2015-06-18 (annotated)
- Committer:
- JackB
- Date:
- Thu Jun 18 21:14:06 2015 +0000
- Revision:
- 0:19406ff51058
- Child:
- 2:5ebf8736e4b2
FT5206 Capacitive Touch Panel driver for 7" BuyDisplay LCD.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JackB | 0:19406ff51058 | 1 | #include "FT5206.h" |
JackB | 0:19406ff51058 | 2 | |
JackB | 0:19406ff51058 | 3 | FT5206::FT5206(PinName sda, PinName scl, PinName interrupt) : m_i2c(sda, scl), m_interrupt(interrupt) { |
JackB | 0:19406ff51058 | 4 | m_addr = (FT5206_I2C_ADDRESS << 1); |
JackB | 0:19406ff51058 | 5 | m_i2c.frequency(FT5206_I2C_FREQUENCY); |
JackB | 0:19406ff51058 | 6 | |
JackB | 0:19406ff51058 | 7 | // Interrupt |
JackB | 0:19406ff51058 | 8 | m_interrupt.mode(PullUp); |
JackB | 0:19406ff51058 | 9 | m_interrupt.enable_irq(); |
JackB | 0:19406ff51058 | 10 | m_interrupt.fall(this, &FT5206::intPanelTouched); |
JackB | 0:19406ff51058 | 11 | |
JackB | 0:19406ff51058 | 12 | init(); |
JackB | 0:19406ff51058 | 13 | } |
JackB | 0:19406ff51058 | 14 | |
JackB | 0:19406ff51058 | 15 | bool FT5206::init(void) { |
JackB | 0:19406ff51058 | 16 | panelTouched = false; |
JackB | 0:19406ff51058 | 17 | |
JackB | 0:19406ff51058 | 18 | if(DEBUG_OUTPUT_ENABLED) { |
JackB | 0:19406ff51058 | 19 | printf("Trying to initialize FT5206 by I2C\r\n"); |
JackB | 0:19406ff51058 | 20 | } |
JackB | 0:19406ff51058 | 21 | |
JackB | 0:19406ff51058 | 22 | writeRegister8(FT5206_DEVICE_MODE, 0); |
JackB | 0:19406ff51058 | 23 | |
JackB | 0:19406ff51058 | 24 | for (int i = 0; i < 5; i++) { |
JackB | 0:19406ff51058 | 25 | touchCoordinatesX[0] = -1; |
JackB | 0:19406ff51058 | 26 | touchCoordinatesY[0] = -1; |
JackB | 0:19406ff51058 | 27 | } |
JackB | 0:19406ff51058 | 28 | |
JackB | 0:19406ff51058 | 29 | if(DEBUG_OUTPUT_ENABLED) { |
JackB | 0:19406ff51058 | 30 | printf("Setup done.\r\n"); |
JackB | 0:19406ff51058 | 31 | } |
JackB | 0:19406ff51058 | 32 | } |
JackB | 0:19406ff51058 | 33 | |
JackB | 0:19406ff51058 | 34 | uint8_t FT5206::getTouchPositions(void) { |
JackB | 0:19406ff51058 | 35 | numberOfTouchPoints = readRegister8(FT5206_TD_STATUS) & 0xF; |
JackB | 0:19406ff51058 | 36 | gestureID = readRegister8(FT5206_GEST_ID); |
JackB | 0:19406ff51058 | 37 | status = readRegister8(FT5206_TD_STATUS); |
JackB | 0:19406ff51058 | 38 | |
JackB | 0:19406ff51058 | 39 | for (int i = 0; i < 5; i++) { |
JackB | 0:19406ff51058 | 40 | touchCoordinatesX[0] = -1; |
JackB | 0:19406ff51058 | 41 | touchCoordinatesY[0] = -1; |
JackB | 0:19406ff51058 | 42 | } |
JackB | 0:19406ff51058 | 43 | if (numberOfTouchPoints > 0) { |
JackB | 0:19406ff51058 | 44 | touchCoordinatesX[0] = (readRegister8(FT5206_TOUCH1_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_XL); |
JackB | 0:19406ff51058 | 45 | touchCoordinatesY[0] = (readRegister8(FT5206_TOUCH1_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_YL); |
JackB | 0:19406ff51058 | 46 | } |
JackB | 0:19406ff51058 | 47 | if (numberOfTouchPoints > 1) { |
JackB | 0:19406ff51058 | 48 | touchCoordinatesX[1] = (readRegister8(FT5206_TOUCH2_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_XL); |
JackB | 0:19406ff51058 | 49 | touchCoordinatesY[1] = (readRegister8(FT5206_TOUCH2_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_YL); |
JackB | 0:19406ff51058 | 50 | } |
JackB | 0:19406ff51058 | 51 | if (numberOfTouchPoints > 2) { |
JackB | 0:19406ff51058 | 52 | touchCoordinatesX[2] = (readRegister8(FT5206_TOUCH3_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_XL); |
JackB | 0:19406ff51058 | 53 | touchCoordinatesY[2] = (readRegister8(FT5206_TOUCH3_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_YL); |
JackB | 0:19406ff51058 | 54 | } |
JackB | 0:19406ff51058 | 55 | if (numberOfTouchPoints > 3) { |
JackB | 0:19406ff51058 | 56 | touchCoordinatesX[3] = (readRegister8(FT5206_TOUCH4_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_XL); |
JackB | 0:19406ff51058 | 57 | touchCoordinatesY[3] = (readRegister8(FT5206_TOUCH4_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_YL); |
JackB | 0:19406ff51058 | 58 | } |
JackB | 0:19406ff51058 | 59 | if (numberOfTouchPoints > 4) { |
JackB | 0:19406ff51058 | 60 | touchCoordinatesX[4] = (readRegister8(FT5206_TOUCH5_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_XL); |
JackB | 0:19406ff51058 | 61 | touchCoordinatesY[4] = (readRegister8(FT5206_TOUCH5_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_YL); |
JackB | 0:19406ff51058 | 62 | } |
JackB | 0:19406ff51058 | 63 | return numberOfTouchPoints; |
JackB | 0:19406ff51058 | 64 | } |
JackB | 0:19406ff51058 | 65 | |
JackB | 0:19406ff51058 | 66 | |
JackB | 0:19406ff51058 | 67 | // Interrupt for touch detection |
JackB | 0:19406ff51058 | 68 | void FT5206::intPanelTouched(void) { |
JackB | 0:19406ff51058 | 69 | // getTouchPositions(); |
JackB | 0:19406ff51058 | 70 | panelTouched = true; |
JackB | 0:19406ff51058 | 71 | } |
JackB | 0:19406ff51058 | 72 | |
JackB | 0:19406ff51058 | 73 | bool FT5206::getPanelTouched(void) { |
JackB | 0:19406ff51058 | 74 | if (panelTouched == true) { |
JackB | 0:19406ff51058 | 75 | panelTouched = false; |
JackB | 0:19406ff51058 | 76 | return true; |
JackB | 0:19406ff51058 | 77 | } else { |
JackB | 0:19406ff51058 | 78 | return false; |
JackB | 0:19406ff51058 | 79 | } |
JackB | 0:19406ff51058 | 80 | } |
JackB | 0:19406ff51058 | 81 | |
JackB | 0:19406ff51058 | 82 | char FT5206::readRegister8(char reg) { |
JackB | 0:19406ff51058 | 83 | char val; |
JackB | 0:19406ff51058 | 84 | m_i2c.write(m_addr, ®, 1); |
JackB | 0:19406ff51058 | 85 | m_i2c.read(m_addr, &val, 1); |
JackB | 0:19406ff51058 | 86 | return val; |
JackB | 0:19406ff51058 | 87 | } |
JackB | 0:19406ff51058 | 88 | |
JackB | 0:19406ff51058 | 89 | void FT5206::writeRegister8(char reg, char val) { |
JackB | 0:19406ff51058 | 90 | char data[2]; |
JackB | 0:19406ff51058 | 91 | data[0] = reg; |
JackB | 0:19406ff51058 | 92 | data[1] = val; |
JackB | 0:19406ff51058 | 93 | m_i2c.write((int)FT5206_I2C_ADDRESS, data, 2); |
JackB | 0:19406ff51058 | 94 | } |