| andrewm@0 | 1 /* | 
| andrewm@0 | 2  * I2c_TouchKey.cpp | 
| andrewm@0 | 3  * | 
| andrewm@0 | 4  *  Created on: Oct 14, 2013 | 
| andrewm@0 | 5  *      Author: Victor Zappi | 
| andrewm@0 | 6  */ | 
| andrewm@0 | 7 | 
| andrewm@0 | 8 | 
| andrewm@0 | 9 | 
| andrewm@0 | 10 #include "I2c_TouchKey.h" | 
| andrewm@0 | 11 | 
| andrewm@0 | 12 #undef DEBUG_I2C_TOUCHKEY | 
| andrewm@0 | 13 | 
| andrewm@0 | 14 I2c_TouchKey::I2c_TouchKey() | 
| andrewm@0 | 15 { | 
| andrewm@0 | 16 	isReady = false; | 
| andrewm@0 | 17 	newSensor = false; | 
| andrewm@0 | 18 	touchCount = 0; | 
| andrewm@0 | 19 	sliderSize[0] = sliderSize[1] = sliderSize[2] = -1; | 
| andrewm@0 | 20 	sliderPosition[0] = sliderPosition[1] = sliderPosition[2] = -1; | 
| andrewm@0 | 21 	sliderPositionH = -1; | 
| andrewm@0 | 22 } | 
| andrewm@0 | 23 | 
| andrewm@0 | 24 int I2c_TouchKey::initTouchKey(bool useNewSensor) | 
| andrewm@0 | 25 { | 
| andrewm@0 | 26 	newSensor = useNewSensor; | 
| andrewm@0 | 27 	numBytesToRead = newSensor ? NUM_BYTES_NEW : NUM_BYTES_OLD; | 
| andrewm@0 | 28 | 
| andrewm@0 | 29 	char buf[3] = { 0x00, 0x01, 0x00 }; // code for centroid mode | 
| andrewm@0 | 30 	if(write(i2C_file, buf, 3) !=3) | 
| andrewm@0 | 31 	{ | 
| andrewm@0 | 32 		cout << "Failed to set TouchKey in \"Centroid Mode\" " << endl; | 
| andrewm@0 | 33 		return 1; | 
| andrewm@0 | 34 	} | 
| andrewm@0 | 35 | 
| andrewm@0 | 36 	usleep(5000); // need to give TouchKey enough time to process command | 
| andrewm@0 | 37 | 
| andrewm@0 | 38 	char buf4[4] = { 0x00, 0x07, 0x00, 0x64}; // code for change minimum touch area | 
| andrewm@0 | 39 	if(write(i2C_file, buf4, 4) !=4) | 
| andrewm@0 | 40 	{ | 
| andrewm@0 | 41 		cout << "Failed to set TouchKey minimum touch size" << endl; | 
| andrewm@0 | 42 		return 1; | 
| andrewm@0 | 43 	} | 
| andrewm@0 | 44 | 
| andrewm@0 | 45 	usleep(5000); // need to give TouchKey enough time to process command | 
| andrewm@0 | 46 | 
| andrewm@0 | 47 	buf[0] = 0x06; // code for data collection | 
| andrewm@0 | 48 	if(write(i2C_file, buf, 1) !=1) | 
| andrewm@0 | 49 	{ | 
| andrewm@0 | 50 		cout << "Failed to prepare data collection " << endl; | 
| andrewm@0 | 51 		return 2; | 
| andrewm@0 | 52 	} | 
| andrewm@0 | 53 | 
| andrewm@0 | 54 	usleep(5000); // need to give TouchKey enough time to process command | 
| andrewm@0 | 55 | 
| andrewm@0 | 56 	isReady = true; | 
| andrewm@0 | 57 | 
| andrewm@0 | 58 	return 0; | 
| andrewm@0 | 59 } | 
| andrewm@0 | 60 | 
| andrewm@0 | 61 | 
| andrewm@0 | 62 int I2c_TouchKey::readI2C() | 
| andrewm@0 | 63 { | 
| andrewm@0 | 64 	bytesRead = read(i2C_file, dataBuffer, numBytesToRead); | 
| andrewm@0 | 65 	if (bytesRead != numBytesToRead) | 
| andrewm@0 | 66 	{ | 
| andrewm@0 | 67 		cout << "Failure to read Byte Stream" << endl; | 
| andrewm@0 | 68 		return 2; | 
| andrewm@0 | 69 	} | 
| andrewm@0 | 70 	/*cout << NUM_BYTES << " bytes read" << endl; | 
| andrewm@0 | 71 	for(int j=0; j<9; j++) | 
| andrewm@0 | 72 		cout << "\t" << (int)dataBuffer[j]; | 
| andrewm@0 | 73 	cout << endl; | 
| andrewm@0 | 74 	*/ | 
| andrewm@0 | 75 | 
| andrewm@0 | 76 	touchCount = 0; | 
| andrewm@0 | 77 | 
| andrewm@0 | 78 	rawSliderPosition[0] = (((dataBuffer[0] & 0xF0) << 4) + dataBuffer[1]); | 
| andrewm@0 | 79 	rawSliderPosition[1] = (((dataBuffer[0] & 0x0F) << 8) + dataBuffer[2]); | 
| andrewm@0 | 80 	rawSliderPosition[2] = (((dataBuffer[3] & 0xF0) << 4) + dataBuffer[4]); | 
| andrewm@0 | 81 | 
| andrewm@0 | 82 	// Old TouchKeys sensors have 3 touch locations plus horizontal positions | 
| andrewm@0 | 83 	// New D-Box sensors have 5 touch locations but no horizontal position | 
| andrewm@0 | 84 	if(newSensor) | 
| andrewm@0 | 85 	{ | 
| andrewm@0 | 86 		rawSliderPosition[3] = (((dataBuffer[5] & 0xF0) << 4) + dataBuffer[6]); | 
| andrewm@0 | 87 		rawSliderPosition[4] = (((dataBuffer[5] & 0x0F) << 8) + dataBuffer[7]); | 
| andrewm@0 | 88 		rawSliderPositionH = 0x0FFF; | 
| andrewm@0 | 89 	} | 
| andrewm@0 | 90 	else | 
| andrewm@0 | 91 	{ | 
| andrewm@0 | 92 		rawSliderPosition[3] = 0x0FFF; | 
| andrewm@0 | 93 		rawSliderPosition[4] = 0x0FFF; | 
| andrewm@0 | 94 		rawSliderPositionH   = (((dataBuffer[3] & 0x0F) << 8) + dataBuffer[5]); | 
| andrewm@0 | 95 	} | 
| andrewm@0 | 96 | 
| andrewm@0 | 97 | 
| andrewm@0 | 98 	for(int i = 0; i < 5; i++) | 
| andrewm@0 | 99 	{ | 
| andrewm@0 | 100 		if(rawSliderPosition[i] != 0x0FFF) // 0x0FFF means no touch | 
| andrewm@0 | 101 		{ | 
| andrewm@0 | 102 			//sliderPosition[i] = (float)rawSliderPosition[i] / 1536.0;	// Black keys, vertical (128 * 12) | 
| andrewm@0 | 103 			//sliderPosition[i] = (float)rawSliderPosition[i] / 768.0;	// Cute white key, for simple instrument | 
| andrewm@0 | 104 			if(newSensor) | 
| andrewm@0 | 105 				sliderPosition[i] = (float)rawSliderPosition[i] / 3200.0;   // New sensors; 26 pads (128 * 25) | 
| andrewm@0 | 106 			else | 
| andrewm@0 | 107 				sliderPosition[i] = (float)rawSliderPosition[i] / 2432.0;	// White keys, vertical (128 * 19) | 
| andrewm@0 | 108 			if(sliderPosition[i]>1.0) | 
| andrewm@0 | 109 				sliderPosition[i] = 1.0; | 
| andrewm@0 | 110 			if(newSensor) | 
| andrewm@0 | 111 				sliderSize[i]     = (float)dataBuffer[i + 8] / 255.0; | 
| andrewm@0 | 112 			else { | 
| andrewm@0 | 113 				if(i < 3) | 
| andrewm@0 | 114 					sliderSize[i]     = (float)dataBuffer[i + 6] / 255.0; | 
| andrewm@0 | 115 				else | 
| andrewm@0 | 116 					sliderSize[i]     = 0.0; | 
| andrewm@0 | 117 			} | 
| andrewm@0 | 118 			touchCount++; | 
| andrewm@0 | 119 		} | 
| andrewm@0 | 120 		else { | 
| andrewm@0 | 121 			sliderPosition[i] = -1.0; | 
| andrewm@0 | 122 			sliderSize[i]     = 0.0; | 
| andrewm@0 | 123 		} | 
| andrewm@0 | 124 	} | 
| andrewm@0 | 125 | 
| andrewm@0 | 126 | 
| andrewm@0 | 127 | 
| andrewm@0 | 128 	if(rawSliderPositionH != 0x0FFF) | 
| andrewm@0 | 129 	{ | 
| andrewm@0 | 130 		sliderPositionH = (float)rawSliderPositionH / 256.0;			// White keys, horizontal (1 byte + 1 bit) | 
| andrewm@0 | 131 	} | 
| andrewm@0 | 132 	else | 
| andrewm@0 | 133 		sliderPositionH = -1.0; | 
| andrewm@0 | 134 | 
| andrewm@0 | 135 #ifdef DEBUG_I2C_TOUCHKEY | 
| andrewm@0 | 136 	for(int i = 0; i < bytesRead; i++) { | 
| andrewm@0 | 137 		printf("%2X ", dataBuffer[i]); | 
| andrewm@0 | 138 	} | 
| andrewm@0 | 139 	cout << touchCount << " touches: "; | 
| andrewm@0 | 140 	for(int i = 0; i < touchCount; i++) { | 
| andrewm@0 | 141 		cout << "(" << sliderPosition[i] << ", " << sliderSize[i] << ") "; | 
| andrewm@0 | 142 	} | 
| andrewm@0 | 143 	cout << "H = " << sliderPositionH << endl; | 
| andrewm@0 | 144 #endif | 
| andrewm@0 | 145 | 
| andrewm@0 | 146 	return 0; | 
| andrewm@0 | 147 } | 
| andrewm@0 | 148 | 
| andrewm@0 | 149 | 
| andrewm@0 | 150 I2c_TouchKey::~I2c_TouchKey() | 
| andrewm@0 | 151 {} | 
| andrewm@0 | 152 |