summaryrefslogtreecommitdiff
path: root/drivers/sensors/analog_joystick.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/sensors/analog_joystick.c')
-rw-r--r--drivers/sensors/analog_joystick.c68
1 files changed, 58 insertions, 10 deletions
diff --git a/drivers/sensors/analog_joystick.c b/drivers/sensors/analog_joystick.c
index 12256a8e7a..4aede4eacd 100644
--- a/drivers/sensors/analog_joystick.c
+++ b/drivers/sensors/analog_joystick.c
@@ -22,17 +22,28 @@
#include <stdlib.h>
// Set Parameters
+#ifndef ANALOG_JOYSTICK_AUTO_AXIS
uint16_t minAxisValue = ANALOG_JOYSTICK_AXIS_MIN;
uint16_t maxAxisValue = ANALOG_JOYSTICK_AXIS_MAX;
+#else
+int16_t minAxisValues[2];
+int16_t maxAxisValues[2];
+#endif
uint8_t maxCursorSpeed = ANALOG_JOYSTICK_SPEED_MAX;
uint8_t speedRegulator = ANALOG_JOYSTICK_SPEED_REGULATOR; // Lower Values Create Faster Movement
+#ifdef ANALOG_JOYSTICK_WEIGHTS
+int8_t weights[101] = ANALOG_JOYSTICK_WEIGHTS;
+#endif
+
int16_t xOrigin, yOrigin;
uint16_t lastCursor = 0;
-int16_t axisCoordinate(pin_t pin, uint16_t origin) {
+uint8_t prevValues[2] = {0, 0};
+
+int16_t axisCoordinate(pin_t pin, uint16_t origin, uint8_t axis) {
int8_t direction;
int16_t distanceFromOrigin;
int16_t range;
@@ -43,12 +54,27 @@ int16_t axisCoordinate(pin_t pin, uint16_t origin) {
return 0;
} else if (origin > position) {
distanceFromOrigin = origin - position;
- range = origin - minAxisValue;
- direction = -1;
+#ifdef ANALOG_JOYSTICK_AUTO_AXIS
+ if (position < minAxisValues[axis]) {
+ minAxisValues[axis] = position;
+ }
+ range = origin - minAxisValues[axis];
+#else
+ range = origin - minAxisValue;
+#endif
+ direction = -1;
} else {
distanceFromOrigin = position - origin;
- range = maxAxisValue - origin;
- direction = 1;
+
+#ifdef ANALOG_JOYSTICK_AUTO_AXIS
+ if (position > maxAxisValues[axis]) {
+ maxAxisValues[axis] = position;
+ }
+ range = maxAxisValues[axis] - origin;
+#else
+ range = maxAxisValue - origin;
+#endif
+ direction = 1;
}
float percent = (float)distanceFromOrigin / range;
@@ -62,14 +88,29 @@ int16_t axisCoordinate(pin_t pin, uint16_t origin) {
}
}
-int8_t axisToMouseComponent(pin_t pin, int16_t origin, uint8_t maxSpeed) {
- int16_t coordinate = axisCoordinate(pin, origin);
+int8_t axisToMouseComponent(pin_t pin, int16_t origin, uint8_t maxSpeed, uint8_t axis) {
+ int16_t coordinate = axisCoordinate(pin, origin, axis);
+ int8_t result;
+#ifndef ANALOG_JOYSTICK_WEIGHTS
if (coordinate != 0) {
float percent = (float)coordinate / 100;
- return percent * maxCursorSpeed * (abs(coordinate) / speedRegulator);
+ result = percent * maxCursorSpeed * (abs(coordinate) / speedRegulator);
} else {
return 0;
}
+#else
+ result = weights[abs(coordinate)] * (coordinate < 0 ? -1 : 1) * maxCursorSpeed / speedRegulator;
+#endif
+
+#ifdef ANALOG_JOYSTICK_CUTOFF
+ uint8_t pv = prevValues[axis];
+ prevValues[axis] = abs(result);
+ if (pv > abs(result)) {
+ return 0;
+ }
+#endif
+
+ return result;
}
report_analog_joystick_t analog_joystick_read(void) {
@@ -77,8 +118,8 @@ report_analog_joystick_t analog_joystick_read(void) {
if (timer_elapsed(lastCursor) > ANALOG_JOYSTICK_READ_INTERVAL) {
lastCursor = timer_read();
- report.x = axisToMouseComponent(ANALOG_JOYSTICK_X_AXIS_PIN, xOrigin, maxCursorSpeed);
- report.y = axisToMouseComponent(ANALOG_JOYSTICK_Y_AXIS_PIN, yOrigin, maxCursorSpeed);
+ report.x = axisToMouseComponent(ANALOG_JOYSTICK_X_AXIS_PIN, xOrigin, maxCursorSpeed, 0);
+ report.y = axisToMouseComponent(ANALOG_JOYSTICK_Y_AXIS_PIN, yOrigin, maxCursorSpeed, 1);
}
#ifdef ANALOG_JOYSTICK_CLICK_PIN
report.button = !readPin(ANALOG_JOYSTICK_CLICK_PIN);
@@ -93,4 +134,11 @@ void analog_joystick_init(void) {
// Account for drift
xOrigin = analogReadPin(ANALOG_JOYSTICK_X_AXIS_PIN);
yOrigin = analogReadPin(ANALOG_JOYSTICK_Y_AXIS_PIN);
+
+#ifdef ANALOG_JOYSTICK_AUTO_AXIS
+ minAxisValues[0] = xOrigin - 100;
+ minAxisValues[1] = yOrigin - 100;
+ maxAxisValues[0] = xOrigin + 100;
+ maxAxisValues[1] = yOrigin + 100;
+#endif
}