diff options
Diffstat (limited to 'drivers/sensors')
| -rw-r--r-- | drivers/sensors/analog_joystick.c | 68 | ||||
| -rw-r--r-- | drivers/sensors/cirque_pinnacle.c | 11 | 
2 files changed, 69 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  } diff --git a/drivers/sensors/cirque_pinnacle.c b/drivers/sensors/cirque_pinnacle.c index 3131805c20..b5c1abdebc 100644 --- a/drivers/sensors/cirque_pinnacle.c +++ b/drivers/sensors/cirque_pinnacle.c @@ -216,6 +216,13 @@ void cirque_pinnacle_cursor_smoothing(bool enable) {      RAP_Write(HOSTREG__FEEDCONFIG3, feedconfig3);  } +// Check sensor is connected +bool cirque_pinnacle_connected(void) { +    uint8_t zidle = 0; +    RAP_ReadBytes(HOSTREG__ZIDLE, &zidle, 1); +    return zidle == HOSTREG__ZIDLE_DEFVAL; +} +  /*  Pinnacle-based TM040040/TM035035/TM023023 Functions  */  void cirque_pinnacle_init(void) {  #if defined(POINTING_DEVICE_DRIVER_cirque_pinnacle_spi) @@ -274,6 +281,10 @@ void cirque_pinnacle_init(void) {      }      cirque_pinnacle_enable_feed(true); + +#ifndef CIRQUE_PINNACLE_SKIP_SENSOR_CHECK +    touchpad_init = cirque_pinnacle_connected(); +#endif  }  pinnacle_data_t cirque_pinnacle_read_data(void) { | 
