[refactor] Read both joystick axes in each loop iteration.

Need to consider both axes at once in deadzone calculation.
This commit is contained in:
littleguy77 2023-09-12 17:51:30 -04:00
parent 87c6f14561
commit 1018f10be7

View file

@ -2652,7 +2652,7 @@ diff -rupN linux.orig/drivers/input/joystick/amlogic-saradc.h linux/drivers/inpu
diff -rupN linux.orig/drivers/input/joystick/odroid-gou-joypad.c linux/drivers/input/joystick/odroid-gou-joypad.c
--- linux.orig/drivers/input/joystick/odroid-gou-joypad.c 1970-01-01 00:00:00.000000000 +0000
+++ linux/drivers/input/joystick/odroid-gou-joypad.c 2023-09-12 12:03:27.490291628 +0000
@@ -0,0 +1,926 @@
@@ -0,0 +1,950 @@
+/*----------------------------------------------------------------------------*/
+#include <linux/kernel.h>
+#include <linux/module.h>
@ -3043,9 +3043,13 @@ diff -rupN linux.orig/drivers/input/joystick/odroid-gou-joypad.c linux/drivers/i
+ struct joypad *joypad = poll_dev->private;
+ int nbtn;
+
+ for (nbtn = 0; nbtn < joypad->chan_count; nbtn++) {
+ /* Assumes an even number of axes and that joystick axis pairs are sequential */
+ /* e.g. left stick Y immediately follows left stick X */
+ for (nbtn = 0; nbtn < joypad->chan_count; nbtn += 2) {
+ struct bt_adc *adcx = &joypad->adcs[nbtn];
+ struct bt_adc *adcy = &joypad->adcs[nbtn + 1];
+
+ /* Read first joystick axis */
+ adcx->value = joypad_adc_read(joypad, adcx);
+ if (!adcx->value) {
+ dev_err(joypad->dev, "%s : saradc channels[%d]!\n",
@ -3054,10 +3058,21 @@ diff -rupN linux.orig/drivers/input/joystick/odroid-gou-joypad.c linux/drivers/i
+ }
+ adcx->value = adcx->value - adcx->cal;
+
+ /* Read second joystick axis */
+ adcy->value = joypad_adc_read(joypad, adcy);
+ if (!adcy->value) {
+ dev_err(joypad->dev, "%s : saradc channels[%d]!\n",
+ __func__, nbtn + 1);
+ continue;
+ }
+ adcy->value = adcy->value - adcy->cal;
+
+ /* Joystick Deadzone check */
+ if (joypad->bt_adc_deadzone) {
+ if (abs(adcx->value) < joypad->bt_adc_deadzone)
+ adcx->value = 0;
+ if (abs(adcy->value) < joypad->bt_adc_deadzone)
+ adcy->value = 0;
+ }
+
+ /* adc data tuning */
@ -3065,13 +3080,22 @@ diff -rupN linux.orig/drivers/input/joystick/odroid-gou-joypad.c linux/drivers/i
+ adcx->value = ADC_DATA_TUNING(adcx->value, adcx->tuning_n);
+ if (adcx->tuning_p && adcx->value > 0)
+ adcx->value = ADC_DATA_TUNING(adcx->value, adcx->tuning_p);
+ if (adcy->tuning_n && adcy->value < 0)
+ adcy->value = ADC_DATA_TUNING(adcy->value, adcy->tuning_n);
+ if (adcy->tuning_p && adcy->value > 0)
+ adcy->value = ADC_DATA_TUNING(adcy->value, adcy->tuning_p);
+
+ adcx->value = adcx->value > adcx->max ? adcx->max : adcx->value;
+ adcx->value = adcx->value < adcx->min ? adcx->min : adcx->value;
+ adcy->value = adcy->value > adcy->max ? adcy->max : adcy->value;
+ adcy->value = adcy->value < adcy->min ? adcy->min : adcy->value;
+
+ input_report_abs(poll_dev->input,
+ adcx->report_type,
+ adcx->invert ? adcx->value * (-1) : adcx->value);
+ input_report_abs(poll_dev->input,
+ adcy->report_type,
+ adcy->invert ? adcy->value * (-1) : adcy->value);
+ }
+ input_sync(poll_dev->input);
+}