~ruther/qmk_firmware

f461adbd1dffa178042a4805137918a4bec3c118 — Drashna Jaelre 4 years ago cc815c4
[Keymap] Update to Drashna keymap and user code (based on develop) (#12936)

34 files changed, 475 insertions(+), 321 deletions(-)

M keyboards/c39/keymaps/drashna/config.h
M keyboards/c39/keymaps/drashna/keymap.c
M keyboards/gergo/keymaps/drashna/keymap.c
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/5x6_right_trackball.c
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/config.h
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/config.h
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/keymap.c
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/rules.mk
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/pmw3360.c
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/pointer_transport.c
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk
M keyboards/keebio/iris/keymaps/drashna/keymap.c
M keyboards/kyria/keymaps/drashna/config.h
M keyboards/kyria/keymaps/drashna/keymap.c
M keyboards/orthodox/keymaps/drashna/keymap.c
M keyboards/ploopyco/mouse/keymaps/drashna/rules.mk
M layouts/community/ergodox/drashna/keymap.c
M layouts/community/ergodox/drashna/rules.mk
M layouts/community/ortho_4x12/drashna/keymap.c
M layouts/community/ortho_5x12/drashna/keymap.c
M layouts/community/split_3x6_3/drashna/keymap.c
M layouts/community/split_3x6_3/drashna/rules.mk
D layouts/community/split_3x6_3/drashna/ssd1306.c
M users/drashna/config.h
M users/drashna/drashna.c
M users/drashna/drashna.h
M users/drashna/drashna_transport.c
M users/drashna/oled_stuff.c
M users/drashna/oled_stuff.h
M users/drashna/pimoroni_trackball.c
M users/drashna/process_records.h
M users/drashna/rgb_matrix_stuff.c
M users/drashna/rgb_stuff.c
M users/drashna/rules.mk
M keyboards/c39/keymaps/drashna/config.h => keyboards/c39/keymaps/drashna/config.h +4 -0
@@ 28,3 28,7 @@
#define RGBLED_NUM 15

#define SOLENOID_PIN B11

#define AUDIO_PIN A5
#define AUDIO_PIN_ALT A4
#define AUDIO_PIN_ALT_AS_NEGATIVE

M keyboards/c39/keymaps/drashna/keymap.c => keyboards/c39/keymaps/drashna/keymap.c +0 -6
@@ 87,12 87,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
  ),

  [_MODS] = LAYOUT_wrapper(
    _______, ___________________BLANK___________________, _______, ___________________BLANK___________________, _______,
    _______, ___________________BLANK___________________, _______, ___________________BLANK___________________, _______,
    KC_LSFT, ___________________BLANK___________________, _______, ___________________BLANK___________________, _______
  ),

  [_LOWER] = LAYOUT_wrapper(
    KC_TILD, _________________LOWER_L1__________________, _______, _________________LOWER_R1__________________, KC_BSPC,
    KC_DEL,  _________________LOWER_L2__________________, _______, _________________LOWER_R2__________________, KC_PIPE,

M keyboards/gergo/keymaps/drashna/keymap.c => keyboards/gergo/keymaps/drashna/keymap.c +0 -6
@@ 87,12 87,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
    ),

    [_MODS] = LAYOUT_gergo_wrapper(
        _______, ___________________BLANK___________________,                                           ___________________BLANK___________________, _______,
        _______, ___________________BLANK___________________, _______,                         _______, ___________________BLANK___________________, _______,
        KC_LSFT, ___________________BLANK___________________, _______, _______,       _______, _______, ___________________BLANK___________________, KC_RSFT,
                                            _______, _______, _______, _______,       _______, _______, _______, _______
        ),
    [_LOWER] = LAYOUT_gergo_wrapper(
        KC_F12,  _________________LOWER_L1__________________,                                           _________________LOWER_R1__________________, KC_F11,
        _______, _________________LOWER_L2__________________, _______,                         _______, _________________LOWER_R2__________________, KC_PIPE,

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/5x6_right_trackball.c => keyboards/handwired/dactyl_manuform/5x6_right_trackball/5x6_right_trackball.c +3 -0
@@ 167,8 167,11 @@ void pointing_device_task(void) {

void eeconfig_init_kb(void) {
    keyboard_config.dpi_config = TRACKBALL_DPI_DEFAULT;
#ifdef POINTING_DEVICE_ENABLE
    trackball_set_cpi(dpi_array[keyboard_config.dpi_config]);
#endif
    eeconfig_update_kb(keyboard_config.raw);
    eeconfig_init_user();
}

void matrix_init_kb(void) {

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/config.h => keyboards/handwired/dactyl_manuform/5x6_right_trackball/config.h +5 -5
@@ 36,13 36,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define DIODE_DIRECTION COL2ROW

// WS2812 RGB LED strip input and number of LEDs
#define RGB_DI_PIN D3
#define RGBLED_NUM 8
#define RGB_DI_PIN E7
#define RGBLED_NUM 58
#define RGBLIGHT_SPLIT
#define RGBLED_SPLIT { 0 , 8 }
#define RGBLED_SPLIT { 30 , 28 }
#define RGBLIGHT_SLEEP
#define RGBW
#define RGBLIGHT_LIMIT_VAL 150
// #define RGBW
#define RGBLIGHT_LIMIT_VAL 100
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST


M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/config.h => keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/config.h +2 -4
@@ 25,9 25,7 @@
#define TRACKBALL_DPI_OPTIONS \
    { 1200, 1800, 2600, 3400 }

#define RGBLIGHT_EFFECT_TWINKLE_LIFE  50
#define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1/63
#define RGBLIGHT_MAX_BRIGHTNESS 100
#define RGBLIGHT_MAX_BRIGHTNESS 60

#undef DEBOUNCE
#define DEBOUNCE 10


@@ 36,6 34,6 @@
#define SOLENOID_DEFAULT_DWELL 8

#define OLED_DISPLAY_128X64
#define OLED_BRIGHTNESS 100
#define OLED_BRIGHTNESS 50

#define MK_KINETIC_SPEED

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/keymap.c => keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/keymap.c +38 -16
@@ 30,8 30,8 @@
     OS_LSFT, CTL_T(K21), K22,  K23,     K24,     K25,                K26,     K27,     K28,     K29, RCTL_T(K2A), OS_RSFT, \
                       OS_LALT, OS_LGUI,                                                TG_GAME, TG_DBLO, \
                                OS_LGUI, KC_GRV,                                        OS_RGUI,  \
                                         KC_SPC,  TT(_MOUSE),                     KC_ENT,  \
                                         BK_LWER, MO(_MOUSE),      MO(_MOUSE), DL_RAIS  \
                                         KC_SPC,  OS_LGUI,                     KC_ENT,  \
                                         BK_LWER, TT(_MOUSE),      TT(_MOUSE), DL_RAIS  \
  )
#define LAYOUT_5x6_right_trackball_base_wrapper(...)       LAYOUT_5x6_right_trackball_base(__VA_ARGS__)



@@ 88,8 88,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_MOUSE] = LAYOUT_5x6_right_trackball(
        _______, _______, _______, _______, _______, _______,                     DPI_CONFIG, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______,                        KC_WH_U, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______,                        KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, _______, _______,
        _______, _______, _______, _______, _______, _______,                        _______, KC_BTN4, KC_BTN5, _______, _______, _______,
        _______, _______, _______, _______, _______, _______,                        KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN6, _______,
        _______, _______, _______, _______, _______, _______,                        KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, _______, _______,
                          _______, _______,                                                            _______, _______,
                                            _______, _______,                                 _______,
                                                     _______, _______,               _______,


@@ 97,9 97,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    ),
    [_GAMEPAD] = LAYOUT_5x6_right_trackball(
        KC_ESC,  KC_NO,   KC_1,    KC_2,    KC_3,    KC_4,                        DPI_CONFIG, _______, _______, _______, _______, _______,
        KC_F1,   KC_K,    KC_Q,    KC_W,    KC_E,    KC_R,                           KC_WH_U, _______, _______, _______, _______, _______,
        KC_TAB,  KC_G,    KC_A,    KC_S,    KC_D,    KC_F,                           KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, _______, _______,
        KC_LCTL, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_H,                           _______, KC_BTN4, KC_BTN5, _______, _______, _______,
        KC_F1,   KC_K,    KC_Q,    KC_W,    KC_E,    KC_R,                           _______, _______, _______, _______, _______, _______,
        KC_TAB,  KC_G,    KC_A,    KC_S,    KC_D,    KC_F,                           _______, _______, _______, _______, _______, _______,
        KC_LCTL, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_H,                           _______, _______, _______, _______, _______, _______,
                          KC_I,    KC_T,                                                               TG_GAME, KC_NO,
                                            KC_V,    KC_O,                                    _______,
                                                     KC_SPC,  KC_P,                  _______,


@@ 107,13 107,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    ),
    [_DIABLO] = LAYOUT_5x6_right_trackball(
        KC_ESC,  KC_V,    KC_D,    KC_LALT, KC_NO,   KC_NO,                          KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NO,   KC_NO,
        KC_TAB,  KC_S,    KC_I,    KC_F,    KC_M,    KC_T,                           KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
        KC_Q,    KC_1,    KC_2,    KC_3,    KC_4,    KC_G,                           KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
        KC_LCTL, KC_D3_1, KC_D3_2, KC_D3_3, KC_D3_4, KC_Z,                           KC_NO,   KC_N,    KC_M,    KC_NO,   KC_NO,   KC_NO,
        KC_TAB,  KC_S,    KC_I,    KC_F,    KC_M,    KC_T,                           _______, _______, _______, _______, _______, _______,
        KC_Q,    KC_1,    KC_2,    KC_3,    KC_4,    KC_G,                           _______, _______, _______, _______, _______, _______,
        KC_LCTL, KC_D3_1, KC_D3_2, KC_D3_3, KC_D3_4, KC_Z,                           _______, _______, _______, _______, _______, _______,
                          KC_F,    KC_L,                                                               KC_NO,   TG_DBLO,
                                      SFT_T(KC_SPC), KC_F,                                    _______,
                                               ALT_T(KC_Q),   KC_J,                  _______,
                                             KC_DIABLO_CLEAR, KC_LGUI,      _______, _______
                                    KC_DIABLO_CLEAR, KC_F,                                    _______,
                                               SFT_T(KC_SPC), KC_J,                  _______,
                                               ALT_T(KC_Q),   KC_LGUI,      _______, _______
    ),
    [_LOWER] = LAYOUT_5x6_right_trackball_wrapper(
        KC_F12,  _________________FUNC_LEFT_________________,                        _________________FUNC_RIGHT________________, KC_F11,


@@ 157,7 157,7 @@ bool            tap_toggling          = false;
void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) {
    if ((x || y) && timer_elapsed(mouse_timer) > 125) {
        mouse_timer = timer_read();
        if (!layer_state_is(_MOUSE) && !layer_state_is(_GAMEPAD) && timer_elapsed(mouse_debounce_timer) > 125) {
        if (!layer_state_is(_MOUSE) && !(layer_state_is(_GAMEPAD) || layer_state_is(_DIABLO)) && timer_elapsed(mouse_debounce_timer) > 125) {
            layer_on(_MOUSE);
        }
    }


@@ 167,7 167,7 @@ void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) {
#    else
    if (timer_elapsed(mouse_debounce_timer) > TAPPING_TERM
#    endif
        || layer_state_is(_GAMEPAD)) {
        || (layer_state_is(_GAMEPAD) || layer_state_is(_DIABLO))) {
        mouse_report->x = x;
        mouse_report->y = y;
    }


@@ 218,11 218,33 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t* record) {
        default:
            if (layer_state_is(_MOUSE) && !mouse_keycode_tracker) {
                layer_off(_MOUSE);
                mouse_keycode_tracker = 0;
            }
            mouse_keycode_tracker = 0;
            mouse_debounce_timer = timer_read();
            break;
    }
    return true;
}

layer_state_t layer_state_set_keymap(layer_state_t state) {
    if (layer_state_cmp(state, _GAMEPAD) || layer_state_cmp(state, _DIABLO)) {
        state |= (1UL << _MOUSE);
    }
    return state;
}
#endif

void matrix_init_keymap(void) {
#ifdef AUDIO_ENABLE
    extern audio_config_t audio_config;

    if (!is_keyboard_master()) {
        audio_stop_all();
        audio_config.enable = false;
    }
#endif
}

void keyboard_post_init_keymap(void) {
    matrix_init_keymap();
}

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/rules.mk => keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/rules.mk +0 -1
@@ 1,5 1,4 @@
RGBLIGHT_STARTUP_ANIMATION   = yes
HAPTIC_ENABLE                = SOLENOID
COMMAND_ENABLE               = no
AUDIO_ENABLE                 = yes
TAP_DANCE_ENABLE             = yes

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/pmw3360.c => keyboards/handwired/dactyl_manuform/5x6_right_trackball/pmw3360.c +3 -0
@@ 16,6 16,7 @@
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifdef POINTING_DEVICE_ENABLE

#include "pmw3360.h"
#include "pmw3360_firmware.h"


@@ 223,3 224,5 @@ report_pmw_t pmw_read_burst(void) {

    return data;
}

#endif

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/pointer_transport.c => keyboards/handwired/dactyl_manuform/5x6_right_trackball/pointer_transport.c +105 -29
@@ 21,6 21,7 @@
#include QMK_KEYBOARD_H

#define ROWS_PER_HAND (MATRIX_ROWS / 2)
#define SYNC_TIMER_OFFSET 2

#ifdef RGBLIGHT_ENABLE
#    include "rgblight.h"


@@ 36,6 37,13 @@ static pin_t encoders_pad[] = ENCODERS_PAD_A;
#    define NUMBER_OF_ENCODERS (sizeof(encoders_pad) / sizeof(pin_t))
#endif

#if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
#    include "led_matrix.h"
#endif
#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
#    include "rgb_matrix.h"
#endif

#ifdef POINTING_DEVICE_ENABLE
static uint16_t device_cpi    = 0;
static int8_t   split_mouse_x = 0, split_mouse_y = 0;


@@ 51,6 59,12 @@ static int8_t   split_mouse_x = 0, split_mouse_y = 0;
#    include "i2c_slave.h"

typedef struct _I2C_slave_buffer_t {
#    ifndef DISABLE_SYNC_TIMER
    uint32_t sync_timer;
#    endif
#    ifdef SPLIT_TRANSPORT_MIRROR
    matrix_row_t mmatrix[ROWS_PER_HAND];
#    endif
    matrix_row_t smatrix[ROWS_PER_HAND];
#    ifdef SPLIT_MODS_ENABLE
    uint8_t real_mods;


@@ 77,14 91,22 @@ typedef struct _I2C_slave_buffer_t {
    bool          oled_on;
    layer_state_t t_layer_state;
    layer_state_t t_default_layer_state;
    bool          is_rgb_matrix_suspended;
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    led_eeconfig_t led_matrix;
    bool           led_suspend_state;
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    rgb_config_t rgb_matrix;
    bool         rgb_suspend_state;
#    endif
} __attribute__((packed)) I2C_slave_buffer_t;

static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg;

#    define I2C_BACKLIGHT_START offsetof(I2C_slave_buffer_t, backlight_level)
#    define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync)
#    define I2C_KEYMAP_START offsetof(I2C_slave_buffer_t, mmatrix)
#    define I2C_KEYMAP_MASTER_START offsetof(I2C_slave_buffer_t, mmatrix)
#    define I2C_KEYMAP_SLAVE_START offsetof(I2C_slave_buffer_t, smatrix)
#    define I2C_SYNC_TIME_START offsetof(I2C_slave_buffer_t, sync_timer)
#    define I2C_REAL_MODS_START offsetof(I2C_slave_buffer_t, real_mods)
#    define I2C_WEAK_MODS_START offsetof(I2C_slave_buffer_t, weak_mods)


@@ 97,7 119,10 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re
#    define I2C_OLED_ON_START offsetof(I2C_slave_buffer_t, oled_on)
#    define I2C_LAYER_STATE_START offsetof(I2C_slave_buffer_t, t_layer_state)
#    define I2C_DEFAULT_LAYER_STATE_START offsetof(I2C_slave_buffer_t, t_default_layer_state)
#    define I2C_RGB_MATRIX_SUSPEND_START offsetof(I2C_slave_buffer_t, is_rgb_matrix_suspended)
#    define I2C_LED_MATRIX_START offsetof(I2C_slave_buffer_t, led_matrix)
#    define I2C_LED_SUSPEND_START offsetof(I2C_slave_buffer_t, led_suspend_state)
#    define I2C_RGB_MATRIX_START offsetof(I2C_slave_buffer_t, rgb_matrix)
#    define I2C_RGB_SUSPEND_START offsetof(I2C_slave_buffer_t, rgb_suspend_state)

#    define TIMEOUT 100



@@ 106,9 131,11 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re
#    endif

// Get rows from other half over i2c
bool transport_master(matrix_row_t matrix[]) {
    i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_START, (void *)matrix, sizeof(i2c_buffer->smatrix), TIMEOUT);

bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
    i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_SLAVE_START, (void *)slave_matrix, sizeof(i2c_buffer->smatrix), TIMEOUT);
#    ifdef SPLIT_TRANSPORT_MIRROR
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_MASTER_START, (void *)master_matrix, sizeof(i2c_buffer->mmatrix), TIMEOUT);
#    endif
    // write backlight info
