mirror of
https://github.com/firewalkwithm3/qmk_firmware.git
synced 2024-11-22 11:30:30 +08:00
Enable sync of OLED/ST7565 display on/off state on Splits (#13542)
* Enable sync of OLED/ST7565 display on/off state on Splits * Only send if states are not matched Co-authored-by: Nick Brassel <nick@tzarc.org> Co-authored-by: Nick Brassel <nick@tzarc.org>
This commit is contained in:
parent
4b3691e72d
commit
488aaa0980
|
@ -343,6 +343,12 @@ There are a few different ways to set handedness for split keyboards (listed in
|
|||
* `#define SPLIT_WPM_ENABLE`
|
||||
* Ensures the current WPM is available on the slave when using the QMK-provided split transport.
|
||||
|
||||
* `#define SPLIT_OLED_ENABLE`
|
||||
* Syncs the on/off state of the OLED between the halves.
|
||||
|
||||
* `#define SPLIT_ST7565_ENABLE`
|
||||
* Syncs the on/off state of the ST7565 screen between the halves.
|
||||
|
||||
* `#define SPLIT_TRANSACTION_IDS_KB .....`
|
||||
* `#define SPLIT_TRANSACTION_IDS_USER .....`
|
||||
* Allows for custom data sync with the slave when using the QMK-provided split transport. See [custom data sync between sides](feature_split_keyboard.md#custom-data-sync) for more information.
|
||||
|
|
|
@ -233,6 +233,18 @@ This enables transmitting modifier state (normal, weak and oneshot) to the non p
|
|||
|
||||
This enables transmitting the current WPM to the slave side of the split keyboard. The purpose of this feature is to support cosmetic use of WPM (e.g. displaying the current value on an OLED screen). This adds overhead to the split communication protocol and may negatively impact the matrix scan speed when enabled.
|
||||
|
||||
```c
|
||||
#define SPLIT_OLED_ENABLE
|
||||
```
|
||||
|
||||
This enables transmitting the current OLED on/off status to the slave side of the split keyboard. The purpose of this feature is to support state (on/off state only) syncing. This adds overhead to the split communication protocol and may negatively impact the matrix scan speed when enabled.
|
||||
|
||||
```c
|
||||
#define SPLIT_ST7565_ENABLE
|
||||
```
|
||||
|
||||
This enables transmitting the current ST7565 on/off status to the slave side of the split keyboard. The purpose of this feature is to support state (on/off state only) syncing. This adds overhead to the split communication protocol and may negatively impact the matrix scan speed when enabled.
|
||||
|
||||
### Custom data sync between sides :id=custom-data-sync
|
||||
|
||||
QMK's split transport allows for arbitrary data transactions at both the keyboard and user levels. This is modelled on a remote procedure call, with the master invoking a function on the slave side, with the ability to send data from master to slave, process it slave side, and send data back from slave to master.
|
||||
|
|
|
@ -70,6 +70,14 @@ enum serial_transaction_id {
|
|||
PUT_WPM,
|
||||
#endif // defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE)
|
||||
|
||||
#if defined(OLED_ENABLE) && defined(SPLIT_OLED_ENABLE)
|
||||
PUT_OLED,
|
||||
#endif // defined(WPM_ENABLE) && defined(SPLIT_OLED_ENABLE)
|
||||
|
||||
#if defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
|
||||
PUT_ST7565,
|
||||
#endif // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
|
||||
|
||||
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
|
||||
PUT_RPC_INFO,
|
||||
PUT_RPC_REQ_DATA,
|
||||
|
|
|
@ -519,6 +519,68 @@ static void wpm_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_
|
|||
|
||||
#endif // defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE)
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
// OLED
|
||||
|
||||
#if defined(OLED_ENABLE) && defined(SPLIT_OLED_ENABLE)
|
||||
|
||||
static bool oled_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
|
||||
static uint32_t last_update = 0;
|
||||
bool current_oled_state = is_oled_on();
|
||||
return send_if_condition(PUT_OLED, &last_update, (current_oled_state != split_shmem->current_oled_state), ¤t_oled_state, sizeof(current_oled_state));
|
||||
}
|
||||
|
||||
static void oled_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
|
||||
if (split_shmem->current_oled_state) {
|
||||
oled_on();
|
||||
} else {
|
||||
oled_off();
|
||||
}
|
||||
}
|
||||
|
||||
# define TRANSACTIONS_OLED_MASTER() TRANSACTION_HANDLER_MASTER(oled_handlers)
|
||||
# define TRANSACTIONS_OLED_SLAVE() TRANSACTION_HANDLER_SLAVE(oled_handlers)
|
||||
# define TRANSACTIONS_OLED_REGISTRATIONS [PUT_OLED] = trans_initiator2target_initializer(current_oled_state),
|
||||
|
||||
#else // defined(OLED_ENABLE) && defined(SPLIT_OLED_ENABLE)
|
||||
|
||||
# define TRANSACTIONS_OLED_MASTER()
|
||||
# define TRANSACTIONS_OLED_SLAVE()
|
||||
# define TRANSACTIONS_OLED_REGISTRATIONS
|
||||
|
||||
#endif // defined(OLED_ENABLE) && defined(SPLIT_OLED_ENABLE)
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
// ST7565
|
||||
|
||||
#if defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
|
||||
|
||||
static bool st7565_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
|
||||
static uint32_t last_update = 0;
|
||||
bool current_st7565_state = st7565_is_on();
|
||||
return send_if_condition(PUT_ST7565, &last_update, (current_st7565_state != split_shmem->current_st7565_state), ¤t_st7565_state, sizeof(current_st7565_state));
|
||||
}
|
||||
|
||||
static void st7565_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
|
||||
if (split_shmem->current_st7565_state) {
|
||||
st7565_on();
|
||||
} else {
|
||||
st7565_off();
|
||||
}
|
||||
}
|
||||
|
||||
# define TRANSACTIONS_ST7565_MASTER() TRANSACTION_HANDLER_MASTER(st7565_handlers)
|
||||
# define TRANSACTIONS_ST7565_SLAVE() TRANSACTION_HANDLER_SLAVE(st7565_handlers)
|
||||
# define TRANSACTIONS_ST7565_REGISTRATIONS [PUT_ST7565] = trans_initiator2target_initializer(current_st7565_state),
|
||||
|
||||
#else // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
|
||||
|
||||
# define TRANSACTIONS_ST7565_MASTER()
|
||||
# define TRANSACTIONS_ST7565_SLAVE()
|
||||
# define TRANSACTIONS_ST7565_REGISTRATIONS
|
||||
|
||||
#endif // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
uint8_t dummy;
|
||||
|
@ -543,6 +605,8 @@ split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = {
|
|||
TRANSACTIONS_LED_MATRIX_REGISTRATIONS
|
||||
TRANSACTIONS_RGB_MATRIX_REGISTRATIONS
|
||||
TRANSACTIONS_WPM_REGISTRATIONS
|
||||
TRANSACTIONS_OLED_REGISTRATIONS
|
||||
TRANSACTIONS_ST7565_REGISTRATIONS
|
||||
// clang-format on
|
||||
|
||||
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
|
||||
|
@ -567,6 +631,8 @@ bool transactions_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix
|
|||
TRANSACTIONS_LED_MATRIX_MASTER();
|
||||
TRANSACTIONS_RGB_MATRIX_MASTER();
|
||||
TRANSACTIONS_WPM_MASTER();
|
||||
TRANSACTIONS_OLED_MASTER();
|
||||
TRANSACTIONS_ST7565_MASTER();
|
||||
return okay;
|
||||
}
|
||||
|
||||
|
@ -583,6 +649,8 @@ void transactions_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[
|
|||
TRANSACTIONS_LED_MATRIX_SLAVE();
|
||||
TRANSACTIONS_RGB_MATRIX_SLAVE();
|
||||
TRANSACTIONS_WPM_SLAVE();
|
||||
TRANSACTIONS_OLED_SLAVE();
|
||||
TRANSACTIONS_ST7565_SLAVE();
|
||||
}
|
||||
|
||||
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
|
||||
|
|
|
@ -165,6 +165,14 @@ typedef struct _split_shared_memory_t {
|
|||
uint8_t current_wpm;
|
||||
#endif // defined(WPM_ENABLE) && defined(SPLIT_WPM_ENABLE)
|
||||
|
||||
#if defined(OLED_ENABLE) && defined(SPLIT_OLED_ENABLE)
|
||||
uint8_t current_oled_state;
|
||||
#endif // defined(OLED_ENABLE) && defined(SPLIT_OLED_ENABLE)
|
||||
|
||||
#if defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
|
||||
uint8_t current_st7565_state;
|
||||
#endif // ST7565_ENABLE(OLED_ENABLE) && defined(SPLIT_ST7565_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];
|
||||
|
|
Loading…
Reference in a new issue