Browse Source

Add full solenoid support on split keyboards (#21583)

Co-authored-by: Jacob Gable <jacob.gable@statheros.tech>
jacob-w-gable 2 years ago
parent
commit
99290b4c7e
4 changed files with 21 additions and 12 deletions
  1. 1 1
      docs/feature_split_keyboard.md
  2. 2 3
      drivers/haptic/solenoid.c
  3. 11 1
      quantum/haptic.c
  4. 7 7
      quantum/keyboard.c

+ 1 - 1
docs/feature_split_keyboard.md

@@ -298,7 +298,7 @@ This enables transmitting the pointing device status to the master side of the s
 #define SPLIT_HAPTIC_ENABLE
 ```
 
-This enables triggering of haptic feedback on the slave side of the split keyboard. For DRV2605L this will send the mode, but for solenoids it is expected that the desired mode is already set up on the slave.
+This enables the triggering of haptic feedback on the slave side of the split keyboard. This will send information to the slave side such as the mode, dwell, and whether buzz is enabled.
 
 ```c
 #define SPLIT_ACTIVITY_ENABLE

+ 2 - 3
drivers/haptic/solenoid.c

@@ -23,7 +23,6 @@
 #include "util.h"
 #include <stdlib.h>
 
-uint8_t      solenoid_dwell  = SOLENOID_DEFAULT_DWELL;
 static pin_t solenoid_pads[] = SOLENOID_PINS;
 #define NUMBER_OF_SOLENOIDS ARRAY_SIZE(solenoid_pads)
 bool     solenoid_on[NUMBER_OF_SOLENOIDS]      = {false};
@@ -53,7 +52,7 @@ void solenoid_set_buzz(uint8_t buzz) {
 }
 
 void solenoid_set_dwell(uint8_t dwell) {
-    solenoid_dwell = dwell;
+    haptic_set_dwell(dwell);
 }
 
 /**
@@ -119,7 +118,7 @@ void solenoid_check(void) {
         elapsed[i] = timer_elapsed(solenoid_start[i]);
 
         // Check if it's time to finish this solenoid click cycle
-        if (elapsed[i] > solenoid_dwell) {
+        if (elapsed[i] > haptic_config.dwell) {
             solenoid_stop(i);
             continue;
         }

+ 11 - 1
quantum/haptic.c

@@ -20,6 +20,7 @@
 #include "debug.h"
 #include "usb_device_state.h"
 #include "gpio.h"
+#include "keyboard.h"
 
 #ifdef HAPTIC_DRV2605L
 #    include "drv2605l.h"
@@ -58,6 +59,11 @@ static void set_haptic_config_enable(bool enabled) {
 }
 
 void haptic_init(void) {
+// only initialize on secondary boards if the user desires
+#if defined(SPLIT_KEYBOARD) && !defined(SPLIT_HAPTIC_ENABLE)
+    if (!is_keyboard_master()) return;
+#endif
+
     if (!eeconfig_is_enabled()) {
         eeconfig_init();
     }
@@ -99,8 +105,12 @@ void haptic_init(void) {
 
 void haptic_task(void) {
 #ifdef HAPTIC_SOLENOID
+// Only run task on seconary boards if the user desires
+#    if defined(SPLIT_KEYBOARD) && !defined(SPLIT_HAPTIC_ENABLE)
+    if (!is_keyboard_master()) return;
+#    endif
     solenoid_check();
-#endif
+#endif // HAPTIC_SOLENOID
 }
 
 void eeconfig_debug_haptic(void) {

+ 7 - 7
quantum/keyboard.c

@@ -395,9 +395,6 @@ void quantum_init(void) {
 #if defined(UNICODE_COMMON_ENABLE)
     unicode_input_mode_init();
 #endif
-#ifdef HAPTIC_ENABLE
-    haptic_init();
-#endif
 }
 
 /** \brief keyboard_init
@@ -462,6 +459,9 @@ void keyboard_init(void) {
 #ifdef BLUETOOTH_ENABLE
     bluetooth_init();
 #endif
+#ifdef HAPTIC_ENABLE
+    haptic_init();
+#endif
 
 #if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE)
     debug_enable = true;
@@ -617,10 +617,6 @@ void quantum_task(void) {
     decay_wpm();
 #endif
 
-#ifdef HAPTIC_ENABLE
-    haptic_task();
-#endif
-
 #ifdef DIP_SWITCH_ENABLE
     dip_switch_read(false);
 #endif
@@ -726,5 +722,9 @@ void keyboard_task(void) {
     bluetooth_task();
 #endif
 
+#ifdef HAPTIC_ENABLE
+    haptic_task();
+#endif
+
     led_task();
 }