diff options
author | Nick Brassel <[email protected]> | 2024-03-10 22:24:17 +1100 |
---|---|---|
committer | GitHub <[email protected]> | 2024-03-10 22:24:17 +1100 |
commit | 3e1ac7a38fa4e6885053a762bc75f7c4e068eccb (patch) | |
tree | 102642e387cebb67a840ae23ffda5d7413f33a71 /quantum/split_common | |
parent | be42ea306b36bf7fac8b790452536156de8efcf6 (diff) | |
download | qmk_firmware-3e1ac7a38fa4e6885053a762bc75f7c4e068eccb.tar.gz qmk_firmware-3e1ac7a38fa4e6885053a762bc75f7c4e068eccb.zip |
Fixes for encoder abstraction. (#23195)0.24.4
Diffstat (limited to 'quantum/split_common')
-rw-r--r-- | quantum/split_common/transaction_id_define.h | 2 | ||||
-rw-r--r-- | quantum/split_common/transactions.c | 32 |
2 files changed, 25 insertions, 9 deletions
diff --git a/quantum/split_common/transaction_id_define.h b/quantum/split_common/transaction_id_define.h index 05b3bf7b62..5bfbe2aec7 100644 --- a/quantum/split_common/transaction_id_define.h +++ b/quantum/split_common/transaction_id_define.h @@ -31,7 +31,7 @@ enum serial_transaction_id { #ifdef ENCODER_ENABLE GET_ENCODERS_CHECKSUM, GET_ENCODERS_DATA, - PUT_ENCODER_TAIL, + CMD_ENCODER_DRAIN, #endif // ENCODER_ENABLE #ifndef DISABLE_SYNC_TIMER 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 <http://www.gnu.org/licenses/>. */ +#include <stdint.h> #include <string.h> #include <stddef.h> @@ -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 |