summary refs log tree commit diff
path: root/quantum
diff options
context:
space:
mode:
authorAlabastard-64 <96358682+Alabastard-64@users.noreply.github.com>2022-01-11 15:33:13 -0700
committerGitHub <noreply@github.com>2022-01-11 14:33:13 -0800
commit2842ab405212aa7edca05eccc8ba892cd6cf54a4 (patch)
treef36962feb4057eb403f1f158f90ffd5b1ca57812 /quantum
parenta7eb27b86775b96f14c4207fe25f74f0ac04220d (diff)
Add PMW3389 optical sensor Support (Updated) (#15740)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Diffstat (limited to 'quantum')
-rw-r--r--quantum/pointing_device.h3
-rw-r--r--quantum/pointing_device_drivers.c36
2 files changed, 39 insertions, 0 deletions
diff --git a/quantum/pointing_device.h b/quantum/pointing_device.h
index 00229e8a24..6ff267e491 100644
--- a/quantum/pointing_device.h
+++ b/quantum/pointing_device.h
@@ -47,6 +47,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #elif defined(POINTING_DEVICE_DRIVER_pmw3360)
 #    include "spi_master.h"
 #    include "drivers/sensors/pmw3360.h"
+#elif defined(POINTING_DEVICE_DRIVER_pmw3389)
+#    include "spi_master.h"
+#    include "drivers/sensors/pmw3389.h"
 #else
 void           pointing_device_driver_init(void);
 report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report);
diff --git a/quantum/pointing_device_drivers.c b/quantum/pointing_device_drivers.c
index 260a6d2eb4..4333bbb095 100644
--- a/quantum/pointing_device_drivers.c
+++ b/quantum/pointing_device_drivers.c
@@ -242,6 +242,42 @@ const pointing_device_driver_t pointing_device_driver = {
     .get_cpi    = pmw3360_get_cpi
 };
 // clang-format on
+#elif defined(POINTING_DEVICE_DRIVER_pmw3389)
+static void pmw3389_device_init(void) { pmw3389_init(); }
+
+report_mouse_t pmw3389_get_report(report_mouse_t mouse_report) {
+    report_pmw3389_t data        = pmw3389_read_burst();
+    static uint16_t  MotionStart = 0;  // Timer for accel, 0 is resting state
+
+    if (data.isOnSurface && data.isMotion) {
+        // Reset timer if stopped moving
+        if (!data.isMotion) {
+            if (MotionStart != 0) MotionStart = 0;
+            return mouse_report;
+        }
+
+        // Set timer if new motion
+        if ((MotionStart == 0) && data.isMotion) {
+#    ifdef CONSOLE_ENABLE
+            if (debug_mouse) dprintf("Starting motion.\n");
+#    endif
+            MotionStart = timer_read();
+        }
+        mouse_report.x = constrain_hid(data.dx);
+        mouse_report.y = constrain_hid(data.dy);
+    }
+
+    return mouse_report;
+}
+
+// clang-format off
+const pointing_device_driver_t pointing_device_driver = {
+    .init       = pmw3389_device_init,
+    .get_report = pmw3389_get_report,
+    .set_cpi    = pmw3389_set_cpi,
+    .get_cpi    = pmw3389_get_cpi
+};
+// clang-format on
 #else
 __attribute__((weak)) void           pointing_device_driver_init(void) {}
 __attribute__((weak)) report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { return mouse_report; }