Exemple #1
0
/**
 * 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;
	}

}
Exemple #2
0
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;
}
Exemple #3
0
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;      
}