Igel_CO2

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers FT5206.cpp Source File

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,&reg,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,&reg,1);
00117     ft_i2c.read( I2C_ADR << 1,&val1,1);
00118     reg++;
00119     ft_i2c.write(I2C_ADR << 1,&reg,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, &reg, 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 */