@@ -148,21 +148,20 @@ int compare(const void* a, const void* b)
148148 return x - y;
149149}
150150
151- int analogReadFilter (int pin)
151+ // Median filter, use with odd values (non even).
152+ int analogReadFilter (int pin, int total_reads)
152153{
153- uint16_t measurements[ANALOG_FILTER_M_COUNT] ;
154+ uint16_t * measurements = ( uint16_t *) malloc (total_reads * sizeof ( uint16_t )) ;
154155
155- for (int i = 0 ; i < ANALOG_FILTER_M_COUNT ; i++)
156+ for (int i = 0 ; i < total_reads ; i++)
156157 measurements[i] = analogRead (pin);
157158
158- float sum = 0 ;
159+ qsort (measurements, total_reads, sizeof ( uint16_t ), compare) ;
159160
160- qsort (measurements, ANALOG_FILTER_M_COUNT, sizeof ( int16_t ), compare) ;
161+ int filtered_val = measurements[total_reads / 2 ] ;
161162
162- for (int i = ANALOG_FILTER_M_DISCARD; i < ANALOG_FILTER_M_COUNT - ANALOG_FILTER_M_DISCARD; i++)
163- sum += measurements[i];
164-
165- return sum / (ANALOG_FILTER_M_COUNT - 2 * ANALOG_FILTER_M_DISCARD);
163+ free (measurements);
164+ return filtered_val;
166165}
167166
168167int readToCurve (int reading, int index)
@@ -202,32 +201,34 @@ int hat(int hat_x, int hat_y)
202201 }
203202}
204203
205- int axisRead (int index, int option = CURVE)
204+ int axisRead (int index, int filter_total, int option = CURVE)
206205{
207206 if (option == CURVE) {
208207 return readToCurve (
209- constrain (
210- map (
211- analogReadFilter (
212- analog_pins[index]),
213- calibration_data.min [index],
214- calibration_data.max [index],
215- 0 ,
216- 1023 ),
208+ map (
209+ analogReadFilter (
210+ analog_pins[index],
211+ filter_total
212+ ),
213+ calibration_data.min [index],
214+ calibration_data.max [index],
217215 0 ,
218- 1023 ),
219- index);
216+ 1023
217+ ),
218+ index
219+ );
220220 }
221- return constrain (
222- map (
223- analogReadFilter (
224- analog_pins[index]),
225- calibration_data.min [index],
226- calibration_data.max [index],
227- 0 ,
228- 1023 ),
221+ return map (
222+ analogReadFilter (
223+ analog_pins[index],
224+ filter_total
225+ ),
226+ calibration_data.min [index],
227+ calibration_data.max [index],
229228 0 ,
230- 1023 );
229+ 1023
230+ );
231+ }
231232
232233int buttonRead (int index)
233234{
@@ -263,10 +264,10 @@ void loop()
263264 for (int btn = 0 ; btn < (sizeof (digital_pins) / sizeof (int )); btn++)
264265 joystick.setButton (btn, buttonRead (btn));
265266
266- // read the analog inputs
267- joystick.setYAxis (axisRead (0 , CURVE));
268- joystick.setXAxis (axisRead (1 , CURVE));
269- joystick.setZAxis (axisRead (2 , LINEAR));
267+ // read the axes
268+ joystick.setYAxis (axisRead (0 , 3 , CURVE));
269+ joystick.setXAxis (axisRead (1 , 3 , CURVE));
270+ joystick.setZAxis (axisRead (2 , 5 , LINEAR));
270271
271272 /* joystick.setRxAxis(constrain(map(analog(A8), */
272273 /* calibration_data.min[2], */
0 commit comments