Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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, intoption = 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)

AltStyle によって変換されたページ (->オリジナル) /