Mercurial > hg > beaglert
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 |