Skip to content

Commit 4db8229

Browse files
committed
axes: filter: change filter to be a median instead of mean
This preocess is faster and eliminates both greater and lower outliers.
1 parent 5aaff79 commit 4db8229

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

FlightStick.ino

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

168167
int 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

232233
int 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

Comments
 (0)