comparison projects/d-box/I2c_TouchKey.cpp @ 15:901d205d1a3c

Updated to latest PRU library; external PRU file no longer needed. Also catch SIGTERM as well as SIGINT to clean up gracefully.
author andrewm
date Sat, 07 Feb 2015 16:41:56 +0000
parents 8a575ba3ab52
children
comparison
equal deleted inserted replaced
14:06f93bef7dd2 15:901d205d1a3c
12 #undef DEBUG_I2C_TOUCHKEY 12 #undef DEBUG_I2C_TOUCHKEY
13 13
14 I2c_TouchKey::I2c_TouchKey() 14 I2c_TouchKey::I2c_TouchKey()
15 { 15 {
16 isReady = false; 16 isReady = false;
17 newSensor = false; 17 sensorType = kSensorTypeTouchKey;
18 touchCount = 0; 18 touchCount = 0;
19 sliderSize[0] = sliderSize[1] = sliderSize[2] = -1; 19 sliderSize[0] = sliderSize[1] = sliderSize[2] = -1;
20 sliderPosition[0] = sliderPosition[1] = sliderPosition[2] = -1; 20 sliderPosition[0] = sliderPosition[1] = sliderPosition[2] = -1;
21 sliderPositionH = -1; 21 sliderPositionH = -1;
22 } 22 }
23 23
24 int I2c_TouchKey::initTouchKey(bool useNewSensor) 24 int I2c_TouchKey::initTouchKey(int sensorTypeToUse)
25 { 25 {
26 newSensor = useNewSensor; 26 sensorType = sensorTypeToUse;
27 numBytesToRead = newSensor ? NUM_BYTES_NEW : NUM_BYTES_OLD; 27 if(sensorType > 2 || sensorType < 0)
28 sensorType = 2;
29
30 numBytesToRead = kSensorBytes[sensorType];
28 31
29 char buf[3] = { 0x00, 0x01, 0x00 }; // code for centroid mode 32 char buf[3] = { 0x00, 0x01, 0x00 }; // code for centroid mode
30 if(write(i2C_file, buf, 3) !=3) 33 if(write(i2C_file, buf, 3) !=3)
31 { 34 {
32 cout << "Failed to set TouchKey in \"Centroid Mode\" " << endl; 35 cout << "Failed to set TouchKey in \"Centroid Mode\" " << endl;
42 return 1; 45 return 1;
43 } 46 }
44 47
45 usleep(5000); // need to give TouchKey enough time to process command 48 usleep(5000); // need to give TouchKey enough time to process command
46 49
47 buf[0] = 0x06; // code for data collection 50 if(sensorType == kSensorTypeDBox2)
51 buf[0] = 0x04; // code for data collection
52 else
53 buf[0] = 0x06; // code for data collection
54
48 if(write(i2C_file, buf, 1) !=1) 55 if(write(i2C_file, buf, 1) !=1)
49 { 56 {
50 cout << "Failed to prepare data collection " << endl; 57 cout << "Failed to prepare data collection " << endl;
51 return 2; 58 return 2;
52 } 59 }
73 cout << endl; 80 cout << endl;
74 */ 81 */
75 82
76 touchCount = 0; 83 touchCount = 0;
77 84
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 85 // Old TouchKeys sensors have 3 touch locations plus horizontal positions
83 // New D-Box sensors have 5 touch locations but no horizontal position 86 // New D-Box sensors have 5 touch locations but no horizontal position
84 if(newSensor) 87 // Later D-Box sensors have same data in a different format
85 { 88 if(sensorType == kSensorTypeDBox1) {
89 rawSliderPosition[0] = (((dataBuffer[0] & 0xF0) << 4) + dataBuffer[1]);
90 rawSliderPosition[1] = (((dataBuffer[0] & 0x0F) << 8) + dataBuffer[2]);
91 rawSliderPosition[2] = (((dataBuffer[3] & 0xF0) << 4) + dataBuffer[4]);
86 rawSliderPosition[3] = (((dataBuffer[5] & 0xF0) << 4) + dataBuffer[6]); 92 rawSliderPosition[3] = (((dataBuffer[5] & 0xF0) << 4) + dataBuffer[6]);
87 rawSliderPosition[4] = (((dataBuffer[5] & 0x0F) << 8) + dataBuffer[7]); 93 rawSliderPosition[4] = (((dataBuffer[5] & 0x0F) << 8) + dataBuffer[7]);
88 rawSliderPositionH = 0x0FFF; 94 rawSliderPositionH = 0x0FFF;
89 } 95 }
90 else 96 else if(sensorType == kSensorTypeDBox2) {
91 { 97 rawSliderPosition[0] = ((dataBuffer[0] << 8) + dataBuffer[1]) & 0x0FFF;
98 rawSliderPosition[1] = ((dataBuffer[2] << 8) + dataBuffer[3]) & 0x0FFF;
99 rawSliderPosition[2] = ((dataBuffer[4] << 8) + dataBuffer[5]) & 0x0FFF;
100 rawSliderPosition[3] = ((dataBuffer[6] << 8) + dataBuffer[7]) & 0x0FFF;
101 rawSliderPosition[4] = ((dataBuffer[8] << 8) + dataBuffer[9]) & 0x0FFF;
102 rawSliderPositionH = 0x0FFF;
103 }
104 else {
105 rawSliderPosition[0] = (((dataBuffer[0] & 0xF0) << 4) + dataBuffer[1]);
106 rawSliderPosition[1] = (((dataBuffer[0] & 0x0F) << 8) + dataBuffer[2]);
107 rawSliderPosition[2] = (((dataBuffer[3] & 0xF0) << 4) + dataBuffer[4]);
92 rawSliderPosition[3] = 0x0FFF; 108 rawSliderPosition[3] = 0x0FFF;
93 rawSliderPosition[4] = 0x0FFF; 109 rawSliderPosition[4] = 0x0FFF;
94 rawSliderPositionH = (((dataBuffer[3] & 0x0F) << 8) + dataBuffer[5]); 110 rawSliderPositionH = (((dataBuffer[3] & 0x0F) << 8) + dataBuffer[5]);
95 } 111 }
96 112
97
98 for(int i = 0; i < 5; i++) 113 for(int i = 0; i < 5; i++)
99 { 114 {
100 if(rawSliderPosition[i] != 0x0FFF) // 0x0FFF means no touch 115 if(rawSliderPosition[i] != 0x0FFF) // 0x0FFF means no touch
101 { 116 {
102 //sliderPosition[i] = (float)rawSliderPosition[i] / 1536.0; // Black keys, vertical (128 * 12) 117 if(sensorType != kSensorTypeTouchKey)
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) 118 sliderPosition[i] = (float)rawSliderPosition[i] / 3200.0; // New sensors; 26 pads (128 * 25)
106 else 119 else
107 sliderPosition[i] = (float)rawSliderPosition[i] / 2432.0; // White keys, vertical (128 * 19) 120 sliderPosition[i] = (float)rawSliderPosition[i] / 2432.0; // White keys, vertical (128 * 19)
108 if(sliderPosition[i]>1.0) 121
122 if(sliderPosition[i] > 1.0)
109 sliderPosition[i] = 1.0; 123 sliderPosition[i] = 1.0;
110 if(newSensor) 124
125 if(sensorType == kSensorTypeDBox2) {
126 sliderSize[i] = (float)((dataBuffer[2*i + 10] << 8) + dataBuffer[2*i + 11]) / 5000.0;
127 if(sliderSize[i] > 1.0)
128 sliderSize[i] = 1.0;
129 }
130 else if(sensorType == kSensorTypeDBox1)
111 sliderSize[i] = (float)dataBuffer[i + 8] / 255.0; 131 sliderSize[i] = (float)dataBuffer[i + 8] / 255.0;
112 else { 132 else {
113 if(i < 3) 133 if(i < 3)
114 sliderSize[i] = (float)dataBuffer[i + 6] / 255.0; 134 sliderSize[i] = (float)dataBuffer[i + 6] / 255.0;
115 else 135 else