diff options
Diffstat (limited to 'quantum/split_common')
| -rw-r--r-- | quantum/split_common/split_util.h | 1 | ||||
| -rw-r--r-- | quantum/split_common/transaction_id_define.h | 6 | ||||
| -rw-r--r-- | quantum/split_common/transactions.c | 81 | ||||
| -rw-r--r-- | quantum/split_common/transport.h | 13 | 
4 files changed, 100 insertions, 1 deletions
| diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h index ef72043bb7..c7eabea233 100644 --- a/quantum/split_common/split_util.h +++ b/quantum/split_common/split_util.h @@ -2,7 +2,6 @@  #include <stdbool.h>  #include <stdint.h> -#include <stdio.h>  #include <stdlib.h>  #include "matrix.h" diff --git a/quantum/split_common/transaction_id_define.h b/quantum/split_common/transaction_id_define.h index 535bc21aea..aa71c3621e 100644 --- a/quantum/split_common/transaction_id_define.h +++ b/quantum/split_common/transaction_id_define.h @@ -78,6 +78,12 @@ enum serial_transaction_id {      PUT_ST7565,  #endif  // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE) +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +    GET_POINTING_CHECKSUM, +    GET_POINTING_DATA, +    PUT_POINTING_CPI, +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)      PUT_RPC_INFO,      PUT_RPC_REQ_DATA, diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c index 3ff87710e7..81f9836382 100644 --- a/quantum/split_common/transactions.c +++ b/quantum/split_common/transactions.c @@ -579,6 +579,84 @@ static void st7565_handlers_slave(matrix_row_t master_matrix[], matrix_row_t sla  #endif  // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)  //////////////////////////////////////////////////// +// POINTING + +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) + +static bool pointing_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { +#    if defined(POINTING_DEVICE_LEFT) +    if (is_keyboard_left()) { +        return true; +    } +#    elif defined(POINTING_DEVICE_RIGHT) +    if (!is_keyboard_left()) { +        return true; +    } +#    endif +    static uint32_t last_update = 0; +    static uint16_t last_cpi    = 0; +    report_mouse_t  temp_state; +    uint16_t        temp_cpi; +    bool            okay = read_if_checksum_mismatch(GET_POINTING_CHECKSUM, GET_POINTING_DATA, &last_update, &temp_state, &split_shmem->pointing.report, sizeof(temp_state)); +    if (okay) pointing_device_set_shared_report(temp_state); +    temp_cpi = pointing_device_get_shared_cpi(); +    if (temp_cpi && memcmp(&last_cpi, &temp_cpi, sizeof(temp_cpi)) != 0) { +        memcpy(&split_shmem->pointing.cpi, &temp_cpi, sizeof(temp_cpi)); +        okay = transport_write(PUT_POINTING_CPI, &split_shmem->pointing.cpi, sizeof(split_shmem->pointing.cpi)); +        if (okay) { +            last_cpi = temp_cpi; +        } +    } +    return okay; +} + +extern const pointing_device_driver_t pointing_device_driver; + +static void pointing_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { +#    if defined(POINTING_DEVICE_LEFT) +    if (!is_keyboard_left()) { +        return; +    } +#    elif defined(POINTING_DEVICE_RIGHT) +    if (is_keyboard_left()) { +        return; +    } +#    endif +    report_mouse_t temp_report; +    uint16_t       temp_cpi; +#    ifdef POINTING_DEVICE_TASK_THROTTLE_MS +    static uint32_t last_exec = 0; +    if (timer_elapsed32(last_exec) < POINTING_DEVICE_TASK_THROTTLE_MS) { +        return; +    } +    last_exec = timer_read32(); +#    endif +    temp_cpi = !pointing_device_driver.get_cpi ? 0 : pointing_device_driver.get_cpi();  // check for NULL +    if (split_shmem->pointing.cpi && memcmp(&split_shmem->pointing.cpi, &temp_cpi, sizeof(temp_cpi)) != 0) { +        if (pointing_device_driver.set_cpi) { +            pointing_device_driver.set_cpi(split_shmem->pointing.cpi); +        } +    } +    memset(&temp_report, 0, sizeof(temp_report)); +    temp_report = pointing_device_driver.get_report(temp_report); +    memcpy(&split_shmem->pointing.report, &temp_report, sizeof(temp_report)); +    // Now update the checksum given that the pointing has been written to +    split_shmem->pointing.checksum = crc8(&temp_report, sizeof(temp_report)); +} + +#    define TRANSACTIONS_POINTING_MASTER() TRANSACTION_HANDLER_MASTER(pointing) +#    define TRANSACTIONS_POINTING_SLAVE() TRANSACTION_HANDLER_SLAVE(pointing) +#    define TRANSACTIONS_POINTING_REGISTRATIONS [GET_POINTING_CHECKSUM] = trans_target2initiator_initializer(pointing.checksum), [GET_POINTING_DATA] = trans_target2initiator_initializer(pointing.report), [PUT_POINTING_CPI] = trans_initiator2target_initializer(pointing.cpi), + +#else  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) + +#    define TRANSACTIONS_POINTING_MASTER() +#    define TRANSACTIONS_POINTING_SLAVE() +#    define TRANSACTIONS_POINTING_REGISTRATIONS + +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) + +////////////////////////////////////////////////////  uint8_t                  dummy;  split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = { @@ -604,6 +682,7 @@ split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = {      TRANSACTIONS_WPM_REGISTRATIONS      TRANSACTIONS_OLED_REGISTRATIONS      TRANSACTIONS_ST7565_REGISTRATIONS +    TRANSACTIONS_POINTING_REGISTRATIONS  // clang-format on  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) @@ -629,6 +708,7 @@ bool transactions_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix      TRANSACTIONS_WPM_MASTER();      TRANSACTIONS_OLED_MASTER();      TRANSACTIONS_ST7565_MASTER(); +    TRANSACTIONS_POINTING_MASTER();      return true;  } @@ -647,6 +727,7 @@ void transactions_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[      TRANSACTIONS_WPM_SLAVE();      TRANSACTIONS_OLED_SLAVE();      TRANSACTIONS_ST7565_SLAVE(); +    TRANSACTIONS_POINTING_SLAVE();  }  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h index 1d4f6ed0cd..31b804908b 100644 --- a/quantum/split_common/transport.h +++ b/quantum/split_common/transport.h @@ -106,6 +106,15 @@ typedef struct _split_mods_sync_t {  } split_mods_sync_t;  #endif  // SPLIT_MODS_ENABLE +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +#    include "pointing_device.h" +typedef struct _split_slave_pointing_sync_t { +    uint8_t        checksum; +    report_mouse_t report; +    uint16_t       cpi; +} split_slave_pointing_sync_t; +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)  typedef struct _rpc_sync_info_t {      int8_t  transaction_id; @@ -173,6 +182,10 @@ typedef struct _split_shared_memory_t {      uint8_t current_st7565_state;  #endif  // ST7565_ENABLE(OLED_ENABLE) && defined(SPLIT_ST7565_ENABLE) +#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +    split_slave_pointing_sync_t pointing; +#endif  // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +  #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)      rpc_sync_info_t rpc_info;      uint8_t         rpc_m2s_buffer[RPC_M2S_BUFFER_SIZE]; | 
