3 WORD calculateCentroids(WORD *centroidBuffer, WORD *sizeBuffer, BYTE maxNumCentroids, BYTE minSensor, BYTE maxSensor, BYTE numSensors) {
4 signed char lastActiveSensor = -1;
5 BYTE centroidIndex = 0, sensorIndex, actualHardwareIndex;
6 BYTE wrappedAround = 0;
8 WORD peakValue = 0, troughDepth = 0;
12 WORD lastSensorVal, currentSensorVal, currentWeightedSum, currentUnweightedSum;
13 BYTE currentStart, currentLength;
15 for(sensorIndex = 0; sensorIndex < maxNumCentroids; sensorIndex++) {
16 centroidBuffer[sensorIndex] = 0xFFFF;
17 sizeBuffer[sensorIndex] = 0;
22 for(sensorIndex = 0, actualHardwareIndex = minSensor; sensorIndex < numSensors; sensorIndex++)
24 lastSensorVal = currentSensorVal;
26 currentSensorVal = CSD_waSnsDiff[actualHardwareIndex++];
27 if(currentSensorVal > 0) {
28 lastActiveSensor = sensorIndex;
31 if(actualHardwareIndex == maxSensor)
33 actualHardwareIndex = minSensor;
45 if(currentSensorVal == 0) {
46 if(currentUnweightedSum > wMinimumCentroidSize)
48 temp = ((long)currentWeightedSum << SLIDER_BITS) / currentUnweightedSum;
49 centroidBuffer[centroidIndex] = (currentStart << SLIDER_BITS) + (WORD)temp;
50 sizeBuffer[centroidIndex] = currentUnweightedSum;
58 if(centroidIndex >= maxNumCentroids)
63 if(currentSensorVal > peakValue)
64 peakValue = currentSensorVal;
65 if(peakValue - currentSensorVal > troughDepth)
66 troughDepth = peakValue - currentSensorVal;
71 if(sensorIndex >= 2) {
72 if(troughDepth > wAdjacentCentroidNoiseThreshold && currentSensorVal > lastSensorVal + wAdjacentCentroidNoiseThreshold) {
73 if(currentUnweightedSum > wMinimumCentroidSize)
75 temp = ((long)currentWeightedSum << SLIDER_BITS) / currentUnweightedSum;
76 centroidBuffer[centroidIndex] = (currentStart << SLIDER_BITS) + (WORD)temp;
77 sizeBuffer[centroidIndex] = currentUnweightedSum;
84 if(centroidIndex >= maxNumCentroids)
87 currentStart = sensorIndex;
88 currentUnweightedSum = peakValue = currentSensorVal;
90 currentWeightedSum = 0;
96 currentUnweightedSum += currentSensorVal;
97 currentWeightedSum += currentLength * currentSensorVal;
102 if(currentSensorVal > 0) {
103 currentStart = sensorIndex;
104 currentUnweightedSum = peakValue = currentSensorVal;
106 currentWeightedSum = 0;
111 if(!inCentroid && wrappedAround){
117 if(inCentroid && currentUnweightedSum > wMinimumCentroidSize)
119 temp = ((long)currentWeightedSum << SLIDER_BITS) / currentUnweightedSum;
120 centroidBuffer[centroidIndex] = (currentStart << SLIDER_BITS) + (WORD)temp;
121 sizeBuffer[centroidIndex] = currentUnweightedSum;
125 return (lastActiveSensor << 8) | currentStart;