/** * Interrupt handler for capacitive keyboard events */ static void cap_change(void) { // Read keyboard int key_state = mpr121Read(TCH_STATL) | (mpr121Read(TCH_STATH) << 8); uint32_t ts = realtime_get_unixtime(); // there appears to be a bug where it suddenly outputs a lot of bits set. unsigned int v = key_state; // count the number of bits set in v unsigned int c; // c accumulates the total bits set in v for (c = 0; v; c++) { v &= v - 1; // clear the least significant bit set } if (c > 3) return; // clear unconnected electrodes key_state &= touchList; // detect keys pressed & released int keys_pressed = key_state & (~last_key_state); //TODO: ! bitwise NOT int keys_released = (~key_state) & last_key_state; //TODO: ! bitwise NOT if (!captouch_disable_messages) { for (int key = 0; key < 16; key++) { if (keys_pressed & (1 << key)) { system_gui->receive_key(key, KEY_PRESSED); press_time[key] = ts; press_time_any = ts; } if (keys_released & (1 << key)) { system_gui->receive_key(key, KEY_RELEASED); release_time[key] = ts; release_time_any = ts; } } last_key_state = key_state; } }
char *cap_diagdata(int e) { int elech = 0; int elecl = 0; if (e == 0) elecl = mpr121Read(ELE0_DATAL); if (e == 0) elech = mpr121Read(ELE0_DATAH); if (e == 1) elecl = mpr121Read(ELE1_DATAL); if (e == 1) elech = mpr121Read(ELE1_DATAH); if (e == 2) elecl = mpr121Read(ELE2_DATAL); if (e == 2) elech = mpr121Read(ELE2_DATAH); if (e == 3) elecl = mpr121Read(ELE3_DATAL); if (e == 3) elech = mpr121Read(ELE3_DATAH); if (e == 4) elecl = mpr121Read(ELE4_DATAL); if (e == 4) elech = mpr121Read(ELE4_DATAH); if (e == 5) elecl = mpr121Read(ELE5_DATAL); if (e == 5) elech = mpr121Read(ELE5_DATAH); if (e == 6) elecl = mpr121Read(ELE6_DATAL); if (e == 6) elech = mpr121Read(ELE6_DATAH); if (e == 7) elecl = mpr121Read(ELE7_DATAL); if (e == 7) elech = mpr121Read(ELE7_DATAH); if (e == 8) elecl = mpr121Read(ELE8_DATAL); if (e == 8) elech = mpr121Read(ELE8_DATAH); if (e == 9) elecl = mpr121Read(ELE9_DATAL); if (e == 9) elech = mpr121Read(ELE9_DATAH); if (e == 10) elecl = mpr121Read(ELE10_DATAL); if (e == 10) elech = mpr121Read(ELE10_DATAH); elech = elech & 0x3; uint32_t elecv = ((uint32_t) elech << 8) | (uint32_t) elecl; uint32_t elec_base = 0; if (e == 0) elec_base = ((uint32_t) ((uint8_t) mpr121Read(ELE0_BASE))) << 2; if (e == 1) elec_base = ((uint32_t) ((uint8_t) mpr121Read(ELE1_BASE))) << 2; if (e == 2) elec_base = ((int) mpr121Read(ELE2_BASE)) << 2; if (e == 3) elec_base = ((int) mpr121Read(ELE3_BASE)) << 2; if (e == 4) elec_base = ((int) mpr121Read(ELE4_BASE)) << 2; if (e == 5) elec_base = ((int) mpr121Read(ELE5_BASE)) << 2; if (e == 6) elec_base = ((int) mpr121Read(ELE6_BASE)) << 2; if (e == 7) elec_base = ((int) mpr121Read(ELE7_BASE)) << 2; if (e == 8) elec_base = ((int) mpr121Read(ELE8_BASE)) << 2; if (e == 9) elec_base = ((int) mpr121Read(ELE9_BASE)) << 2; if (e == 10) elec_base = ((int) mpr121Read(ELE10_BASE)) << 2; uint32_t bs = mpr121Read(TCH_STATL); bs = bs | ((0x1F & mpr121Read(TCH_STATH)) << 8); uint32_t is_pressed = 0; if (bs & (1 << e)) is_pressed = 1; else is_pressed = 0; sprintf(c, "%"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32"", elecv, elec_base, bs, is_pressed); return c; }
bool cap_check() { uint8 d = mpr121Read(ELE0_DATAL); if (d == 255) return false; return true; }
int DetectTouch::whichkey() { touchstatus = mpr121Read(0x01) << 8; touchstatus |= mpr121Read(0x00); n_key=0; for (i=0; i<12; i++) { if (touchstatus & (1<<i)) { n_key++; keypress=1<<i; } } if (n_key == 1) { Serial.print("You have touched a sensor"); switch (keypress) { case 1: Serial.println(":0"); key = 0; break; case 2: Serial.println(":1"); key = 1; break; case 4: Serial.println(":2"); key = 2; break; case 8: Serial.println(":3"); key = 3; break; case 16: Serial.println(":4"); key = 4; break; case 32: Serial.println(":5"); key = 5; break; case 64: Serial.println(":6"); key = 6; break; case 128: Serial.println(":7"); key = 7; break; case 256: Serial.println(":8"); key = 8; break; case 512: Serial.println(":9"); key = 9; break; case 1024: Serial.println("10"); key = 10; break; case 2048: Serial.println(":11"); key = 11; break; } } else { Serial.println("Press only single sensor"); key = -1; } return key; }