diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 5d044c4ea0b..874339361d2 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -56,6 +56,11 @@ static uint8_t connection_errors = 0; volatile bool isLeftHand = true; +static struct { + bool master; + bool left; +} split_config; + #if defined(SPLIT_USB_DETECT) _Static_assert((SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL) <= UINT16_MAX, "Please lower SPLIT_USB_TIMEOUT and/or increase SPLIT_USB_TIMEOUT_POLL."); static bool usbIsActive(void) { @@ -131,8 +136,10 @@ static uint8_t peek_matrix_intersection(pin_t out_pin, pin_t in_pin) { } #endif -__attribute__((weak)) bool is_keyboard_left(void) { +__attribute__((weak)) bool is_keyboard_left_impl(void) { #if defined(SPLIT_HAND_PIN) + setPinInput(SPLIT_HAND_PIN); + wait_us(100); // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand # ifdef SPLIT_HAND_PIN_LOW_IS_LEFT return !readPin(SPLIT_HAND_PIN); @@ -145,36 +152,6 @@ __attribute__((weak)) bool is_keyboard_left(void) { # else return !peek_matrix_intersection(SPLIT_HAND_MATRIX_GRID); # endif -#elif defined(EE_HANDS) - return eeconfig_read_handedness(); -#elif defined(MASTER_RIGHT) - return !is_keyboard_master(); -#endif - - return is_keyboard_master(); -} - -__attribute__((weak)) bool is_keyboard_master(void) { - static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN; - - // only check once, as this is called often - if (usbstate == UNKNOWN) { - usbstate = usbIsActive() ? MASTER : SLAVE; - - // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow - if (usbstate == SLAVE) { - usb_disconnect(); - } - } - - return (usbstate == MASTER); -} - -// this code runs before the keyboard is fully initialized -void split_pre_init(void) { -#if defined(SPLIT_HAND_PIN) - setPinInput(SPLIT_HAND_PIN); - wait_us(100); #elif defined(EE_HANDS) if (!eeconfig_is_enabled()) { eeconfig_init(); @@ -193,12 +170,42 @@ void split_pre_init(void) { eeconfig_update_handedness(should_be_left); } # endif // defined(INIT_EE_HANDS_LEFT) || defined(INIT_EE_HANDS_RIGHT) + return eeconfig_read_handedness(); +#elif defined(MASTER_RIGHT) + return !is_keyboard_master(); +#else + return is_keyboard_master(); #endif - isLeftHand = is_keyboard_left(); +} + +__attribute__((weak)) bool is_keyboard_master_impl(void) { + bool is_master = usbIsActive(); + + // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow + if (!is_master) { + usb_disconnect(); + } + return is_master; +} + +__attribute__((weak)) bool is_keyboard_left(void) { + return split_config.left; +} + +__attribute__((weak)) bool is_keyboard_master(void) { + return split_config.master; +} + +// this code runs before the keyboard is fully initialized +void split_pre_init(void) { + split_config.master = is_keyboard_master_impl(); + split_config.left = is_keyboard_left_impl(); + + isLeftHand = is_keyboard_left(); // TODO: Remove isLeftHand #if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT) uint8_t num_rgb_leds_split[2] = RGBLED_SPLIT; - if (isLeftHand) { + if (is_keyboard_left()) { rgblight_set_clipping_range(0, num_rgb_leds_split[0]); } else { rgblight_set_clipping_range(num_rgb_leds_split[0], num_rgb_leds_split[1]);