Browse Source

[Keyboard] Ploopy improvements (#15348)

Drashna Jaelre 4 years ago
parent
commit
62e01928cd

+ 21 - 4
keyboards/ploopyco/mouse/mouse.c

@@ -66,7 +66,24 @@ uint8_t  OptLowPin         = OPT_ENC1;
 bool     debug_encoder     = false;
 bool     is_drag_scroll    = false;
 
-void process_wheel(report_mouse_t* mouse_report) {
+__attribute__((weak)) bool encoder_update_user(uint8_t index, bool clockwise) { return true; }
+
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+    if (!encoder_update_user(index, clockwise)) {
+        return false;
+    }
+#ifdef MOUSEKEY_ENABLE
+    tap_code(clockwise ? KC_WH_U : KC_WH_D);
+#else
+    mouse_report_t mouse_report = pointing_device_get_report();
+    mouse_report.v = clockwise ? 1 : -1;
+    pointing_device_set_report(mouse_report);
+    pointing_device_send();
+#endif
+    return true;
+}
+
+void process_wheel(void) {
     // Lovingly ripped from the Ploopy Source
 
     // If the mouse wheel was just released, do not scroll.
@@ -94,11 +111,11 @@ void process_wheel(report_mouse_t* mouse_report) {
     int dir = opt_encoder_handler(p1, p2);
 
     if (dir == 0) return;
-    mouse_report->v = (int8_t)(dir * OPT_SCALE);
+    encoder_update_kb(0, dir == 1);
 }
 
-__attribute__((weak)) report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
-    process_wheel(&mouse_report);
+report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
+    process_wheel();
 
     if (is_drag_scroll) {
         mouse_report.h = mouse_report.x;

+ 8 - 5
keyboards/ploopyco/mouse/mouse.h

@@ -28,16 +28,16 @@
 #define OPT_ENC1_MUX 0
 #define OPT_ENC2_MUX 4
 
-void process_wheel(report_mouse_t* mouse_report);
+void process_wheel(void);
 
 #define LAYOUT(BLL, BL, BM, BR, BRR, BF, BB, BDPI) \
     { {BL, BM, BR, BF, BB, BRR, BLL, BDPI}, }
 
 typedef union {
-  uint32_t raw;
-  struct {
-    uint8_t    dpi_config;
-  };
+    uint32_t raw;
+    struct {
+        uint8_t dpi_config;
+    };
 } keyboard_config_t;
 
 extern keyboard_config_t keyboard_config;
@@ -56,3 +56,6 @@ enum ploopy_keycodes {
     PLOOPY_SAFE_RANGE,
 #endif
 };
+
+bool encoder_update_user(uint8_t index, bool clockwise);
+bool encoder_update_kb(uint8_t index, bool clockwise);

+ 3 - 0
keyboards/ploopyco/mouse/rules.mk

@@ -25,5 +25,8 @@ POINTING_DEVICE_ENABLE = yes
 POINTING_DEVICE_DRIVER = pmw3360
 MOUSEKEY_ENABLE = yes       # Mouse keys
 
+ENCODER_ENABLE := no
+OPTS_DEF += -DENCODER_ENABLE
+
 QUANTUM_LIB_SRC += analog.c
 SRC += opt_encoder.c

+ 3 - 0
keyboards/ploopyco/trackball/rules.mk

@@ -22,6 +22,9 @@ POINTING_DEVICE_ENABLE = yes
 POINTING_DEVICE_DRIVER = pmw3360
 MOUSEKEY_ENABLE = yes       # Mouse keys
 
+ENCODER_ENABLE := no
+OPTS_DEF += -DENCODER_ENABLE
+
 QUANTUM_LIB_SRC += analog.c
 SRC += opt_encoder.c
 

+ 24 - 6
keyboards/ploopyco/trackball/trackball.c

@@ -31,7 +31,8 @@
 #    define OPT_SCALE 1  // Multiplier for wheel
 #endif
 #ifndef PLOOPY_DPI_OPTIONS
-#    define PLOOPY_DPI_OPTIONS { 1200, 1600, 2400 }
+#    define PLOOPY_DPI_OPTIONS \
+        { 1200, 1600, 2400 }
 #    ifndef PLOOPY_DPI_DEFAULT
 #        define PLOOPY_DPI_DEFAULT 1
 #    endif
@@ -40,10 +41,10 @@
 #    define PLOOPY_DPI_DEFAULT 0
 #endif
 #ifndef PLOOPY_DRAGSCROLL_DPI
-#    define PLOOPY_DRAGSCROLL_DPI 100 // Fixed-DPI Drag Scroll
+#    define PLOOPY_DRAGSCROLL_DPI 100  // Fixed-DPI Drag Scroll
 #endif
 #ifndef PLOOPY_DRAGSCROLL_MULTIPLIER
-#    define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll
+#    define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75  // Variable-DPI Drag Scroll
 #endif
 
 keyboard_config_t keyboard_config;
@@ -65,7 +66,24 @@ uint8_t  OptLowPin         = OPT_ENC1;
 bool     debug_encoder     = false;
 bool     is_drag_scroll    = false;
 
-void process_wheel(report_mouse_t* mouse_report) {
+__attribute__((weak)) bool encoder_update_user(uint8_t index, bool clockwise) { return true; }
+
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+    if (!encoder_update_user(index, clockwise)) {
+        return false;
+    }
+#ifdef MOUSEKEY_ENABLE
+    tap_code(clockwise ? KC_WH_U : KC_WH_D);
+#else
+    mouse_report_t mouse_report = pointing_device_get_report();
+    mouse_report.v = clockwise ? 1 : -1;
+    pointing_device_set_report(mouse_report);
+    pointing_device_send();
+#endif
+    return true;
+}
+
+void process_wheel(void) {
     // TODO: Replace this with interrupt driven code,  polling is S L O W
     // Lovingly ripped from the Ploopy Source
 
@@ -94,11 +112,11 @@ void process_wheel(report_mouse_t* mouse_report) {
     int dir = opt_encoder_handler(p1, p2);
 
     if (dir == 0) return;
-    mouse_report->v = (int8_t)(dir * OPT_SCALE);
+    encoder_update_kb(0, dir == 1);
 }
 
 report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
-    process_wheel(&mouse_report);
+    process_wheel();
 
     if (is_drag_scroll) {
         mouse_report.h = mouse_report.x;

+ 3 - 0
keyboards/ploopyco/trackball/trackball.h

@@ -61,3 +61,6 @@ enum ploopy_keycodes {
     PLOOPY_SAFE_RANGE,
 #endif
 };
+
+bool encoder_update_user(uint8_t index, bool clockwise);
+bool encoder_update_kb(uint8_t index, bool clockwise);

+ 4 - 1
keyboards/ploopyco/trackball_mini/rules.mk

@@ -20,7 +20,10 @@ RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
 AUDIO_ENABLE = no           # Audio output
 POINTING_DEVICE_ENABLE = yes
 POINTING_DEVICE_DRIVER = adns5050
-MOUSEKEY_ENABLE = no        # Mouse keys
+MOUSEKEY_ENABLE = yes        # Mouse keys
+
+ENCODER_ENABLE := no
+OPTS_DEF += -DENCODER_ENABLE
 
 QUANTUM_LIB_SRC += analog.c
 SRC += opt_encoder.c

+ 35 - 23
keyboards/ploopyco/trackball_mini/trackball_mini.c

@@ -45,11 +45,11 @@
 #    define PLOOPY_DRAGSCROLL_DPI 375  // Fixed-DPI Drag Scroll
 #endif
 #ifndef PLOOPY_DRAGSCROLL_MULTIPLIER
-#    define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll
+#    define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75  // Variable-DPI Drag Scroll
 #endif
 
 keyboard_config_t keyboard_config;
-uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS;
+uint16_t          dpi_array[] = PLOOPY_DPI_OPTIONS;
 #define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t))
 
 // TODO: Implement libinput profiles
@@ -58,23 +58,38 @@ uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS;
 // Valid options are ACC_NONE, ACC_LINEAR, ACC_CUSTOM, ACC_QUADRATIC
 
 // Trackball State
-bool is_scroll_clicked = false;
-bool BurstState = false;  // init burst state for Trackball module
-uint16_t MotionStart = 0;  // Timer for accel, 0 is resting state
-uint16_t lastScroll = 0;  // Previous confirmed wheel event
-uint16_t lastMidClick = 0;  // Stops scrollwheel from being read if it was pressed
-uint8_t OptLowPin = OPT_ENC1;
-bool debug_encoder = false;
+bool     is_scroll_clicked = false;
+bool     BurstState        = false;  // init burst state for Trackball module
+uint16_t MotionStart       = 0;      // Timer for accel, 0 is resting state
+uint16_t lastScroll        = 0;      // Previous confirmed wheel event
+uint16_t lastMidClick      = 0;      // Stops scrollwheel from being read if it was pressed
+uint8_t  OptLowPin         = OPT_ENC1;
+bool     debug_encoder     = false;
 bool     is_drag_scroll    = false;
 
-void process_wheel(report_mouse_t* mouse_report) {
+__attribute__((weak)) bool encoder_update_user(uint8_t index, bool clockwise) { return true; }
+
+bool encoder_update_kb(uint8_t index, bool clockwise) {
+    if (!encoder_update_user(index, clockwise)) {
+        return false;
+    }
+#ifdef MOUSEKEY_ENABLE
+    tap_code(clockwise ? KC_WH_U : KC_WH_D);
+#else
+    mouse_report_t mouse_report = pointing_device_get_report();
+    mouse_report.v = clockwise ? 1 : -1;
+    pointing_device_set_report(mouse_report);
+    pointing_device_send();
+#endif
+    return true;
+}
+
+void process_wheel(void) {
     // If the mouse wheel was just released, do not scroll.
-    if (timer_elapsed(lastMidClick) < SCROLL_BUTT_DEBOUNCE)
-        return;
+    if (timer_elapsed(lastMidClick) < SCROLL_BUTT_DEBOUNCE) return;
 
     // Limit the number of scrolls per unit time.
-    if (timer_elapsed(lastScroll) < OPT_DEBOUNCE)
-        return;
+    if (timer_elapsed(lastScroll) < OPT_DEBOUNCE) return;
 
     // Don't scroll if the middle button is depressed.
     if (is_scroll_clicked) {
@@ -87,15 +102,12 @@ void process_wheel(report_mouse_t* mouse_report) {
     uint16_t p1 = adc_read(OPT_ENC1_MUX);
     uint16_t p2 = adc_read(OPT_ENC2_MUX);
 
-    if (debug_encoder)
-        dprintf("OPT1: %d, OPT2: %d\n", p1, p2);
+    if (debug_encoder) dprintf("OPT1: %d, OPT2: %d\n", p1, p2);
 
     uint8_t dir = opt_encoder_handler(p1, p2);
 
-    if (dir == 0)
-        return;
-
-    mouse_report->v = (int8_t)(dir * OPT_SCALE);
+    if (dir == 0) return;
+    encoder_update_kb(0, dir == 1);
 }
 
 void pointing_device_init_kb(void) {
@@ -106,6 +118,7 @@ void pointing_device_init_kb(void) {
 }
 
 report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
+    process_wheel();
 
     if (is_drag_scroll) {
         mouse_report.h = mouse_report.x;
@@ -127,12 +140,11 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
 
     // Update Timer to prevent accidental scrolls
     if ((record->event.key.col == 1) && (record->event.key.row == 0)) {
-        lastMidClick = timer_read();
+        lastMidClick      = timer_read();
         is_scroll_clicked = record->event.pressed;
     }
 
-    if (!process_record_user(keycode, record))
-        return false;
+    if (!process_record_user(keycode, record)) return false;
 
     if (keycode == DPI_CONFIG && record->event.pressed) {
         keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;

+ 8 - 5
keyboards/ploopyco/trackball_mini/trackball_mini.h

@@ -29,16 +29,16 @@
 #define OPT_ENC1_MUX 0
 #define OPT_ENC2_MUX 4
 
-void process_wheel(report_mouse_t* mouse_report);
+void process_wheel(void);
 
 #define LAYOUT(BL, BM, BR, BF, BB) \
     { {BL, BM, BR, BF, BB}, }
 
 typedef union {
-  uint32_t raw;
-  struct {
-    uint8_t dpi_config;
-  };
+    uint32_t raw;
+    struct {
+        uint8_t dpi_config;
+    };
 } keyboard_config_t;
 
 extern keyboard_config_t keyboard_config;
@@ -56,3 +56,6 @@ enum ploopy_keycodes {
     PLOOPY_SAFE_RANGE,
 #endif
 };
+
+bool encoder_update_user(uint8_t index, bool clockwise);
+bool encoder_update_kb(uint8_t index, bool clockwise);