~ruther/qmk_firmware

99290b4c7e891e69ca161d79c74a0e32014645bb — jacob-w-gable 1 year, 7 months ago 7a761eb
Add full solenoid support on split keyboards (#21583)

Co-authored-by: Jacob Gable <jacob.gable@statheros.tech>
4 files changed, 21 insertions(+), 12 deletions(-)

M docs/feature_split_keyboard.md
M drivers/haptic/solenoid.c
M quantum/haptic.c
M quantum/keyboard.c
M docs/feature_split_keyboard.md => docs/feature_split_keyboard.md +1 -1
@@ 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

M drivers/haptic/solenoid.c => drivers/haptic/solenoid.c +2 -3
@@ 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;
        }

M quantum/haptic.c => quantum/haptic.c +11 -1
@@ 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) {

M quantum/keyboard.c => quantum/keyboard.c +7 -7
@@ 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();
}

Do not follow this link