#    ifdef BACKLIGHT_ENABLE
    uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0;


@@ 206,21 233,34 @@ bool transport_master(matrix_row_t matrix[]) {
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    bool sus_state = rgb_matrix_get_suspend_state();
    if (sus_state != i2c_buffer->is_rgb_matrix_suspended) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_MATRIX_SUSPEND_START, (void *)&sus_state, sizeof(sus_state), TIMEOUT) >= 0) {
            i2c_buffer->is_rgb_matrix_suspended = sus_state;
        }
    }
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_MATRIX_START, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix), TIMEOUT);
    bool suspend_state = led_matrix_get_suspend_state();
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->led_suspend_state), TIMEOUT);
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_MATRIX_START, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix), TIMEOUT);
    bool suspend_state = rgb_matrix_get_suspend_state();
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->rgb_suspend_state), TIMEOUT);
#    endif

#    ifndef DISABLE_SYNC_TIMER
    i2c_buffer->sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET;
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_SYNC_TIME_START, (void *)&i2c_buffer->sync_timer, sizeof(i2c_buffer->sync_timer), TIMEOUT);
#    endif

    return true;
}

void transport_slave(matrix_row_t matrix[]) {
void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
#    ifndef DISABLE_SYNC_TIMER
    sync_timer_update(i2c_buffer->sync_timer);
#    endif
    // Copy matrix to I2C buffer
    memcpy((void *)i2c_buffer->smatrix, (void *)matrix, sizeof(i2c_buffer->smatrix));
    memcpy((void *)i2c_buffer->smatrix, (void *)slave_matrix, sizeof(i2c_buffer->smatrix));
#    ifdef SPLIT_TRANSPORT_MIRROR
    memcpy((void *)master_matrix, (void *)i2c_buffer->mmatrix, sizeof(i2c_buffer->mmatrix));
#    endif

// Read Backlight Info
#    ifdef BACKLIGHT_ENABLE


@@ 281,8 321,13 @@ void transport_slave(matrix_row_t matrix[]) {
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(i2c_buffer->is_rgb_matrix_suspended);
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    memcpy((void *)i2c_buffer->led_matrix, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix));
    led_matrix_set_suspend_state(i2c_buffer->led_suspend_state);
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    memcpy((void *)i2c_buffer->rgb_matrix, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix));
    rgb_matrix_set_suspend_state(i2c_buffer->rgb_suspend_state);
