11 #include "QuickMpr121.h"
13 byte mpr121::i2cReadBuf[MPR121_I2C_BUFLEN];
15 #if MPR121_SAVE_MEMORY
16 short mpr121::electrodeDataBuf[13];
17 byte mpr121::electrodeBaselineBuf[13];
18 byte mpr121::electrodeCDCBuf[13];
20 #if !MPR121_USE_BITFIELDS
21 bool mpr121::electrodeOORBuf[15];
23 #endif // MPR121_SAVE_MEMORY
27 i2cWire->beginTransmission(i2cAddr);
29 i2cWire->write(value);
30 i2cWire->endTransmission();
36 if (count > MPR121_I2C_BUFLEN)
37 count = MPR121_I2C_BUFLEN;
40 i2cWire->beginTransmission(i2cAddr);
42 i2cWire->endTransmission(
false);
44 i2cWire->requestFrom(i2cAddr, count, (
byte)
true);
47 while (i2cWire->available() && readnum < count)
49 i2cReadBuf[readnum] = i2cWire->read();
54 for ( ; readnum < count; readnum++)
56 i2cReadBuf[readnum] = 0;
66 bool mpr121::checkElectrodeNum(
byte &electrode,
byte &count) {
70 if (electrode + count > 13)
71 count = 13 - electrode;
79 bool mpr121::checkElectrodeNum(
byte &electrode) {
89 bool mpr121::checkGPIOPinNum(
byte &pin,
byte &count) {
90 if (pin < 4 || pin > 11)
102 bool mpr121::checkGPIOPinNum(
byte &pin) {
103 if (pin < 4 || pin > 11)
112 void mpr121::setElectrodeThresholds(
byte electrode,
byte count,
byte touchThreshold,
byte releaseThreshold) {
113 if (!checkElectrodeNum(electrode, count))
116 for (
byte i = 0; i < count; i++) {
117 writeRegister((
mpr121Register)(MPRREG_ELE0_TOUCH_THRESHOLD + (i+electrode)*2), touchThreshold);
118 writeRegister((
mpr121Register)(MPRREG_ELE0_RELEASE_THRESHOLD + (i+electrode)*2), releaseThreshold);
126 void mpr121::setMHD(
byte rising,
byte falling) {
127 writeRegister(MPRREG_MHD_RISING, rising);
128 writeRegister(MPRREG_MHD_FALLING, falling);
134 void mpr121::setNHD(
byte rising,
byte falling,
byte touched) {
135 writeRegister(MPRREG_NHD_AMOUNT_RISING, rising);
136 writeRegister(MPRREG_NHD_AMOUNT_FALLING, falling);
137 writeRegister(MPRREG_NHD_AMOUNT_TOUCHED, touched);
142 void mpr121::setNCL(
byte rising,
byte falling,
byte touched) {
143 writeRegister(MPRREG_NCL_RISING, rising);
144 writeRegister(MPRREG_NCL_FALLING, falling);
145 writeRegister(MPRREG_NCL_TOUCHED, touched);
150 void mpr121::setFDL(
byte rising,
byte falling,
byte touched) {
151 writeRegister(MPRREG_FDL_RISING, rising);
152 writeRegister(MPRREG_FDL_FALLING, falling);
153 writeRegister(MPRREG_NCL_TOUCHED, touched);
160 void mpr121::setMHDProx(
byte rising,
byte falling) {
161 writeRegister(MPRREG_ELEPROX_MHD_RISING, rising);
162 writeRegister(MPRREG_ELEPROX_MHD_FALLING, falling);
168 void mpr121::setNHDProx(
byte rising,
byte falling,
byte touched) {
169 writeRegister(MPRREG_ELEPROX_NHD_AMOUNT_RISING, rising);
170 writeRegister(MPRREG_ELEPROX_NHD_AMOUNT_FALLING, falling);
171 writeRegister(MPRREG_ELEPROX_NHD_AMOUNT_TOUCHED, touched);
176 void mpr121::setNCLProx(
byte rising,
byte falling,
byte touched) {
177 writeRegister(MPRREG_ELEPROX_NCL_RISING, rising);
178 writeRegister(MPRREG_ELEPROX_NCL_FALLING, falling);
179 writeRegister(MPRREG_ELEPROX_NCL_TOUCHED, touched);
184 void mpr121::setFDLProx(
byte rising,
byte falling,
byte touched) {
185 writeRegister(MPRREG_ELEPROX_FDL_RISING, rising);
186 writeRegister(MPRREG_ELEPROX_FDL_FALLING, falling);
187 writeRegister(MPRREG_ELEPROX_NCL_TOUCHED, touched);
194 void mpr121::setDebounce(
byte touchNumber,
byte releaseNumber) {
195 touchNumber &= 0b0111;
196 releaseNumber &= 0b0111;
198 writeRegister(MPRREG_DEBOUNCE, (touchNumber << 4) | releaseNumber);
213 byte FFI_2 = (byte)
FFI & 0b00000011;
214 byte CDC_6 = CDC & 0b00111111;
215 byte CDT_3 = (byte)CDT & 0b00000111;
216 byte SFI_2 = (byte)
SFI & 0b00000011;
217 byte ESI_3 = (byte)
ESI & 0b00000111;
219 writeRegister(MPRREG_FILTER_GLOBAL_CDC_CONFIG, (FFI_2 << 6) | CDC_6);
220 writeRegister(MPRREG_FILTER_GLOBAL_CDT_CONFIG, (CDT_3 << 5) | (SFI_2 << 3) | ESI_3);
223 byte autoConf = readRegister(MPRREG_AUTOCONFIG_CONTROL_0) & 0b00111111;
224 autoConf |= (FFI_2 << 6);
225 writeRegister(MPRREG_AUTOCONFIG_CONTROL_0, autoConf);
235 byte CL_2 = CL & 0b00000011;
236 byte ELEPROX_EN_2 = ELEPROX_EN & 0b00000011;
237 byte ELE_EN_4 = ELE_EN & 0b00001111;
239 writeRegister(MPRREG_ELECTRODE_CONFIG, (CL_2 << 6) | (ELEPROX_EN_2 << 4) | ELE_EN_4);
258 void mpr121::setAutoConfig(
byte USL,
byte LSL,
byte TL,
mpr121AutoConfigRetry RETRY,
mpr121AutoConfigBVA BVA,
bool ARE,
bool ACE,
bool SCTS,
bool OORIE,
bool ARFIE,
bool ACFIE) {
259 byte FFI = (readRegister(MPRREG_AFE_CONFIG) >> 6) & 0b00000011;
260 byte RETRY_2 = RETRY & 0b00000011;
261 byte BVA_2 = BVA & 0b00000011;
263 writeRegister(MPRREG_AUTOCONFIG_USL, USL);
264 writeRegister(MPRREG_AUTOCONFIG_LSL, LSL);
265 writeRegister(MPRREG_AUTOCONFIG_TL, TL);
266 writeRegister(MPRREG_AUTOCONFIG_CONTROL_0, (
FFI << 6) | (RETRY_2 << 4) | (BVA_2 << 2) | ((ARE ? 1 : 0) << 1) | (ACE ? 1 : 0));
267 writeRegister(MPRREG_AUTOCONFIG_CONTROL_1, ((SCTS ? 1 : 0) << 7) | ((OORIE ? 1 : 0) << 2) | ((ARFIE ? 1 : 0) << 1) | (ACFIE ? 1 : 0));
277 void mpr121::setPWM(
byte pin,
byte count,
byte value) {
278 if (!checkGPIOPinNum(pin, count))
283 byte value_4 = value & 0b1111;
288 for (
byte i = 0; i < count; i++) {
289 if (i == 0 || (pin + i) % 2 == 0) {
291 regVal = readRegister(reg);
294 if ((pin + i) % 2 == 0)
295 regVal = (regVal & 0b11110000) | value_4;
297 regVal = (regVal & 0b00001111) | (value_4 << 4);
299 if ((pin + i) % 2 == 1 || i == count - 1)
300 writeRegister(reg, regVal);
310 static byte usedAddresses = 0;
313 if (!bitRead(usedAddresses, 0)) {
316 else if (!bitRead(usedAddresses, 1)) {
319 else if (!bitRead(usedAddresses, 2)) {
322 else if (!bitRead(usedAddresses, 3)) {
330 if (addr >= 0x5a && addr <= 0x5d)
331 bitSet(usedAddresses, 0x5a - addr);
388 for (
byte i = 0; i < 13; i++)
427 if (!checkElectrodeNum(electrode))
430 unsigned long microsNow = micros();
431 if (microsNow > electrodeTouchCacheMicros + 500 || microsNow < electrodeTouchCacheMicros) {
432 electrodeTouchCacheMicros = microsNow;
433 #if MPR121_USE_BITFIELDS
442 #if MPR121_USE_BITFIELDS
443 return bitRead(electrodeTouchCache, electrode);
445 return electrodeTouchBuf[electrode];
450 #if MPR121_USE_BITFIELDS
454 byte* rawdata = readRegister(MPRREG_ELE0_TO_ELE7_TOUCH_STATUS, 2);
455 return rawdata[0] | ((rawdata[1] & 0b00011111) << 8);
462 byte* rawdata = readRegister(MPRREG_ELE0_TO_ELE7_OOR_STATUS, 2);
463 byte autoConfBits = ((rawdata[1] & 0b10000000) >> 2) | (rawdata[1] & 0b01000000);
464 return rawdata[0] | ((rawdata[1] & 0b00011111) << 8) | (autoConfBits << 8);
466 #else // MPR121_USE_BITFIELDS
470 byte* rawdata = readRegister(MPRREG_ELE0_TO_ELE7_TOUCH_STATUS, 2);
472 electrodeTouchBuf[0] = bitRead(rawdata[0], 0);
473 electrodeTouchBuf[1] = bitRead(rawdata[0], 1);
474 electrodeTouchBuf[2] = bitRead(rawdata[0], 2);
475 electrodeTouchBuf[3] = bitRead(rawdata[0], 3);
476 electrodeTouchBuf[4] = bitRead(rawdata[0], 4);
477 electrodeTouchBuf[5] = bitRead(rawdata[0], 5);
478 electrodeTouchBuf[6] = bitRead(rawdata[0], 6);
479 electrodeTouchBuf[7] = bitRead(rawdata[0], 7);
481 electrodeTouchBuf[8] = bitRead(rawdata[1], 0);
482 electrodeTouchBuf[9] = bitRead(rawdata[1], 1);
483 electrodeTouchBuf[10] = bitRead(rawdata[1], 2);
484 electrodeTouchBuf[11] = bitRead(rawdata[1], 3);
485 electrodeTouchBuf[12] = bitRead(rawdata[1], 4);
489 return electrodeTouchBuf;
496 byte* rawdata = readRegister(MPRREG_ELE0_TO_ELE7_OOR_STATUS, 2);
498 electrodeOORBuf[0] = bitRead(rawdata[0], 0);
499 electrodeOORBuf[1] = bitRead(rawdata[0], 1);
500 electrodeOORBuf[2] = bitRead(rawdata[0], 2);
501 electrodeOORBuf[3] = bitRead(rawdata[0], 3);
502 electrodeOORBuf[4] = bitRead(rawdata[0], 4);
503 electrodeOORBuf[5] = bitRead(rawdata[0], 5);
504 electrodeOORBuf[6] = bitRead(rawdata[0], 6);
505 electrodeOORBuf[7] = bitRead(rawdata[0], 7);
507 electrodeOORBuf[8] = bitRead(rawdata[1], 0);
508 electrodeOORBuf[9] = bitRead(rawdata[1], 1);
509 electrodeOORBuf[10] = bitRead(rawdata[1], 2);
510 electrodeOORBuf[11] = bitRead(rawdata[1], 3);
511 electrodeOORBuf[12] = bitRead(rawdata[1], 4);
513 electrodeOORBuf[13] = bitRead(rawdata[1], 7);
514 electrodeOORBuf[14] = bitRead(rawdata[1], 6);
516 return electrodeOORBuf;
518 #endif // MPR121_USE_BITFIELDS
524 return bitRead(readRegister(MPRREG_ELE8_TO_ELEPROX_TOUCH_STATUS), 7);
530 writeRegister(MPRREG_ELE8_TO_ELEPROX_TOUCH_STATUS, 0b10000000);
536 if (!checkElectrodeNum(electrode, count))
537 return electrodeDataBuf;
539 byte* rawdata = readRegister((
mpr121Register)(MPRREG_ELE0_FILTERED_DATA_LSB + electrode*2), count*2);
541 for (
byte i = 0; i < count; i++) {
542 electrodeDataBuf[electrode + i] = rawdata[i*2] | ((rawdata[i*2 + 1] & 0b00000011) << 8);
545 return &electrodeDataBuf[electrode];
550 if (!checkElectrodeNum(electrode, count))
551 return electrodeBaselineBuf;
553 byte* rawdata = readRegister((
mpr121Register)(MPRREG_ELE0_BASELINE + electrode), count);
555 for (
byte i = 0; i < count; i++) {
556 electrodeBaselineBuf[electrode + i] = rawdata[i];
559 return &electrodeBaselineBuf[electrode];
564 if (!checkElectrodeNum(electrode, count))
567 for (
byte i = 0; i < count; i++) {
568 writeRegister((
mpr121Register)(MPRREG_ELE0_BASELINE + (i+electrode)), value);
575 byte maxElectrode = 11;
579 for (
byte i = 0; i <= maxElectrode; i++) {
589 if (!checkElectrodeNum(electrode, count))
590 return electrodeCDCBuf;
592 byte* rawdata = readRegister((
mpr121Register)(MPRREG_ELE0_CDC + electrode), count);
594 for (
byte i = 0; i < count; i++) {
595 electrodeCDCBuf[electrode + i] = rawdata[i];
598 return &electrodeCDCBuf[electrode];
604 if (!checkElectrodeNum(electrode, count))
607 for (
byte i = 0; i < count; i++) {
608 writeRegister((
mpr121Register)(MPRREG_ELE0_CDC + (electrode + i)), value);
614 if (!checkElectrodeNum(electrode, count))
615 return electrodeCDTBuf;
617 byte* rawdata = readRegister((
mpr121Register)(MPRREG_ELE0_ELE1_CDT + electrode/2), (electrode % 2 == 0 ? (count+1) / 2 : (count+2) / 2));
619 for (
byte i = 0; i < count; i++) {
621 if (electrode % 2 == 0)
622 value = (
mpr121FilterCDT)(( rawdata[i / 2] >> (i % 2 == 0 ? 0 : 4) ) & 0b111);
624 value = (
mpr121FilterCDT)(( rawdata[(i+1) / 2] >> (i % 2 == 0 ? 4 : 0) ) & 0b111);
626 electrodeCDTBuf[electrode + i] = value;
629 return &electrodeCDTBuf[electrode];
634 if (!checkElectrodeNum(electrode, count))
637 byte value_3 = value & 0b111;
642 for (
byte i = 0; i < count; i++) {
643 if (i == 0 || (electrode + i) % 2 == 0) {
645 regVal = readRegister(reg);
648 if ((electrode + i) % 2 == 0)
649 regVal = (regVal & 0b11110000) | value_3;
651 regVal = (regVal & 0b00001111) | (value_3 << 4);
653 if ((electrode + i) % 2 == 1 || i == count - 1)
654 writeRegister(reg, regVal);
663 if (!checkGPIOPinNum(pin, count))
669 byte enableByte = readRegister(MPRREG_GPIO_ENABLE);
672 for (
byte i = 0; i < count; i++) {
673 bitClear(enableByte, pin + i);
675 writeRegister(MPRREG_GPIO_ENABLE, enableByte);
685 tempByte = readRegister(MPRREG_GPIO_DIRECTION);
686 tempVal = bitRead(mode, 2);
687 for (
byte i = 0; i < count; i++) {
688 bitWrite(tempByte, pin + i, tempVal);
690 writeRegister(MPRREG_GPIO_DIRECTION, tempByte);
693 tempByte = readRegister(MPRREG_GPIO_CONTROL_0);
694 tempVal = bitRead(mode, 1);
695 for (
byte i = 0; i < count; i++) {
696 bitWrite(tempByte, pin + i, tempVal);
698 writeRegister(MPRREG_GPIO_CONTROL_0, tempByte);
701 tempByte = readRegister(MPRREG_GPIO_CONTROL_1);
702 tempVal = bitRead(mode, 0);
703 for (
byte i = 0; i < count; i++) {
704 bitWrite(tempByte, pin + i, tempVal);
706 writeRegister(MPRREG_GPIO_CONTROL_1, tempByte);
710 tempVal = bitRead(mode, 3);
711 for (
byte i = 0; i < count; i++) {
712 bitWrite(enableByte, pin + i, tempVal);
714 writeRegister(MPRREG_GPIO_ENABLE, enableByte);
720 if (!checkGPIOPinNum(pin, count))
725 setPWM(pin, count, 0);
730 mpr121Register reg = value ? MPRREG_GPIO_DATA_SET : MPRREG_GPIO_DATA_CLEAR;
733 for (
byte i = 0; i < count; i++) {
734 bitSet(tempByte, pin + i);
736 writeRegister(reg, tempByte);
745 if (!checkGPIOPinNum(pin, count))
750 setPWM(pin, count, value);
755 mpr121Register reg = value == 0 ? MPRREG_GPIO_DATA_CLEAR : MPRREG_GPIO_DATA_SET;
758 for (
byte i = 0; i < count; i++) {
759 bitSet(tempByte, pin + i);
761 writeRegister(reg, tempByte);
773 i2cWire->setClock(clock);
815 for (
byte i = 0; i < 13; i++)
836 byte oldConfig = readRegister(MPRREG_ELECTRODE_CONFIG);
837 writeRegister(MPRREG_ELECTRODE_CONFIG, oldConfig & 0b11000000);
843 return (readRegister(MPRREG_ELECTRODE_CONFIG) & 0b00111111) != 0;
849 writeRegister(MPRREG_SOFT_RESET, 0x63);