Atmel AT42QT1070 Seven-channel QTouch® Touch Sensor IC
QT1070.cpp@1:324c2c093ab8, 2018-06-28 (annotated)
- Committer:
- mederic
- Date:
- Thu Jun 28 08:08:14 2018 +0000
- Revision:
- 1:324c2c093ab8
- Parent:
- 0:cdb98fa5056a
replace "x%=X_MAX;" by "if(x>X_MAX)x=X_MAX;"
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mederic | 0:cdb98fa5056a | 1 | #include "QT1070.h" |
mederic | 0:cdb98fa5056a | 2 | |
mederic | 0:cdb98fa5056a | 3 | // Detection Status REG bits |
mederic | 0:cdb98fa5056a | 4 | #define QT1070_BIT_CALIB 7 |
mederic | 0:cdb98fa5056a | 5 | #define QT1070_BIT_OVFLW 6 |
mederic | 0:cdb98fa5056a | 6 | #define QT1070_BIT_TOUCH 0 |
mederic | 0:cdb98fa5056a | 7 | |
mederic | 0:cdb98fa5056a | 8 | // AVEAKS REG bits |
mederic | 0:cdb98fa5056a | 9 | #define QT1070_BIT_AVE 2 |
mederic | 0:cdb98fa5056a | 10 | |
mederic | 0:cdb98fa5056a | 11 | // FOMOGRD REG bits |
mederic | 0:cdb98fa5056a | 12 | #define QT1070_BIT_FO 5 |
mederic | 0:cdb98fa5056a | 13 | #define QT1070_BIT_MAX_CAL 4 |
mederic | 0:cdb98fa5056a | 14 | #define QT1070_MSL_GUARD 0xF0 |
mederic | 0:cdb98fa5056a | 15 | |
mederic | 0:cdb98fa5056a | 16 | QT1070::QT1070(I2C *i2c, PinName change):_i2c(i2c),_change(change){ |
mederic | 0:cdb98fa5056a | 17 | reset(); |
mederic | 0:cdb98fa5056a | 18 | } |
mederic | 0:cdb98fa5056a | 19 | |
mederic | 0:cdb98fa5056a | 20 | char QT1070::key(void){ |
mederic | 0:cdb98fa5056a | 21 | return read(REG_KEYSTAT); |
mederic | 0:cdb98fa5056a | 22 | } |
mederic | 0:cdb98fa5056a | 23 | |
mederic | 0:cdb98fa5056a | 24 | bool QT1070::change(void){ |
mederic | 0:cdb98fa5056a | 25 | if(_change.is_connected()){ |
mederic | 0:cdb98fa5056a | 26 | return !_change; |
mederic | 0:cdb98fa5056a | 27 | }else{ |
mederic | 0:cdb98fa5056a | 28 | return (read(REG_STATUS)&(1<<QT1070_BIT_TOUCH)); |
mederic | 0:cdb98fa5056a | 29 | } |
mederic | 0:cdb98fa5056a | 30 | } |
mederic | 0:cdb98fa5056a | 31 | |
mederic | 0:cdb98fa5056a | 32 | unsigned short QT1070::signal(char key){ |
mederic | 0:cdb98fa5056a | 33 | key%=KEY_NUM; |
mederic | 0:cdb98fa5056a | 34 | return readW(REG_KEYSIG0+(key<<1)); |
mederic | 0:cdb98fa5056a | 35 | } |
mederic | 0:cdb98fa5056a | 36 | |
mederic | 0:cdb98fa5056a | 37 | unsigned short QT1070::ref(char key){ |
mederic | 0:cdb98fa5056a | 38 | key%=KEY_NUM; |
mederic | 0:cdb98fa5056a | 39 | return readW(REG_REFDAT0+(key<<1)); |
mederic | 0:cdb98fa5056a | 40 | } |
mederic | 0:cdb98fa5056a | 41 | |
mederic | 0:cdb98fa5056a | 42 | char QT1070::nthresh(char key, char val){ |
mederic | 0:cdb98fa5056a | 43 | key%=KEY_NUM; |
mederic | 0:cdb98fa5056a | 44 | if (val){ |
mederic | 0:cdb98fa5056a | 45 | write(REG_NTHR0+key,val); |
mederic | 0:cdb98fa5056a | 46 | } |
mederic | 0:cdb98fa5056a | 47 | return read(REG_NTHR0+key); |
mederic | 0:cdb98fa5056a | 48 | } |
mederic | 0:cdb98fa5056a | 49 | |
mederic | 0:cdb98fa5056a | 50 | char QT1070::aksAve(char key, char group, char ave){ |
mederic | 0:cdb98fa5056a | 51 | key%=KEY_NUM; |
mederic | 1:324c2c093ab8 | 52 | if(ave>AVEMAX)ave=AVEMAX; |
mederic | 1:324c2c093ab8 | 53 | if(group>AKSMAX)group=AKSMAX; |
mederic | 0:cdb98fa5056a | 54 | write(REG_AVEAKS0+key,(ave<<QT1070_BIT_AVE)|(group)); |
mederic | 0:cdb98fa5056a | 55 | return read(REG_AVEAKS0+key); |
mederic | 0:cdb98fa5056a | 56 | } |
mederic | 0:cdb98fa5056a | 57 | |
mederic | 0:cdb98fa5056a | 58 | void QT1070::detectInt(char key, char val){ |
mederic | 0:cdb98fa5056a | 59 | key%=KEY_NUM; |
mederic | 0:cdb98fa5056a | 60 | val |= 0x02; |
mederic | 0:cdb98fa5056a | 61 | write(REG_DI0+key,val); |
mederic | 0:cdb98fa5056a | 62 | } |
mederic | 0:cdb98fa5056a | 63 | |
mederic | 0:cdb98fa5056a | 64 | void QT1070::foMaxCal(bool fo, bool maxcal){ |
mederic | 0:cdb98fa5056a | 65 | char reg = read(REG_FOMOGRD); |
mederic | 0:cdb98fa5056a | 66 | reg &= ~((1<<QT1070_BIT_FO) | (1<<QT1070_BIT_MAX_CAL)); |
mederic | 0:cdb98fa5056a | 67 | reg |= (fo<<QT1070_BIT_FO) | (maxcal<<QT1070_BIT_MAX_CAL); |
mederic | 0:cdb98fa5056a | 68 | write(REG_FOMOGRD, reg); |
mederic | 0:cdb98fa5056a | 69 | } |
mederic | 0:cdb98fa5056a | 70 | |
mederic | 0:cdb98fa5056a | 71 | void QT1070::guard(char key){ |
mederic | 0:cdb98fa5056a | 72 | key%=KEY_NUM; |
mederic | 0:cdb98fa5056a | 73 | char reg = read(REG_FOMOGRD); |
mederic | 0:cdb98fa5056a | 74 | reg &= QT1070_MSL_GUARD; |
mederic | 0:cdb98fa5056a | 75 | reg |= key; |
mederic | 0:cdb98fa5056a | 76 | write(REG_FOMOGRD ,reg); |
mederic | 0:cdb98fa5056a | 77 | } |
mederic | 0:cdb98fa5056a | 78 | |
mederic | 0:cdb98fa5056a | 79 | void QT1070::lowpwr(unsigned short ms){ |
mederic | 1:324c2c093ab8 | 80 | if(ms>2040)ms=2040; |
mederic | 1:324c2c093ab8 | 81 | char reg = ms>>3; |
mederic | 0:cdb98fa5056a | 82 | write(REG_LOWPWR, reg); |
mederic | 0:cdb98fa5056a | 83 | |
mederic | 0:cdb98fa5056a | 84 | } |
mederic | 0:cdb98fa5056a | 85 | |
mederic | 0:cdb98fa5056a | 86 | void QT1070::maxOnDuration(unsigned short ms){ |
mederic | 0:cdb98fa5056a | 87 | write(REG_MAXOND , ms>>4); |
mederic | 0:cdb98fa5056a | 88 | } |
mederic | 0:cdb98fa5056a | 89 | |
mederic | 0:cdb98fa5056a | 90 | void QT1070::calibrate(void){ |
mederic | 0:cdb98fa5056a | 91 | write(REG_CALIB ,255); |
mederic | 0:cdb98fa5056a | 92 | } |
mederic | 0:cdb98fa5056a | 93 | |
mederic | 0:cdb98fa5056a | 94 | void QT1070::reset(void){ |
mederic | 0:cdb98fa5056a | 95 | write(REG_RESET ,255); |
mederic | 0:cdb98fa5056a | 96 | } |
mederic | 0:cdb98fa5056a | 97 | |
mederic | 0:cdb98fa5056a | 98 | void QT1070::write(char reg, char data){ |
mederic | 0:cdb98fa5056a | 99 | char buf[2] = {reg,data}; |
mederic | 0:cdb98fa5056a | 100 | _i2c->write(I2C_ADDR, buf, 2); |
mederic | 0:cdb98fa5056a | 101 | } |
mederic | 0:cdb98fa5056a | 102 | |
mederic | 0:cdb98fa5056a | 103 | void QT1070::writeW(char reg, unsigned short data){ |
mederic | 0:cdb98fa5056a | 104 | char buf[3] = {reg,data>>8,data&0xff}; |
mederic | 0:cdb98fa5056a | 105 | _i2c->write(I2C_ADDR, buf, 3); |
mederic | 0:cdb98fa5056a | 106 | } |
mederic | 0:cdb98fa5056a | 107 | |
mederic | 0:cdb98fa5056a | 108 | char QT1070::read(char reg){ |
mederic | 0:cdb98fa5056a | 109 | char ret; |
mederic | 0:cdb98fa5056a | 110 | _i2c->write(I2C_ADDR, ®, 1); |
mederic | 0:cdb98fa5056a | 111 | _i2c->read(I2C_ADDR, &ret, 1); |
mederic | 0:cdb98fa5056a | 112 | return ret; |
mederic | 0:cdb98fa5056a | 113 | } |
mederic | 0:cdb98fa5056a | 114 | |
mederic | 0:cdb98fa5056a | 115 | unsigned short QT1070::readW(char reg){ |
mederic | 0:cdb98fa5056a | 116 | char ret[2]; |
mederic | 0:cdb98fa5056a | 117 | _i2c->write(I2C_ADDR, ®, 1); |
mederic | 0:cdb98fa5056a | 118 | _i2c->read(I2C_ADDR, ret, 2); |
mederic | 0:cdb98fa5056a | 119 | return ret[0]<<8 | ret[1]; |
mederic | 0:cdb98fa5056a | 120 | } |
mederic | 0:cdb98fa5056a | 121 |