From 3e1ac7a38fa4e6885053a762bc75f7c4e068eccb Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 10 Mar 2024 22:24:17 +1100 Subject: Fixes for encoder abstraction. (#23195) --- quantum/split_common/transactions.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'quantum/split_common/transactions.c') diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c index 2cfa83e7a3..33bc9e9f57 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 @@ -80,8 +81,12 @@ { 0, 0, sizeof_member(split_shared_memory_t, member), offsetof(split_shared_memory_t, member), cb } #define trans_target2initiator_initializer(member) trans_target2initiator_initializer_cb(member, NULL) +#define trans_initiator2target_cb(cb) \ + { 0, 0, 0, 0, cb } + #define transport_write(id, data, length) transport_execute_transaction(id, data, length, NULL, 0) #define transport_read(id, data, length) transport_execute_transaction(id, NULL, 0, data, length) +#define transport_exec(id) transport_execute_transaction(id, NULL, 0, NULL, 0) #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) // Forward-declare the RPC callback handlers @@ -234,14 +239,26 @@ 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) { - encoder_handle_slave_events(&split_shmem->encoders.events); - transport_write(PUT_ENCODER_TAIL, &split_shmem->encoders.events.tail, sizeof(split_shmem->encoders.events.tail)); - split_shmem->encoders.checksum = crc8(&split_shmem->encoders.events, sizeof(split_shmem->encoders.events)); + 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) { + okay &= transport_exec(CMD_ENCODER_DRAIN); + } + last_checksum = split_shmem->encoders.checksum; + } } return okay; } @@ -253,9 +270,8 @@ static void encoder_handlers_slave(matrix_row_t master_matrix[], matrix_row_t sl split_shmem->encoders.checksum = crc8(&split_shmem->encoders.events, sizeof(split_shmem->encoders.events)); } -static void encoder_handlers_slave_reset(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { - uint8_t tail_index = *(uint8_t *)initiator2target_buffer; - encoder_set_tail_index(tail_index); +static void encoder_handlers_slave_drain(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { + encoder_signal_queue_drain(); } // clang-format off @@ -264,7 +280,7 @@ static void encoder_handlers_slave_reset(uint8_t initiator2target_buffer_size, c # define TRANSACTIONS_ENCODERS_REGISTRATIONS \ [GET_ENCODERS_CHECKSUM] = trans_target2initiator_initializer(encoders.checksum), \ [GET_ENCODERS_DATA] = trans_target2initiator_initializer(encoders.events), \ - [PUT_ENCODER_TAIL] = trans_initiator2target_initializer_cb(encoders.events.tail, encoder_handlers_slave_reset), + [CMD_ENCODER_DRAIN] = trans_initiator2target_cb(encoder_handlers_slave_drain), // clang-format on #else // ENCODER_ENABLE -- cgit v1.2.3