Igel_CO2
Embed:
(wiki syntax)
Show/hide line numbers
FT5206.cpp
00001 // FT5206.cpp 00002 // Roland Fuchs 00003 00004 #include "FT5206.h" 00005 #include "fuchs.h" 00006 00007 #define I2C_ADR 0x38 00008 #define TD_STATUS 0x02 // How many points detected (3:0). 1-5 is valid. 00009 00010 #define T1_X 0x03 // 1 Event Flag, Touch X Position 00011 #define T2_X 0x09 // 2 00012 #define T3_X 0x0f // 3 00013 #define T4_X 0x15 // 4 00014 #define T5_X 0x1b // 5 00015 00016 00017 extern I2C ft_i2c; // (p9,p10); //SDA,SCL Tip 00018 extern InterruptIn ft_irq; // (p16); 00019 00020 extern DigitalOut led1;//(LED1); 00021 00022 //--------------------------------------------------------------- 00023 00024 void init_FT5206() 00025 { 00026 ft_i2c.frequency(400000); // 400kHz=Standard (FT5206_I2C_FREQUENCY); 00027 // Interrupt 00028 ft_irq.fall(&tip_irq_ein); 00029 ft_irq.rise(&tip_irq_aus); 00030 //#define FT5206_DEVICE_MODE 0x00 00031 writeReg8(0x00,0); 00032 wait(0.1); 00033 } 00034 00035 int getTip5(Tip *zt) 00036 { 00037 Tip Tx=*zt; 00038 int tipanz=readReg8(TD_STATUS) & 0xF; 00039 if(tipanz>5) tipanz=5; 00040 char adr[5]={T1_X,T2_X,T3_X,T4_X,T5_X}; // TOUCH1_XH....... 00041 for(int i=0; i<5; i++) 00042 { 00043 Tx.x[i]=Tx.y[i]=-1; 00044 if(i<tipanz) 00045 { 00046 Tx.x[i]=readReg16(adr[i]);//(readReg8(adr[i] ) & 0x0f)*256+readReg8(adr[i]+1); 00047 Tx.y[i]=readReg16(adr[i]+2);//(readReg8(adr[i]+2) & 0x0f)*256+readReg8(adr[i]+3); 00048 } 00049 } 00050 *zt=Tx; 00051 klick(1); 00052 return tipanz; 00053 } 00054 00055 int getTip(int *x,int *y) 00056 { // wartet auf 1. Tip 00057 int tipanz=0; 00058 char adr=T1_X; 00059 do 00060 tipanz=readReg8(TD_STATUS) & 0xF; 00061 while(tipanz==0); 00062 klick(1); 00063 *x=readReg16(adr);//(readReg8(adr ) & 0x0f)*256+readReg8(adr+1); 00064 *y=readReg16(adr+2);//(readReg8(adr+2) & 0x0f)*256+readReg8(adr+3); 00065 return tipanz; 00066 } 00067 00068 int getTipPoll(int *x,int *y) 00069 { // wartet nicht auf Tip !!!!! 00070 char adr=T1_X; 00071 *x=*y=0; 00072 int tipanz=readReg8(TD_STATUS) & 0xF; 00073 if(tipanz>0) 00074 { 00075 *x=readReg16(adr);//(readReg8(adr ) & 0x0f)*256+readReg8(adr+1); 00076 *y=readReg16(adr+2);//(readReg8(adr+2) & 0x0f)*256+readReg8(adr+3); 00077 klick(1); 00078 } 00079 return tipanz; 00080 } 00081 00082 void getTipWait(int ms) 00083 { // wartet vorher ms millisekunden 00084 wait_ms(ms); 00085 while( (readReg8(TD_STATUS) & 0xF)==0); 00086 klick(1); 00087 } 00088 00089 void tip_irq_ein() 00090 { 00091 led1=1;//piep(1000,0.1); 00092 } 00093 00094 void tip_irq_aus() 00095 { 00096 led1=0;//piep(1000,0.1); 00097 } 00098 00099 char readReg8(char reg) 00100 { 00101 char val; 00102 ft_i2c.write(I2C_ADR << 1,®,1); 00103 ft_i2c.read( I2C_ADR << 1,&val,1); 00104 return val; 00105 } 00106 00107 void writeReg8(char reg,char val) 00108 { 00109 char data[2]={reg,val}; 00110 ft_i2c.write(I2C_ADR,data,2); 00111 } 00112 00113 int readReg16(char reg) 00114 { 00115 char val1,val2; 00116 ft_i2c.write(I2C_ADR << 1,®,1); 00117 ft_i2c.read( I2C_ADR << 1,&val1,1); 00118 reg++; 00119 ft_i2c.write(I2C_ADR << 1,®,1); 00120 ft_i2c.read( I2C_ADR << 1,&val2,1); 00121 return (int)(256*(val1 & 0x0f)+val2); 00122 } 00123 00124 /* 00125 FT5206::FT5206(PinName sda, PinName scl, PinName interrupt) : m_i2c(sda, scl), m_interrupt(interrupt) 00126 { 00127 //m_addr = (FT5206_I2C_ADDRESS << 1); 00128 m_i2c.frequency(400000);//(FT5206_I2C_FREQUENCY); 00129 00130 // Interrupt 00131 m_interrupt.mode(PullUp); 00132 //----------------------------------------------- 00133 // Roli 14.3.17 InterruptIn has no member enable_irq() 00134 // m_interrupt.enable_irq(); 00135 //----------------------------------------------- 00136 m_interrupt.fall(this, &FT5206::intPanelTouched); 00137 00138 init(); 00139 } 00140 00141 void FT5206::init(void) 00142 { 00143 panelTouched = false; 00144 00145 // if(DEBUG_OUTPUT_ENABLED) printf("Trying to initialize FT5206 by I2C\r\n"); 00146 //#define FT5206_DEVICE_MODE 0x00 00147 writeRegister8(0x00,0); 00148 00149 for(int i=0; i<5; i++) 00150 { 00151 tipx[0]=-1; 00152 tipy[0]=-1; 00153 } 00154 00155 // if(DEBUG_OUTPUT_ENABLED) printf("Setup done.\r\n"); 00156 } 00157 00158 int FT5206::getTouchPositions() 00159 { 00160 tipanz = readRegister8(FT5206_TD_STATUS) & 0xF; 00161 00162 for (int i = 0; i < 5; i++) 00163 { 00164 tipx[0] = -1; 00165 tipy[0] = -1; 00166 } 00167 if (tipanz > 0) 00168 { 00169 tipx[0] = (readRegister8(FT5206_TOUCH1_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_XL); 00170 tipy[0] = (readRegister8(FT5206_TOUCH1_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_YL); 00171 } 00172 if (tipanz > 1) 00173 { 00174 tipx[1] = (readRegister8(FT5206_TOUCH2_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_XL); 00175 tipy[1] = (readRegister8(FT5206_TOUCH2_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_YL); 00176 } 00177 if (tipanz > 2) 00178 { 00179 tipx[2] = (readRegister8(FT5206_TOUCH3_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_XL); 00180 tipy[2] = (readRegister8(FT5206_TOUCH3_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_YL); 00181 } 00182 if (tipanz > 3) 00183 { 00184 tipx[3] = (readRegister8(FT5206_TOUCH4_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_XL); 00185 tipy[3] = (readRegister8(FT5206_TOUCH4_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_YL); 00186 } 00187 if (tipanz > 4) 00188 { 00189 tipx[4] = (readRegister8(FT5206_TOUCH5_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_XL); 00190 tipy[4] = (readRegister8(FT5206_TOUCH5_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_YL); 00191 } 00192 return tipanz; 00193 } 00194 00195 00196 // Interrupt for touch detection 00197 void FT5206::intPanelTouched() 00198 { 00199 getTouchPositions(); 00200 panelTouched = true; 00201 } 00202 00203 bool FT5206::getPanelTouched() 00204 { 00205 if(panelTouched==true) 00206 { 00207 panelTouched=false; 00208 return true; 00209 } 00210 else 00211 return false; 00212 } 00213 00214 char FT5206::readRegister8(char reg) 00215 { 00216 char val; 00217 m_i2c.write(FT5206_I2C_ADDRESS << 1, ®, 1); 00218 m_i2c.read(FT5206_I2C_ADDRESS << 1, &val, 1); 00219 return val; 00220 } 00221 00222 void FT5206::writeRegister8(char reg, char val) 00223 { 00224 char data[2]; 00225 data[0] = reg; 00226 data[1] = val; 00227 m_i2c.write((int)FT5206_I2C_ADDRESS, data, 2); 00228 } 00229 */
Generated on Sun Jul 31 2022 17:58:53 by
1.7.2