Atmel AT42QT1070 Seven-channel QTouch® Touch Sensor IC

Revision:
0:cdb98fa5056a
Child:
1:324c2c093ab8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QT1070.cpp	Wed Jun 27 06:25:51 2018 +0000
@@ -0,0 +1,120 @@
+#include "QT1070.h"
+
+// Detection Status REG bits
+#define QT1070_BIT_CALIB    7
+#define QT1070_BIT_OVFLW    6
+#define QT1070_BIT_TOUCH    0
+
+// AVEAKS REG bits
+#define QT1070_BIT_AVE      2
+
+// FOMOGRD REG bits
+#define QT1070_BIT_FO       5
+#define QT1070_BIT_MAX_CAL  4
+#define QT1070_MSL_GUARD    0xF0
+
+QT1070::QT1070(I2C *i2c, PinName change):_i2c(i2c),_change(change){
+    reset();
+}
+
+char QT1070::key(void){
+    return read(REG_KEYSTAT);
+}
+ 
+bool QT1070::change(void){
+    if(_change.is_connected()){
+        return !_change;
+    }else{
+        return (read(REG_STATUS)&(1<<QT1070_BIT_TOUCH));
+    }     
+}
+
+unsigned short QT1070::signal(char key){
+    key%=KEY_NUM;
+    return readW(REG_KEYSIG0+(key<<1));
+}
+
+unsigned short QT1070::ref(char key){
+    key%=KEY_NUM;
+    return readW(REG_REFDAT0+(key<<1));
+}
+
+char QT1070::nthresh(char key, char val){
+    key%=KEY_NUM;
+    if (val){
+        write(REG_NTHR0+key,val);
+    }
+    return read(REG_NTHR0+key);
+}
+
+char QT1070::aksAve(char key, char group, char ave){
+    key%=KEY_NUM;
+    ave%=AVEMAX;
+    group%=AKSMAX;
+    write(REG_AVEAKS0+key,(ave<<QT1070_BIT_AVE)|(group));
+    return read(REG_AVEAKS0+key);
+}
+
+void QT1070::detectInt(char key, char val){
+    key%=KEY_NUM;
+    val |= 0x02;
+    write(REG_DI0+key,val);
+}
+
+void QT1070::foMaxCal(bool fo, bool maxcal){
+    char reg = read(REG_FOMOGRD);
+    reg &= ~((1<<QT1070_BIT_FO) | (1<<QT1070_BIT_MAX_CAL));
+    reg |= (fo<<QT1070_BIT_FO) | (maxcal<<QT1070_BIT_MAX_CAL);
+    write(REG_FOMOGRD, reg);
+}
+
+void QT1070::guard(char key){
+    key%=KEY_NUM;
+    char reg = read(REG_FOMOGRD);
+    reg &= QT1070_MSL_GUARD;
+    reg |= key;
+    write(REG_FOMOGRD ,reg);
+}
+
+void QT1070::lowpwr(unsigned short ms){
+    char reg  = (ms%2040)>>3;
+    write(REG_LOWPWR, reg);
+    
+}
+
+void QT1070::maxOnDuration(unsigned short ms){
+     write(REG_MAXOND , ms>>4);
+}
+
+void QT1070::calibrate(void){
+    write(REG_CALIB ,255);
+}
+
+void QT1070::reset(void){
+    write(REG_RESET ,255);
+}
+
+void QT1070::write(char reg, char data){
+    char buf[2] = {reg,data};
+    _i2c->write(I2C_ADDR, buf, 2);
+}
+
+void QT1070::writeW(char reg, unsigned short data){
+    char buf[3] = {reg,data>>8,data&0xff};
+    _i2c->write(I2C_ADDR, buf, 3);
+}
+
+char QT1070::read(char reg){
+    char ret;
+    _i2c->write(I2C_ADDR, &reg, 1);
+    _i2c->read(I2C_ADDR, &ret, 1);
+    return ret;  
+}
+
+unsigned short QT1070::readW(char reg){
+    char ret[2];
+    _i2c->write(I2C_ADDR, &reg, 1);
+    _i2c->read(I2C_ADDR, ret, 2);
+    return ret[0]<<8 | ret[1];  
+}
+