mirror of
https://github.com/Keychron/qmk_firmware.git
synced 2024-12-27 11:38:58 +06:00
f077204fae
* Add support for wiring RGB LEDs for both halves directly to their respective controllers RGB LEDs for each half don't need to be chained together across the TRRS cable with this * Add split RGB LED support for serial * Update config/rules for bakingpy layout * Un-nest ifdefs for hand detection * Read RGB config state from memory instead of EEPROM for serial updates * Reuse existing LED pointer instead of creating new one
93 lines
1.9 KiB
C
93 lines
1.9 KiB
C
#include "split_util.h"
|
|
#include "matrix.h"
|
|
#include "keyboard.h"
|
|
#include "config.h"
|
|
#include "timer.h"
|
|
#include "transport.h"
|
|
#include "quantum.h"
|
|
|
|
#ifdef EE_HANDS
|
|
# include "tmk_core/common/eeprom.h"
|
|
# include "eeconfig.h"
|
|
#endif
|
|
|
|
#if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT)
|
|
#include "rgblight.h"
|
|
#endif
|
|
|
|
volatile bool isLeftHand = true;
|
|
|
|
__attribute__((weak))
|
|
bool is_keyboard_left(void) {
|
|
#if defined(SPLIT_HAND_PIN)
|
|
// Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand
|
|
setPinInput(SPLIT_HAND_PIN);
|
|
return readPin(SPLIT_HAND_PIN);
|
|
#elif defined(EE_HANDS)
|
|
return eeprom_read_byte(EECONFIG_HANDEDNESS);
|
|
#elif defined(MASTER_RIGHT)
|
|
return !is_keyboard_master();
|
|
#endif
|
|
|
|
return is_keyboard_master();
|
|
}
|
|
|
|
bool is_keyboard_master(void)
|
|
{
|
|
#ifdef __AVR__
|
|
static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN;
|
|
|
|
// only check once, as this is called often
|
|
if (usbstate == UNKNOWN)
|
|
{
|
|
USBCON |= (1 << OTGPADE); // enables VBUS pad
|
|
wait_us(5);
|
|
|
|
usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS
|
|
}
|
|
|
|
return (usbstate == MASTER);
|
|
#else
|
|
return true;
|
|
#endif
|
|
}
|
|
|
|
static void keyboard_master_setup(void) {
|
|
#if defined(USE_I2C) || defined(EH)
|
|
#ifdef SSD1306OLED
|
|
matrix_master_OLED_init ();
|
|
#endif
|
|
#endif
|
|
transport_master_init();
|
|
}
|
|
|
|
static void keyboard_slave_setup(void)
|
|
{
|
|
transport_slave_init();
|
|
}
|
|
|
|
// this code runs before the usb and keyboard is initialized
|
|
void matrix_setup(void)
|
|
{
|
|
isLeftHand = is_keyboard_left();
|
|
|
|
#if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT)
|
|
uint8_t num_rgb_leds_split[2] = RGBLED_SPLIT;
|
|
if (isLeftHand) {
|
|
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]);
|
|
}
|
|
#endif
|
|
|
|
if (is_keyboard_master())
|
|
{
|
|
keyboard_master_setup();
|
|
}
|
|
else
|
|
{
|
|
keyboard_slave_setup();
|
|
}
|
|
}
|