diff options
Diffstat (limited to 'quantum/pointing_device')
| -rw-r--r-- | quantum/pointing_device/pointing_device.c | 28 | ||||
| -rw-r--r-- | quantum/pointing_device/pointing_device.h | 7 | ||||
| -rw-r--r-- | quantum/pointing_device/pointing_device_drivers.c | 22 | 
3 files changed, 45 insertions, 12 deletions
diff --git a/quantum/pointing_device/pointing_device.c b/quantum/pointing_device/pointing_device.c index 75bb5f81fc..abb3817b5f 100644 --- a/quantum/pointing_device/pointing_device.c +++ b/quantum/pointing_device/pointing_device.c @@ -74,7 +74,8 @@ uint16_t pointing_device_get_shared_cpi(void) {  #endif // defined(SPLIT_POINTING_ENABLE) -static report_mouse_t local_mouse_report = {}; +static report_mouse_t local_mouse_report         = {}; +static bool           pointing_device_force_send = false;  extern const pointing_device_driver_t pointing_device_driver; @@ -163,11 +164,11 @@ __attribute__((weak)) void pointing_device_init(void) {   * This sends the mouse report generated by pointing_device_task if changed since the last report. Once send zeros mouse report except buttons.   *   */ -__attribute__((weak)) void pointing_device_send(void) { -    static report_mouse_t old_report = {}; +__attribute__((weak)) bool pointing_device_send(void) { +    static report_mouse_t old_report         = {}; +    bool                  should_send_report = has_mouse_report_changed(&local_mouse_report, &old_report); -    // If you need to do other things, like debugging, this is the place to do it. -    if (has_mouse_report_changed(&local_mouse_report, &old_report)) { +    if (should_send_report) {          host_mouse_send(&local_mouse_report);      }      // send it and 0 it out except for buttons, so those stay until they are explicity over-ridden using update_pointing_device @@ -175,6 +176,8 @@ __attribute__((weak)) void pointing_device_send(void) {      memset(&local_mouse_report, 0, sizeof(local_mouse_report));      local_mouse_report.buttons = buttons;      memcpy(&old_report, &local_mouse_report, sizeof(local_mouse_report)); + +    return should_send_report || buttons;  }  /** @@ -220,18 +223,18 @@ report_mouse_t pointing_device_adjust_by_defines(report_mouse_t mouse_report) {   * It applies any optional configuration e.g. rotation or axis inversion and then initiates a send.   *   */ -__attribute__((weak)) void pointing_device_task(void) { +__attribute__((weak)) bool pointing_device_task(void) {  #if defined(SPLIT_POINTING_ENABLE)      // Don't poll the target side pointing device.      if (!is_keyboard_master()) { -        return; +        return false;      };  #endif  #if (POINTING_DEVICE_TASK_THROTTLE_MS > 0)      static uint32_t last_exec = 0;      if (timer_elapsed32(last_exec) < POINTING_DEVICE_TASK_THROTTLE_MS) { -        return; +        return false;      }      last_exec = timer_read32();  #endif @@ -286,7 +289,11 @@ __attribute__((weak)) void pointing_device_task(void) {      report_mouse_t mousekey_report = mousekey_get_report();      local_mouse_report.buttons     = local_mouse_report.buttons | mousekey_report.buttons;  #endif -    pointing_device_send(); + +    const bool send_report     = pointing_device_send() || pointing_device_force_send; +    pointing_device_force_send = false; + +    return send_report;  }  /** @@ -304,7 +311,8 @@ report_mouse_t pointing_device_get_report(void) {   * @param[in] mouse_report   */  void pointing_device_set_report(report_mouse_t mouse_report) { -    local_mouse_report = mouse_report; +    pointing_device_force_send = has_mouse_report_changed(&local_mouse_report, &mouse_report); +    memcpy(&local_mouse_report, &mouse_report, sizeof(local_mouse_report));  }  /** diff --git a/quantum/pointing_device/pointing_device.h b/quantum/pointing_device/pointing_device.h index d430e6cfa4..afd653eaee 100644 --- a/quantum/pointing_device/pointing_device.h +++ b/quantum/pointing_device/pointing_device.h @@ -28,6 +28,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #if defined(POINTING_DEVICE_DRIVER_adns5050)  #    include "drivers/sensors/adns5050.h"  #    define POINTING_DEVICE_MOTION_PIN_ACTIVE_LOW +#elif defined(POINTING_DEVICE_DRIVER_pmw3320) +#    include "drivers/sensors/pmw3320.h" +#    define POINTING_DEVICE_MOTION_PIN_ACTIVE_LOW  #elif defined(POINTING_DEVICE_DRIVER_adns9800)  #    include "spi_master.h"  #    include "drivers/sensors/adns9800.h" @@ -97,8 +100,8 @@ typedef int16_t clamp_range_t;  #endif  void           pointing_device_init(void); -void           pointing_device_task(void); -void           pointing_device_send(void); +bool           pointing_device_task(void); +bool           pointing_device_send(void);  report_mouse_t pointing_device_get_report(void);  void           pointing_device_set_report(report_mouse_t mouse_report);  uint16_t       pointing_device_get_cpi(void); diff --git a/quantum/pointing_device/pointing_device_drivers.c b/quantum/pointing_device/pointing_device_drivers.c index d6f29c062e..9a4315f76f 100644 --- a/quantum/pointing_device/pointing_device_drivers.c +++ b/quantum/pointing_device/pointing_device_drivers.c @@ -50,6 +50,28 @@ const pointing_device_driver_t pointing_device_driver = {  };  // clang-format on +#elif defined(POINTING_DEVICE_DRIVER_pmw3320) +report_mouse_t pmw3320_get_report(report_mouse_t mouse_report) { +    report_pmw3320_t data = pmw3320_read_burst(); + +    if (data.dx != 0 || data.dy != 0) { +        pd_dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy); +        mouse_report.x = (mouse_xy_report_t)data.dx; +        mouse_report.y = (mouse_xy_report_t)data.dy; +    } + +    return mouse_report; +} + +// clang-format off +const pointing_device_driver_t pointing_device_driver = { +    .init         = pmw3320_init, +    .get_report   = pmw3320_get_report, +    .set_cpi      = pmw3320_set_cpi, +    .get_cpi      = pmw3320_get_cpi, +}; +// clang-format on +  #elif defined(POINTING_DEVICE_DRIVER_adns9800)  report_mouse_t adns9800_get_report_driver(report_mouse_t mouse_report) {  | 
