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