diff --git a/quantum/encoder.c b/quantum/encoder.c index 77261c6d65f2..453130ba4330 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -5,6 +5,7 @@ #include "action.h" #include "encoder.h" #include "wait.h" +#include "debug.h" #ifndef ENCODER_MAP_KEY_DELAY # define ENCODER_MAP_KEY_DELAY TAP_CODE_DELAY @@ -15,12 +16,19 @@ __attribute__((weak)) bool should_process_encoder(void) { } static encoder_events_t encoder_events; +static bool signal_queue_drain = false; void encoder_init(void) { memset(&encoder_events, 0, sizeof(encoder_events)); encoder_driver_init(); } +static void encoder_queue_drain(void) { + // dprintf("Draining encoder queue\n"); + encoder_events.tail = encoder_events.head; + encoder_events.dequeued = encoder_events.enqueued; +} + static bool encoder_handle_queue(void) { bool changed = false; uint8_t index; @@ -60,6 +68,11 @@ bool encoder_task(void) { } #endif // SPLIT_KEYBOARD + if (signal_queue_drain) { + signal_queue_drain = false; + encoder_queue_drain(); + } + // Let the encoder driver produce events encoder_driver_task(); @@ -137,18 +150,9 @@ void encoder_retrieve_events(encoder_events_t *events) { memcpy(events, &encoder_events, sizeof(encoder_events)); } -#ifdef SPLIT_KEYBOARD -void encoder_queue_drain(void) { - uint8_t index; - bool clockwise; - - // dprintf("Draining encoder queue\n"); - - while (encoder_events.dequeued != encoder_events.enqueued) { - encoder_dequeue_event(&index, &clockwise); - } +void encoder_signal_queue_drain(void) { + signal_queue_drain = true; } -#endif // SPLIT_KEYBOARD __attribute__((weak)) bool encoder_update_user(uint8_t index, bool clockwise) { return true; diff --git a/quantum/encoder.h b/quantum/encoder.h index 8d735bfc64ba..317a91f1da54 100644 --- a/quantum/encoder.h +++ b/quantum/encoder.h @@ -83,8 +83,8 @@ typedef struct encoder_event_t { } encoder_event_t; typedef struct encoder_events_t { - uint16_t enqueued; - uint16_t dequeued; + uint8_t enqueued; + uint8_t dequeued; uint8_t head; uint8_t tail; encoder_event_t queue[MAX_QUEUED_ENCODER_EVENTS]; @@ -97,9 +97,8 @@ void encoder_retrieve_events(encoder_events_t *events); bool encoder_queue_event_advanced(encoder_events_t *events, uint8_t index, bool clockwise); bool encoder_dequeue_event_advanced(encoder_events_t *events, uint8_t *index, bool *clockwise); -# ifdef SPLIT_KEYBOARD -void encoder_queue_drain(void); -# endif // SPLIT_KEYBOARD +// Reset the queue to be empty +void encoder_signal_queue_drain(void); # ifdef ENCODER_MAP_ENABLE # define NUM_DIRECTIONS 2 diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c index 4a385cffcaa3..33bc9e9f575a 100644 --- a/quantum/split_common/transactions.c +++ b/quantum/split_common/transactions.c @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +#include #include #include @@ -238,21 +239,25 @@ static void master_matrix_handlers_slave(matrix_row_t master_matrix[], matrix_ro #ifdef ENCODER_ENABLE static bool encoder_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { - static uint32_t last_update = 0; + static uint32_t last_update = 0; + static uint8_t last_checksum = 0; encoder_events_t temp_events; bool okay = read_if_checksum_mismatch(GET_ENCODERS_CHECKSUM, GET_ENCODERS_DATA, &last_update, &temp_events, &split_shmem->encoders.events, sizeof(temp_events)); if (okay) { - bool actioned = false; - uint8_t index; - bool clockwise; - while (okay && encoder_dequeue_event_advanced(&split_shmem->encoders.events, &index, &clockwise)) { - okay &= encoder_queue_event(index, clockwise); - actioned = true; - } + if (last_checksum != split_shmem->encoders.checksum) { + bool actioned = false; + uint8_t index; + bool clockwise; + while (okay && encoder_dequeue_event_advanced(&split_shmem->encoders.events, &index, &clockwise)) { + okay &= encoder_queue_event(index, clockwise); + actioned = true; + } - if (actioned) { - transport_exec(CMD_ENCODER_DRAIN); + if (actioned) { + okay &= transport_exec(CMD_ENCODER_DRAIN); + } + last_checksum = split_shmem->encoders.checksum; } } return okay; @@ -266,7 +271,7 @@ static void encoder_handlers_slave(matrix_row_t master_matrix[], matrix_row_t sl } static void encoder_handlers_slave_drain(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { - encoder_queue_drain(); + encoder_signal_queue_drain(); } // clang-format off