diff options
Diffstat (limited to 'quantum/split_common/transactions.c')
| -rw-r--r-- | quantum/split_common/transactions.c | 32 | 
1 files changed, 24 insertions, 8 deletions
| 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 | 
