Mercurial > hg > beaglert
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() +{} +