diff projects/d-box/I2c_TouchKey.cpp @ 0:8a575ba3ab52

Initial commit.
author andrewm
date Fri, 31 Oct 2014 19:10:17 +0100
parents
children 901d205d1a3c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/d-box/I2c_TouchKey.cpp	Fri Oct 31 19:10:17 2014 +0100
@@ -0,0 +1,152 @@
+/*
+ * I2c_TouchKey.cpp
+ *
+ *  Created on: Oct 14, 2013
+ *      Author: Victor Zappi
+ */
+
+
+
+#include "I2c_TouchKey.h"
+
+#undef DEBUG_I2C_TOUCHKEY
+
+I2c_TouchKey::I2c_TouchKey()
+{
+	isReady = false;
+	newSensor = false;
+	touchCount = 0;
+	sliderSize[0] = sliderSize[1] = sliderSize[2] = -1;
+	sliderPosition[0] = sliderPosition[1] = sliderPosition[2] = -1;
+	sliderPositionH = -1;
+}
+
+int I2c_TouchKey::initTouchKey(bool useNewSensor)
+{
+	newSensor = useNewSensor;
+	numBytesToRead = newSensor ? NUM_BYTES_NEW : NUM_BYTES_OLD;
+
+	char buf[3] = { 0x00, 0x01, 0x00 }; // code for centroid mode
+	if(write(i2C_file, buf, 3) !=3)
+	{
+		cout << "Failed to set TouchKey in \"Centroid Mode\" " << endl;
+		return 1;
+	}
+
+	usleep(5000); // need to give TouchKey enough time to process command
+
+	char buf4[4] = { 0x00, 0x07, 0x00, 0x64}; // code for change minimum touch area
+	if(write(i2C_file, buf4, 4) !=4)
+	{
+		cout << "Failed to set TouchKey minimum touch size" << endl;
+		return 1;
+	}
+
+	usleep(5000); // need to give TouchKey enough time to process command
+
+	buf[0] = 0x06; // code for data collection
+	if(write(i2C_file, buf, 1) !=1)
+	{
+		cout << "Failed to prepare data collection " << endl;
+		return 2;
+	}
+
+	usleep(5000); // need to give TouchKey enough time to process command
+
+	isReady = true;
+
+	return 0;
+}
+
+
+int I2c_TouchKey::readI2C()
+{
+	bytesRead = read(i2C_file, dataBuffer, numBytesToRead);
+	if (bytesRead != numBytesToRead)
+	{
+		cout << "Failure to read Byte Stream" << endl;
+		return 2;
+	}
+	/*cout << NUM_BYTES << " bytes read" << endl;
+	for(int j=0; j<9; j++)
+		cout << "\t" << (int)dataBuffer[j];
+	cout << endl;
+	*/
+
+	touchCount = 0;
+
+	rawSliderPosition[0] = (((dataBuffer[0] & 0xF0) << 4) + dataBuffer[1]);
+	rawSliderPosition[1] = (((dataBuffer[0] & 0x0F) << 8) + dataBuffer[2]);
+	rawSliderPosition[2] = (((dataBuffer[3] & 0xF0) << 4) + dataBuffer[4]);
+
+	// Old TouchKeys sensors have 3 touch locations plus horizontal positions
+	// New D-Box sensors have 5 touch locations but no horizontal position
+	if(newSensor)
+	{
+		rawSliderPosition[3] = (((dataBuffer[5] & 0xF0) << 4) + dataBuffer[6]);
+		rawSliderPosition[4] = (((dataBuffer[5] & 0x0F) << 8) + dataBuffer[7]);
+		rawSliderPositionH = 0x0FFF;
+	}
+	else
+	{
+		rawSliderPosition[3] = 0x0FFF;
+		rawSliderPosition[4] = 0x0FFF;
+		rawSliderPositionH   = (((dataBuffer[3] & 0x0F) << 8) + dataBuffer[5]);
+	}
+
+
+	for(int i = 0; i < 5; i++)
+	{
+		if(rawSliderPosition[i] != 0x0FFF) // 0x0FFF means no touch
+		{
+			//sliderPosition[i] = (float)rawSliderPosition[i] / 1536.0;	// Black keys, vertical (128 * 12)
+			//sliderPosition[i] = (float)rawSliderPosition[i] / 768.0;	// Cute white key, for simple instrument
+			if(newSensor)
+				sliderPosition[i] = (float)rawSliderPosition[i] / 3200.0;   // New sensors; 26 pads (128 * 25)
+			else
+				sliderPosition[i] = (float)rawSliderPosition[i] / 2432.0;	// White keys, vertical (128 * 19)
+			if(sliderPosition[i]>1.0)
+				sliderPosition[i] = 1.0;
+			if(newSensor)
+				sliderSize[i]     = (float)dataBuffer[i + 8] / 255.0;
+			else {
+				if(i < 3)
+					sliderSize[i]     = (float)dataBuffer[i + 6] / 255.0;
+				else
+					sliderSize[i]     = 0.0;
+			}
+			touchCount++;
+		}
+		else {
+			sliderPosition[i] = -1.0;
+			sliderSize[i]     = 0.0;
+		}
+	}
+
+
+
+	if(rawSliderPositionH != 0x0FFF)
+	{
+		sliderPositionH = (float)rawSliderPositionH / 256.0;			// White keys, horizontal (1 byte + 1 bit)
+	}
+	else
+		sliderPositionH = -1.0;
+
+#ifdef DEBUG_I2C_TOUCHKEY
+	for(int i = 0; i < bytesRead; i++) {
+		printf("%2X ", dataBuffer[i]);
+	}
+	cout << touchCount << " touches: ";
+	for(int i = 0; i < touchCount; i++) {
+		cout << "(" << sliderPosition[i] << ", " << sliderSize[i] << ") ";
+	}
+	cout << "H = " << sliderPositionH << endl;
+#endif
+
+	return 0;
+}
+
+
+I2c_TouchKey::~I2c_TouchKey()
+{}
+