From b585ece5ef9309557ac6b61eadda4f00e4e52b0c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 31 Dec 2022 16:56:32 -0800 Subject: Add Split support for Haptic feedback (#19203) --- quantum/haptic.c | 9 ++++++ quantum/split_common/transaction_id_define.h | 4 +++ quantum/split_common/transactions.c | 45 ++++++++++++++++++++++++++++ quantum/split_common/transport.h | 12 ++++++++ 4 files changed, 70 insertions(+) (limited to 'quantum') diff --git a/quantum/haptic.c b/quantum/haptic.c index ad64fe2cc7..c151547fca 100644 --- a/quantum/haptic.c +++ b/quantum/haptic.c @@ -25,6 +25,9 @@ #ifdef SOLENOID_ENABLE # include "solenoid.h" #endif +#if defined(SPLIT_KEYBOARD) && defined(SPLIT_HAPTIC_ENABLE) +extern uint8_t split_haptic_play; +#endif haptic_config_t haptic_config; @@ -319,9 +322,15 @@ void haptic_play(void) { uint8_t play_eff = 0; play_eff = haptic_config.mode; DRV_pulse(play_eff); +# if defined(SPLIT_KEYBOARD) && defined(SPLIT_HAPTIC_ENABLE) + split_haptic_play = haptic_config.mode; +# endif #endif #ifdef SOLENOID_ENABLE solenoid_fire_handler(); +# if defined(SPLIT_KEYBOARD) && defined(SPLIT_HAPTIC_ENABLE) + split_haptic_play = 1; +# endif #endif } diff --git a/quantum/split_common/transaction_id_define.h b/quantum/split_common/transaction_id_define.h index 8c19948107..18d3826b83 100644 --- a/quantum/split_common/transaction_id_define.h +++ b/quantum/split_common/transaction_id_define.h @@ -88,6 +88,10 @@ enum serial_transaction_id { PUT_WATCHDOG, #endif // defined(SPLIT_WATCHDOG_ENABLE) +#if defined(HAPTIC_ENABLE) && defined(SPLIT_HAPTIC_ENABLE) + PUT_HAPTIC, +#endif // defined(HAPTIC_ENABLE) && defined(SPLIT_HAPTIC_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 527b2f4caf..8e1961b586 100644 --- a/quantum/split_common/transactions.c +++ b/quantum/split_common/transactions.c @@ -748,6 +748,48 @@ static void watchdog_handlers_slave(matrix_row_t master_matrix[], matrix_row_t s #endif // defined(SPLIT_WATCHDOG_ENABLE) +#if defined(HAPTIC_ENABLE) && defined(SPLIT_HAPTIC_ENABLE) + +uint8_t split_haptic_play = 0xFF; +extern haptic_config_t haptic_config; + +static bool haptic_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { + static uint32_t last_update = 0; + split_slave_haptic_sync_t haptic_sync; + + memcpy(&haptic_sync.haptic_config, &haptic_config, sizeof(haptic_config_t)); + haptic_sync.haptic_play = split_haptic_play; + + bool okay = send_if_data_mismatch(PUT_HAPTIC, &last_update, &haptic_sync, &split_shmem->haptic_sync, sizeof(haptic_sync)); + + split_haptic_play = 0xFF; + + return okay; +} + +static void haptic_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { + memcpy(&haptic_config, &split_shmem->haptic_sync.haptic_config, sizeof(haptic_config_t)); + + if (split_shmem->haptic_sync.haptic_play != 0xFF) { + haptic_set_mode(split_shmem->haptic_sync.haptic_play); + haptic_play(); + } +} + +// clang-format off +# define TRANSACTIONS_HAPTIC_MASTER() TRANSACTION_HANDLER_MASTER(haptic) +# define TRANSACTIONS_HAPTIC_SLAVE() TRANSACTION_HANDLER_SLAVE(haptic) +# define TRANSACTIONS_HAPTIC_REGISTRATIONS [PUT_HAPTIC] = trans_initiator2target_initializer(haptic_sync), +// clang-format on + +#else // defined(HAPTIC_ENABLE) && defined(SPLIT_HAPTIC_ENABLE) + +# define TRANSACTIONS_HAPTIC_MASTER() +# define TRANSACTIONS_HAPTIC_SLAVE() +# define TRANSACTIONS_HAPTIC_REGISTRATIONS + +#endif // defined(HAPTIC_ENABLE) && defined(SPLIT_HAPTIC_ENABLE) + //////////////////////////////////////////////////// split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = { @@ -775,6 +817,7 @@ split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = { TRANSACTIONS_ST7565_REGISTRATIONS TRANSACTIONS_POINTING_REGISTRATIONS TRANSACTIONS_WATCHDOG_REGISTRATIONS + TRANSACTIONS_HAPTIC_REGISTRATIONS // clang-format on #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) @@ -802,6 +845,7 @@ bool transactions_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix TRANSACTIONS_ST7565_MASTER(); TRANSACTIONS_POINTING_MASTER(); TRANSACTIONS_WATCHDOG_MASTER(); + TRANSACTIONS_HAPTIC_MASTER(); return true; } @@ -822,6 +866,7 @@ void transactions_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[ TRANSACTIONS_ST7565_SLAVE(); TRANSACTIONS_POINTING_SLAVE(); TRANSACTIONS_WATCHDOG_SLAVE(); + TRANSACTIONS_HAPTIC_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 833633edc2..adee4470d2 100644 --- a/quantum/split_common/transport.h +++ b/quantum/split_common/transport.h @@ -114,6 +114,14 @@ typedef struct _split_slave_pointing_sync_t { } split_slave_pointing_sync_t; #endif // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE) +#if defined(HAPTIC_ENABLE) && defined(SPLIT_HAPTIC_ENABLE) +# include "haptic.h" +typedef struct _split_slave_haptic_sync_t { + haptic_config_t haptic_config; + uint8_t haptic_play; +} split_slave_haptic_sync_t; +#endif // defined(HAPTIC_ENABLE) && defined(SPLIT_HAPTIC_ENABLE) + #if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER) typedef struct _rpc_sync_info_t { uint8_t checksum; @@ -192,6 +200,10 @@ typedef struct _split_shared_memory_t { bool watchdog_pinged; #endif // defined(SPLIT_WATCHDOG_ENABLE) +#if defined(HAPTIC_ENABLE) + split_slave_haptic_sync_t haptic_sync; +#endif // defined(HAPTIC_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]; -- cgit v1.2.3