#    endif
}



@@ 313,7 358,10 @@ typedef struct _Serial_m2s_buffer_t {
#        endif
#    endif
#    ifndef DISABLE_SYNC_TIMER
    uint32_t      sync_timer;
    uint32_t     sync_timer;
#    endif
#    ifdef SPLIT_TRANSPORT_MIRROR
    matrix_row_t mmatrix[ROWS_PER_HAND];
#    endif
#    ifdef BACKLIGHT_ENABLE
    uint8_t       backlight_level;


@@ 325,7 373,14 @@ typedef struct _Serial_m2s_buffer_t {
    bool          oled_on;
    layer_state_t t_layer_state;
    layer_state_t t_default_layer_state;
    bool          is_rgb_matrix_suspended;
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    led_eeconfig_t led_matrix;
    bool           led_suspend_state;
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    rgb_config_t   rgb_matrix;
    bool           rgb_suspend_state;
#    endif
} __attribute__((packed)) Serial_m2s_buffer_t;

#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)


@@ 402,7 457,7 @@ void transport_rgblight_slave(void) {
#        define transport_rgblight_slave()
#    endif

bool transport_master(matrix_row_t matrix[]) {
bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
#    ifndef SERIAL_USE_MULTI_TRANSACTION
    if (soft_serial_transaction() != TRANSACTION_END) {
        return false;


@@ 416,7 471,10 @@ bool transport_master(matrix_row_t matrix[]) {

    // TODO:  if MATRIX_COLS > 8 change to unpack()
    for (int i = 0; i < ROWS_PER_HAND; ++i) {
        matrix[i] = serial_s2m_buffer.smatrix[i];
        slave_matrix[i] = serial_s2m_buffer.smatrix[i];
#    ifdef SPLIT_TRANSPORT_MIRROR
        serial_m2s_buffer.mmatrix[i] = master_matrix[i];
#    endif
    }

#    ifdef BACKLIGHT_ENABLE


@@ 457,19 515,32 @@ bool transport_master(matrix_row_t matrix[]) {
    serial_m2s_buffer.oled_on                 = is_oled_on();
#    endif

#    ifdef RGB_MATRIX_ENABLE
    serial_m2s_buffer.is_rgb_matrix_suspended = rgb_matrix_get_suspend_state();
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    serial_m2s_buffer.led_matrix        = led_matrix_eeconfig;
    serial_m2s_buffer.led_suspend_state = led_matrix_get_suspend_state();
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    serial_m2s_buffer.rgb_matrix        = rgb_matrix_config;
    serial_m2s_buffer.rgb_suspend_state = rgb_matrix_get_suspend_state();
#    endif
#    ifndef DISABLE_SYNC_TIMER
    serial_m2s_buffer.sync_timer   = sync_timer_read32() + SYNC_TIMER_OFFSET;
#    endif

    return true;
}

void transport_slave(matrix_row_t matrix[]) {
void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
    transport_rgblight_slave();
#    ifndef DISABLE_SYNC_TIMER
    sync_timer_update(serial_m2s_buffer.sync_timer);
#    endif

    // TODO: if MATRIX_COLS > 8 change to pack()
    for (int i = 0; i < ROWS_PER_HAND; ++i) {
        serial_s2m_buffer.smatrix[i] = matrix[i];
        serial_s2m_buffer.smatrix[i] = slave_matrix[i];
#    ifdef SPLIT_TRANSPORT_MIRROR
        master_matrix[i]             = serial_m2s_buffer.mmatrix[i];
#    endif
    }

#    ifdef BACKLIGHT_ENABLE


@@ 518,8 589,13 @@ void transport_slave(matrix_row_t matrix[]) {
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(serial_m2s_buffer.is_rgb_matrix_suspended);
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    led_matrix_eeconfig = serial_m2s_buffer.led_matrix;
    led_matrix_set_suspend_state(serial_m2s_buffer.led_suspend_state);
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    rgb_matrix_config = serial_m2s_buffer.rgb_matrix;
    rgb_matrix_set_suspend_state(serial_m2s_buffer.rgb_suspend_state);
#    endif
}



@@ 534,7 610,7 @@ void trackball_set_cpi(uint16_t cpi) {
    if (!is_keyboard_left()) {
        pmw_set_cpi(cpi);
    } else {
        device_cpi = cpi * 1.5;
        device_cpi = cpi;
    }
}
#endif

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk => keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk +3 -2
@@ 11,17 11,18 @@ BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = no         # Console for debug
COMMAND_ENABLE = yes        # Commands for debug and configuration
COMMAND_ENABLE = no        # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
NKRO_ENABLE = yes            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no       # Enable Bluetooth
AUDIO_ENABLE = no           # Audio output
SWAP_HANDS_ENABLE = yes
POINTING_DEVICE_ENABLE = yes
MOUSE_SHARED_EP = no

SPLIT_KEYBOARD = yes
SPLIT_TRANSPORT = custom

M keyboards/keebio/iris/keymaps/drashna/keymap.c => keyboards/keebio/iris/keymaps/drashna/keymap.c +0 -8
@@ 91,14 91,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
  ),

  [_MODS] = LAYOUT_wrapper(
     _______, ___________________BLANK___________________,                       ___________________BLANK___________________, _______,
     _______, ___________________BLANK___________________,                       ___________________BLANK___________________, _______,
     _______, ___________________BLANK___________________,                       ___________________BLANK___________________, _______,
     KC_LSFT, ___________________BLANK___________________, _______,     _______, ___________________BLANK___________________, KC_RSFT,
                                       _______, _______, _______,         _______, _______, _______
  ),

  [_GAMEPAD] = LAYOUT_wrapper(
     KC_ESC,  KC_NO,   KC_1,    KC_2,    KC_3,    KC_4,                          _______, _______, _______, _______, _______, _______,
     KC_F1,   KC_K,    KC_Q,    KC_W,    KC_E,    KC_R,                          _______, _______, _______, _______, _______, _______,

M keyboards/kyria/keymaps/drashna/config.h => keyboards/kyria/keymaps/drashna/config.h +1 -2
@@ 20,7 20,6 @@

#ifdef OLED_DRIVER_ENABLE
#    define OLED_DISPLAY_128X64
#    define OLED_SCROLL_TIMEOUT_RIGHT 60000
#endif

#ifdef RGBLIGHT_ENABLE


@@ 30,7 29,7 @@
#    define RGBLIGHT_SAT_STEP 8
#    define RGBLIGHT_VAL_STEP 8
#    define RGBLIGHT_SPLIT
#    define RGBLIGHT_LAYERS
// #    define RGBLIGHT_LAYERS
#endif

#define KEYLOGGER_LENGTH 10

M keyboards/kyria/keymaps/drashna/keymap.c => keyboards/kyria/keymaps/drashna/keymap.c +0 -44
@@ 16,12 16,6 @@

#include "drashna.h"

uint8_t is_master;

#ifndef UNICODE_ENABLE
#    define UC(x) KC_NO
#endif

/*
 * The `LAYOUT_kyria_base` macro is a template to allow the use of identical
 * modifiers for the default layouts (eg QWERTY, Colemak, Dvorak, etc), so


@@ 96,13 90,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
    ),

    [_MODS] = LAYOUT_wrapper(
        _______, ___________________BLANK___________________,                                       ___________________BLANK___________________, _______,
        _______, ___________________BLANK___________________,                                       ___________________BLANK___________________, _______,
        KC_LSFT, ___________________BLANK___________________, _______, _______,   _______, _______, ___________________BLANK___________________, KC_RSFT,
                                   _______, _______, KC_LALT, _______, _______,   _______, _______, KC_RGUI, _______, _______
    ),

    [_GAMEPAD] = LAYOUT_wrapper(
        KC_ESC,  KC_K,    KC_Q,    KC_W,    KC_E,    KC_R,                                          _______, _______, _______, _______, _______, _______,
        KC_TAB,  KC_G,    KC_A,    KC_S,    KC_D,    KC_F,                                          _______, _______, _______, _______, _______, _______,


@@ 143,39 130,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
// clang-format on

bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
    if (record->event.pressed) {
#ifndef SPLIT_KEYBOARD
        if (keycode == RESET && !is_master) {
            return false;
        }
#endif
    }
    return true;
}

void matrix_init_keymap(void) { is_master = (uint8_t)is_keyboard_master(); }

#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; }

// clang-format off

#    ifndef SPLIT_TRANSPORT_MIRROR
void oled_driver_render_logo(void) {
    static const char PROGMEM kyria_logo[] = {
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,192,224,240,112,120, 56, 60, 28, 30, 14, 14, 14,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 14, 14, 14, 30, 28, 60, 56,120,112,240,224,192,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,192,224,240,124, 62, 31, 15,  7,  3,  1,128,192,224,240,120, 56, 60, 28, 30, 14, 14,  7,  7,135,231,127, 31,255,255, 31,127,231,135,  7,  7, 14, 14, 30, 28, 60, 56,120,240,224,192,128,  1,  3,  7, 15, 31, 62,124,240,224,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,240,252,255, 31,  7,  1,  0,  0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135,  1,  0,  0,255,255,  0,  0,  1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192,  0,  0,  1,  7, 31,255,252,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,255,255,255,  0,  0,  0,  0,  0,254,255,255,  1,  1,  7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30,  7,  1,  1,255,255,254,  0,  0,  0,  0,  0,255,255,255,  0,  0,  0,  0,255,255,  0,  0,192,192, 48, 48,  0,  0,240,240,  0,  0,  0,  0,  0,  0,240,240,  0,  0,240,240,192,192, 48, 48, 48, 48,192,192,  0,  0, 48, 48,243,243,  0,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48,192,192,  0,  0,  0,  0,  0,
        0,  0,  0,255,255,255,  0,  0,  0,  0,  0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31,  7,255,255,  7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127,  0,  0,  0,  0,  0,255,255,255,  0,  0,  0,  0, 63, 63,  3,  3, 12, 12, 48, 48,  0,  0,  0,  0, 51, 51, 51, 51, 51, 51, 15, 15,  0,  0, 63, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48, 48, 63, 63, 48, 48,  0,  0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63,  0,  0,  0,  0,  0,
        0,  0,  0,  0, 15, 63,255,248,224,128,  0,  0,  3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128,  0,  0,255,255,  0,  0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15,  3,  0,  0,128,224,248,255, 63, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  3,  7, 15, 62,124,248,240,224,192,128,  1,  3,  7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15,  7,  3,  1,128,192,224,240,248,124, 62, 15,  7,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  3,  7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15,  7,  3,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
    };
    oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
}
#    endif
#endif

#ifdef ENCODER_ENABLE

M keyboards/orthodox/keymaps/drashna/keymap.c => keyboards/orthodox/keymaps/drashna/keymap.c +0 -7
@@ 73,13 73,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
  ),


  [_MODS] = LAYOUT_wrapper(\
    _______, _______, _______, _______, _______, _______,                                                               _______, _______, _______, _______, _______, _______,
    _______, _______, _______, _______, _______, _______,          _______, _______,         _______, _______,          _______, _______, _______, _______, _______, _______,
    KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______
  ),

  [_LOWER] = LAYOUT_wrapper(\
    KC_TILD, _________________LOWER_L1__________________,                                                               _________________LOWER_R1__________________, KC_BSPC,
    KC_F11,  _________________LOWER_L2__________________,          _______, _______,         _______, _______,          _________________LOWER_R2__________________, KC_PIPE,

M keyboards/ploopyco/mouse/keymaps/drashna/rules.mk => keyboards/ploopyco/mouse/keymaps/drashna/rules.mk +1 -0
@@ 2,3 2,4 @@ USER_NAME := not_drashna

RGBLIGHT_ENABLE = yes
CONSOLE_ENABLE  = no
LTO_ENABLE = yes

M layouts/community/ergodox/drashna/keymap.c => layouts/community/ergodox/drashna/keymap.c +15 -29
@@ 19,9 19,6 @@
#ifdef UNICODEMAP_ENABLE
#    include "drashna_unicode.h"
#endif  // UNICODEMAP_ENABLE
#ifndef UNICODE_ENABLE
#    define UC(x) KC_NO
#endif

enum more_custom_keycodes {
    KC_SWAP_NUM = NEW_SAFE_RANGE,


@@ 199,20 196,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
  ),


// Reverts OSM(Shift) to normal Shifts. However, may not need since we fixed the issue with RDP (LOCAL RESOURCES)
  [_MODS] = LAYOUT_ergodox_pretty_wrapper(
             _______, _______, _______, _______, _______, _______, _______,                 _______, _______, _______, _______, _______, _______, _______,
             _______, _______, _______, _______, _______, _______, _______,                 _______, _______, _______, _______, _______, _______, _______,
             _______, _______, _______, _______, _______, _______,                                   _______, _______, _______, _______, _______, _______,
             KC_LSFT, _______, _______, _______, _______, _______, _______,                 _______, _______, _______, _______, _______, _______, KC_RSFT,
             _______, _______, _______, _______, _______,                                                     _______, _______, _______, _______, _______,
                                                          _______, _______,                 _______, _______,
                                                                   _______,                 _______,
                                                 _______, _______, _______,                 _______, _______, _______
            ),


/* Keymap 4: Customized Overwatch Layout
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.


@@ 303,7 286,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
             KC_MAKE, _______, _______, _______, _______, _______, UC_MOD,                  KC_NUKE, _________________ADJUST_R1_________________, KC_RST,
             VRSN,    _________________ADJUST_L1_________________, _______,                 _______, _________________ADJUST_R1_________________, EEP_RST,
             _______, _________________ADJUST_L2_________________,                                   _________________ADJUST_R2_________________, RGB_IDL,
             _______, _________________ADJUST_L3_________________, _______,                 _______, _________________ADJUST_R3_________________, TG(_MODS),
             _______, _________________ADJUST_L3_________________, _______,                 _______, _________________ADJUST_R3_________________, TG_MODS,
             _______, _______, _______, _______, _______,                                                     _______, _______, _______, _______, _______,
                                                          _______, _______,                 _______, _______,
                                                                   _______,                 _______,


@@ 466,9 449,12 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
        RGB_MATRIX_INDICATOR_SET_COLOR(25, 0x7A, 0x00, 0xFF);                                          // 3
    }


    if (userspace_config.rgb_layer_change) {
        bool mods_enabled = IS_LAYER_ON(_MODS);
#    if defined(RGBLIGHT_ENABLE)
    if (!userspace_config.rgb_layer_change)
#    else
    if (userspace_config.rgb_layer_change)
#    endif
    {
        switch (get_highest_layer(layer_state|default_layer_state)) {
            case _GAMEPAD:
                rgb_matrix_layer_helper(HSV_ORANGE, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);


@@ 486,28 472,28 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
                rgb_matrix_layer_helper(HSV_RED, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _QWERTY:
                rgb_matrix_layer_helper(HSV_CYAN, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_CYAN, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _COLEMAK:
                rgb_matrix_layer_helper(HSV_MAGENTA, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_MAGENTA, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _DVORAK:
                rgb_matrix_layer_helper(HSV_SPRINGGREEN, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_SPRINGGREEN, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _WORKMAN:
                rgb_matrix_layer_helper(HSV_GOLDENROD, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_GOLDENROD, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _NORMAN:
                rgb_matrix_layer_helper(HSV_CORAL, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_CORAL, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _MALTRON:
                rgb_matrix_layer_helper(HSV_YELLOW, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_YELLOW, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _EUCALYN:
                rgb_matrix_layer_helper(HSV_PINK, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_PINK, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            case _CARPLAX:
                rgb_matrix_layer_helper(HSV_BLUE, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                rgb_matrix_layer_helper(HSV_BLUE, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
        }
    }

M layouts/community/ergodox/drashna/rules.mk => layouts/community/ergodox/drashna/rules.mk +1 -1
@@ 1,5 1,5 @@
BOOTMAGIC_ENABLE   = lite
TAP_DANCE_ENABLE   = yes
TAP_DANCE_ENABLE   = no
COMMAND_ENABLE     = no  # Commands for debug and configuration
CONSOLE_ENABLE     = no
SPACE_CADET_ENABLE = no

M layouts/community/ortho_4x12/drashna/keymap.c => layouts/community/ortho_4x12/drashna/keymap.c +8 -16
@@ 115,13 115,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
  ),

  [_MODS] = LAYOUT_ortho_4x12_wrapper(
    _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
    _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
    KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, _______,
    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  ),

  [_LOWER] = LAYOUT_ortho_4x12_wrapper(
    KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_BSPC,
    KC_DEL,  _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE,


@@ 262,31 255,30 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
                rgb_matrix_layer_helper(HSV_RED, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                break;
            default: {
                bool mods_enabled = IS_LAYER_ON(_MODS);
                switch (get_highest_layer(default_layer_state)) {
                    case _QWERTY:
                        rgb_matrix_layer_helper(HSV_CYAN, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_CYAN, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                    case _COLEMAK:
                        rgb_matrix_layer_helper(HSV_MAGENTA, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_MAGENTA, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                    case _DVORAK:
                        rgb_matrix_layer_helper(HSV_SPRINGGREEN, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_SPRINGGREEN, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                    case _WORKMAN:
                        rgb_matrix_layer_helper(HSV_GOLDENROD, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_GOLDENROD, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                    case _NORMAN:
                        rgb_matrix_layer_helper(HSV_CORAL, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_CORAL, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                    case _MALTRON:
                        rgb_matrix_layer_helper(HSV_YELLOW, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_YELLOW, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                    case _EUCALYN:
                        rgb_matrix_layer_helper(HSV_PINK, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_PINK, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                    case _CARPLAX:
                        rgb_matrix_layer_helper(HSV_BLUE, mods_enabled, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        rgb_matrix_layer_helper(HSV_BLUE, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
                        break;
                }
                break;

M layouts/community/ortho_5x12/drashna/keymap.c => layouts/community/ortho_5x12/drashna/keymap.c +0 -8
@@ 67,14 67,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  _________________WORKMAN_L3________________, _________________WORKMAN_R3________________
),

[_MODS] = LAYOUT_ortho_5x12_wrapper(
  _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
  _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
  _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
  KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, _______,
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),

/* Lower
 * ,-----------------------------------------------------------------------------------.
 * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |

M layouts/community/split_3x6_3/drashna/keymap.c => layouts/community/split_3x6_3/drashna/keymap.c +1 -9
@@ 90,13 90,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
  ),

  [_MODS] = LAYOUT_split_3x6_3_wrapper(
      _______, ___________________BLANK___________________,                  ___________________BLANK___________________, _______,
      _______, ___________________BLANK___________________,                  ___________________BLANK___________________, _______,
      KC_LSFT, ___________________BLANK___________________,                  ___________________BLANK___________________, KC_RSFT,
                                     _______, _______, _______,        _______, _______, _______
  ),

  [_LOWER] = LAYOUT_split_3x6_3_wrapper(
    KC_F11,  _________________LOWER_L1__________________,                    _________________LOWER_R1__________________, KC_F11,
    KC_F12,  _________________LOWER_L2__________________,                    _________________LOWER_R2__________________, KC_PIPE,


@@ 179,7 172,6 @@ void check_default_layer(uint8_t mode, uint8_t type, uint8_t led_min, uint8_t le
}

void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
    if (!is_keyboard_master()) return;
    if (userspace_config.rgb_layer_change) {
        switch (get_highest_layer(layer_state)) {
            case _GAMEPAD:


@@ 198,7 190,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
                rgb_matrix_layer_helper(HSV_RED, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW, led_min, led_max);
                break;
            default: {
                check_default_layer(IS_LAYER_ON(_MODS), LED_FLAG_UNDERGLOW, led_min, led_max);
                check_default_layer(0, LED_FLAG_UNDERGLOW, led_min, led_max);
                break;
            }
        }

M layouts/community/split_3x6_3/drashna/rules.mk => layouts/community/split_3x6_3/drashna/rules.mk +8 -8
@@ 3,17 3,16 @@
#   change to "no" to disable the options, or define them in the Makefile in
#   the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE           = lite # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE            = no  # Mouse keys(+4700)
EXTRAKEY_ENABLE            = yes # Audio control and System control(+450)
CONSOLE_ENABLE             = no  # Console for debug(+400)
BOOTMAGIC_ENABLE           = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE            = no  # Mouse keys
EXTRAKEY_ENABLE            = yes # Audio control and System control
CONSOLE_ENABLE             = no  # Console for debug
COMMAND_ENABLE             = no  # Commands for debug and configuration
NKRO_ENABLE                = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE           = no  # Enable keyboard backlight functionality
MIDI_ENABLE                = no  # MIDI controls
AUDIO_ENABLE               = no  # Audio output on port C6
AUDIO_ENABLE               = no  # Audio output
UNICODE_ENABLE             = no  # Unicode
BLUETOOTH_ENABLE           = no  # Enable Bluetooth with the Adafruit EZ-Key HID
BLUETOOTH_ENABLE           = no  # Enable Bluetooth
RGBLIGHT_ENABLE            = no  # Enable WS2812 RGB underlight.
SWAP_HANDS_ENABLE          = no  # Enable one-hand typing



@@ 23,7 22,7 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
ifeq ($(strip $(KEYBOARD)), crkbd/rev1)
    OLED_DRIVER_ENABLE = yes
    RGB_MATRIX_ENABLE = yes
    HAPTIC_ENABLE = SOLENOID
    HAPTIC_ENABLE = no
    BOOTLOADER = qmk-dfu
endif



@@ 31,4 30,5 @@ ifeq ($(strip $(CTPC)), yes)
    HAPTIC_ENABLE = no
    WS2812_DRIVER = pwm # won't work without a patch to the ctpc mk file
    SERIAL_DRIVER = usart
    SWAP_HANDS_ENABLE = yes
endif

D layouts/community/split_3x6_3/drashna/ssd1306.c => layouts/community/split_3x6_3/drashna/ssd1306.c +0 -0
M users/drashna/config.h => users/drashna/config.h +9 -2
@@ 24,7 24,7 @@

#if defined(SPLIT_KEYBOARD)
#    define SPLIT_MODS_ENABLE
// #    define SPLIT_TRANSPORT_MIRROR
#    define SPLIT_TRANSPORT_MIRROR
#    define SERIAL_USE_MULTI_TRANSACTION
// #    define SPLIT_NUM_TRANSACTIONS_KB 2
#endif


@@ 56,6 56,8 @@
#    else
#        define RGBLIGHT_ANIMATIONS
#    endif
#    define RGBLIGHT_EFFECT_TWINKLE_LIFE  250
#    define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1/24
#endif  // RGBLIGHT_ENABLE

#ifdef RGB_MATRIX_ENABLE


@@ 115,6 117,9 @@
#        define OLED_UPDATE_INTERVAL 15
#    endif
#    define OLED_DISABLE_TIMEOUT
#    ifdef OLED_FONT_H
#        undef OLED_FONT_H
#    endif
#    define OLED_FONT_H "drashna_font.h"
#    define OLED_FONT_END 255
// #    define OLED_FONT_5X5


@@ 149,7 154,9 @@
#undef PERMISSIVE_HOLD
//#define TAPPING_FORCE_HOLD
//#define RETRO_TAPPING
#define TAPPING_TERM_PER_KEY
#ifndef KEYBOARD_kyria_rev1
#    define TAPPING_TERM_PER_KEY
#endif

#define FORCE_NKRO


M users/drashna/drashna.c => users/drashna/drashna.c +2 -1
@@ 164,6 164,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
        return state;
    }

    state = layer_state_set_keymap(state);
    state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
#if defined(RGBLIGHT_ENABLE)
    state = layer_state_set_rgb_light(state);


@@ 179,7 180,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
        }
    }
#endif
    return layer_state_set_keymap(state);
    return state;
}

__attribute__((weak)) layer_state_t default_layer_state_set_keymap(layer_state_t state) { return state; }

M users/drashna/drashna.h => users/drashna/drashna.h +0 -1
@@ 47,7 47,6 @@ enum userspace_layers {
    _MALTRON,
    _EUCALYN,
    _CARPLAX,
    _MODS, /* layer 8 */
    _GAMEPAD,
    _DIABLO,
    _MACROS,

M users/drashna/drashna_transport.c => users/drashna/drashna_transport.c +147 -52
@@ 21,6 21,7 @@
#include QMK_KEYBOARD_H

#define ROWS_PER_HAND (MATRIX_ROWS / 2)
#define SYNC_TIMER_OFFSET 2

#ifdef RGBLIGHT_ENABLE
#    include "rgblight.h"


@@ 37,19 38,33 @@ static pin_t encoders_pad[] = ENCODERS_PAD_A;
#endif

#ifdef POINTING_DEVICE_ENABLE
static int8_t split_mouse_x = 0, split_mouse_y = 0;
static uint16_t device_cpi    = 0;
static int8_t   split_mouse_x = 0, split_mouse_y = 0;
#endif

#ifdef OLED_DRIVER_ENABLE
#    include "oled_driver.h"
#endif

#if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
#    include "led_matrix.h"
#endif
#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
#    include "rgb_matrix.h"
#endif

#if defined(USE_I2C)

#    include "i2c_master.h"
#    include "i2c_slave.h"

typedef struct _I2C_slave_buffer_t {
#    ifndef DISABLE_SYNC_TIMER
    uint32_t sync_timer;
#    endif
#    ifdef SPLIT_TRANSPORT_MIRROR
    matrix_row_t mmatrix[ROWS_PER_HAND];
#    endif
    matrix_row_t smatrix[ROWS_PER_HAND];
#    ifdef SPLIT_MODS_ENABLE
    uint8_t real_mods;


@@ 70,19 85,29 @@ typedef struct _I2C_slave_buffer_t {
#    ifdef WPM_ENABLE
    uint8_t current_wpm;
#    endif
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    led_eeconfig_t led_matrix;
    bool           led_suspend_state;
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    rgb_config_t rgb_matrix;
    bool         rgb_suspend_state;
#    endif
    int8_t        mouse_x;
    int8_t        mouse_y;
    uint16_t      device_cpi;
    bool          oled_on;
    layer_state_t t_layer_state;
    layer_state_t t_default_layer_state;
    bool          is_rgb_matrix_suspended;
} __attribute__((packed)) I2C_slave_buffer_t;

static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg;

#    define I2C_BACKLIGHT_START offsetof(I2C_slave_buffer_t, backlight_level)
#    define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync)
#    define I2C_KEYMAP_START offsetof(I2C_slave_buffer_t, smatrix)
#    define I2C_KEYMAP_MASTER_START offsetof(I2C_slave_buffer_t, mmatrix)
#    define I2C_KEYMAP_SLAVE_START offsetof(I2C_slave_buffer_t, smatrix)
#    define I2C_SYNC_TIME_START offsetof(I2C_slave_buffer_t, sync_timer)
#    define I2C_REAL_MODS_START offsetof(I2C_slave_buffer_t, real_mods)
#    define I2C_WEAK_MODS_START offsetof(I2C_slave_buffer_t, weak_mods)
#    define I2C_ONESHOT_MODS_START offsetof(I2C_slave_buffer_t, oneshot_mods)


@@ 90,10 115,14 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re
#    define I2C_WPM_START offsetof(I2C_slave_buffer_t, current_wpm)
#    define I2C_MOUSE_X_START offsetof(I2C_slave_buffer_t, mouse_x)
#    define I2C_MOUSE_Y_START offsetof(I2C_slave_buffer_t, mouse_y)
#    define I2C_MOUSE_DPI_START offsetof(I2C_slave_buffer_t, device_cpi)
#    define I2C_OLED_ON_START offsetof(I2C_slave_buffer_t, oled_on)
#    define I2C_LAYER_STATE_START offsetof(I2C_slave_buffer_t, t_layer_state)
#    define I2C_DEFAULT_LAYER_STATE_START offsetof(I2C_slave_buffer_t, t_default_layer_state)
#    define I2C_RGB_MATRIX_SUSPEND_START offsetof(I2C_slave_buffer_t, is_rgb_matrix_suspended)
#    define I2C_LED_MATRIX_START offsetof(I2C_slave_buffer_t, led_matrix)
#    define I2C_LED_SUSPEND_START offsetof(I2C_slave_buffer_t, led_suspend_state)
#    define I2C_RGB_MATRIX_START offsetof(I2C_slave_buffer_t, rgb_matrix)
#    define I2C_RGB_SUSPEND_START offsetof(I2C_slave_buffer_t, rgb_suspend_state)

#    define TIMEOUT 100



@@ 102,9 131,11 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re
#    endif

// Get rows from other half over i2c
bool transport_master(matrix_row_t matrix[]) {
    i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_START, (void *)matrix, sizeof(i2c_buffer->smatrix), TIMEOUT);

bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
    i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_SLAVE_START, (void *)slave_matrix, sizeof(i2c_buffer->smatrix), TIMEOUT);
#    ifdef SPLIT_TRANSPORT_MIRROR
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_MASTER_START, (void *)master_matrix, sizeof(i2c_buffer->mmatrix), TIMEOUT);
#    endif
    // write backlight info
#    ifdef BACKLIGHT_ENABLE
    uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0;


@@ 147,6 178,12 @@ bool transport_master(matrix_row_t matrix[]) {
        i2c_readReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_Y_START, (void *)&i2c_buffer->mouse_y, sizeof(i2c_buffer->mouse_y), TIMEOUT);
        temp_report.y = i2c_buffer->mouse_y;
        pointing_device_set_report(temp_report);

        if (device_cpi != i2c_buffer->device_cpi) {
            if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_DPI_START, (void *)&device_cpi, sizeof(device_cpi), TIMEOUT) >= 0) {
                i2c_buffer->device_cpi = device_cpi
            }
        }
    }
#    endif



@@ 188,29 225,42 @@ bool transport_master(matrix_row_t matrix[]) {
    }

#    ifdef OLED_DRIVER_ENABLE
    bool is_oled = is_oled_on();
    if (is_oled != i2c_buffer->oled_on) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LAYER_STATE_START, (void *)&is_oled, sizeof(is_oled), TIMEOUT) >= 0) {
            i2c_buffer->oled_on = is_oled;
    bool is_oled_on = is_oled_on();
    if (is_oled_on != i2c_buffer->oled_on) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LAYER_STATE_START, (void *)&is_oled_on, sizeof(is_oled_on), TIMEOUT) >= 0) {
            i2c_buffer->oled_on = is_oled_on;
        }
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    bool sus_state = rgb_matrix_get_suspend_state();
    if (sus_state != i2c_buffer->is_rgb_matrix_suspended) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_MATRIX_SUSPEND_START, (void *)&sus_state, sizeof(sus_state), TIMEOUT) >= 0) {
            i2c_buffer->is_rgb_matrix_suspended = sus_state;
        }
    }
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_MATRIX_START, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix), TIMEOUT);
    bool suspend_state = led_matrix_get_suspend_state();
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LED_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->led_suspend_state), TIMEOUT);
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_MATRIX_START, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix), TIMEOUT);
    bool suspend_state = rgb_matrix_get_suspend_state();
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_SUSPEND_START, (void *)suspend_state, sizeof(i2c_buffer->rgb_suspend_state), TIMEOUT);
#    endif

#    ifndef DISABLE_SYNC_TIMER
    i2c_buffer->sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET;
    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_SYNC_TIME_START, (void *)&i2c_buffer->sync_timer, sizeof(i2c_buffer->sync_timer), TIMEOUT);
#    endif

    return true;
}

void transport_slave(matrix_row_t matrix[]) {
void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
#    ifndef DISABLE_SYNC_TIMER
    sync_timer_update(i2c_buffer->sync_timer);
#    endif
    // Copy matrix to I2C buffer
    memcpy((void *)i2c_buffer->smatrix, (void *)matrix, sizeof(i2c_buffer->smatrix));
    memcpy((void *)i2c_buffer->smatrix, (void *)slave_matrix, sizeof(i2c_buffer->smatrix));
#    ifdef SPLIT_TRANSPORT_MIRROR
    memcpy((void *)master_matrix, (void *)i2c_buffer->mmatrix, sizeof(i2c_buffer->mmatrix));
#    endif

// Read Backlight Info
#    ifdef BACKLIGHT_ENABLE


@@ 235,6 285,11 @@ void transport_slave(matrix_row_t matrix[]) {

#    ifdef POINTING_DEVICE_ENABLE
    if (!is_keyboard_left()) {
        static uint16_t cpi;
        if (cpi != i2c_buffer->device_cpi) {
            cpi = i2c_buffer->device_cpi;
            pmw_set_cpi(cpi);
        }
        i2c_buffer->mouse_x = split_mouse_x;
        i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_X_START, (void *)&i2c_buffer->mouse_x, sizeof(i2c_buffer->mouse_x), TIMEOUT);
        i2c_buffer->mouse_y = split_mouse_y;


@@ 266,8 321,13 @@ void transport_slave(matrix_row_t matrix[]) {
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(i2c_buffer->is_rgb_matrix_suspended);
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    memcpy((void *)i2c_buffer->led_matrix, (void *)led_matrix_eeconfig, sizeof(i2c_buffer->led_matrix));
    led_matrix_set_suspend_state(i2c_buffer->led_suspend_state);
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    memcpy((void *)i2c_buffer->rgb_matrix, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix));
    rgb_matrix_set_suspend_state(i2c_buffer->rgb_suspend_state);
#    endif
}



@@ 283,30 343,44 @@ typedef struct _Serial_s2m_buffer_t {
    // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack
    matrix_row_t smatrix[ROWS_PER_HAND];
#    ifdef ENCODER_ENABLE
    uint8_t encoder_state[NUMBER_OF_ENCODERS];
    uint8_t      encoder_state[NUMBER_OF_ENCODERS];
#    endif
    int8_t mouse_x;
    int8_t mouse_y;
    int8_t       mouse_x;
    int8_t       mouse_y;
} __attribute__((packed)) Serial_s2m_buffer_t;

typedef struct _Serial_m2s_buffer_t {
#    ifdef SPLIT_MODS_ENABLE
    uint8_t real_mods;
    uint8_t weak_mods;
    uint8_t       real_mods;
    uint8_t       weak_mods;
#        ifndef NO_ACTION_ONESHOT
    uint8_t oneshot_mods;
    uint8_t       oneshot_mods;
#        endif
#    endif
#    ifndef DISABLE_SYNC_TIMER
    uint32_t     sync_timer;
#    endif
#    ifdef SPLIT_TRANSPORT_MIRROR
    matrix_row_t mmatrix[ROWS_PER_HAND];
#    endif
#    ifdef BACKLIGHT_ENABLE
    uint8_t backlight_level;
    uint8_t       backlight_level;
#    endif
#    ifdef WPM_ENABLE
    uint8_t current_wpm;
    uint8_t       current_wpm;
#    endif
    uint16_t      device_cpi;
    bool          oled_on;
    layer_state_t t_layer_state;
    layer_state_t t_default_layer_state;
    bool          is_rgb_matrix_suspended;
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    led_eeconfig_t led_matrix;
    bool           led_suspend_state;
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    rgb_config_t   rgb_matrix;
    bool           rgb_suspend_state;
#    endif
} __attribute__((packed)) Serial_m2s_buffer_t;

#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)


@@ 383,7 457,7 @@ void transport_rgblight_slave(void) {
#        define transport_rgblight_slave()
#    endif

bool transport_master(matrix_row_t matrix[]) {
bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
#    ifndef SERIAL_USE_MULTI_TRANSACTION
    if (soft_serial_transaction() != TRANSACTION_END) {
        return false;


@@ 397,7 471,10 @@ bool transport_master(matrix_row_t matrix[]) {

    // TODO:  if MATRIX_COLS > 8 change to unpack()
    for (int i = 0; i < ROWS_PER_HAND; ++i) {
        matrix[i] = serial_s2m_buffer.smatrix[i];
        slave_matrix[i] = serial_s2m_buffer.smatrix[i];
#    ifdef SPLIT_TRANSPORT_MIRROR
        serial_m2s_buffer.mmatrix[i] = master_matrix[i];
#    endif
    }

#    ifdef BACKLIGHT_ENABLE


@@ 411,12 488,12 @@ bool transport_master(matrix_row_t matrix[]) {

#    ifdef WPM_ENABLE
    // Write wpm to slave
    serial_m2s_buffer.current_wpm = get_current_wpm();
    serial_m2s_buffer.current_wpm  = get_current_wpm();
#    endif

#    ifdef SPLIT_MODS_ENABLE
    serial_m2s_buffer.real_mods = get_mods();
    serial_m2s_buffer.weak_mods = get_weak_mods();
    serial_m2s_buffer.real_mods    = get_mods();
    serial_m2s_buffer.weak_mods    = get_weak_mods();
#        ifndef NO_ACTION_ONESHOT
    serial_m2s_buffer.oneshot_mods = get_oneshot_mods();
#        endif


@@ 428,28 505,43 @@ bool transport_master(matrix_row_t matrix[]) {
        temp_report.x              = serial_s2m_buffer.mouse_x;
        temp_report.y              = serial_s2m_buffer.mouse_y;
        pointing_device_set_report(temp_report);
        serial_m2s_buffer.device_cpi = device_cpi;
    }
#    endif

    serial_m2s_buffer.t_layer_state         = layer_state;
    serial_m2s_buffer.t_default_layer_state = default_layer_state;
    serial_m2s_buffer.t_layer_state           = layer_state;
    serial_m2s_buffer.t_default_layer_state   = default_layer_state;
#    ifdef OLED_DRIVER_ENABLE
    serial_m2s_buffer.oled_on = is_oled_on();
    serial_m2s_buffer.oled_on                 = is_oled_on();
#    endif

#    ifdef RGB_MATRIX_ENABLE
    serial_m2s_buffer.is_rgb_matrix_suspended = rgb_matrix_get_suspend_state();
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    serial_m2s_buffer.led_matrix        = led_matrix_eeconfig;
    serial_m2s_buffer.led_suspend_state = led_matrix_get_suspend_state();
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    serial_m2s_buffer.rgb_matrix        = rgb_matrix_config;
    serial_m2s_buffer.rgb_suspend_state = rgb_matrix_get_suspend_state();
#    endif

#    ifndef DISABLE_SYNC_TIMER
    serial_m2s_buffer.sync_timer   = sync_timer_read32() + SYNC_TIMER_OFFSET;
#    endif
    return true;
}

void transport_slave(matrix_row_t matrix[]) {
void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
    transport_rgblight_slave();
#    ifndef DISABLE_SYNC_TIMER
    sync_timer_update(serial_m2s_buffer.sync_timer);
#    endif

    // TODO: if MATRIX_COLS > 8 change to pack()
    for (int i = 0; i < ROWS_PER_HAND; ++i) {
        serial_s2m_buffer.smatrix[i] = matrix[i];
        serial_s2m_buffer.smatrix[i] = slave_matrix[i];
#    ifdef SPLIT_TRANSPORT_MIRROR
        master_matrix[i]             = serial_m2s_buffer.mmatrix[i];
#    endif
    }

#    ifdef BACKLIGHT_ENABLE


@@ 474,6 566,11 @@ void transport_slave(matrix_row_t matrix[]) {

#    ifdef POINTING_DEVICE_ENABLE
    if (!is_keyboard_left()) {
        static uint16_t cpi;
        if (cpi != serial_m2s_buffer.device_cpi) {
            cpi = serial_m2s_buffer.device_cpi;
            pmw_set_cpi(cpi);
        }
        serial_s2m_buffer.mouse_x = split_mouse_x;
        serial_s2m_buffer.mouse_y = split_mouse_y;
    }


@@ 493,16 590,14 @@ void transport_slave(matrix_row_t matrix[]) {
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(serial_m2s_buffer.is_rgb_matrix_suspended);
#    if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
    led_matrix_eeconfig = serial_m2s_buffer.led_matrix;
    led_matrix_set_suspend_state(serial_m2s_buffer.led_suspend_state);
#    endif
#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
    rgb_matrix_config = serial_m2s_buffer.rgb_matrix;
    rgb_matrix_set_suspend_state(serial_m2s_buffer.rgb_suspend_state);
#    endif
}

#endif

#ifdef POINTING_DEVICE_ENABLE
void master_mouse_send(int8_t x, int8_t y) {
    split_mouse_x = x;
    split_mouse_y = y;
}
#endif

M users/drashna/oled_stuff.c => users/drashna/oled_stuff.c +47 -8
@@ 15,7 15,6 @@
 */

#include "drashna.h"
#include <stdio.h>

#ifndef KEYLOGGER_LENGTH
// #    ifdef OLED_DISPLAY_128X64


@@ 158,6 157,19 @@ void render_keylock_status(uint8_t led_usb_state) {
    oled_advance_page(true);
#endif
}
void render_matrix_scan_rate(void) {
#ifdef DEBUG_MATRIX_SCAN_RATE
    char matrix_rate[5];
    uint16_t n = get_matrix_scan_rate();
    matrix_rate[4] = '\0';
    matrix_rate[3] = '0' + n % 10;
    matrix_rate[2] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' ';
    matrix_rate[1] =  n / 10 ? '0' + n / 10 : ' ';
    matrix_rate[0] = ' ';
    oled_write_P(PSTR("MS:"), false);
    oled_write(matrix_rate, false);
#endif
}

void render_mod_status(uint8_t modifiers) {
    static const char PROGMEM mod_status[5][3] = {{0xE8, 0xE9, 0}, {0xE4, 0xE5, 0}, {0xE6, 0xE7, 0}, {0xEA, 0xEB, 0}, {0xEC, 0xED, 0}};


@@ 169,11 181,17 @@ void render_mod_status(uint8_t modifiers) {
#endif
    oled_write_P(mod_status[2], (modifiers & MOD_MASK_ALT));
    oled_write_P(mod_status[1], (modifiers & MOD_MASK_CTRL));

    render_matrix_scan_rate();
#if defined(OLED_DISPLAY_128X64)
    oled_advance_page(true);
#endif
}

#ifdef SWAP_HANDS_ENABLE
extern bool swap_hands;
#endif

void render_bootmagic_status(void) {
    /* Show Ctrl-Gui Swap options */
    static const char PROGMEM logo[][2][3] = {


@@ 209,7 227,7 @@ void render_bootmagic_status(void) {
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NKRO), keymap_config.nkro);
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NOGUI), !keymap_config.no_gui);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NOGUI), keymap_config.no_gui);
#ifdef OLED_DISPLAY_128X64
    oled_advance_page(true);
    oled_write_P(PSTR("Magic"), false);


@@ 221,10 239,11 @@ void render_bootmagic_status(void) {
    }
#endif
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_GRV), keymap_config.swap_grave_esc);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_ONESHOT), !is_oneshot_enabled());
#ifdef SWAP_HANDS_ENABLE
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_CAPS), keymap_config.swap_control_capslock);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_SWAP), swap_hands);
#endif
#ifdef OLED_DISPLAY_128X64
    oled_advance_page(true);
#endif


@@ 282,12 301,22 @@ __attribute__((weak)) void oled_driver_render_logo(void) {

void render_wpm(void) {
#ifdef WPM_ENABLE
    uint8_t n = get_current_wpm();
#    ifdef OLED_DISPLAY_128X64
    char wpm_counter[4];
    wpm_counter[3] = '\0';
    wpm_counter[2] = '0' + n % 10;
    wpm_counter[1] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' ';
    wpm_counter[0] = n / 10 ? '0' + n / 10 : ' ';
#    else
    char wpm_counter[6];
#    endif
    snprintf(wpm_counter, sizeof(wpm_counter), "%3u", get_current_wpm());
    wpm_counter[5] = '\0';
    wpm_counter[4] = '0' + n % 10;
    wpm_counter[3] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' ';
    wpm_counter[2] = n / 10 ? '0' + n / 10 : ' ';
    wpm_counter[1] = ' ';
    wpm_counter[0] = ' ';
    #    endif
    oled_write_P(PSTR(OLED_RENDER_WPM_COUNTER), false);
    oled_write(wpm_counter, false);
#endif


@@ 299,7 328,13 @@ extern uint16_t          dpi_array[];

void render_pointing_dpi_status(void) {
    char dpi_status[6];
    snprintf(dpi_status, sizeof(dpi_status), "%5u", dpi_array[keyboard_config.dpi_config]);
    uint16_t n = dpi_array[keyboard_config.dpi_config];
    dpi_status[5] = '\0';
    dpi_status[4] = '0' + n % 10;
    dpi_status[3] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' ';
    dpi_status[2] = ( n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' ';
    dpi_status[1] =  n / 10 ? '0' + n / 10 : ' ';
    dpi_status[0] = ' ';
    oled_write_P(PSTR("  DPI: "), false);
    oled_write(dpi_status, false);
}


@@ 320,7 355,11 @@ void render_status_secondary(void) {
void render_status_main(void) {
#if defined(OLED_DISPLAY_128X64)
    oled_driver_render_logo();
#    ifdef DEBUG_MATRIX_SCAN_RATE
    render_matrix_scan_rate();
#    else
    render_wpm();
#    endif
#    ifdef KEYBOARD_handwired_dactyl_manuform_5x6_right_trackball
    render_pointing_dpi_status();
#    endif

M users/drashna/oled_stuff.h => users/drashna/oled_stuff.h +4 -0
@@ 57,6 57,8 @@ extern uint32_t oled_timer;
#    define OLED_RENDER_BOOTMAGIC_NKRO  "NKRO"
#    define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI"
#    define OLED_RENDER_BOOTMAGIC_GRV   "GRV"
#    define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT"
#    define OLED_RENDER_BOOTMAGIC_SWAP "SWAP"
#    define OLED_RENDER_BOOTMAGIC_CAPS  "CAPS"

#    define OLED_RENDER_USER_NAME "USER:"


@@ 99,6 101,8 @@ extern uint32_t oled_timer;
#    define OLED_RENDER_BOOTMAGIC_NKRO  "NKRO"
#    define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI"
#    define OLED_RENDER_BOOTMAGIC_GRV   "GRV"
#    define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT"
#    define OLED_RENDER_BOOTMAGIC_SWAP "SWAP"
#    define OLED_RENDER_BOOTMAGIC_CAPS  "CAPS"

#    define OLED_RENDER_USER_NAME "USER:"

M users/drashna/pimoroni_trackball.c => users/drashna/pimoroni_trackball.c +2 -2
@@ 33,7 33,7 @@ static float   precisionSpeed = 1;

void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) {
    uint8_t data[] = {0x00, red, green, blue, white};
    i2c_transmit(TRACKBALL_WRITE, data, sizeof(data), I2C_TIMEOUT);
    i2c_transmit(TRACKBALL_ADDRESS << 1, data, sizeof(data), I2C_TIMEOUT);
}

int16_t mouse_offset(uint8_t positive, uint8_t negative, int16_t scale) {


@@ 94,7 94,7 @@ void pointing_device_task(void) {
    static bool     debounce;
    static uint16_t debounce_timer;
    uint8_t         state[5] = {};
    if (i2c_readReg(TRACKBALL_WRITE, 0x04, state, 5, I2C_TIMEOUT) == I2C_STATUS_SUCCESS) {
    if (i2c_readReg(TRACKBALL_ADDRESS << 1, 0x04, state, 5, I2C_TIMEOUT) == I2C_STATUS_SUCCESS) {
        if (!state[4] && !debounce) {
            if (scrolling) {
#ifdef PIMORONI_TRACKBALL_INVERT_X

M users/drashna/process_records.h => users/drashna/process_records.h +1 -1
@@ 53,7 53,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
#define LOWER   MO(_LOWER)
#define RAISE   MO(_RAISE)
#define ADJUST  MO(_ADJUST)
#define TG_MODS TG(_MODS)
#define TG_MODS OS_TOGG
#define TG_GAME TG(_GAMEPAD)
#define TG_DBLO TG(_DIABLO)
#define OS_LWR  OSL(_LOWER)

M users/drashna/rgb_matrix_stuff.c => users/drashna/rgb_matrix_stuff.c +2 -2
@@ 62,7 62,7 @@ __attribute__((weak)) void rgb_matrix_indicator_keymap(void) {}

void matrix_scan_rgb_matrix(void) {
#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
    if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && timer_elapsed32(hypno_timer) > 15000) {
    if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && sync_timer_elapsed32(hypno_timer) > 15000) {
        rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
    }
#endif


@@ 79,7 79,7 @@ void keyboard_post_init_rgb_matrix(void) {

bool process_record_user_rgb_matrix(uint16_t keycode, keyrecord_t *record) {
#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
    hypno_timer = timer_read32();
    hypno_timer = sync_timer_read32();
    if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) {
        rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
    }

M users/drashna/rgb_stuff.c => users/drashna/rgb_stuff.c +17 -20
@@ 32,7 32,7 @@ void scan_rgblight_fadeout(void) {  // Don't effing change this function .... rg
    bool litup = false;

    for (uint8_t light_index = 0; light_index < RGBLED_NUM; ++light_index) {
        if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) {
        if (lights[light_index].enabled && sync_timer_elapsed(lights[light_index].timer) > 10) {
            rgblight_fadeout *light = &lights[light_index];
            litup                   = true;



@@ 41,7 41,7 @@ void scan_rgblight_fadeout(void) {  // Don't effing change this function .... rg
                if (get_highest_layer(layer_state) == 0) {
                    sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]);
                }
                light->timer = timer_read();
                light->timer = sync_timer_read();
            } else {
                if (light->enabled && get_highest_layer(layer_state) == 0) {
                    rgblight_sethsv_default_helper(light_index);


@@ 86,7 86,7 @@ void start_rgb_light(void) {

    rgblight_fadeout *light = &lights[light_index];
    light->enabled          = true;
    light->timer            = timer_read();
    light->timer            = sync_timer_read();
    light->life             = 0xC0 + rand() % 0x40;

    light->hue = rgblight_get_hue() + (rand() % 0xB4) - 0x54;


@@ 149,11 149,11 @@ void matrix_scan_rgb_light(void) {

#    if defined(RGBLIGHT_STARTUP_ANIMATION)
    if (is_rgblight_startup && is_keyboard_master()) {
        if (timer_elapsed(rgblight_startup_loop_timer) > 10) {
        if (sync_timer_elapsed(rgblight_startup_loop_timer) > 10) {
            static uint8_t counter;
            counter++;
            rgblight_sethsv_noeeprom((counter + old_hue) % 255, 255, 255);
            rgblight_startup_loop_timer = timer_read();
            rgblight_startup_loop_timer = sync_timer_read();
            if (counter == 255) {
                is_rgblight_startup = false;
                if (!is_enabled) {


@@ 177,14 177,11 @@ void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mo
layer_state_t layer_state_set_rgb_light(layer_state_t state) {
#    ifdef RGBLIGHT_ENABLE
    if (userspace_config.rgb_layer_change) {
        uint8_t mode = layer_state_cmp(state, _MODS) ? RGBLIGHT_MODE_BREATHING : RGBLIGHT_MODE_STATIC_LIGHT;
        switch (get_highest_layer(state | default_layer_state)) {
            case _MACROS:
#        ifdef RGBLIGHT_EFFECT_TWINKLE
                rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_TWINKLE + 5);
#        else
                rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3);
#        endif
            case _MACROS: // mouse
                if (!layer_state_cmp(state, _GAMEPAD) && !layer_state_cmp(state, _DIABLO)) {
                    rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3);
                }
                break;
            case _MEDIA:
                rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1);


@@ 205,28 202,28 @@ layer_state_t layer_state_set_rgb_light(layer_state_t state) {
                rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2);
                break;
            case _COLEMAK:
                rgblight_set_hsv_and_mode(HSV_MAGENTA, mode);
                rgblight_set_hsv_and_mode(HSV_MAGENTA, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
            case _DVORAK:
                rgblight_set_hsv_and_mode(HSV_SPRINGGREEN, mode);
                rgblight_set_hsv_and_mode(HSV_SPRINGGREEN, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
            case _WORKMAN:
                rgblight_set_hsv_and_mode(HSV_GOLDENROD, mode);
                rgblight_set_hsv_and_mode(HSV_GOLDENROD, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
            case _NORMAN:
                rgblight_set_hsv_and_mode(HSV_CORAL, mode);
                rgblight_set_hsv_and_mode(HSV_CORAL, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
            case _MALTRON:
                rgblight_set_hsv_and_mode(HSV_YELLOW, mode);
                rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
            case _EUCALYN:
                rgblight_set_hsv_and_mode(HSV_PINK, mode);
                rgblight_set_hsv_and_mode(HSV_PINK, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
            case _CARPLAX:
                rgblight_set_hsv_and_mode(HSV_BLUE, mode);
                rgblight_set_hsv_and_mode(HSV_BLUE, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
            default:
                rgblight_set_hsv_and_mode(HSV_CYAN, mode);
                rgblight_set_hsv_and_mode(HSV_CYAN, RGBLIGHT_MODE_STATIC_LIGHT);
                break;
        }
    }

M users/drashna/rules.mk => users/drashna/rules.mk +46 -31
@@ 16,29 16,37 @@ ifneq ($(strip $(NO_SECRETS)), yes)
    endif
endif

CUSTOM_TAP_DANCE ?= yes
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
    SRC += tap_dances.c
    ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
        SRC += tap_dances.c
    endif
endif

CUSTOM_RGBLIGHT ?= yes
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
    SRC += rgb_stuff.c
    ifeq ($(strip $(RGBLIGHT_TWINKLE)), yes)
        OPT_DEFS += -DRGBLIGHT_TWINKLE
    endif
    ifeq ($(strip $(RGBLIGHT_NOEEPROM)), yes)
        OPT_DEFS += -DRGBLIGHT_NOEEPROM
    endif
    ifeq ($(strip $(RGBLIGHT_STARTUP_ANIMATION)), yes)
        OPT_DEFS += -DRGBLIGHT_STARTUP_ANIMATION
    ifeq ($(strip $(CUSTOM_RGBLIGHT)), yes)
        SRC += rgb_stuff.c
        ifeq ($(strip $(RGBLIGHT_TWINKLE)), yes)
            OPT_DEFS += -DRGBLIGHT_TWINKLE
        endif
        ifeq ($(strip $(RGBLIGHT_NOEEPROM)), yes)
            OPT_DEFS += -DRGBLIGHT_NOEEPROM
        endif
        ifeq ($(strip $(RGBLIGHT_STARTUP_ANIMATION)), yes)
            OPT_DEFS += -DRGBLIGHT_STARTUP_ANIMATION
        endif
    endif
endif

RGB_MATRIX_ENABLE ?= no
ifneq ($(strip $(RGB_MATRIX_ENABLE)), no)
    SRC += rgb_matrix_stuff.c
CUSTOM_RGB_MATRIX ?= yes
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
    ifeq ($(strip $(CUSTOM_RGB_MATRIX)), yes)
        SRC += rgb_matrix_stuff.c
    endif
endif


KEYLOGGER_ENABLE ?= no
ifdef CONSOLE_ENABLE
    ifeq ($(strip $(KEYLOGGER_ENABLE)), yes)
        OPT_DEFS += -DKEYLOGGER_ENABLE


@@ 56,8 64,11 @@ ifeq ($(strip $(PROTOCOL)), VUSB)
    NKRO_ENABLE       = no
endif

CUSTOM_OLED_DRIVER ?= yes
ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
    SRC += oled_stuff.c
    ifeq ($(strip $(CUSTOM_OLED_DRIVER)), yes)
        SRC += oled_stuff.c
    endif
endif

ifeq ($(strip $(PIMORONI_TRACKBALL_ENABLE)), yes)


@@ 67,26 78,30 @@ ifeq ($(strip $(PIMORONI_TRACKBALL_ENABLE)), yes)
    QUANTUM_LIB_SRC += i2c_master.c
endif


CUSTOM_SPLIT_TRANSPORT ?= yes
ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
    ifneq ($(strip $(SPLIT_TRANSPORT)), custom)
        SPLIT_TRANSPORT = custom
        QUANTUM_LIB_SRC += drashna_transport.c
        OPT_DEFS += -DDRASHNA_CUSTOM_TRANSPORT
        # Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
        ifeq ($(PLATFORM),AVR)
            ifneq ($(NO_I2C),yes)
                QUANTUM_LIB_SRC += i2c_master.c \
                                   i2c_slave.c
        ifeq ($(strip $(CUSTOM_SPLIT_TRANSPORT)), yes)
            SPLIT_TRANSPORT = custom
            QUANTUM_LIB_SRC += drashna_transport.c
            OPT_DEFS += -DDRASHNA_CUSTOM_TRANSPORT
            # Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
            ifeq ($(PLATFORM),AVR)
                ifneq ($(NO_I2C),yes)
                    QUANTUM_LIB_SRC += i2c_master.c \
                                    i2c_slave.c
                endif
            endif
        endif

        SERIAL_DRIVER ?= bitbang
        OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
        ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
            QUANTUM_LIB_SRC += serial.c
        else
            QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
            SERIAL_DRIVER ?= bitbang
            OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
            ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
                QUANTUM_LIB_SRC += serial.c
            else
                QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
            endif
        endif
    endif
endif

# DEBUG_MATRIX_SCAN_RATE_ENABLE = api