~ruther/qmk_firmware

146b042514569acac33b616aa278d293af594f49 — Drashna Jael're 4 years ago 2abfa62 + 0b69e4d
Merge remote-tracking branch 'origin/master' into develop
44 files changed, 2513 insertions(+), 752 deletions(-)

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/pointer_transport.c
M keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk
M keyboards/keebio/iris/keymaps/drashna/keymap.c
M keyboards/keebio/viterbi/keymaps/drashna/keymap.c
M keyboards/kyria/keymaps/drashna/config.h
M keyboards/kyria/keymaps/drashna/keymap.c
M keyboards/kyria/keymaps/drashna/rules.mk
M keyboards/moonlander/keymaps/drashna/keymap.c
M keyboards/orthodox/keymaps/drashna/keymap.c
A keyboards/splitkb/zima/keymaps/drashna/config.h
A keyboards/splitkb/zima/keymaps/drashna/keymap.c
A keyboards/splitkb/zima/keymaps/drashna/readme.md
A keyboards/splitkb/zima/keymaps/drashna/rules.mk
M layouts/community/ergodox/drashna/keymap.c
M layouts/community/ortho_4x12/drashna/keymap.c
M layouts/community/ortho_5x12/drashna/keymap.c
M layouts/community/ortho_5x12/drashna/rules.mk
A layouts/community/split_3x6_3/drashna/chconf.h
M layouts/community/split_3x6_3/drashna/config.h
M layouts/community/split_3x6_3/drashna/keymap.c
M layouts/community/split_3x6_3/drashna/mcuconf.h
M layouts/community/split_3x6_3/drashna/rules.mk
M users/drashna/config.h
M users/drashna/drashna.c
M users/drashna/drashna.h
A users/drashna/drashna_font.h
A users/drashna/drashna_transport.c
D users/drashna/font_gmk_bad.h
D users/drashna/hue_manitee_font.h
M users/drashna/oled_stuff.c
M users/drashna/oled_stuff.h
M users/drashna/pimoroni_trackball.h
M users/drashna/process_records.c
M users/drashna/process_records.h
M users/drashna/rgb_stuff.c
M users/drashna/rules.mk
M users/drashna/wrappers.h
M keyboards/c39/keymaps/drashna/keymap.c => keyboards/c39/keymaps/drashna/keymap.c +3 -2
@@ 24,14 24,15 @@
 * of use. K## is a placeholder to pass through the individual keycodes
 */
// clang-format off
#define LAYOUT_wrapper(...)            LAYOUT(__VA_ARGS__)
#define LAYOUT_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_wrapper( \
    KC_ESC,  K01,    K02,     K03,      K04,     K05,     KC_NO,   K06,     K07,     K08,     K09,     K0A,     KC_DEL, \
    ALT_T(KC_TAB), K11, K12,  K13,      K14,     K15,     KC_BSPC, K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
    ALT_T(KC_TAB), K11, K12,  K13,      K14,     K15,     KC_BSPC, K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
    KC_MLSF, CTL_T(K21), K22, K23,   K24, LT(_LOWER,K25), KC_SPC, LT(_RAISE,K26), K27, K28,   K29, RCTL_T(K2A), KC_ENT \
  )
#define LAYOUT_base_wrapper(...)       LAYOUT_base(__VA_ARGS__)

M keyboards/gergo/keymaps/drashna/keymap.c => keyboards/gergo/keymaps/drashna/keymap.c +3 -2
@@ 24,14 24,15 @@
 * of use. K## is a placeholder to pass through the individual keycodes
 */
// clang-format off
#define LAYOUT_gergo_wrapper(...)            LAYOUT_gergo(__VA_ARGS__)
#define LAYOUT_gergo_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_gergo_wrapper( \
    KC_ESC,  K01,    K02,     K03,      K04,     K05,                                                K06,     K07,     K08,     K09,     K0A,    KC_PIPE,      \
    LALT_T(KC_TAB), K11, K12, K13,      K14,     K15,     _______,                         _______,  K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
    LALT_T(KC_TAB), K11, K12, K13,      K14,     K15,     _______,                         _______,  K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
    OS_LSFT, CTL_T(K21), K22, K23,      K24,     K25,     _______, _______,       _______, _______,  K26,     K27,     K28,     K29, RCTL_T(K2A), OS_RSFT,      \
                                       KC_GRV,   KC_SPC,  BK_LWER, OS_LALT,       OS_RGUI, DL_RAIS, KC_ENT, _______                            \
    )

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/5x6_right_trackball.c => keyboards/handwired/dactyl_manuform/5x6_right_trackball/5x6_right_trackball.c +5 -1
@@ 85,7 85,11 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {

#ifdef POINTING_DEVICE_ENABLE
    if (keycode == DPI_CONFIG && record->event.pressed) {
        keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
        if ((get_mods()|get_oneshot_mods()) & MOD_MASK_SHIFT) {
            keyboard_config.dpi_config = (keyboard_config.dpi_config - 1) % DPI_OPTION_SIZE;
        } else {
            keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
        }
        eeconfig_update_kb(keyboard_config.raw);
        trackball_set_cpi(dpi_array[keyboard_config.dpi_config]);
    }

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/config.h => keyboards/handwired/dactyl_manuform/5x6_right_trackball/config.h +1 -0
@@ 62,6 62,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define BOOTMAGIC_LITE_COLUMN_RIGHT 5

#define AUDIO_PIN C6
#define AUDIO_PIN_ALT B7

#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 4095
#define DYNAMIC_KEYMAP_LAYER_COUNT 16

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/config.h => keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/config.h +3 -4
@@ 18,9 18,10 @@

// #define USE_I2C
#define SELECT_SOFT_SERIAL_SPEED 0
#define SERIAL_USE_MULTI_TRANSACTION

// #define SERIAL_USE_MULTI_TRANSACTION
#define SPLIT_MODS_ENABLE
#define EE_HANDS

#define TRACKBALL_DPI_OPTIONS \
    { 1200, 1800, 2600, 3400 }



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

#define OLED_DISPLAY_128X64
#define OLED_TIMEOUT 0
#define OLED_BRIGHTNESS 100
#define SPLIT_MODS_ENABLE

#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 +49 -17
@@ 16,24 16,21 @@

#include "drashna.h"

#define TG_DBLO TG(_DIABLO)


// clang-format off
#define LAYOUT_5x6_right_trackball_wrapper(...) LAYOUT_5x6_right_trackball(__VA_ARGS__)
#define LAYOUT_5x6_right_trackball_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_5x6_right_trackball_wrapper( \
     KC_GRV,  ________________NUMBER_LEFT________________,            ________________NUMBER_RIGHT_______________, KC_MINS, \
     KC_ESC,  K01,    K02,      K03,     K04,     K05,                K06,     K07,     K08,     K09,     K0A,     KC_BSLS, \
     LALT_T(KC_TAB), K11, K12,  K13,     K14,     K15,                K16,     K17,     K18,     K19,     K1A,     RALT_T(KC_QUOT), \
     KC_ESC,  ________________NUMBER_LEFT________________,            ________________NUMBER_RIGHT_______________, KC_MINS, \
     SH_TT,   K01,    K02,      K03,     K04,     K05,                K06,     K07,     K08,     K09,     K0A,     SH_TT, \
     LALT_T(KC_TAB), K11, K12,  K13,     K14,     K15,                K16,     K17,     K18,     K19,     K1A,     RALT_T(K1B), \
     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,  _______,                     KC_ENT,  \
                                         KC_SPC,  TT(_MOUSE),                     KC_ENT,  \
                                         BK_LWER, MO(_MOUSE),      MO(_MOUSE), DL_RAIS  \
  )
#define LAYOUT_5x6_right_trackball_base_wrapper(...)       LAYOUT_5x6_right_trackball_base(__VA_ARGS__)


@@ 149,13 146,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                     _______, _______,    KC_NUKE, _______
    ),
};
// clang-format off

// clang-format on

#ifdef POINTING_DEVICE_ENABLE
static uint16_t mouse_timer = 0;
static uint16_t mouse_debounce_timer = 0;
static uint16_t mouse_timer           = 0;
static uint16_t mouse_debounce_timer  = 0;
static uint8_t  mouse_keycode_tracker = 0;
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) {


@@ 164,29 161,64 @@ void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) {
            layer_on(_MOUSE);
        }
    }
    if (timer_elapsed(mouse_debounce_timer) > 125 || layer_state_is(_GAMEPAD) ) {

#    ifdef TAPPING_TERM_PER_KEY
    if (timer_elapsed(mouse_debounce_timer) > get_tapping_term(KC_BTN1, NULL)
#    else
    if (timer_elapsed(mouse_debounce_timer) > TAPPING_TERM
#    endif
        || layer_state_is(_GAMEPAD)) {
        mouse_report->x = x;
        mouse_report->y = y;
    }
#    ifdef OLED_DRIVER_ENABLE
    if (x || y) oled_timer = timer_read32();
#    endif
}

void matrix_scan_keymap(void) {
    if (timer_elapsed(mouse_timer) > 650 && layer_state_is(_MOUSE) && !mouse_keycode_tracker) {
    if (timer_elapsed(mouse_timer) > 650 && layer_state_is(_MOUSE) && !mouse_keycode_tracker && !tap_toggling) {
        layer_off(_MOUSE);
    }
    if (tap_toggling) {
        if (!layer_state_is(_MOUSE)) {
            layer_on(_MOUSE);
        }
    }
}

bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
    switch(keycode){
bool process_record_keymap(uint16_t keycode, keyrecord_t* record) {
    switch (keycode) {
        case TT(_MOUSE): {
            if (record->event.pressed) {
                mouse_keycode_tracker++;
            } else {
#    if TAPPING_TOGGLE != 0
                if (record->tap.count == TAPPING_TOGGLE) {
                    tap_toggling ^= 1;
#        if TAPPING_TOGGLE == 1
                    if (!tap_toggling) mouse_keycode_tracker -= record->tap.count + 1;
#        else
                    if (!tap_toggling) mouse_keycode_tracker -= record->tap.count;
#        endif
                } else {
                    mouse_keycode_tracker--;
                }
#    endif
            }
            mouse_timer = timer_read();
            break;
        }
        case MO(_MOUSE):
        case DPI_CONFIG:
        case KC_MS_UP...KC_MS_WH_RIGHT:
        case KC_MS_UP ... KC_MS_WH_RIGHT:
            record->event.pressed ? mouse_keycode_tracker++ : mouse_keycode_tracker--;
            mouse_timer = timer_read();
            break;
        default:
            if (layer_state_is(_MOUSE) && !mouse_keycode_tracker) {
                layer_off(_MOUSE);
                mouse_keycode_tracker = 0;
            }
            mouse_debounce_timer = timer_read();
            break;

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/rules.mk => keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/rules.mk +1 -1
@@ 5,5 5,5 @@ AUDIO_ENABLE                 = yes
TAP_DANCE_ENABLE             = yes
UNICODE_ENABLE               = yes
OLED_DRIVER_ENABLE           = yes

WPM_ENABLE                   = yes
# DEBOUNCE_TYPE = sym_eager_pk

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/pointer_transport.c => keyboards/handwired/dactyl_manuform/5x6_right_trackball/pointer_transport.c +41 -16
@@ 77,7 77,8 @@ typedef struct _I2C_slave_buffer_t {
    bool          oled_on;
    layer_state_t t_layer_state;
    layer_state_t t_default_layer_state;
} I2C_slave_buffer_t;
    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;



@@ 93,9 94,10 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re
#    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_buffent, oled_on)
#    define I2C_LAYER_STATE_START offsetof(I2C_slave_buffent, t_layer_state)
#    define I2C_DEFAULT_LAYER_STATE_START offsetof(I2C_slave_buffent, t_default_layer_state)
#    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 TIMEOUT 100



@@ 196,9 198,19 @@ bool transport_master(matrix_row_t matrix[]) {
    }

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


@@ 255,10 267,10 @@ void transport_slave(matrix_row_t matrix[]) {
#    endif

    if (layer_state != i2c_buffer->t_layer_state) {
        layer_state_set(i2c_buffer->t_layer_state);
        layer_state = i2c_buffer->t_layer_state;
    }
    if (default_layer_state != i2c_buffer->t_default_layer_state) {
        default_layer_state_set(i2c_buffer->t_default_layer_state);
        default_layer_state = i2c_buffer->t_default_layer_state;
    }

#    ifdef OLED_DRIVER_ENABLE


@@ 268,6 280,10 @@ void transport_slave(matrix_row_t matrix[]) {
        oled_off();
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(i2c_buffer->is_rgb_matrix_suspended);
#    endif
}

void transport_master_init(void) { i2c_init(); }


@@ 286,7 302,7 @@ typedef struct _Serial_s2m_buffer_t {
#    endif
    int8_t       mouse_x;
    int8_t       mouse_y;
} Serial_s2m_buffer_t;
} __attribute__((packed)) Serial_s2m_buffer_t;

typedef struct _Serial_m2s_buffer_t {
#    ifdef SPLIT_MODS_ENABLE


@@ 309,7 325,8 @@ typedef struct _Serial_m2s_buffer_t {
    bool          oled_on;
    layer_state_t t_layer_state;
    layer_state_t t_default_layer_state;
} Serial_m2s_buffer_t;
    bool          is_rgb_matrix_suspended;
} __attribute__((packed)) Serial_m2s_buffer_t;

#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
// When MCUs on both sides drive their respective RGB LED chains,


@@ 434,10 451,14 @@ bool transport_master(matrix_row_t matrix[]) {
    }
#    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();
#    endif

    return true;


@@ 484,10 505,10 @@ void transport_slave(matrix_row_t matrix[]) {
#    endif

    if (layer_state != serial_m2s_buffer.t_layer_state) {
        layer_state_set(serial_m2s_buffer.t_layer_state);
        layer_state = serial_m2s_buffer.t_layer_state;
    }
    if (default_layer_state != serial_m2s_buffer.t_default_layer_state) {
        default_layer_set(serial_m2s_buffer.t_default_layer_state);
        default_layer_state = serial_m2s_buffer.t_default_layer_state;
    }
#    ifdef OLED_DRIVER_ENABLE
    if (serial_m2s_buffer.oled_on) {


@@ 496,6 517,10 @@ void transport_slave(matrix_row_t matrix[]) {
        oled_off();
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(serial_m2s_buffer.is_rgb_matrix_suspended);
#    endif
}

#endif

M keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk => keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk +1 -1
@@ 27,4 27,4 @@ SPLIT_KEYBOARD = yes
SPLIT_TRANSPORT = custom

SRC += pmw3360.c
QUANTUM_LIB_SRC += serial.c i2c_master.c i2c_slave.c spi_master.c pointer_transport.c
QUANTUM_LIB_SRC += pointer_transport.c serial.c i2c_master.c i2c_slave.c spi_master.c

M keyboards/keebio/iris/keymaps/drashna/keymap.c => keyboards/keebio/iris/keymaps/drashna/keymap.c +3 -2
@@ 25,15 25,16 @@
 */

// clang-format off
#define LAYOUT_wrapper(...)            LAYOUT(__VA_ARGS__)
#define LAYOUT_iris_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_wrapper( \
     KC_ESC,  ________________NUMBER_LEFT________________,                       ________________NUMBER_RIGHT_______________, KC_MINS, \
     LALT_T(KC_TAB), K01, K02, K03,      K04,     K05,                           K06,     K07,     K08,     K09,     K0A,     KC_BSLS, \
     KC_C1R3, K11,    K12,     K13,      K14,     K15,                           K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
     KC_C1R3, K11,    K12,     K13,      K14,     K15,                           K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
     OS_LSFT, CTL_T(K21), K22, K23,      K24,     K25,     OS_LALT,     OS_RGUI, K26,     K27,     K28,     K29, RCTL_T(K2A), OS_RSFT, \
                             KC_GRV, KC_SPC,  LT(_LOWER,KC_BSPC),         LT(_RAISE,KC_DEL),  KC_ENT,  RAISE                           \
  )

M keyboards/keebio/viterbi/keymaps/drashna/keymap.c => keyboards/keebio/viterbi/keymaps/drashna/keymap.c +8 -10
@@ 17,9 17,7 @@
#include "drashna.h"

// Fillers to make layering more clear
#define DIABLO TG(_DIABLO)
#define GAMEPAD TG(_GAMEPAD)
#define MEDIA TT(_MEDIA)
#define TT_MDIA TT(_MEDIA)

// enum more_custom_keycodes {
//  KC_P00 = NEW_SAFE_RANGE


@@ 29,15 27,15 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

  [_NUMLOCK] = LAYOUT_ortho_5x7(
      KC_NO,  DIABLO,  GAMEPAD, KC_NLCK, KC_SLCK, KC_COLN, KC_PSLS,
      MEDIA,   KC_CALC, XXXXXXX, KC_P7,   KC_P8,   KC_P9,   KC_PAST,
      KC_NO,   TG_DBLO, TG_GAME, KC_NLCK, KC_SLCK, KC_COLN, KC_PSLS,
      TT_MDIA, KC_CALC, XXXXXXX, KC_P7,   KC_P8,   KC_P9,   KC_PAST,
      KC_HOME, KC_DEL,  KC_PGUP, KC_P4,   KC_P5,   KC_P6,   KC_PMNS,
      KC_END,  KC_UP,   KC_PGDN, KC_P1,   KC_P2,   KC_P3,   KC_PPLS,
      KC_LEFT, KC_DOWN, KC_RGHT, KC_P0,   KC_PDOT, KC_COLN, KC_PENT
  ),

  [_DIABLO] = LAYOUT_ortho_5x7(
      KC_ESC,  DIABLO,  KC_V,    KC_D,    XXXXXXX, XXXXXXX, KC_L,
      KC_ESC,  _______, KC_V,    KC_D,    XXXXXXX, XXXXXXX, KC_L,
      KC_TAB,  KC_S,    KC_F,    KC_I,    KC_M,    KC_T,    KC_J,
      KC_Q,    KC_1,    KC_2,    KC_3,    KC_4,    KC_G,    KC_F,
      KC_LCTL, KC_D3_3, KC_D3_3, KC_D3_3, KC_D3_3, KC_Z,    KC_DIABLO_CLEAR,


@@ 45,16 43,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  ),

  [_GAMEPAD] = LAYOUT_ortho_5x7(  // Game pad layout designed primarily for Overwatch
      KC_NO,  KC_ESC,  GAMEPAD, KC_1,    KC_2,    KC_3,    KC_4,
      MEDIA,   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,
      KC_NO,   KC_ESC,  _______, KC_1,    KC_2,    KC_3,    KC_4,
      TT_MDIA, KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,
      KC_Z,    KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,
      KC_Y,    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,
      KC_F1,   KC_U,    KC_I,    KC_Y,    KC_V,    KC_SPC,  KC_V
  ),

  [_MEDIA] = LAYOUT_ortho_5x7(
      KC_MAKE, KC_RESET,MU_TOG,  AU_ON,   AU_OFF,  CK_TOGG, RGB_SAD,
      MEDIA,   EEP_RST,    KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI,
      KC_MAKE, RESET,   MU_TOG,  AU_ON,   AU_OFF,  CK_TOGG, RGB_SAD,
      _______, EEP_RST, KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI,
      RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_HUD,
      KC_MPLY, KC_MPRV, KC_MNXT, RGB_M_X, RGB_M_G, RGB_M_P, RGB_HUI,
      KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI

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

#ifdef OLED_DRIVER_ENABLE
#    define OLED_DISPLAY_128X64
#    define OLED_FONT_H "font_gmk_bad.h"
#    define OLED_DISABLE_TIMEOUT
#    define OLED_SCROLL_TIMEOUT_RIGHT 60000
#endif


M keyboards/kyria/keymaps/drashna/keymap.c => keyboards/kyria/keymaps/drashna/keymap.c +5 -4
@@ 31,15 31,16 @@ uint8_t is_master;
 */

// clang-format off
#define LAYOUT_wrapper(...)            LAYOUT(__VA_ARGS__)
#define LAYOUT_kyria_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_wrapper( \
      KC_ESC,  K01,     K02,     K03,     K04,     K05,                                             K06,     K07,     K08,     K09,     K0A,     KC_MINS, \
   LALT_T(KC_TAB), K11, K12,     K13,     K14,     K15,                                             K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
      OS_LSFT, CTL_T(K21), K22,  K23,     K24,     K25,  TG(_GAMEPAD), MEH(KC_MINS),  TG(_DIABLO), KC_CAPS,  K26,     K27,     K28,     K29, RCTL_T(K2A), OS_RSFT, \
   LALT_T(KC_TAB), K11, K12,     K13,     K14,     K15,                                             K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
      OS_LSFT, CTL_T(K21), K22,  K23,     K24,     K25,  TG_GAME, MEH(KC_MINS),   TG_DBLO, KC_CAPS, K26,     K27,     K28,     K29, RCTL_T(K2A), OS_RSFT, \
                                 KC_MUTE, OS_LALT, KC_GRV,  KC_SPC,  BK_LWER,     DL_RAIS, KC_ENT,  OS_RGUI, UC(0x03A8), UC(0x2E2E) \
    )
/* Re-pass though to allow templates to be used */


@@ 112,7 113,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_DIABLO] = LAYOUT_wrapper(
        KC_ESC,  KC_S,    KC_I,    KC_F,    KC_M,    KC_T,                                          KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NO,   KC_NO,
        KC_TAB,  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_J,    KC_L,      TG(_DIABLO), KC_NO, 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_J,    KC_L,        TG_DBLO, KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
                           KC_DIABLO_CLEAR, KC_J,    KC_NO, SFT_T(KC_SPACE), ALT_T(KC_Q),   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO
    ),
    [_LOWER] = LAYOUT_wrapper(

M keyboards/kyria/keymaps/drashna/rules.mk => keyboards/kyria/keymaps/drashna/rules.mk +1 -1
@@ 1,7 1,7 @@
OLED_DRIVER_ENABLE = yes   # Enables the use of OLED displays
ENCODER_ENABLE = yes       # ENables the use of one or more encoders
RGBLIGHT_ENABLE = yes      # Enable keyboard RGB underglow
RGBLIGHT_STARTUP_ANIMATION = yes
RGBLIGHT_STARTUP_ANIMATION = no

BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no       # Mouse keys

M keyboards/moonlander/keymaps/drashna/keymap.c => keyboards/moonlander/keymaps/drashna/keymap.c +4 -4
@@ 27,13 27,13 @@ enum more_custom_keycodes { KC_SWAP_NUM = NEW_SAFE_RANGE };

#define LAYOUT_moonlander_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
    ) \
    LAYOUT_moonlander_wrapper( \
        KC_ESC,  ________________NUMBER_LEFT________________, UC_FLIP,        UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, \
        KC_TAB,  K01,     K02,     K03,     K04,     K05,   TG(_DIABLO),TG(_DIABLO),   K06,     K07,     K08,     K09,     K0A,     KC_BSLS, \
        KC_C1R3, K11,     K12,     K13,     K14,     K15,  TG(_GAMEPAD),TG(_GAMEPAD),  K16,     K17,     K18,     K19,     K1A,     RALT_T(KC_QUOT), \
        KC_TAB,  K01,     K02,     K03,     K04,     K05,   TG_DBLO,TG_DBLO,   K06,     K07,     K08,     K09,     K0A,     KC_BSLS, \
        KC_C1R3, K11,     K12,     K13,     K14,     K15,  TG_GAME,TG_GAME,  K16,     K17,     K18,     K19,     K1A,     RALT_T(K1B), \
        KC_MLSF, CTL_T(K21), K22,  K23,     K24,     K25,                              K26,     K27,     K28,     K29,  RCTL_T(K2A),KC_MRSF, \
        KC_GRV,  OS_MEH,  OS_HYPR, KC_LBRC, KC_RBRC,          KC_NO,          KC_DEL,           KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, UC(0x2E2E), \
                                            KC_SPC,  BK_LWER, OS_LALT,        OS_RGUI, DL_RAIS, KC_ENT \


@@ 105,7 105,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_GAMEPAD] = LAYOUT_moonlander_wrapper(
        KC_ESC,  KC_NO,   KC_1,    KC_2,    KC_3,    KC_4, HYPR(KC_Q),                 KC_TRNS, KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NO,   KC_NO,
        KC_F1,   KC_K,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                    UC_SHRG, UC_DISA, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
        KC_TAB,  KC_G,    KC_A,    KC_S,    KC_D,    KC_F,    KC_TRNS,            TG(_GAMEPAD), KC_I,    KC_O,    KC_NO,   KC_NO,   KC_NO,   KC_NO,
        KC_TAB,  KC_G,    KC_A,    KC_S,    KC_D,    KC_F,    KC_TRNS,            TG_GAME, KC_I,    KC_O,    KC_NO,   KC_NO,   KC_NO,   KC_NO,
        KC_LCTL, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,                                      KC_N,    KC_M,    KC_NO,   KC_NO,   KC_NO,   KC_NO,
        KC_GRV,  KC_U,    KC_I,    KC_Y,    KC_T,             KC_PSCR,                 _______,          KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, KC_NO,
                                            KC_V,    KC_SPC,  KC_H,                    KC_NO, KC_NO,  KC_SWAP_NUM

M keyboards/orthodox/keymaps/drashna/keymap.c => keyboards/orthodox/keymaps/drashna/keymap.c +3 -2
@@ 8,14 8,15 @@
 * of use. K## is a placeholder to pass through the individual keycodes
 */
// clang-format off
#define LAYOUT_wrapper(...)            LAYOUT(__VA_ARGS__)
#define LAYOUT_orthodox_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_wrapper( \
    KC_ESC,  K01,    K02,     K03,      K04,     K05,                                                             K06,     K07,     K08,     K09,     K0A,     KC_BSPC, \
    LALT_T(KC_TAB), K11, K12, K13,      K14,     K15,              OS_LALT, OS_LGUI,   OS_RALT, RAISE,            K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
    LALT_T(KC_TAB), K11, K12, K13,      K14,     K15,              OS_LALT, OS_LGUI,   OS_RALT, RAISE,            K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
    KC_MLSF, CTL_T(K21), K22, K23,      K24,     K25,     LOWER,   KC_SPACE,KC_BSPC,   KC_DEL,  KC_ENT,  RAISE,   K26,     K27,     K28,     K29, RCTL_T(K2A), KC_MRSF  \
  )
#define LAYOUT_orthodox_base_wrapper(...)       LAYOUT_orthodox_base(__VA_ARGS__)

A keyboards/splitkb/zima/keymaps/drashna/config.h => keyboards/splitkb/zima/keymaps/drashna/config.h +32 -0
@@ 0,0 1,32 @@
/* Copyright 2019 Thomas Baart
 * Copyright 2021 Christopher Courtney, aka Drashna Jael're  (@drashna) <drashna@live.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#define OLED_FONT_H "users/drashna/drashna_font.h"
#define OLED_UPDATE_INTERVAL 15
#define OLED_DISABLE_TIMEOUT
#define OLED_FONT_END 255
// #    define OLED_FONT_5X5
// #    define OLED_FONT_AZTECH
// #    define OLED_FONT_BMPLAIN
#    define OLED_FONT_SUPER_DIGG
// #    define OLED_LOGO_GMK_BAD
// #    define OLED_LOGO_HUE_MANITEE
// #    define OLED_LOGO_CORNE
// #    define OLED_LOGO_GOTHAM
#define OLED_LOGO_SCIFI

A keyboards/splitkb/zima/keymaps/drashna/keymap.c => keyboards/splitkb/zima/keymaps/drashna/keymap.c +140 -0
@@ 0,0 1,140 @@
/* Copyright 2019 Thomas Baart
 * Copyright 2021 Christopher Courtney, aka Drashna Jael're  (@drashna) <drashna@live.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include QMK_KEYBOARD_H
#include <stdio.h>

#ifdef HAPTIC_ENABLE
#    include "haptic.h"
extern haptic_config_t haptic_config;
#endif

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = LAYOUT_ortho_4x3( /* Base */
        KC_MUTE, TG(1),   TG(2),
        KC_P7,   KC_P8,   KC_P9,
        KC_P4,   KC_P5,   KC_P6,
        KC_P1,   KC_P2,   KC_P3
    ),
    [1] = LAYOUT_ortho_4x3( /* Layer 1 */
        RESET,   _______, XXXXXXX,
        AU_ON,   AU_OFF,  XXXXXXX,
        CK_TOGG, XXXXXXX, CK_UP,
        CK_RST,  XXXXXXX, CK_DOWN
    ),
    [2] = LAYOUT_ortho_4x3( /* Layer 2*/
        RGB_TOG, RGB_MOD, _______,
        RGB_HUI, RGB_SAI, RGB_VAI,
        RGB_HUD, RGB_SAD, RGB_VAD,
        HPT_TOG, HPT_FBK, HPT_CONT
    )
};


static bool is_asleep = false;
static uint32_t oled_timer;

void render_oled_logo(void) {
        // clang-format off
    static const char PROGMEM qmk_logo[] = {
        0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
        0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
        0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
    // clang-format on
    oled_write_ln_P(qmk_logo, false);
}

void render_user_status(void) {
    static const char PROGMEM audio_status[2][3] = {{0xE0, 0xE1, 0}, {0xE2, 0xE3, 0}};
    oled_write_P(audio_status[is_audio_on()], false);
    static const char PROGMEM audio_clicky_status[2][3] = {{0xF4, 0xF5, 0}, {0xF6, 0xF7, 0}};
    oled_write_P(audio_clicky_status[is_clicky_on() && is_audio_on()], false);
    static const char PROGMEM rgb_layer_status[2][3] = {{0xEE, 0xEF, 0}, {0xF0, 0xF1, 0}};
    oled_write_P(rgb_layer_status[rgblight_is_enabled()], false);
    static const char PROGMEM nukem_good[2][3] = {{0xF8, 0xF9, 0}, {0xF6, 0xF7, 0}};
    oled_write_P(nukem_good[0], haptic_config.enable);
}

void keyboard_post_init_user(void) {
    oled_scroll_set_speed(0);
}

void oled_task_user(void) {
    if (is_asleep) {
        oled_off();
        return;
    }

    if (timer_elapsed32(oled_timer) < 30000) {
        oled_on();
        oled_scroll_off();
        oled_write_P(PSTR("SplitKB's Zima"), false);
        char layer[2] = {0};
        snprintf(layer, sizeof(layer), "%d", get_highest_layer(layer_state));
        oled_write_P(PSTR("   L:"), false);
        oled_write_ln(layer, false);
        oled_write_ln_P(PSTR("--------------"), false);
        if (rgblight_is_enabled()) {
            oled_write_P(PSTR("HSV: "), false);
            char rgbs[14];
            snprintf(rgbs, sizeof(rgbs), "%3d, %3d, %3d", rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val());
            oled_write_ln(rgbs, false);
        } else {
            oled_write_ln_P(PSTR("RGB LIGHT DISABLED"), false);
        }
        render_user_status();
    } else {
        if (timer_elapsed32(oled_timer) < 120000) {
            oled_on();
            render_oled_logo();
            oled_scroll_right();
        } else {
            oled_off();
        }
    }
}

void suspend_power_down_user(void) {
    is_asleep = true;
}

void suspend_wakeup_init_user(void) {
    is_asleep = false;
}

bool process_record_user(uint16_t keycode, keyrecord_t* record) {
    oled_timer = timer_read32();

    return true;
}


 void encoder_update_user(uint8_t index, bool clockwise) {
    if (clockwise) {
        tap_code16(KC_VOLU);
    } else {
        tap_code16(KC_VOLD);
    }
#    ifdef OLED_DRIVER_ENABLE
    oled_timer = timer_read32();
#    endif
#    if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY)
    if (is_audio_on() && is_clicky_on()) clicky_play();
#    endif
#    ifdef HAPTIC_ENABLE
    if (haptic_config.enable) haptic_play();
#    endif
}

A keyboards/splitkb/zima/keymaps/drashna/readme.md => keyboards/splitkb/zima/keymaps/drashna/readme.md +7 -0
@@ 0,0 1,7 @@
# The default keymap for zima

This includes support for the OLED and Encoder.  However, the actual code is found in the `zima.c` file. This can be replaced by adding your own `oled_task_user(void)` and `encoder_update_user` functinons. These will replace what is in the keyboard, and allow you to customize these features. 

The reason that this is done this way, is so that this functionality will work on the [QMK Configurator](https://config.qmk.fm/#/splitkb/zima/LAYOUT_ortho_4x3)

For reference, the code used for the oled and encoder defaults is in [zima.c](https://github.com/qmk/qmk_firmware/tree/master/keyboards/splitkb/zima/zima.c).

A keyboards/splitkb/zima/keymaps/drashna/rules.mk => keyboards/splitkb/zima/keymaps/drashna/rules.mk +2 -0
@@ 0,0 1,2 @@
# is intentional.  won't compile under size, otherwise.
USER_NAME := not_drashna

M layouts/community/ergodox/drashna/keymap.c => layouts/community/ergodox/drashna/keymap.c +9 -6
@@ 40,17 40,20 @@ bool skip_leds = false;
 * ease of use. K## is a placeholder to pass through the individual keycodes
 */
// clang-format off
#define LAYOUT_ergodox_wrapper(...)          LAYOUT_ergodox(__VA_ARGS__)
#define LAYOUT_ergodox_pretty_wrapper(...)   LAYOUT_ergodox_pretty(__VA_ARGS__)

#define LAYOUT_ergodox_pretty_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_ergodox_pretty_wrapper( \
      KC_ESC,  ________________NUMBER_LEFT________________, UC_FLIP,                 UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, \
      LALT_T(KC_TAB), K01, K02, K03,      K04,     K05,     TG(_DIABLO),         TG(_DIABLO), K06,     K07,     K08,     K09,     K0A,     KC_BSLS, \
      KC_C1R3, K11,    K12,     K13,      K14,     K15,                                       K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
      KC_MLSF, CTL_T(K21), K22, K23,      K24,     K25,     TG(_GAMEPAD),       TG(_GAMEPAD), K26,     K27,     K28,     K29,  RCTL_T(K2A), KC_MRSF, \
      KC_GRV,  OS_MEH, OS_HYPR, KC_LBRC, KC_RBRC,                                            KC_BTN1, KC_BTN3, KC_BTN2,   PM_SCROLL, PM_PRECISION,        \
      LALT_T(KC_TAB), K01, K02, K03,      K04,     K05,     TG_DBLO,         TG_DBLO, K06,     K07,     K08,     K09,     K0A,     KC_BSLS, \
      KC_C1R3, K11,    K12,     K13,      K14,     K15,                                       K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
      KC_MLSF, CTL_T(K21), K22, K23,      K24,     K25,     TG_GAME,       TG_GAME, K26,     K27,     K28,     K29, RCTL_T(K2A), KC_MRSF, \
      KC_GRV,  OS_MEH, OS_HYPR, KC_LBRC, KC_RBRC,                                            KC_BTN1, KC_BTN3, KC_BTN2,   PM_SCROLL, PM_PRECISION,  \
                                                  OS_LALT, OS_LGUI,                 OS_RGUI, CTL_T(KC_ESCAPE),                                      \
                                                           KC_APP,                  KC_MENU,                                                        \
                              KC_SPC, LT(_LOWER, KC_BSPC), OS_LWR,                  OS_RSE, LT(_RAISE, KC_DEL), KC_ENT                              \


@@ 235,7 238,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
             KC_ESC,  KC_NO,   KC_1,    KC_2,    KC_3, HYPR(KC_Q), HYPR(KC_GRV),            KC_TRNS, KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NO,   KC_NO,
             KC_F1,   KC_K,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                    UC_SHRG, UC_DISA, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
             KC_TAB,  KC_G,    KC_A,    KC_S,    KC_D,    KC_F,                                      KC_I,    KC_O,    KC_NO,   KC_NO,   KC_NO,   KC_NO,
             KC_LCTL, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_TRNS,            TG(_GAMEPAD), KC_N,    KC_M,    KC_NO,   KC_NO,   KC_NO,   KC_NO,
             KC_LCTL, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_TRNS,            TG_GAME, KC_N,    KC_M,    KC_NO,   KC_NO,   KC_NO,   KC_NO,
             KC_GRV,  KC_U,    KC_I,    KC_Y,    KC_T,                                                        KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, KC_NO,
                                                          KC_O,    KC_P,                    MAGIC_TOGGLE_NKRO, LALT(KC_PSCR),
                                                                   KC_LGUI,                 KC_HYPR,

M layouts/community/ortho_4x12/drashna/keymap.c => layouts/community/ortho_4x12/drashna/keymap.c +3 -2
@@ 50,14 50,15 @@ enum planck_keycodes {
 * of use. K## is a placeholder to pass through the individual keycodes
 */
// clang-format off
#define LAYOUT_ortho_4x12_wrapper(...)       LAYOUT_ortho_4x12(__VA_ARGS__)
#define LAYOUT_ortho_4x12_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_ortho_4x12_wrapper( \
    KC_ESC,  K01,    K02,     K03,      K04,     K05,     K06,     K07,     K08,     K09,     K0A,     KC_DEL, \
    LALT_T(KC_TAB), K11, K12, K13,      K14,     K15,     K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
    LALT_T(KC_TAB), K11, K12, K13,      K14,     K15,     K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
    KC_MLSF, CTL_T(K21), K22, K23,      K24,     K25,     K26,     K27,     K28,     K29, RCTL_T(K2A), KC_ENT,  \
    BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, PLNK_1,  PLNK_2,  PLNK_3,  PLNK_4,  KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT  \
  )

M layouts/community/ortho_5x12/drashna/keymap.c => layouts/community/ortho_5x12/drashna/keymap.c +7 -11
@@ 24,17 24,17 @@
 * of use. K## is a placeholder to pass through the individual keycodes
 */
// clang-format off
#define LAYOUT_ortho_5x12_wrapper(...)       LAYOUT_ortho_5x12(__VA_ARGS__)
#define LAYOUT_ortho_5x12_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A,  \
    K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A  \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_ortho_5x12_wrapper( \
    KC_ESC,  K01,    K02,     K03,      K04,     K05,     K06,     K07,     K08,     K09,     K0A,     KC_BSPC, \
    LALT_T(KC_TAB), K11, K12, K13,      K14,     K15,     K16,     K17,     K18,     K19,     K1A,     KC_BSPC, \
    KC_C1R3, K21,    K22,     K23,      K24,     K25,     K26,     K27,     K28,     K29,     K2A, RALT_T(KC_QUOT), \
    KC_MLSF, CTL_T(K31), K32, K33,      K34,     K35,     K36,     K37,     K38,     K39, RCTL_T(K3A), KC_ENT,  \
    KC_ESC,  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_BSPC, \
    LALT_T(KC_TAB), K01, K02, K03,      K04,     K05,     K06,     K07,     K08,     K09,     K0A,     KC_BSPC, \
    KC_C1R3, K11,    K12,     K13,      K14,     K15,     K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
    KC_MLSF, CTL_T(K21), K22, K23,      K24,     K25,     K26,     K27,     K28,     K29, RCTL_T(K2A), KC_ENT,  \
    KC_NO,   OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT  \
  )



@@ 44,28 44,24 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

[_QWERTY] = LAYOUT_ortho_5x12_base_wrapper(
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________,
  _________________QWERTY_L2_________________, _________________QWERTY_R2_________________,
  _________________QWERTY_L3_________________, _________________QWERTY_R3_________________
),

[_COLEMAK] = LAYOUT_ortho_5x12_base_wrapper(
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
  _________________COLEMAK_L1________________, _________________COLEMAK_R1________________,
  _________________COLEMAK_L2________________, _________________COLEMAK_R2________________,
  _________________COLEMAK_L3________________, _________________COLEMAK_R3________________
),

[_DVORAK] = LAYOUT_ortho_5x12_base_wrapper(
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
  _________________DVORAK_L1_________________, _________________DVORAK_R1_________________,
  _________________DVORAK_L2_________________, _________________DVORAK_R2_________________,
  _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
),

[_WORKMAN] = LAYOUT_ortho_5x12_base_wrapper(
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
  _________________WORKMAN_L1________________, _________________WORKMAN_R1________________,
  _________________WORKMAN_L2________________, _________________WORKMAN_R2________________,
  _________________WORKMAN_L3________________, _________________WORKMAN_R3________________

M layouts/community/ortho_5x12/drashna/rules.mk => layouts/community/ortho_5x12/drashna/rules.mk +2 -0
@@ 9,6 9,8 @@ NKRO_ENABLE       = yes
ifeq ($(strip $(KEYBOARD)), fractal)
    RGB_MATRIX_ENABLE           = no
    AUDIO_ENABLE                = yes
    AUDIO_SUPPORTED             = yes
    RGBLIGHT_SUPPORTED          = yes
    RGBLIGHT_ENABLE             = yes
    RGBLIGHT_TWINKLE            = yes
    RGBLIGHT_STARTUP_ANIMATION  = yes

A layouts/community/split_3x6_3/drashna/chconf.h => layouts/community/split_3x6_3/drashna/chconf.h +9 -0
@@ 0,0 1,9 @@

#define CH_CFG_ST_RESOLUTION                16
#define CH_CFG_ST_FREQUENCY                 10000

#if __has_include("platforms/chibios/common/configs/chconf.h")
#    include_next "platforms/chibios/common/configs/chconf.h"
#else
#    include_next "chconf.h"
#endif

M layouts/community/split_3x6_3/drashna/config.h => layouts/community/split_3x6_3/drashna/config.h +13 -15
@@ 19,8 19,10 @@
/* Select hand configuration */

// #define MASTER_LEFT
#define MASTER_RIGHT
// #define EE_HAND
// #define MASTER_RIGHT
#define EE_HANDS
#define SPLIT_MODS_ENABLE

#undef USE_I2C
#undef SSD1306OLED



@@ 40,7 42,7 @@
#ifdef RGB_MATRIX_ENABLE
#    ifdef CONVERT_TO_PROTON_C
#        undef RGB_DI_PIN
#        define RGB_DI_PIN PAL_LINE(GPIOA, 3)
#        define RGB_DI_PIN A3
#    endif
#    define RGB_MATRIX_KEYPRESSES  // reacts to keypresses
// #   define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)


@@ 56,24 58,24 @@
#endif

#ifdef CONVERT_TO_PROTON_C
#    define WS2812_PWM_DRIVER PWMD15                 // default: PWMD2
#    define WS2812_PWM_CHANNEL 2                    // default: 2
#    define WS2812_PWM_PAL_MODE 9                   // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
#    define WS2812_DMA_STREAM STM32_DMA1_STREAM5    // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#    define WS2812_DMA_CHANNEL 5                    // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#    define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM15_UP  // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
#    define WS2812_PWM_DRIVER PWMD2                 // default: PWMD2
#    define WS2812_PWM_CHANNEL 4                    // default: 2
#    define WS2812_PWM_PAL_MODE 1                   // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
#    define WS2812_DMA_STREAM STM32_DMA1_STREAM2    // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#    define WS2812_DMA_CHANNEL 2                    // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#    define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM2_UP  // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.

#    undef SOFT_SERIAL_PIN
#    define SOFT_SERIAL_PIN D3
#    define SERIAL_USART_DRIVER SD1     // USART driver of TX pin. default: SD1
#    define SERIAL_USART_TX_PAL_MODE 7  // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7


// #define INIT_EE_HANDS_LEFT
// #define INIT_EE_HANDS_RIGHT
#endif

#ifdef AUDIO_ENABLE

#if defined(AUDIO_ENABLE) && !defined(CONVERT_TO_PROTON_C)
#    define AUDIO_PIN B6
#    define NO_MUSIC_MODE
#endif


@@ 88,9 90,5 @@
#else
#    define PRODUCT Drashna Hacked Corne Keyboard
#endif
#define OLED_FONT_H "layouts/community/split_3x6_3/drashna/glcdfont.c"
// #define OLED_FONT_WIDTH 5
// #define OLED_FONT_HEIGHT 7

#define OLED_DISABLE_TIMEOUT
#define TAPPING_TERM_PER_KEY

M layouts/community/split_3x6_3/drashna/keymap.c => layouts/community/split_3x6_3/drashna/keymap.c +4 -7
@@ 27,14 27,15 @@ enum crkbd_keycodes { RGBRST = NEW_SAFE_RANGE };
 */

// clang-format off
#define LAYOUT_split_3x6_3_wrapper(...)      LAYOUT_split_3x6_3(__VA_ARGS__)
#define LAYOUT_split_3x6_3_base( \
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
  ) \
  LAYOUT_split_3x6_3_wrapper( \
    KC_ESC,  K01,    K02,     K03,      K04,     K05,                        K06,     K07,     K08,     K09,     K0A,     KC_MINS, \
    ALT_T(KC_TAB), K11,  K12, K13,      K14,     K15,                        K16,     K17,     K18,     K19,     K1A, RALT_T(KC_QUOT), \
    ALT_T(KC_TAB), K11,  K12, K13,      K14,     K15,                        K16,     K17,     K18,     K19,     K1A, RALT_T(K1B), \
    OS_LSFT, CTL_T(K21), K22, K23,      K24,     K25,                        K26,     K27,     K28,     K29, RCTL_T(K2A), OS_RSFT, \
                                        RGB_MOD,  KC_SPC,  BK_LWER, DL_RAIS,  KC_ENT,  OS_RGUI                                      \
  )


@@ 121,11 122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    if (is_keyboard_master()) {
        return OLED_ROTATION_270;
    } else {
        return rotation;
    }
    return OLED_ROTATION_270;
}
#endif


M layouts/community/split_3x6_3/drashna/mcuconf.h => layouts/community/split_3x6_3/drashna/mcuconf.h +10 -6
@@ 19,14 19,18 @@

// #undef STM32_HSE_ENABLED
// #define STM32_HSE_ENABLED FALSE
#undef STM32_GPT_USE_TIM15
#define STM32_GPT_USE_TIM15                  FALSE
// #undef STM32_GPT_USE_TIM15
// #define STM32_GPT_USE_TIM15                  FALSE

#undef STM32_PWM_USE_TIM15
#define STM32_PWM_USE_TIM15                  TRUE
#undef STM32_PWM_USE_TIM2
#define STM32_PWM_USE_TIM2                  TRUE
#undef STM32_PWM_USE_TIM3
#define STM32_PWM_USE_TIM3                  FALSE

#undef STM32_SERIAL_USE_USART1
#define STM32_SERIAL_USE_USART1 TRUE

#undef STM32_PWM_TIM15_IRQ_PRIORITY
#define STM32_PWM_TIM15_IRQ_PRIORITY         16
// #undef STM32_PWM_TIM15_IRQ_PRIORITY
// #define STM32_PWM_TIM15_IRQ_PRIORITY         16
#undef STM32_ST_USE_TIMER
#define STM32_ST_USE_TIMER 3

M layouts/community/split_3x6_3/drashna/rules.mk => layouts/community/split_3x6_3/drashna/rules.mk +1 -1
@@ 29,6 29,6 @@ endif

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

M users/drashna/config.h => users/drashna/config.h +35 -1
@@ 22,8 22,11 @@
/* Set Polling rate to 1000Hz */
#define USB_POLLING_INTERVAL_MS 1

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

#ifdef AUDIO_ENABLE


@@ 111,6 114,18 @@
#    else
#        define OLED_UPDATE_INTERVAL 15
#    endif
#    define OLED_DISABLE_TIMEOUT
#    define OLED_FONT_H "drashna_font.h"
#    define OLED_FONT_END 255
// #    define OLED_FONT_5X5
// #    define OLED_FONT_AZTECH
// #    define OLED_FONT_BMPLAIN
// #    define OLED_FONT_SUPER_DIGG
// #    define OLED_LOGO_GMK_BAD
// #    define OLED_LOGO_HUE_MANITEE
// #    define OLED_LOGO_CORNE
// #    define OLED_LOGO_GOTHAM
#    define OLED_LOGO_SCIFI
#endif

#ifndef ONESHOT_TAP_TOGGLE


@@ 162,3 177,22 @@
#ifdef LOCKING_RESYNC_ENABLE
#    undef LOCKING_RESYNC_ENABLE
#endif

#ifdef CONVERT_TO_PROTON_C
// pins that are available but not present on Pro Micro
#    define A3 PAL_LINE(GPIOA, 3)
#    define A4 PAL_LINE(GPIOA, 4)
#    define A5 PAL_LINE(GPIOA, 5)
#    define A6 PAL_LINE(GPIOA, 6)
#    define A7 PAL_LINE(GPIOA, 7)
#    define A8 PAL_LINE(GPIOA, 8)
#    define A13 PAL_LINE(GPIOA, 13)
#    define A14 PAL_LINE(GPIOA, 14)
#    define A15 PAL_LINE(GPIOA, 15)
#    define B10 PAL_LINE(GPIOB, 10)
#    define B11 PAL_LINE(GPIOB, 11)
#    define B12 PAL_LINE(GPIOB, 12)
#    define C13 PAL_LINE(GPIOC, 13)
#    define C14 PAL_LINE(GPIOC, 14)
#    define C15 PAL_LINE(GPIOC, 15)
#endif

M users/drashna/drashna.c => users/drashna/drashna.c +31 -4
@@ 111,7 111,12 @@ void shutdown_user(void) {

__attribute__((weak)) void suspend_power_down_keymap(void) {}

void suspend_power_down_user(void) { suspend_power_down_keymap(); }
void suspend_power_down_user(void) {
#ifdef OLED_DRIVER_ENABLE
    oled_off();
#endif
    suspend_power_down_keymap();
}

__attribute__((weak)) void suspend_wakeup_init_keymap(void) {}



@@ 146,17 151,34 @@ void matrix_scan_user(void) {
    matrix_scan_keymap();
}

#ifdef AUDIO_ENABLE
float doom_song[][2] = SONG(E1M1_DOOM);
#endif

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

// on layer change, no matter where the change was initiated
// Then runs keymap's layer change check
layer_state_t layer_state_set_user(layer_state_t state) {
    if (!is_keyboard_master()) { return state; }
    
    if (!is_keyboard_master()) {
        return state;
    }

    state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
#if defined(RGBLIGHT_ENABLE)
    state = layer_state_set_rgb_light(state);
#endif  // RGBLIGHT_ENABLE
#if defined(AUDIO_ENABLE) && !defined(__arm__)
    static bool is_gamepad_on = false;
    if (layer_state_cmp(state, _GAMEPAD) != is_gamepad_on) {
        is_gamepad_on = layer_state_cmp(state, _GAMEPAD);
        if (is_gamepad_on) {
            PLAY_LOOP(doom_song);
        } else {
            stop_all_notes();
        }
    }
#endif
    return layer_state_set_keymap(state);
}



@@ 164,7 186,9 @@ __attribute__((weak)) layer_state_t default_layer_state_set_keymap(layer_state_t

// Runs state check and changes underglow color and animation
layer_state_t default_layer_state_set_user(layer_state_t state) {
    if (!is_keyboard_master()) { return state; }
    if (!is_keyboard_master()) {
        return state;
    }

    state = default_layer_state_set_keymap(state);
#if 0


@@ 189,6 213,9 @@ void eeconfig_init_user(void) {
    userspace_config.rgb_layer_change = true;
    eeconfig_update_user(userspace_config.raw);
    eeconfig_init_keymap();
#ifdef VIA_ENABLE
    via_eeprom_reset();
#endif
    keyboard_init();
}


M users/drashna/drashna.h => users/drashna/drashna.h +4 -0
@@ 105,3 105,7 @@ We use custom codes here, so we can substitute the right stuff
#    define KC_D3_3 KC_3
#    define KC_D3_4 KC_4
#endif  // TAP_DANCE_ENABLE

#if defined(DRASHNA_CUSTOM_TRANSPORT) && defined(POINTING_DEVICE_ENABLE)
void master_mouse_send(int8_t x, int8_t y);
#endif

A users/drashna/drashna_font.h => users/drashna/drashna_font.h +1306 -0
@@ 0,0 1,1306 @@
#pragma once

// additional fonts from
// https://github.com/datacute/TinyOLED-Fonts

#include "progmem.h"

static const unsigned char font[] PROGMEM = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 0
    0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, // 0x01 1
    0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, // 0x02 2
    0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, // 0x03 3 ♥
    0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, // 0x04 4 ♦
    0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, // 0x05 5 ♧
    0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, // 0x06 6 ♤
    0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, // 0x07 7
    0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, // 0x08 8
    0x00, 0x18, 0x24, 0x18, 0x00, 0x00, // 0x09 9
    0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, // 0x0A 10
    0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, // 0x0B 11 ♂
    0x26, 0x29, 0x79, 0x29, 0x26, 0x00, // 0x0C 12 ♀
    0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, // 0x0D 13 ♪
    0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, // 0x0E 14 ♫
    0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, // 0x0F 15
    0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, // 0x10 16
    0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, // 0x11 17
    0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, // 0x12 18 ↕
    0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, // 0x13 19 ‼
    0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, // 0x14 20 ¶
    0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, // 0x15 21 §
    0x60, 0x60, 0x60, 0x60, 0x60, 0x00, // 0x16 22 _
    0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, // 0x17 23 ↨
    0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, // 0x18 24 ↑
    0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, // 0x19 25 ↓
    0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, // 0x1A 26 →
    0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, // 0x1B 27 ←
    0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, // 0x1C 28 ⌙h
    0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, // 0x1D 29 ↭
    0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, // 0x1E 30
    0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, // 0x1F 31
#if defined(OLED_FONT_5X5)
    0x00,0x00,0x00,0x00,0x00,0x00, // 0x20 32
    0x5c,0x00,0x00,0x00,0x00,0x00, // 0x21 33 !
    0x06,0x00,0x06,0x00,0x00,0x00, // 0x22 34 "
    0x28,0x7c,0x28,0x7c,0x28,0x00, // 0x23 35 #
    0x5c,0x54,0xfe,0x54,0x74,0x00, // 0x24 36 $
    0x44,0x20,0x10,0x08,0x44,0x00, // 0x25 37 %
    0x28,0x54,0x54,0x20,0x50,0x00, // 0x26 38 &
    0x06,0x00,0x00,0x00,0x00,0x00, // 0x27 39 '
    0x38,0x44,0x00,0x00,0x00,0x00, // 0x28 40 (
    0x44,0x38,0x00,0x00,0x00,0x00, // 0x29 41 )
    0x02,0x07,0x02,0x00,0x00,0x00, // 0x2A 42 *
    0x10,0x10,0x7c,0x10,0x10,0x00, // 0x2B 43 +
    0xc0,0x00,0x00,0x00,0x00,0x00, // 0x2C 44 ,
    0x10,0x10,0x10,0x10,0x10,0x00, // 0x2D 45 -
    0x40,0x00,0x00,0x00,0x00,0x00, // 0x2E 46 .
    0x60,0x10,0x0c,0x00,0x00,0x00, // 0x2F 47 /
    0x7c,0x64,0x54,0x4c,0x7c,0x00, // 0x30 48 0
    0x48,0x7c,0x40,0x00,0x00,0x00, // 0x31 49 1
    0x64,0x54,0x54,0x54,0x48,0x00, // 0x32 50 2
    0x44,0x54,0x54,0x54,0x6c,0x00, // 0x33 51 3
    0x3c,0x20,0x70,0x20,0x20,0x00, // 0x34 52 4
    0x5c,0x54,0x54,0x54,0x24,0x00, // 0x35 53 5
    0x7c,0x54,0x54,0x54,0x74,0x00, // 0x36 54 6
    0x04,0x04,0x64,0x14,0x0c,0x00, // 0x37 55 7
    0x7c,0x54,0x54,0x54,0x7c,0x00, // 0x38 56 8
    0x5c,0x54,0x54,0x54,0x7c,0x00, // 0x39 57 9
    0x44,0x00,0x00,0x00,0x00,0x00, // 0x3A 58 :
    0xc4,0x00,0x00,0x00,0x00,0x00, // 0x3B 59 ;
    0x10,0x28,0x44,0x00,0x00,0x00, // 0x3C 60 <
    0x28,0x28,0x28,0x28,0x28,0x00, // 0x3D 61 =
    0x44,0x28,0x10,0x00,0x00,0x00, // 0x3E 62 >
    0x08,0x04,0x54,0x08,0x00,0x00, // 0x3F 63 ?
    0x7c,0x44,0x54,0x54,0x5c,0x00, // 0x40 64 @
    0x7c,0x24,0x24,0x24,0x7c,0x00, // 0x41 65 A
    0x7c,0x54,0x54,0x54,0x6c,0x00, // 0x42 66 B
    0x7c,0x44,0x44,0x44,0x44,0x00, // 0x43 67 C
    0x7c,0x44,0x44,0x44,0x38,0x00, // 0x44 68 D
    0x7c,0x54,0x54,0x54,0x44,0x00, // 0x45 69 E
    0x7c,0x14,0x14,0x14,0x04,0x00, // 0x46 70 F
    0x7c,0x44,0x44,0x54,0x74,0x00, // 0x47 71 G
    0x7c,0x10,0x10,0x10,0x7c,0x00, // 0x48 72 H
    0x44,0x44,0x7c,0x44,0x44,0x00, // 0x49 73 I
    0x60,0x40,0x40,0x44,0x7c,0x00, // 0x4A 74 J
    0x7c,0x10,0x10,0x28,0x44,0x00, // 0x4B 75 K
    0x7c,0x40,0x40,0x40,0x40,0x00, // 0x4C 76 L
    0x7c,0x08,0x10,0x08,0x7c,0x00, // 0x4D 77 M
    0x7c,0x08,0x10,0x20,0x7c,0x00, // 0x4E 78 N
    0x38,0x44,0x44,0x44,0x38,0x00, // 0x4F 79 O
    0x7c,0x14,0x14,0x14,0x08,0x00, // 0x50 80 P
    0x3c,0x24,0x64,0x24,0x3c,0x00, // 0x51 81 Q
    0x7c,0x14,0x14,0x14,0x68,0x00, // 0x52 82 R
    0x5c,0x54,0x54,0x54,0x74,0x00, // 0x53 83 S
    0x04,0x04,0x7c,0x04,0x04,0x00, // 0x54 84 T
    0x7c,0x40,0x40,0x40,0x7c,0x00, // 0x55 85 U
    0x0c,0x30,0x40,0x30,0x0c,0x00, // 0x56 86 V
    0x3c,0x40,0x30,0x40,0x3c,0x00, // 0x57 87 W
    0x44,0x28,0x10,0x28,0x44,0x00, // 0x58 88 X
    0x0c,0x10,0x60,0x10,0x0c,0x00, // 0x59 89 Y
    0x44,0x64,0x54,0x4c,0x44,0x00, // 0x5A 90 Z
    0x7c,0x44,0x00,0x00,0x00,0x00, // 0x5B 91 [
    0x0c,0x10,0x60,0x00,0x00,0x00, // 0x5C 92 \ backslash
    0x44,0x7c,0x00,0x00,0x00,0x00, // 0x5D 93 ]
    0x00,0x01,0x00,0x01,0x00,0x00, // 0x5E 94 ^
    0x40,0x40,0x40,0x40,0x40,0x40, // 0x5F 95 _
    0x00,0x01,0x00,0x00,0x00,0x00, // 0x60 96 `
    0x7c,0x24,0x24,0x24,0x7c,0x00, // 0x61 97 a
    0x7c,0x54,0x54,0x54,0x6c,0x00, // 0x62 98 b
    0x7c,0x44,0x44,0x44,0x44,0x00, // 0x63 99 c
    0x7c,0x44,0x44,0x44,0x38,0x00, // 0x64 100 d
    0x7c,0x54,0x54,0x54,0x44,0x00, // 0x65 101 e
    0x7c,0x14,0x14,0x14,0x04,0x00, // 0x66 102 f
    0x7c,0x44,0x44,0x54,0x74,0x00, // 0x67 103 g
    0x7c,0x10,0x10,0x10,0x7c,0x00, // 0x68 104 h
    0x44,0x44,0x7c,0x44,0x44,0x00, // 0x69 105 i
    0x60,0x40,0x40,0x44,0x7c,0x00, // 0x6A 106 j
    0x7c,0x10,0x10,0x28,0x44,0x00, // 0x6B 107 k
    0x7c,0x40,0x40,0x40,0x40,0x00, // 0x6C 108 l
    0x7c,0x08,0x10,0x08,0x7c,0x00, // 0x6D 109 m
    0x7c,0x08,0x10,0x20,0x7c,0x00, // 0x6E 110 n
    0x38,0x44,0x44,0x44,0x38,0x00, // 0x6F 111 o
    0x7c,0x14,0x14,0x14,0x08,0x00, // 0x70 112 p
    0x3c,0x24,0x64,0x24,0x3c,0x00, // 0x71 113 q
    0x7c,0x14,0x14,0x14,0x68,0x00, // 0x72 114 r
    0x5c,0x54,0x54,0x54,0x74,0x00, // 0x73 115 s
    0x04,0x04,0x7c,0x04,0x04,0x00, // 0x74 116 t
    0x7c,0x40,0x40,0x40,0x7c,0x00, // 0x75 117 u
    0x0c,0x30,0x40,0x30,0x0c,0x00, // 0x76 118 v
    0x3c,0x40,0x30,0x40,0x3c,0x00, // 0x77 119 w
    0x44,0x28,0x10,0x28,0x44,0x00, // 0x78 120 x
    0x0c,0x10,0x60,0x10,0x0c,0x00, // 0x79 121 y
    0x44,0x64,0x54,0x4c,0x44,0x00, // 0x7A 122 z
    0x10,0x7c,0x44,0x00,0x00,0x00, // 0x7B 123 {
    0x6c,0x00,0x00,0x00,0x00,0x00, // 0x7C 124 |
    0x44,0x7c,0x10,0x00,0x00,0x00, // 0x7D 125 }
    0x02,0x01,0x02,0x01,0x00,0x00, // 0x7E 126 ~
    0x00,0x00,0x00,0x00,0x00,0x00, // 0x7F 127
#elif defined(OLED_FONT_AZTECH)
    0x00,0x00,0x00,0x00,0x00,0x00, // 0x20 32
    0x00,0x2e,0x00,0x00,0x00,0x00, // 0x21 33 !
    0x00,0x02,0x00,0x02,0x00,0x00, // 0x22 34 "
    0x00,0x0a,0x1e,0x0a,0x1e,0x00, // 0x23 35 #
    0x00,0x0e,0x2a,0x6b,0x2a,0x3a, // 0x24 36 $
    0x00,0x06,0x06,0x26,0x18,0x06, // 0x25 37 %
    0x38,0x3e,0x2a,0x2a,0x28,0x38, // 0x26 38 &
    0x18,0x02,0x00,0x00,0x00,0x00, // 0x27 39 '
    0x00,0x3e,0x22,0x00,0x00,0x00, // 0x28 40 (
    0x00,0x22,0x3e,0x00,0x00,0x00, // 0x29 41 )
    0x00,0x0e,0x0e,0x0e,0x04,0x00, // 0x2A 42 *
    0x00,0x08,0x1c,0x08,0x00,0x00, // 0x2B 43 +
    0x00,0x20,0x00,0x00,0x00,0x00, // 0x2C 44 ,
    0x00,0x08,0x08,0x08,0x00,0x00, // 0x2D 45 -
    0x00,0x20,0x00,0x00,0x00,0x00, // 0x2E 46 .
    0x00,0x20,0x18,0x06,0x00,0x00, // 0x2F 47 /
    0x00,0x3e,0x22,0x2a,0x22,0x3e, // 0x30 48 0
    0x02,0x3e,0x00,0x00,0x00,0x00, // 0x31 49 1
    0x00,0x38,0x28,0x2a,0x2a,0x2e, // 0x32 50 2
    0x00,0x22,0x2a,0x2e,0x38,0x00, // 0x33 51 3
    0x00,0x0e,0x08,0x08,0x3e,0x08, // 0x34 52 4
    0x00,0x2e,0x2a,0x2a,0x28,0x38, // 0x35 53 5
    0x00,0x3e,0x2a,0x2a,0x28,0x38, // 0x36 54 6
    0x00,0x06,0x02,0x02,0x0a,0x3e, // 0x37 55 7
    0x00,0x38,0x2e,0x2a,0x2e,0x38, // 0x38 56 8
    0x00,0x0e,0x0a,0x2a,0x2a,0x3e, // 0x39 57 9
    0x00,0x28,0x00,0x00,0x00,0x00, // 0x3A 58 :
    0x00,0x28,0x00,0x00,0x00,0x00, // 0x3B 59 ;
    0x00,0x08,0x14,0x22,0x00,0x00, // 0x3C 60 <
    0x00,0x14,0x14,0x14,0x14,0x00, // 0x3D 61 =
    0x00,0x22,0x14,0x08,0x00,0x00, // 0x3E 62 >
    0x00,0x06,0x02,0x2a,0x0a,0x06, // 0x3F 63 ?
    0x00,0x3e,0x02,0x3a,0x2a,0x0a, // 0x40 64 @
    0x22,0x3e,0x02,0x0a,0x0a,0x3e, // 0x41 65 A
    0x00,0x3e,0x22,0x2a,0x2e,0x38, // 0x42 66 B
    0x00,0x3e,0x22,0x22,0x20,0x30, // 0x43 67 C
    0x00,0x3e,0x22,0x22,0x22,0x3c, // 0x44 68 D
    0x00,0x3e,0x2a,0x22,0x20,0x30, // 0x45 69 E
    0x00,0x3e,0x0a,0x0a,0x06,0x02, // 0x46 70 F
    0x00,0x3e,0x22,0x2a,0x28,0x38, // 0x47 71 G
    0x00,0x3e,0x08,0x08,0x08,0x3e, // 0x48 72 H
    0x00,0x22,0x3e,0x22,0x00,0x00, // 0x49 73 I
    0x00,0x30,0x20,0x20,0x22,0x3e, // 0x4A 74 J
    0x00,0x3e,0x08,0x08,0x0e,0x38, // 0x4B 75 K
    0x00,0x3e,0x20,0x20,0x20,0x30, // 0x4C 76 L
    0x00,0x3e,0x02,0x3e,0x20,0x3e, // 0x4D 77 M
    0x3e,0x3e,0x02,0x3e,0x20,0x3e, // 0x4E 78 N
    0x00,0x3e,0x22,0x22,0x22,0x3e, // 0x4F 79 O
    0x00,0x3e,0x02,0x0a,0x0a,0x0e, // 0x50 80 P
    0x00,0x3e,0x22,0x22,0x22,0x3e, // 0x51 81 Q
    0x00,0x3e,0x02,0x0a,0x0e,0x38, // 0x52 82 R
    0x00,0x0e,0x0a,0x2a,0x2a,0x3a, // 0x53 83 S
    0x00,0x06,0x02,0x3e,0x02,0x06, // 0x54 84 T
    0x00,0x3e,0x20,0x20,0x20,0x3e, // 0x55 85 U
    0x00,0x3e,0x20,0x20,0x3e,0x00, // 0x56 86 V
    0x00,0x3e,0x20,0x3e,0x02,0x3e, // 0x57 87 W
    0x3e,0x3a,0x0e,0x08,0x0e,0x3a, // 0x58 88 X
    0x00,0x0e,0x08,0x08,0x28,0x3e, // 0x59 89 Y
    0x00,0x3a,0x2a,0x2a,0x0a,0x0e, // 0x5A 90 Z
    0x00,0x3e,0x22,0x00,0x00,0x00, // 0x5B 91 [
    0x00,0x02,0x0c,0x30,0x00,0x00, // 0x5C 92 \ backslash
    0x22,0x3e,0x00,0x00,0x00,0x00, // 0x5D 93 ]
    0x00,0x01,0x00,0x01,0x00,0x00, // 0x5E 94 ^
    0x00,0x20,0x20,0x20,0x00,0x00, // 0x5F 95 _
    0x00,0x01,0x00,0x00,0x00,0x00, // 0x60 96 `
    0x00,0x38,0x28,0x28,0x08,0x38, // 0x61 97 a
    0x00,0x3e,0x20,0x28,0x28,0x38, // 0x62 98 b
    0x00,0x38,0x28,0x28,0x20,0x30, // 0x63 99 c
    0x00,0x38,0x28,0x28,0x20,0x3e, // 0x64 100 d
    0x00,0xf8,0x88,0x28,0x28,0x38, // 0x65 101 e
    0x00,0xf8,0x28,0x28,0x18,0x08, // 0x66 102 f
    0x00,0x38,0x28,0xa8,0x88,0xf8, // 0x67 103 g
    0x00,0x3c,0x08,0x08,0x08,0x38, // 0x68 104 h
    0x00,0x3a,0x00,0x00,0x00,0x00, // 0x69 105 i
    0x80,0xfa,0x00,0x00,0x00,0x00, // 0x6A 106 j
    0x00,0x3e,0x08,0x08,0x38,0x2c, // 0x6B 107 k
    0x00,0x3e,0x20,0x00,0x00,0x00, // 0x6C 108 l
    0x00,0x38,0x08,0x38,0x20,0x38, // 0x6D 109 m
    0x38,0x38,0x08,0x38,0x20,0x38, // 0x6E 110 n
    0x00,0x38,0x28,0x28,0x28,0x38, // 0x6F 111 o
    0x00,0xf8,0x08,0x28,0x28,0x38, // 0x70 112 p
    0x00,0x38,0x28,0x28,0x08,0xf8, // 0x71 113 q
    0x00,0x38,0x08,0x08,0x18,0x08, // 0x72 114 r
    0x00,0x38,0x28,0xa8,0xa8,0xe8, // 0x73 115 s
    0x00,0x3e,0x28,0x28,0x20,0x30, // 0x74 116 t
    0x00,0x38,0x20,0x20,0x20,0x38, // 0x75 117 u
    0x00,0x38,0x20,0x38,0x00,0x00, // 0x76 118 v
    0x00,0x38,0x20,0x38,0x08,0x38, // 0x77 119 w
    0x38,0x28,0x38,0x10,0x38,0x28, // 0x78 120 x
    0x00,0x38,0x20,0xa0,0xa0,0xf8, // 0x79 121 y
    0x00,0xe8,0xa8,0xa8,0x28,0x38, // 0x7A 122 z
    0x08,0x3e,0x22,0x00,0x00,0x00, // 0x7B 123 {
    0x00,0x3f,0x00,0x00,0x00,0x00, // 0x7C 124 |
    0x22,0x3e,0x08,0x00,0x00,0x00, // 0x7D 125 }
    0x00,0x00,0x00,0x00,0x00,0x00, // 0x7E 126 ~
    0x00,0x00,0x00,0x00,0x00,0x00, // 0x7F 127
#elif defined(OLED_FONT_BMPLAIN)
    0x00,0x00,0x00,0x00,0x00,0x00, // 0x20 32
    0x2e,0x00,0x00,0x00,0x00,0x00, // 0x21 33 !
    0x03,0x00,0x03,0x00,0x00,0x00, // 0x22 34 "
    0x0a,0x1f,0x0a,0x1f,0x0a,0x00, // 0x23 35 #
    0x2e,0x2a,0x6b,0x2a,0x3a,0x00, // 0x24 36 $
    0x0e,0x2a,0x1e,0x08,0x3c,0x2a, // 0x25 37 %
    0x3e,0x2a,0x2a,0x22,0x38,0x08, // 0x26 38 &
    0x03,0x00,0x00,0x00,0x00,0x00, // 0x27 39 '
    0x1c,0x22,0x00,0x00,0x00,0x00, // 0x28 40 (
    0x22,0x1c,0x00,0x00,0x00,0x00, // 0x29 41 )
    0x15,0x0e,0x04,0x0e,0x15,0x00, // 0x2A 42 *
    0x08,0x08,0x3e,0x08,0x08,0x00, // 0x2B 43 +
    0x60,0x00,0x00,0x00,0x00,0x00, // 0x2C 44 ,
    0x08,0x08,0x08,0x08,0x08,0x00, // 0x2D 45 -
    0x20,0x00,0x00,0x00,0x00,0x00, // 0x2E 46 .
    0x20,0x10,0x08,0x04,0x02,0x00, // 0x2F 47 /
    0x3e,0x22,0x2a,0x22,0x3e,0x00, // 0x30 48 0
    0x04,0x3e,0x00,0x00,0x00,0x00, // 0x31 49 1
    0x3a,0x2a,0x2a,0x2a,0x2e,0x00, // 0x32 50 2
    0x2a,0x2a,0x2a,0x2a,0x3e,0x00, // 0x33 51 3
    0x0e,0x08,0x08,0x08,0x3e,0x00, // 0x34 52 4
    0x2e,0x2a,0x2a,0x2a,0x3a,0x00, // 0x35 53 5
    0x3e,0x2a,0x2a,0x2a,0x3a,0x00, // 0x36 54 6
    0x02,0x02,0x02,0x02,0x3e,0x00, // 0x37 55 7
    0x3e,0x2a,0x2a,0x2a,0x3e,0x00, // 0x38 56 8
    0x2e,0x2a,0x2a,0x2a,0x3e,0x00, // 0x39 57 9
    0x14,0x00,0x00,0x00,0x00,0x00, // 0x3A 58 :
    0x34,0x00,0x00,0x00,0x00,0x00, // 0x3B 59 ;
    0x08,0x14,0x22,0x00,0x00,0x00, // 0x3C 60 <
    0x14,0x14,0x14,0x14,0x14,0x00, // 0x3D 61 =
    0x22,0x14,0x08,0x00,0x00,0x00, // 0x3E 62 >
    0x06,0x02,0x2a,0x0a,0x0e,0x00, // 0x3F 63 ?
    0x3e,0x02,0x3a,0x2a,0x3e,0x00, // 0x40 64 @
    0x3e,0x12,0x12,0x12,0x3e,0x00, // 0x41 65 A
    0x3e,0x2a,0x2a,0x2a,0x36,0x00, // 0x42 66 B
    0x3e,0x22,0x22,0x22,0x22,0x00, // 0x43 67 C
    0x3e,0x22,0x22,0x22,0x1c,0x00, // 0x44 68 D
    0x3e,0x2a,0x2a,0x2a,0x22,0x00, // 0x45 69 E
    0x3e,0x0a,0x0a,0x0a,0x02,0x00, // 0x46 70 F
    0x3e,0x22,0x2a,0x2a,0x3a,0x00, // 0x47 71 G
    0x3e,0x08,0x08,0x08,0x3e,0x00, // 0x48 72 H
    0x22,0x3e,0x22,0x00,0x00,0x00, // 0x49 73 I
    0x38,0x20,0x20,0x20,0x3e,0x00, // 0x4A 74 J
    0x3e,0x08,0x08,0x14,0x22,0x00, // 0x4B 75 K
    0x3e,0x20,0x20,0x20,0x20,0x00, // 0x4C 76 L
    0x3e,0x04,0x38,0x04,0x3e,0x00, // 0x4D 77 M
    0x3e,0x04,0x08,0x10,0x3e,0x00, // 0x4E 78 N
    0x3e,0x22,0x22,0x22,0x3e,0x00, // 0x4F 79 O
    0x3e,0x0a,0x0a,0x0a,0x0e,0x00, // 0x50 80 P
    0x3e,0x22,0x72,0x22,0x3e,0x00, // 0x51 81 Q
    0x3e,0x0a,0x0a,0x1a,0x2e,0x00, // 0x52 82 R
    0x2e,0x2a,0x2a,0x2a,0x3a,0x00, // 0x53 83 S
    0x02,0x02,0x3e,0x02,0x02,0x00, // 0x54 84 T
    0x1e,0x20,0x20,0x20,0x1e,0x00, // 0x55 85 U
    0x0e,0x10,0x20,0x10,0x0e,0x00, // 0x56 86 V
    0x3e,0x10,0x0e,0x10,0x3e,0x00, // 0x57 87 W
    0x22,0x14,0x08,0x14,0x22,0x00, // 0x58 88 X
    0x02,0x04,0x38,0x04,0x02,0x00, // 0x59 89 Y
    0x3a,0x2a,0x2a,0x2a,0x2e,0x00, // 0x5A 90 Z
    0x3e,0x22,0x00,0x00,0x00,0x00, // 0x5B 91 [
    0x3f,0x21,0x3f,0x00,0x00,0x00, // 0x5C 92 \ backslash
    0x22,0x3e,0x00,0x00,0x00,0x00, // 0x5D 93 ]
    0x0c,0x1e,0x3c,0x1e,0x0c,0x00, // 0x5E 94 ^
    0x20,0x20,0x20,0x20,0x20,0x00, // 0x5F 95 _
    0x1c,0x3e,0x3e,0x3e,0x1c,0x00, // 0x60 96 `
    0x3c,0x24,0x24,0x24,0x3c,0x20, // 0x61 97 a
    0x3e,0x24,0x24,0x24,0x3c,0x00, // 0x62 98 b
    0x3c,0x24,0x24,0x24,0x24,0x00, // 0x63 99 c
    0x3c,0x24,0x24,0x24,0x3e,0x00, // 0x64 100 d
    0x3c,0x24,0x34,0x2c,0x24,0x00, // 0x65 101 e
    0x08,0x3e,0x0a,0x0a,0x00,0x00, // 0x66 102 f
    0x1c,0x54,0x54,0x54,0x7c,0x00, // 0x67 103 g
    0x3e,0x04,0x04,0x04,0x3c,0x00, // 0x68 104 h
    0x3a,0x00,0x00,0x00,0x00,0x00, // 0x69 105 i
    0x7a,0x00,0x00,0x00,0x00,0x00, // 0x6A 106 j
    0x3e,0x08,0x14,0x22,0x00,0x00, // 0x6B 107 k
    0x02,0x3e,0x00,0x00,0x00,0x00, // 0x6C 108 l
    0x3c,0x04,0x3c,0x04,0x3c,0x00, // 0x6D 109 m
    0x3c,0x04,0x04,0x04,0x3c,0x00, // 0x6E 110 n
    0x3c,0x24,0x24,0x24,0x3c,0x00, // 0x6F 111 o
    0x7c,0x24,0x24,0x24,0x3c,0x00, // 0x70 112 p
    0x3c,0x24,0x24,0x24,0x7c,0x00, // 0x71 113 q
    0x3c,0x04,0x04,0x04,0x00,0x00, // 0x72 114 r
    0x24,0x2c,0x34,0x24,0x00,0x00, // 0x73 115 s
    0x04,0x3e,0x24,0x24,0x00,0x00, // 0x74 116 t
    0x3c,0x20,0x20,0x20,0x3c,0x00, // 0x75 117 u
    0x0c,0x10,0x20,0x10,0x0c,0x00, // 0x76 118 v
    0x3c,0x20,0x3c,0x20,0x3c,0x00, // 0x77 119 w
    0x24,0x24,0x18,0x24,0x24,0x00, // 0x78 120 x
    0x1c,0x50,0x50,0x50,0x7c,0x00, // 0x79 121 y
    0x24,0x34,0x2c,0x24,0x00,0x00, // 0x7A 122 z
    0x08,0x3e,0x22,0x00,0x00,0x00, // 0x7B 123 {
    0x1c,0x22,0x22,0x22,0x1c,0x00, // 0x7C 124 |
    0x22,0x3e,0x08,0x00,0x00,0x00, // 0x7D 125 }
    0x01,0x01,0x01,0x00,0x00,0x00, // 0x7E 126 ~
    0x00,0x00,0x00,0x00,0x00,0x00, // 0x7F 127
#elif defined(OLED_FONT_SUPER_DIGG)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 32
    0x58, 0x5C, 0x00, 0x00, 0x00, 0x00, // 0x21 33 !
    0x00, 0x01, 0x00, 0x00, 0x01, 0x00, // 0x22 34 "
    0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, // 0x23 35 #
    0x5C, 0xFE, 0x54, 0xFE, 0x74, 0x00, // 0x24 36 $
    0x03, 0x63, 0x38, 0x0C, 0x63, 0x60, // 0x25 37 %
    0x70, 0x5C, 0x54, 0x74, 0x7C, 0x50, // 0x26 38 &
    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // 0x27 39 '
    0x70, 0x7C, 0x44, 0x00, 0x00, 0x00, // 0x28 40 (
    0x44, 0x7C, 0x70, 0x00, 0x00, 0x00, // 0x29 41 )
    0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, // 0x2A 42 *
    0x10, 0x10, 0x70, 0x7C, 0x10, 0x00, // 0x2B 43 +
    0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, // 0x2C 44 ,
    0x10, 0x10, 0x10, 0x10, 0x00, 0x00, // 0x2D 45 -
    0x40, 0x40, 0x00, 0x00, 0x00, 0x00, // 0x2E 46 .
    0x70, 0x7C, 0x03, 0x00, 0x00, 0x00, // 0x2F 47 /
    0x7C, 0x44, 0x44, 0x44, 0x7C, 0x1C, // 0x30 48 0
    0x04, 0x04, 0x7C, 0x1C, 0x00, 0x00, // 0x31 49 1
    0x74, 0x74, 0x54, 0x54, 0x5C, 0x00, // 0x32 50 2
    0x44, 0x54, 0x54, 0x54, 0x7C, 0x70, // 0x33 51 3
    0x1C, 0x10, 0x10, 0x7C, 0x7C, 0x00, // 0x34 52 4
    0x5C, 0x5C, 0x54, 0x54, 0x74, 0x00, // 0x35 53 5
    0x70, 0x7C, 0x54, 0x54, 0x74, 0x00, // 0x36 54 6
    0x04, 0x14, 0x14, 0x14, 0x7C, 0x70, // 0x37 55 7
    0x70, 0x5C, 0x54, 0x74, 0x7C, 0x00, // 0x38 56 8
    0x5C, 0x54, 0x54, 0x54, 0x7C, 0x1C, // 0x39 57 9
    0x50, 0x50, 0x00, 0x00, 0x00, 0x00, // 0x3A 58 :
    0x50, 0xD0, 0x00, 0x00, 0x00, 0x00, // 0x3B 59 ;
    0x18, 0x18, 0x24, 0x42, 0x00, 0x00, // 0x3C 60 <
    0x28, 0x28, 0x28, 0x28, 0x00, 0x00, // 0x3D 61 =
    0x42, 0x24, 0x18, 0x18, 0x00, 0x00, // 0x3E 62 >
    0x04, 0x14, 0x54, 0x54, 0x1C, 0x1C, // 0x3F 63 ?
    0xF8, 0x04, 0x74, 0x74, 0x54, 0x54, // 0x40 64 @
    0x70, 0x7C, 0x14, 0x14, 0x3C, 0x00, // 0x41 65 A
    0x7C, 0x74, 0x54, 0x54, 0x7C, 0x00, // 0x42 66 B
    0x70, 0x7C, 0x44, 0x44, 0x44, 0x44, // 0x43 67 C
    0x70, 0x7C, 0x44, 0x44, 0x48, 0x70, // 0x44 68 D
    0x70, 0x7C, 0x54, 0x54, 0x54, 0x44, // 0x45 69 E
    0x70, 0x7C, 0x14, 0x14, 0x14, 0x04, // 0x46 70 F
    0x70, 0x7C, 0x44, 0x44, 0x54, 0x74, // 0x47 71 G
    0x70, 0x7C, 0x10, 0x10, 0x7C, 0x00, // 0x48 72 H
    0x70, 0x7C, 0x00, 0x00, 0x00, 0x00, // 0x49 73 I
    0x60, 0x40, 0x40, 0x40, 0x7C, 0x70, // 0x4A 74 J
    0x7C, 0x70, 0x10, 0x1C, 0x70, 0x00, // 0x4B 75 K
    0x70, 0x7C, 0x40, 0x40, 0x40, 0x60, // 0x4C 76 L
    0x70, 0x7C, 0x04, 0x04, 0x7C, 0x04, // 0x4D 77 M
    0x70, 0x7C, 0x04, 0x04, 0x04, 0x7C, // 0x4E 78 N
    0x70, 0x7C, 0x44, 0x44, 0x44, 0x7C, // 0x4F 79 O
    0x70, 0x7C, 0x24, 0x24, 0x3C, 0x00, // 0x50 80 P
    0x7C, 0x44, 0x44, 0x44, 0x7C, 0x00, // 0x51 81 Q
    0x7C, 0x74, 0x14, 0x14, 0x3C, 0x00, // 0x52 82 R
    0x5C, 0x5C, 0x54, 0x54, 0x74, 0x00, // 0x53 83 S
    0x04, 0x04, 0x7C, 0x74, 0x04, 0x00, // 0x54 84 T
    0x70, 0x7C, 0x40, 0x40, 0x40, 0x7C, // 0x55 85 U
    0x70, 0x7C, 0x40, 0x40, 0x20, 0x1C, // 0x56 86 V
    0x70, 0x7C, 0x40, 0x40, 0x7C, 0x40, // 0x57 87 W
    0x70, 0x7C, 0x10, 0x10, 0x3C, 0x00, // 0x58 88 X
    0x1C, 0x10, 0x70, 0x70, 0x1C, 0x00, // 0x59 89 Y
    0x74, 0x74, 0x54, 0x54, 0x5C, 0x00, // 0x5A 90 Z
    0xF0, 0xFE, 0x82, 0x00, 0x00, 0x00, // 0x5B 91 [
    0x03, 0x7C, 0x70, 0x00, 0x00, 0x00, // 0x5C 92 \ backslash
    0x82, 0xFE, 0xF0, 0x00, 0x00, 0x00, // 0x5D 93 ]
    0x04, 0x02, 0x01, 0x06, 0x04, 0x00, // 0x5E 94 ^
    0x40, 0x40, 0x40, 0x40, 0x00, 0x00, // 0x5F 95 _
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 96 `
    0x70, 0x7C, 0x14, 0x14, 0x3C, 0x00, // 0x61 97 a
    0x7C, 0x74, 0x54, 0x54, 0x7C, 0x00, // 0x62 98 b
    0x70, 0x7C, 0x44, 0x44, 0x44, 0x44, // 0x63 99 c
    0x70, 0x7C, 0x44, 0x44, 0x48, 0x70, // 0x64 100 d
    0x70, 0x7C, 0x54, 0x54, 0x54, 0x44, // 0x65 101 e
    0x70, 0x7C, 0x14, 0x14, 0x14, 0x04, // 0x66 102 f
    0x70, 0x7C, 0x44, 0x44, 0x54, 0x74, // 0x67 103 g
    0x70, 0x7C, 0x10, 0x10, 0x7C, 0x00, // 0x68 104 h
    0x70, 0x7C, 0x00, 0x00, 0x00, 0x00, // 0x69 105 i
    0x60, 0x40, 0x40, 0x40, 0x7C, 0x70, // 0x6A 106 j
    0x7C, 0x70, 0x10, 0x1C, 0x70, 0x00, // 0x6B 107 k
    0x70, 0x7C, 0x40, 0x40, 0x40, 0x60, // 0x6C 108 l
    0x70, 0x7C, 0x04, 0x04, 0x7C, 0x04, // 0x6D 109 m
    0x70, 0x7C, 0x04, 0x04, 0x04, 0x7C, // 0x6E 110 n
    0x70, 0x7C, 0x44, 0x44, 0x44, 0x7C, // 0x6F 111 o
    0x70, 0x7C, 0x24, 0x24, 0x3C, 0x00, // 0x70 112 p
    0x7C, 0x44, 0x44, 0x44, 0x7C, 0x00, // 0x71 113 q
    0x7C, 0x74, 0x14, 0x14, 0x3C, 0x00, // 0x72 114 r
    0x5C, 0x5C, 0x54, 0x54, 0x74, 0x00, // 0x73 115 s
    0x04, 0x04, 0x7C, 0x74, 0x04, 0x00, // 0x74 116 t
    0x70, 0x7C, 0x40, 0x40, 0x40, 0x7C, // 0x75 117 u
    0x70, 0x7C, 0x40, 0x40, 0x20, 0x1C, // 0x76 118 v
    0x70, 0x7C, 0x40, 0x40, 0x7C, 0x40, // 0x77 119 w
    0x70, 0x7C, 0x10, 0x10, 0x3C, 0x00, // 0x78 120 x
    0x1C, 0x10, 0x70, 0x70, 0x1C, 0x00, // 0x79 121 y
    0x74, 0x74, 0x54, 0x54, 0x5C, 0x00, // 0x7A 122 z
    0x10, 0xFE, 0xC2, 0x00, 0x00, 0x00, // 0x7B 123 {
    0x00, 0x44, 0x77, 0x00, 0x00, 0x00, // 0x7C 124 |
    0xC2, 0xFE, 0x10, 0x00, 0x00, 0x00, // 0x7D 125 }
    0x02, 0x01, 0x03, 0x04, 0x06, 0x02, // 0x7E 126 ~
    0x3C, 0x22, 0x21, 0x22, 0x3C, 0x00, // 0x7F 127
#else // default font
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 32
    0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, // 0x21 33 !
    0x00, 0x07, 0x00, 0x07, 0x00, 0x00, // 0x22 34 "
    0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, // 0x23 35 #
    0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, // 0x24 36 $
    0x23, 0x13, 0x08, 0x64, 0x62, 0x00, // 0x25 37 %
    0x36, 0x49, 0x56, 0x20, 0x50, 0x00, // 0x26 38 &
    0x00, 0x08, 0x07, 0x03, 0x00, 0x00, // 0x27 39 '
    0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, // 0x28 40 (
    0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, // 0x29 41 )
    0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, // 0x2A 42 *
    0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, // 0x2B 43 +
    0x00, 0x80, 0x70, 0x30, 0x00, 0x00, // 0x2C 44 ,
    0x08, 0x08, 0x08, 0x08, 0x08, 0x00, // 0x2D 45 -
    0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // 0x2E 46 .
    0x20, 0x10, 0x08, 0x04, 0x02, 0x00, // 0x2F 47 /
    0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, // 0x30 48 0
    0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, // 0x31 49 1
    0x72, 0x49, 0x49, 0x49, 0x46, 0x00, // 0x32 50 2
    0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, // 0x33 51 3
    0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, // 0x34 52 4
    0x27, 0x45, 0x45, 0x45, 0x39, 0x00, // 0x35 53 5
    0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, // 0x36 54 6
    0x41, 0x21, 0x11, 0x09, 0x07, 0x00, // 0x37 55 7
    0x36, 0x49, 0x49, 0x49, 0x36, 0x00, // 0x38 56 8
    0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, // 0x39 57 9
    0x00, 0x00, 0x14, 0x00, 0x00, 0x00, // 0x3A 58 :
    0x00, 0x40, 0x34, 0x00, 0x00, 0x00, // 0x3B 59 ;
    0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // 0x3C 60 <
    0x14, 0x14, 0x14, 0x14, 0x14, 0x00, // 0x3D 61 =
    0x00, 0x41, 0x22, 0x14, 0x08, 0x00, // 0x3E 62 >
    0x02, 0x01, 0x59, 0x09, 0x06, 0x00, // 0x3F 63 ?
    0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, // 0x40 64 @
    0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, // 0x41 65 A
    0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, // 0x42 66 B
    0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, // 0x43 67 C
    0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, // 0x44 68 D
    0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, // 0x45 69 E
    0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, // 0x46 70 F
    0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, // 0x47 71 G
    0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, // 0x48 72 H
    0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, // 0x49 73 I
    0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, // 0x4A 74 J
    0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, // 0x4B 75 K
    0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, // 0x4C 76 L
    0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, // 0x4D 77 M
    0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, // 0x4E 78 N
    0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, // 0x4F 79 O
    0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, // 0x50 80 P
    0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, // 0x51 81 Q
    0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, // 0x52 82 R
    0x26, 0x49, 0x49, 0x49, 0x32, 0x00, // 0x53 83 S
    0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, // 0x54 84 T
    0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, // 0x55 85 U
    0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, // 0x56 86 V
    0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, // 0x57 87 W
    0x63, 0x14, 0x08, 0x14, 0x63, 0x00, // 0x58 88 X
    0x03, 0x04, 0x78, 0x04, 0x03, 0x00, // 0x59 89 Y
    0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, // 0x5A 90 Z
    0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, // 0x5B 91 [
    0x02, 0x04, 0x08, 0x10, 0x20, 0x00, // 0x5C 92 \ backslash
    0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, // 0x5D 93 ]
    0x04, 0x02, 0x01, 0x02, 0x04, 0x00, // 0x5E 94 ^
    0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // 0x5F 95 _
    0x00, 0x03, 0x07, 0x08, 0x00, 0x00, // 0x60 96 `
    0x20, 0x54, 0x54, 0x78, 0x40, 0x00, // 0x61 97 a
    0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, // 0x62 98 b
    0x38, 0x44, 0x44, 0x44, 0x28, 0x00, // 0x63 99 c
    0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, // 0x64 100 d
    0x38, 0x54, 0x54, 0x54, 0x18, 0x00, // 0x65 101 e
    0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, // 0x66 102 f
    0x18, 0x24, 0x24, 0x1C, 0x78, 0x00, // 0x67 103 g
    0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, // 0x68 104 h
    0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, // 0x69 105 i
    0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, // 0x6A 106 j
    0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, // 0x6B 107 k
    0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, // 0x6C 108 l
    0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, // 0x6D 109 m
    0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, // 0x6E 110 n
    0x38, 0x44, 0x44, 0x44, 0x38, 0x00, // 0x6F 111 o
    0x7C, 0x18, 0x24, 0x24, 0x18, 0x00, // 0x70 112 p
    0x18, 0x24, 0x24, 0x18, 0x7C, 0x00, // 0x71 113 q
    0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, // 0x72 114 r
    0x48, 0x54, 0x54, 0x54, 0x24, 0x00, // 0x73 115 s
    0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, // 0x74 116 t
    0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, // 0x75 117 u
    0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, // 0x76 118 v
    0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, // 0x77 119 w
    0x44, 0x28, 0x10, 0x28, 0x44, 0x00, // 0x78 120 x
    0x4C, 0x90, 0x10, 0x90, 0x7C, 0x00, // 0x79 121 y
    0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, // 0x7A 122 z
    0x00, 0x08, 0x36, 0x41, 0x00, 0x00, // 0x7B 123 {
    0x00, 0x00, 0x77, 0x00, 0x00, 0x00, // 0x7C 124 |
    0x00, 0x41, 0x36, 0x08, 0x00, 0x00, // 0x7D 125 }
    0x02, 0x01, 0x02, 0x04, 0x02, 0x00, // 0x7E 126 ~
    0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, // 0x7F 127
#endif

#if defined(OLED_LOGO_GMK_BAD)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80
    0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0x70, // 0x81
    0x38, 0x38, 0x38, 0x78, 0x70, 0xF0, // 0x82
    0xE0, 0xE0, 0x80, 0x00, 0x00, 0x00, // 0x83
    0x00, 0x00, 0x00, 0x80, 0xF0, 0xF8, // 0x84
    0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, // 0x85
    0x80, 0xE0, 0xF8, 0xF8, 0xF8, 0xF8, // 0x86
    0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x87
    0x80, 0xF8, 0xF8, 0xF8, 0x38, 0x00, // 0x88
    0x80, 0xE0, 0xF0, 0xF8, 0x78, 0x38, // 0x89
    0x08, 0x08, 0x00, 0x00, 0x00, 0x00, // 0x8A
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x8B
    0x80, 0xF8, 0xF8, 0xF8, 0x38, 0x38, // 0x8C
    0x38, 0xF8, 0xF0, 0xF0, 0xE0, 0x00, // 0x8D
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x8E
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x8F
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x91
    0x00, 0x00, 0x00, 0x80, 0xFC, 0xFC, // 0x92
    0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, // 0x93
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x94
    0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, // 0x95
    0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, // 0x96
    0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, // 0x97
    0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, // 0x98
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x99
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x9A
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x9B
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x9C
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x9D
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x9E
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x9F
    0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, // 0xA0
    0xFF, 0xFF, 0xFF, 0xC1, 0x80, 0x00, // 0xA1
    0x00, 0x38, 0x38, 0xB8, 0xB8, 0xF9, // 0xA2
    0xF9, 0xF8, 0x38, 0x00, 0x00, 0x00, // 0xA3
    0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0x1F, // 0xA4
    0x01, 0x3F, 0xFF, 0xFF, 0xF0, 0xFE, // 0xA5
    0x7F, 0x0F, 0x03, 0xFF, 0xFF, 0xFF, // 0xA6
    0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, // 0xA7
    0xFF, 0xFF, 0xFF, 0x3F, 0x1E, 0x7F, // 0xA8
    0xFF, 0xFF, 0xF3, 0xC1, 0x80, 0x00, // 0xA9
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xAA
    0x00, 0x00, 0x00, 0x00, 0x00, 0x80, // 0xAB
    0xFF, 0xFF, 0xFF, 0x3F, 0x1C, 0x1C, // 0xAC
    0x9C, 0xFF, 0xFF, 0xF3, 0xE1, 0x00, // 0xAD
    0x00, 0x00, 0x00, 0xF0, 0xFC, 0xFE, // 0xAE
    0xFF, 0x0F, 0x07, 0x07, 0x8E, 0xFF, // 0xAF
    0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, // 0xB0
    0x00, 0xF0, 0xFC, 0xFE, 0xFF, 0x8F, // 0xB1
    0x07, 0x07, 0x8E, 0xFF, 0xFF, 0xFF, // 0xB2
    0x3F, 0x00, 0x00, 0x00, 0x00, 0x80, // 0xB3
    0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, // 0xB4
    0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, // 0xB5
    0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, // 0xB6
    0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, // 0xB7
    0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, // 0xB8
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB9
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xBA
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xBB
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xBC
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xBD
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xBE
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xBF
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0
    0x00, 0x01, 0x03, 0x03, 0x03, 0x07, // 0xC1
    0x07, 0x07, 0x07, 0x03, 0x03, 0x03, // 0xC2
    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC3
    0x06, 0x07, 0x07, 0x07, 0x01, 0x00, // 0xC4
    0x00, 0x00, 0x07, 0x07, 0x07, 0x01, // 0xC5
    0x00, 0x00, 0x00, 0x07, 0x07, 0x07, // 0xC6
    0x07, 0x00, 0x00, 0x00, 0x00, 0x07, // 0xC7
    0x07, 0x07, 0x07, 0x00, 0x00, 0x00, // 0xC8
    0x00, 0x03, 0x07, 0x07, 0x07, 0x06, // 0xC9
    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xCA
    0x00, 0x00, 0x00, 0x00, 0x00, 0x07, // 0xCB
    0x07, 0x07, 0x07, 0x07, 0x07, 0x07, // 0xCC
    0x07, 0x07, 0x03, 0x01, 0x00, 0x00, // 0xCD
    0x00, 0x00, 0x00, 0x00, 0x03, 0x07, // 0xCE
    0x07, 0x07, 0x07, 0x03, 0x07, 0x07, // 0xCF
    0x07, 0x07, 0x00, 0x00, 0x00, 0x00, // 0xD0
    0x00, 0x00, 0x03, 0x07, 0x07, 0x07, // 0xD1
    0x07, 0x03, 0x07, 0x07, 0x07, 0x07, // 0xD2
    0x00, 0x00, 0x00, 0x00, 0x01, 0x07, // 0xD3
    0x07, 0x07, 0x01, 0x00, 0x00, 0x00, // 0xD4
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD5
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD6
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD7
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD9
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDA
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDB
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDC
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDD
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDE
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDF
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x14, 0x08, 0x14, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x22, 0x1C, 0x41, 0x3E, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x18, 0x0C,
    0x06, 0x0C, 0x18, 0x30, 0x00, 0x00,
    0x00, 0x00, 0x06, 0x06, 0x06, 0x0C,
    0x18, 0x30, 0x66, 0x66, 0x66, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x0C, 0x7E,
    0x7F, 0x7E, 0x0C, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x77, 0x77, 0x77, 0x00,
    0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
    0x00, 0x00, 0xE7, 0xA5, 0xFF, 0x24,
    0x24, 0xFF, 0xA5, 0xE7, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
    0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00,
    0x00, 0x10, 0x02, 0x38, 0xFC, 0xED,
    0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x3E, 0x4A, 0x4F,
    0x4A, 0x3E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x40, 0x60, 0x6A, 0x64,
    0x6A, 0x60, 0x40, 0x00, 0x00, 0x00,
    0x00, 0x04, 0x42, 0x69, 0x65, 0x65,
    0x65, 0x69, 0x42, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x14, 0x1C, 0x08,
    0x18, 0x08, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x70, 0xC8, 0xEE, 0xF9, 0x70,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    #elif defined(OLED_LOGO_HUE_MANITEE)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80
    0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0,
    0x90, 0x70, 0xE8, 0xA8, 0xE4, 0xC4,
    0xC4, 0xA0, 0xE4, 0xB0, 0xDC, 0xE4,
    0xFC, 0xFC, 0xFC, 0xFC, 0x3C, 0x3C,
    0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, // 0x90
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
    0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
    0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
    0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, // 0xA0
    0xFC, 0xF6, 0xF7, 0xEF, 0xFF, 0x87,
    0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
    0x1F, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF,
    0xFF, 0x07, 0x1F, 0x1F, 0x19, 0x15,
    0xF7, 0x16, 0x1A, 0x1B, 0x16, 0x07,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x0C, 0x0C, 0x33, 0x33,
    0x33, 0x33, 0x33, 0x33, 0xC0, 0xC0,
    0x00, 0x00, 0x03, 0x03, 0xFF, 0xFF,
    0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0,
    0x00, 0x00, 0x00, 0xFC, 0xFC, 0x03,
    0x03, 0x03, 0x03, 0x03, 0x03, 0xFC,
    0xFC, 0x00, 0x00, 0x00, 0xFC, 0xFC,
    0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
    0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
    0xFF, 0xFF, 0x30, 0x30, 0xCC, 0xCC, // 0xB0
    0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
    0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
    0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
    0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // 0xC0
    0x03, 0x07, 0x07, 0x07, 0x07, 0x01,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x03, 0x07, 0x07,
    0x03, 0x00, 0x00, 0x02, 0x04, 0x00,
    0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x03, 0x03, 0x03, 0x03,
    0x03, 0x03, 0x03, 0x03, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x03, 0x03, 0x03, 0x03, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
    0x03, 0x03, 0x03, 0x03, 0x03, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x03, 0x03, 0x00, 0x00, 0x00, 0x00, // 0xD0
    0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDF
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x14, 0x08, 0x14, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x22, 0x1C, 0x41, 0x3E, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x18, 0x0C,
    0x06, 0x0C, 0x18, 0x30, 0x00, 0x00,
    0x00, 0x00, 0x06, 0x06, 0x06, 0x0C,
    0x18, 0x30, 0x66, 0x66, 0x66, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x0C, 0x7E,
    0x7F, 0x7E, 0x0C, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x77, 0x77, 0x77, 0x00,
    0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
    0x00, 0x00, 0xE7, 0xA5, 0xFF, 0x24,
    0x24, 0xFF, 0xA5, 0xE7, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
    0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00,
    0x00, 0x10, 0x02, 0x38, 0xFC, 0xED,
    0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x3E, 0x4A, 0x4F,
    0x4A, 0x3E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x40, 0x60, 0x6A, 0x64,
    0x6A, 0x60, 0x40, 0x00, 0x00, 0x00,
    0x00, 0x04, 0x42, 0x69, 0x65, 0x65,
    0x65, 0x69, 0x42, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x14, 0x1C, 0x08,
    0x18, 0x08, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x70, 0xC8, 0xEE, 0xF9, 0x70,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    #elif defined(OLED_LOGO_CORNE)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0,
    0xF0, 0xF8, 0xF8, 0x18, 0x00, 0xC0,
    0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0,
    0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
    0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
    0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0,
    0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80,
    0x00, 0x00, 0x00, 0xE0, 0xE0, 0xC0,
    0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00,
    0x00, 0xE0, 0xE0, 0xC0, 0xC0, 0xE0,
    0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80,
    0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, // 0x90
    0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
    0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
    0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
    0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
    0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
    0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
    0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
    0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
    0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0
    0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE,
    0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0x1F, 0x07, 0x01, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0xFF, 0xFF, 0xFF, 0x81, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
    0xC3, 0xC3, 0xC3, 0x00, 0x00, 0xFF,
    0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF,
    0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
    0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF,
    0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, // 0xB0
    0x9D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
    0x1C, 0x9D, 0xDF, 0xDF, 0xDF, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
    0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
    0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
    0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
    0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
    0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
    0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
    0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0
    0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F,
    0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x3F,
    0x3F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
    0x7F, 0x7C, 0x78, 0x78, 0x38, 0x1C,
    0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x01, 0x03, 0x07, 0x07,
    0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
    0x03, 0x01, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x03, 0x07, 0x07, 0x07, 0x07,
    0x07, 0x07, 0x07, 0x07, 0x03, 0x01,
    0x00, 0x00, 0x00, 0x07, 0x07, 0x07,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x07, 0x07, 0x07, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x07, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x01, 0x03, // 0xD0
    0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
    0x07, 0x07, 0x03, 0x01, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDF
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x14, 0x08, 0x14, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x22, 0x1C, 0x41, 0x3E, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x18, 0x0C,
    0x06, 0x0C, 0x18, 0x30, 0x00, 0x00,
    0x00, 0x00, 0x06, 0x06, 0x06, 0x0C,
    0x18, 0x30, 0x66, 0x66, 0x66, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x0C, 0x7E,
    0x7F, 0x7E, 0x0C, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x77, 0x77, 0x77, 0x00,
    0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
    0x00, 0x00, 0xE7, 0xA5, 0xFF, 0x24,
    0x24, 0xFF, 0xA5, 0xE7, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
    0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00,
    0x00, 0x10, 0x02, 0x38, 0xFC, 0xED,
    0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x3E, 0x4A, 0x4F,
    0x4A, 0x3E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x40, 0x60, 0x6A, 0x64,
    0x6A, 0x60, 0x40, 0x00, 0x00, 0x00,
    0x00, 0x04, 0x42, 0x69, 0x65, 0x65,
    0x65, 0x69, 0x42, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x14, 0x1C, 0x08,
    0x18, 0x08, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x70, 0xC8, 0xEE, 0xF9, 0x70,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

#elif defined(OLED_LOGO_GOTHAM) // see /keyboards/crkbd/keymaps/gotham/oled.c
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80
    0x00, 0x00, 0xC0, 0x60, 0x30, 0x18,
    0xF8, 0x18, 0x00, 0xC0, 0x70, 0x1C,
    0x06, 0x03, 0x01, 0x01, 0x01, 0x01,
    0x01, 0xC3, 0x7E, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x08, 0x08, 0x08, 0x00,
    0x00, 0x08, 0x08, 0x08, 0x00, 0x1C,
    0x22, 0x41, 0x41, 0x41, 0x22, 0x1C,
    0x00, 0x08, 0x08, 0x08, 0x00, 0x00,
    0x08, 0x08, 0x08, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x20, 0x20, 0xF8,
    0x0C, 0x04, 0xE7, 0xE4, 0xE4, 0x07,
    0x04, 0xE4, 0xE7, 0xE4, 0x04, 0x07,
    0xE4, 0xE4, 0xE7, 0x04, 0x0C, 0xF8,
    0x20, 0x20, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x14, 0x08, 0x14, 0x00, 0x00, // 0x90
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x22, 0x1C, 0x41, 0x3E, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
    0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30,
    0x77, 0x77, 0x77, 0x00, 0x77, 0x77,
    0x77, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x3E, 0x4A, 0x4F,
    0x4A, 0x3E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x08, 0x00, 0x00, 0x60,
    0x70, 0x3E, 0x1F, 0x19, 0x18, 0x0C,
    0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
    0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0xF8, 0x0C, 0x06, 0x07, 0xFC, // 0xA0
    0x00, 0xFF, 0x01, 0x00, 0x00, 0x00,
    0xFF, 0x80, 0xFF, 0x01, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0xF0, 0x1C,
    0x07, 0x01, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0x41, 0x00,
    0x00, 0x1C, 0x22, 0x00, 0x00, 0x1C,
    0x3E, 0x7F, 0x63, 0x41, 0x22, 0x1C,
    0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
    0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x49, 0x49, 0xFF,
    0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x38,
    0x30, 0xFF, 0xFF, 0xFF, 0x30, 0x38,
    0x3F, 0x1F, 0x0F, 0x00, 0x00, 0xFF,
    0x49, 0x49, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x40, 0x60, 0x6A, 0x64,
    0x6A, 0x60, 0x40, 0x00, 0x00, 0x00, // 0xB0
    0x00, 0x04, 0x42, 0x69, 0x65, 0x65,
    0x65, 0x69, 0x42, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x06, 0x06, 0x06,
    0x0C, 0x18, 0x30, 0x66, 0x66, 0x66,
    0x00, 0x00, 0xFC, 0x24, 0x24, 0xFC,
    0x24, 0x24, 0xFC, 0x24, 0x24, 0xFC,
    0x24, 0x24, 0xFC, 0x24, 0x24, 0xFC,
    0x24, 0x24, 0xFC, 0x24, 0x24, 0xFC,
    0x24, 0x24, 0xFC, 0x00, 0x00, 0x00,
    0xF0, 0x90, 0x90, 0xF0, 0x90, 0x90,
    0xF0, 0x98, 0x9C, 0xF2, 0x22, 0x21,
    0xE1, 0x01, 0x01, 0x01, 0xF1, 0x91,
    0x91, 0xFA, 0x4C, 0x4C, 0xF8, 0x48,
    0x48, 0xF8, 0x48, 0x48, 0xF8, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x03, 0x0E, 0x18, 0x30, 0x21, // 0xC0
    0x21, 0x31, 0x18, 0x10, 0x30, 0x20,
    0x60, 0x41, 0x60, 0x20, 0x30, 0x18,
    0x30, 0x60, 0x40, 0x40, 0x47, 0x4C,
    0x48, 0x68, 0x38, 0x1C, 0x0F, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x08, 0x00, 0x00, 0x1C,
    0x22, 0x41, 0x63, 0x7F, 0x3E, 0x1C,
    0x00, 0x00, 0x22, 0x1C, 0x00, 0x00,
    0x41, 0x22, 0x1C, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x02, 0x02, 0x0F,
    0x18, 0x10, 0x70, 0x10, 0x10, 0x70,
    0x10, 0x13, 0x73, 0x13, 0x10, 0x70,
    0x10, 0x10, 0x70, 0x10, 0x18, 0x0F,
    0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
    0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00, // 0xD0
    0x00, 0x10, 0x02, 0x38, 0xFC, 0xED,
    0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
    0x08, 0x0C, 0x7E, 0x7F, 0x7E, 0x0C,
    0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x0F, 0x09, 0x09, 0x09,
    0x0F, 0x09, 0x09, 0x0F, 0x09, 0x09,
    0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
    0x09, 0x0F, 0x09, 0x09, 0x0F, 0x09,
    0x09, 0x09, 0x0F, 0x00, 0x00, 0x00,
    0x07, 0x04, 0x04, 0x07, 0x04, 0x04,
    0x07, 0x04, 0x04, 0x0F, 0x09, 0x09,
    0x0F, 0x00, 0x00, 0x00, 0x07, 0x04,
    0x04, 0x07, 0x02, 0x02, 0x03, 0x02,
    0x02, 0x03, 0x02, 0x02, 0x03, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDF
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x14, 0x08, 0x14, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x22, 0x1C, 0x41, 0x3E, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x18, 0x0C,
    0x06, 0x0C, 0x18, 0x30, 0x00, 0x00,
    0x00, 0x00, 0x06, 0x06, 0x06, 0x0C,
    0x18, 0x30, 0x66, 0x66, 0x66, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x0C, 0x7E,
    0x7F, 0x7E, 0x0C, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x77, 0x77, 0x77, 0x00,
    0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
    0x00, 0x00, 0xE7, 0xA5, 0xFF, 0x24,
    0x24, 0xFF, 0xA5, 0xE7, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
    0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00,
    0x00, 0x10, 0x02, 0x38, 0xFC, 0xED,
    0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x3E, 0x4A, 0x4F,
    0x4A, 0x3E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x40, 0x60, 0x6A, 0x64,
    0x6A, 0x60, 0x40, 0x00, 0x00, 0x00,
    0x00, 0x04, 0x42, 0x69, 0x65, 0x65,
    0x65, 0x69, 0x42, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x14, 0x1C, 0x08,
    0x18, 0x08, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x70, 0xC8, 0xEE, 0xF9, 0x70,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

#elif defined(OLED_LOGO_SCIFI)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0x80, 0x80, 0xC0, 0xC0, 0xE0, 0x60,
    0x70, 0x30, 0x38, 0x18, 0x0C, 0x0C,
    0x1E, 0x0C, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0xF0, 0x38, 0x1C, 0x0E,
    0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    0x00, 0x00, 0x80, 0x40, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x80, 0x80, 0x80, 0x00,
    0x00, 0x00, 0x00, 0x80, 0x80, 0xC0,
    0xC0, 0x60, 0x60, 0x30, 0x10, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
    0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
    0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
    0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
    0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
    0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
    0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
    0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
    0x30, 0x30, 0x70, 0x78, 0x78, 0x7C,
    0x7C, 0x7E, 0x3E, 0x3F, 0x3F, 0x3B,
    0x3B, 0x39, 0x39, 0x38, 0x38, 0x38,
    0x38, 0x38, 0x38, 0x38, 0x3C, 0x38,
    0x18, 0x8F, 0xDF, 0xF8, 0x7C, 0xBE,
    0xDF, 0xF7, 0xFB, 0xFD, 0xFE, 0xEF,
    0x73, 0x3B, 0x1B, 0x1F, 0xEF, 0xF7,
    0xFF, 0x7E, 0x6F, 0x6F, 0x6F, 0x6F,
    0x6D, 0xBD, 0xE1, 0xF9, 0x3F, 0x3F,
    0x39, 0x79, 0x79, 0x7D, 0xED, 0xED,
    0xCD, 0xC7, 0xC7, 0x87, 0xC7, 0xE3,
    0xE0, 0xF8, 0x7E, 0x3F, 0x37, 0x33,
    0x3B, 0x1B, 0x19, 0x19, 0x0D, 0xED,
    0xFF, 0xBF, 0xC7, 0xE7, 0xE3, 0xF0,
    0x7C, 0xDE, 0xE7, 0xFB, 0x3E, 0x3F,
    0xFC, 0xE0, 0xF8, 0x3E, 0xCF, 0xF3,
    0xFC, 0x3F, 0x1F, 0x1F, 0x3C, 0x7E,
    0x76, 0xF3, 0xE3, 0x81, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
    0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
    0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
    0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
    0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
    0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
    0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
    0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x20, 0x30, 0x18, 0x1E,
    0x0F, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x01, 0x03, 0x03, 0x01, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x03, 0x07, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x01, 0xE1, 0x79, 0x3E, 0x1F,
    0x07, 0x01, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
    0x01, 0x00, 0x00, 0x01, 0x01, 0x01,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x01, 0x01, 0x03,
    0x02, 0x06, 0x04, 0x08, 0x18, 0x10,
    0x30, 0x20, 0x60, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x14, 0x08, 0x14, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x22, 0x1C, 0x41, 0x3E, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x18, 0x0C,
    0x06, 0x0C, 0x18, 0x30, 0x00, 0x00,
    0x00, 0x00, 0x06, 0x06, 0x06, 0x0C,
    0x18, 0x30, 0x66, 0x66, 0x66, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x0C, 0x7E,
    0x7F, 0x7E, 0x0C, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x77, 0x77, 0x77, 0x00,
    0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
    0x00, 0x00, 0xE7, 0xA5, 0xFF, 0x24,
    0x24, 0xFF, 0xA5, 0xE7, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
    0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00,
    0x00, 0x10, 0x02, 0x38, 0xFC, 0xED,
    0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x3E, 0x4A, 0x4F,
    0x4A, 0x3E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x40, 0x60, 0x6A, 0x64,
    0x6A, 0x60, 0x40, 0x00, 0x00, 0x00,
    0x00, 0x04, 0x42, 0x69, 0x65, 0x65,
    0x65, 0x69, 0x42, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x14, 0x1C, 0x08,
    0x18, 0x08, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x70, 0xC8, 0xEE, 0xF9, 0x70,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00
#else
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80
    0x40, 0x40, 0x40, 0xF0, 0xF8, 0xF8,
    0xFF, 0x38, 0xFF, 0xF8, 0xF8, 0x3F,
    0xF8, 0xF8, 0xFF, 0x38, 0xFF, 0xF8,
    0xF8, 0xF0, 0x40, 0x40, 0x40, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00,
    0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x80, 0xC0, 0xC0, 0x00, 0xC0, 0xC0,
    0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00,
    0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
    0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
    0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
    0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
    0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
    0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
    0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
    0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
    0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0
    0x49, 0x49, 0x49, 0xFF, 0xFF, 0xFF,
    0xFF, 0xE0, 0xDF, 0xBF, 0xBF, 0x00,
    0xBF, 0xBF, 0xDF, 0xE0, 0xFF, 0xFF,
    0xFF, 0xFF, 0x49, 0x49, 0x49, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F,
    0x60, 0x60, 0xE0, 0xBF, 0x1F, 0x00,
    0x7F, 0x7F, 0x07, 0x1E, 0x38, 0x1E,
    0x07, 0x7F, 0x7F, 0x00, 0x7F, 0x7F,
    0x0E, 0x1F, 0x3B, 0x71, 0x60, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F,
    0x0C, 0x0C, 0x0C, 0x00, 0x7E, 0x7E,
    0x00, 0x7F, 0x7E, 0x03, 0x03, 0x00,
    0x7F, 0x7E, 0x03, 0x03, 0x7E, 0x7E,
    0x03, 0x03, 0x7F, 0x7E, 0x00, 0x0F,
    0x3E, 0x70, 0x3C, 0x06, 0x3C, 0x70,
    0x3E, 0x0F, 0x00, 0x32, 0x7B, 0x49, // 0xB0
    0x49, 0x3F, 0x7E, 0x00, 0x7F, 0x7E,
    0x03, 0x03, 0x00, 0x1E, 0x3F, 0x69,
    0x69, 0x6F, 0x26, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
    0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
    0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
    0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
    0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
    0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
    0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
    0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0
    0x01, 0x01, 0x01, 0x07, 0x0F, 0x0F,
    0x7F, 0x0F, 0x7F, 0x0F, 0x0F, 0x7E,
    0x0F, 0x0F, 0x7F, 0x0F, 0x7F, 0x0F,
    0x0F, 0x07, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xDF
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x14, 0x08, 0x14, 0x00, 0x00,
    0x00, 0x1C, 0x1C, 0x3E, 0x7F, 0x7F,
    0x00, 0x22, 0x1C, 0x41, 0x3E, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x18, 0x0C,
    0x06, 0x0C, 0x18, 0x30, 0x00, 0x00,
    0x00, 0x00, 0x06, 0x06, 0x06, 0x0C,
    0x18, 0x30, 0x66, 0x66, 0x66, 0x00,
    0x00, 0x00, 0x00, 0x08, 0x0C, 0x7E,
    0x7F, 0x7E, 0x0C, 0x08, 0x00, 0x00,
    0x00, 0x00, 0x77, 0x77, 0x77, 0x00,
    0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
    0x00, 0x00, 0xE7, 0xA5, 0xFF, 0x24,
    0x24, 0xFF, 0xA5, 0xE7, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
    0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00,
    0x00, 0x10, 0x02, 0x38, 0xFC, 0xED,
    0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x3E, 0x4A, 0x4F,
    0x4A, 0x3E, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x40, 0x60, 0x6A, 0x64,
    0x6A, 0x60, 0x40, 0x00, 0x00, 0x00,
    0x00, 0x04, 0x42, 0x69, 0x65, 0x65,
    0x65, 0x69, 0x42, 0x04, 0x00, 0x00,
    0x00, 0x00, 0x1C, 0x14, 0x1C, 0x08,
    0x18, 0x08, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x70, 0xC8, 0xEE, 0xF9, 0x70,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

#endif
  };

A users/drashna/drashna_transport.c => users/drashna/drashna_transport.c +508 -0
@@ 0,0 1,508 @@
/* Copyright 2020 Christopher Courtney, aka Drashna Jael're  (@drashna) <drashna@live.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <string.h>
#include <stddef.h>

#include "matrix.h"
#include QMK_KEYBOARD_H

#define ROWS_PER_HAND (MATRIX_ROWS / 2)

#ifdef RGBLIGHT_ENABLE
#    include "rgblight.h"
#endif

#ifdef BACKLIGHT_ENABLE
#    include "backlight.h"
#endif

#ifdef ENCODER_ENABLE
#    include "encoder.h"
static pin_t encoders_pad[] = ENCODERS_PAD_A;
#    define NUMBER_OF_ENCODERS (sizeof(encoders_pad) / sizeof(pin_t))
#endif

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

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

#if defined(USE_I2C)

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

typedef struct _I2C_slave_buffer_t {
    matrix_row_t smatrix[ROWS_PER_HAND];
#    ifdef SPLIT_MODS_ENABLE
    uint8_t real_mods;
    uint8_t weak_mods;
#        ifndef NO_ACTION_ONESHOT
    uint8_t oneshot_mods;
#        endif
#    endif
#    ifdef BACKLIGHT_ENABLE
    uint8_t backlight_level;
#    endif
#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
    rgblight_syncinfo_t rgblight_sync;
#    endif
#    ifdef ENCODER_ENABLE
    uint8_t encoder_state[NUMBER_OF_ENCODERS];
#    endif
#    ifdef WPM_ENABLE
    uint8_t current_wpm;
#    endif
    int8_t        mouse_x;
    int8_t        mouse_y;
    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_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)
#    define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state)
#    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_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 TIMEOUT 100

#    ifndef SLAVE_I2C_ADDRESS
#        define SLAVE_I2C_ADDRESS 0x32
#    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);

    // write backlight info
#    ifdef BACKLIGHT_ENABLE
    uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0;
    if (level != i2c_buffer->backlight_level) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_BACKLIGHT_START, (void *)&level, sizeof(level), TIMEOUT) >= 0) {
            i2c_buffer->backlight_level = level;
        }
    }
#    endif

#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
    if (rgblight_get_change_flags()) {
        rgblight_syncinfo_t rgblight_sync;
        rgblight_get_syncinfo(&rgblight_sync);
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_START, (void *)&rgblight_sync, sizeof(rgblight_sync), TIMEOUT) >= 0) {
            rgblight_clear_change_flags();
        }
    }
#    endif

#    ifdef ENCODER_ENABLE
    i2c_readReg(SLAVE_I2C_ADDRESS, I2C_ENCODER_START, (void *)i2c_buffer->encoder_state, sizeof(i2c_buffer->encoder_state), TIMEOUT);
    encoder_update_raw(i2c_buffer->encoder_state);
#    endif

#    ifdef WPM_ENABLE
    uint8_t current_wpm = get_current_wpm();
    if (current_wpm != i2c_buffer->current_wpm) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WPM_START, (void *)&current_wpm, sizeof(current_wpm), TIMEOUT) >= 0) {
            i2c_buffer->current_wpm = current_wpm;
        }
    }
#    endif

#    ifdef POINTING_DEVICE_ENABLE
    if (is_keyboard_left()) {
        report_mouse_t temp_report = pointing_device_get_report();
        i2c_readReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_X_START, (void *)&i2c_buffer->mouse_x, sizeof(i2c_buffer->mouse_x), TIMEOUT);
        temp_report.x = i2c_buffer->mouse_x;
        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);
    }
#    endif

#    ifdef SPLIT_MODS_ENABLE
    uint8_t real_mods = get_mods();
    if (real_mods != i2c_buffer->real_mods) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_REAL_MODS_START, (void *)&real_mods, sizeof(real_mods), TIMEOUT) >= 0) {
            i2c_buffer->real_mods = real_mods;
        }
    }

    uint8_t weak_mods = get_weak_mods();
    if (weak_mods != i2c_buffer->weak_mods) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WEAK_MODS_START, (void *)&weak_mods, sizeof(weak_mods), TIMEOUT) >= 0) {
            i2c_buffer->weak_mods = weak_mods;
        }
    }

#        ifndef NO_ACTION_ONESHOT
    uint8_t oneshot_mods = get_oneshot_mods();
    if (oneshot_mods != i2c_buffer->oneshot_mods) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_ONESHOT_MODS_START, (void *)&oneshot_mods, sizeof(oneshot_mods), TIMEOUT) >= 0) {
            i2c_buffer->oneshot_mods = oneshot_mods;
        }
    }
#        endif
#    endif

    if (layer_state != i2c_buffer->t_layer_state) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_LAYER_STATE_START, (void *)&layer_state, sizeof(layer_state), TIMEOUT) >= 0) {
            i2c_buffer->t_layer_state = layer_state;
        }
    }

    if (default_layer_state != i2c_buffer->t_default_layer_state) {
        if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_DEFAULT_LAYER_STATE_START, (void *)&default_layer_state, sizeof(default_layer_state), TIMEOUT) >= 0) {
            i2c_buffer->t_default_layer_state = default_layer_state;
        }
    }

#    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;
        }
    }
#    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;
        }
    }
#    endif

    return true;
}

void transport_slave(matrix_row_t matrix[]) {
    // Copy matrix to I2C buffer
    memcpy((void *)i2c_buffer->smatrix, (void *)matrix, sizeof(i2c_buffer->smatrix));

// Read Backlight Info
#    ifdef BACKLIGHT_ENABLE
    backlight_set(i2c_buffer->backlight_level);
#    endif

#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
    // Update the RGB with the new data
    if (i2c_buffer->rgblight_sync.status.change_flags != 0) {
        rgblight_update_sync(&i2c_buffer->rgblight_sync, false);
        i2c_buffer->rgblight_sync.status.change_flags = 0;
    }
#    endif

#    ifdef ENCODER_ENABLE
    encoder_state_raw(i2c_buffer->encoder_state);
#    endif

#    ifdef WPM_ENABLE
    set_current_wpm(i2c_buffer->current_wpm);
#    endif

#    ifdef POINTING_DEVICE_ENABLE
    if (!is_keyboard_left()) {
        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;
        i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_MOUSE_Y_START, (void *)&i2c_buffer->mouse_y, sizeof(i2c_buffer->mouse_y), TIMEOUT);
    }

#    endif

#    ifdef SPLIT_MODS_ENABLE
    set_mods(i2c_buffer->real_mods);
    set_weak_mods(i2c_buffer->weak_mods);
#        ifndef NO_ACTION_ONESHOT
    set_oneshot_mods(i2c_buffer->oneshot_mods);
#        endif
#    endif

    if (layer_state != i2c_buffer->t_layer_state) {
        layer_state = i2c_buffer->t_layer_state;
    }
    if (default_layer_state != i2c_buffer->t_default_layer_state) {
        default_layer_state = i2c_buffer->t_default_layer_state;
    }

#    ifdef OLED_DRIVER_ENABLE
    if (i2c_buffer->oled_on) {
        oled_on();
    } else {
        oled_off();
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(i2c_buffer->is_rgb_matrix_suspended);
#    endif
}

void transport_master_init(void) { i2c_init(); }

void transport_slave_init(void) { i2c_slave_init(SLAVE_I2C_ADDRESS); }

#else  // USE_SERIAL

#    include "serial.h"

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];
#    endif
    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;
#        ifndef NO_ACTION_ONESHOT
    uint8_t oneshot_mods;
#        endif
#    endif
#    ifdef BACKLIGHT_ENABLE
    uint8_t backlight_level;
#    endif
#    ifdef WPM_ENABLE
    uint8_t current_wpm;
#    endif
    bool          oled_on;
    layer_state_t t_layer_state;
    layer_state_t t_default_layer_state;
    bool          is_rgb_matrix_suspended;
} __attribute__((packed)) Serial_m2s_buffer_t;

#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
// When MCUs on both sides drive their respective RGB LED chains,
// it is necessary to synchronize, so it is necessary to communicate RGB
// information. In that case, define RGBLIGHT_SPLIT with info on the number
// of LEDs on each half.
//
// Otherwise, if the master side MCU drives both sides RGB LED chains,
// there is no need to communicate.

typedef struct _Serial_rgblight_t {
    rgblight_syncinfo_t rgblight_sync;
} Serial_rgblight_t;

volatile Serial_rgblight_t serial_rgblight = {};
uint8_t volatile status_rgblight           = 0;
#    endif

volatile Serial_s2m_buffer_t serial_s2m_buffer = {};
volatile Serial_m2s_buffer_t serial_m2s_buffer = {};
uint8_t volatile status0                       = 0;

enum serial_transaction_id {
    GET_SLAVE_MATRIX = 0,
#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
    PUT_RGBLIGHT,
#    endif
};

SSTD_t transactions[] = {
    [GET_SLAVE_MATRIX] =
        {
            (uint8_t *)&status0,
            sizeof(serial_m2s_buffer),
            (uint8_t *)&serial_m2s_buffer,
            sizeof(serial_s2m_buffer),
            (uint8_t *)&serial_s2m_buffer,
        },
#    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
    [PUT_RGBLIGHT] =
        {
            (uint8_t *)&status_rgblight, sizeof(serial_rgblight), (uint8_t *)&serial_rgblight, 0, NULL  // no slave to master transfer
        },
#    endif
};

void transport_master_init(void) { soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }

void transport_slave_init(void) { soft_serial_target_init(transactions, TID_LIMIT(transactions)); }

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

// rgblight synchronization information communication.

void transport_rgblight_master(void) {
    if (rgblight_get_change_flags()) {
        rgblight_get_syncinfo((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync);
        if (soft_serial_transaction(PUT_RGBLIGHT) == TRANSACTION_END) {
            rgblight_clear_change_flags();
        }
    }
}

void transport_rgblight_slave(void) {
    if (status_rgblight == TRANSACTION_ACCEPTED) {
        rgblight_update_sync((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync, false);
        status_rgblight = TRANSACTION_END;
    }
}

#    else
#        define transport_rgblight_master()
#        define transport_rgblight_slave()
#    endif

bool transport_master(matrix_row_t matrix[]) {
#    ifndef SERIAL_USE_MULTI_TRANSACTION
    if (soft_serial_transaction() != TRANSACTION_END) {
        return false;
    }
#    else
    transport_rgblight_master();
    if (soft_serial_transaction(GET_SLAVE_MATRIX) != TRANSACTION_END) {
        return false;
    }
#    endif

    // TODO:  if MATRIX_COLS > 8 change to unpack()
    for (int i = 0; i < ROWS_PER_HAND; ++i) {
        matrix[i] = serial_s2m_buffer.smatrix[i];
    }

#    ifdef BACKLIGHT_ENABLE
    // Write backlight level for slave to read
    serial_m2s_buffer.backlight_level = is_backlight_enabled() ? get_backlight_level() : 0;
#    endif

#    ifdef ENCODER_ENABLE
    encoder_update_raw((uint8_t *)serial_s2m_buffer.encoder_state);
#    endif

#    ifdef WPM_ENABLE
    // Write wpm to slave
    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();
#        ifndef NO_ACTION_ONESHOT
    serial_m2s_buffer.oneshot_mods = get_oneshot_mods();
#        endif
#    endif

#    ifdef POINTING_DEVICE_ENABLE
    if (is_keyboard_left()) {
        report_mouse_t temp_report = pointing_device_get_report();
        temp_report.x              = serial_s2m_buffer.mouse_x;
        temp_report.y              = serial_s2m_buffer.mouse_y;
        pointing_device_set_report(temp_report);
    }
#    endif

    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();
#    endif

#    ifdef RGB_MATRIX_ENABLE
    serial_m2s_buffer.is_rgb_matrix_suspended = rgb_matrix_get_suspend_state();
#    endif

    return true;
}

void transport_slave(matrix_row_t matrix[]) {
    transport_rgblight_slave();

    // TODO: if MATRIX_COLS > 8 change to pack()
    for (int i = 0; i < ROWS_PER_HAND; ++i) {
        serial_s2m_buffer.smatrix[i] = matrix[i];
    }

#    ifdef BACKLIGHT_ENABLE
    backlight_set(serial_m2s_buffer.backlight_level);
#    endif

#    ifdef ENCODER_ENABLE
    encoder_state_raw((uint8_t *)serial_s2m_buffer.encoder_state);
#    endif

#    ifdef WPM_ENABLE
    set_current_wpm(serial_m2s_buffer.current_wpm);
#    endif

#    ifdef SPLIT_MODS_ENABLE
    set_mods(serial_m2s_buffer.real_mods);
    set_weak_mods(serial_m2s_buffer.weak_mods);
#        ifndef NO_ACTION_ONESHOT
    set_oneshot_mods(serial_m2s_buffer.oneshot_mods);
#        endif
#    endif

#    ifdef POINTING_DEVICE_ENABLE
    if (!is_keyboard_left()) {
        serial_s2m_buffer.mouse_x = split_mouse_x;
        serial_s2m_buffer.mouse_y = split_mouse_y;
    }
#    endif

    if (layer_state != serial_m2s_buffer.t_layer_state) {
        layer_state = serial_m2s_buffer.t_layer_state;
    }
    if (default_layer_state != serial_m2s_buffer.t_default_layer_state) {
        default_layer_state = serial_m2s_buffer.t_default_layer_state;
    }
#    ifdef OLED_DRIVER_ENABLE
    if (serial_m2s_buffer.oled_on) {
        oled_on();
    } else {
        oled_off();
    }
#    endif

#    ifdef RGB_MATRIX_ENABLE
    rgb_matrix_set_suspend_state(serial_m2s_buffer.is_rgb_matrix_suspended);
#    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

D users/drashna/font_gmk_bad.h => users/drashna/font_gmk_bad.h +0 -234
@@ 1,234 0,0 @@
#pragma once

#include "progmem.h"

// Corne 8x6 font with QMK Firmware Logo
// Online editor: https://helixfonteditor.netlify.com/

// clang-format off
const unsigned char font[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
  0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
  0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
  0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
  0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
  0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
  0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
  0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
  0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
  0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
  0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
  0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
  0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
  0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
  0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
  0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
  0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
  0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
  0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
  0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
  0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
  0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
  0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
  0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
  0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
  0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
  0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
  0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
  0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
  0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
  0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
  0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
  0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
  0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
  0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
  0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
  0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
  0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
  0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
  0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
  0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
  0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
  0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
  0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
  0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
  0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
  0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
  0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
  0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
  0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
  0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
  0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
  0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
  0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
  0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
  0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
  0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
  0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
  0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
  0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
  0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
  0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
  0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
  0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
  0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
  0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
  0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
  0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
  0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
  0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
  0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
  0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
  0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
  0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
  0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
  0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
  0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
  0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
  0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
  0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
  0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
  0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
  0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
  0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
  0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
  0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
  0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
  0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
  0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
  0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
  0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
  0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
  0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
  0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
  0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
  0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
  0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
  0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
  0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
  0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
  0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
  0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
  0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
  0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
  0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
  0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
  0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
  0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
  0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
  0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
  0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
  0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
  0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
  0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
  0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
  0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
  0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
  0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
  0x4C, 0x90, 0x10, 0x90, 0x7C, 0x00,
  0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
  0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
  0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
  0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
  0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
  0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0x70,
  0x38, 0x38, 0x38, 0x78, 0x70, 0xF0,
  0xE0, 0xE0, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x80, 0xF0, 0xF8,
  0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00,
  0x80, 0xE0, 0xF8, 0xF8, 0xF8, 0xF8,
  0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x80, 0xF8, 0xF8, 0xF8, 0x38, 0x00,
  0x80, 0xE0, 0xF0, 0xF8, 0x78, 0x38,
  0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x80, 0xF8, 0xF8, 0xF8, 0x38, 0x38,
  0x38, 0xF8, 0xF0, 0xF0, 0xE0, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x80, 0xFC, 0xFC,
  0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
  0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
  0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
  0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3C,
  0xFF, 0xFF, 0xFF, 0xC1, 0x80, 0x00,
  0x00, 0x38, 0x38, 0xB8, 0xB8, 0xF9,
  0xF9, 0xF8, 0x38, 0x00, 0x00, 0x00,
  0x00, 0xC0, 0xF8, 0xFF, 0xFF, 0x1F,
  0x01, 0x3F, 0xFF, 0xFF, 0xF0, 0xFE,
  0x7F, 0x0F, 0x03, 0xFF, 0xFF, 0xFF,
  0xFF, 0x00, 0x00, 0x00, 0x00, 0x80,
  0xFF, 0xFF, 0xFF, 0x3F, 0x1E, 0x7F,
  0xFF, 0xFF, 0xF3, 0xC1, 0x80, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
  0xFF, 0xFF, 0xFF, 0x3F, 0x1C, 0x1C,
  0x9C, 0xFF, 0xFF, 0xF3, 0xE1, 0x00,
  0x00, 0x00, 0x00, 0xF0, 0xFC, 0xFE,
  0xFF, 0x0F, 0x07, 0x07, 0x8E, 0xFF,
  0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00,
  0x00, 0xF0, 0xFC, 0xFE, 0xFF, 0x8F,
  0x07, 0x07, 0x8E, 0xFF, 0xFF, 0xFF,
  0x3F, 0x00, 0x00, 0x00, 0x00, 0x80,
  0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
  0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
  0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
  0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
  0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x01, 0x03, 0x03, 0x03, 0x07,
  0x07, 0x07, 0x07, 0x03, 0x03, 0x03,
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x06, 0x07, 0x07, 0x07, 0x01, 0x00,
  0x00, 0x00, 0x07, 0x07, 0x07, 0x01,
  0x00, 0x00, 0x00, 0x07, 0x07, 0x07,
  0x07, 0x00, 0x00, 0x00, 0x00, 0x07,
  0x07, 0x07, 0x07, 0x00, 0x00, 0x00,
  0x00, 0x03, 0x07, 0x07, 0x07, 0x06,
  0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
  0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  0x07, 0x07, 0x03, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0x07,
  0x07, 0x07, 0x07, 0x03, 0x07, 0x07,
  0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x03, 0x07, 0x07, 0x07,
  0x07, 0x03, 0x07, 0x07, 0x07, 0x07,
  0x00, 0x00, 0x00, 0x00, 0x01, 0x07,
  0x07, 0x07, 0x01, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

D users/drashna/hue_manitee_font.h => users/drashna/hue_manitee_font.h +0 -234
@@ 1,234 0,0 @@
#pragma once

#include "progmem.h"

// Corne 8x6 font with QMK Firmware Logo
// Online editor: https://helixfonteditor.netlify.com/

// clang-format off
const unsigned char font[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
  0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
  0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
  0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
  0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
  0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
  0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
  0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
  0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
  0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
  0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
  0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
  0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
  0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
  0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
  0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
  0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
  0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
  0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
  0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
  0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
  0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
  0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
  0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
  0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
  0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
  0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
  0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
  0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
  0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
  0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
  0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
  0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
  0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
  0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
  0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
  0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
  0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
  0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
  0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
  0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
  0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
  0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
  0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
  0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
  0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
  0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
  0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
  0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
  0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
  0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
  0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
  0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
  0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
  0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
  0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
  0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
  0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
  0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
  0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
  0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
  0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
  0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
  0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
  0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
  0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
  0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
  0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
  0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
  0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
  0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
  0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
  0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
  0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
  0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
  0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
  0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
  0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
  0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
  0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
  0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
  0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
  0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
  0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
  0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
  0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
  0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
  0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
  0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
  0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
  0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
  0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
  0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
  0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
  0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
  0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
  0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
  0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
  0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
  0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
  0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
  0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
  0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
  0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
  0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
  0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
  0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
  0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
  0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
  0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
  0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
  0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
  0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
  0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
  0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
  0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
  0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
  0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
  0x4C, 0x90, 0x10, 0x90, 0x7C, 0x00,
  0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
  0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
  0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
  0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
  0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
  0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0,
  0x90, 0x70, 0xE8, 0xA8, 0xE4, 0xC4,
  0xC4, 0xA0, 0xE4, 0xB0, 0xDC, 0xE4,
  0xFC, 0xFC, 0xFC, 0xFC, 0x3C, 0x3C,
  0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
  0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
  0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
  0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
  0xFC, 0xF6, 0xF7, 0xEF, 0xFF, 0x87,
  0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
  0x1F, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF,
  0xFF, 0x07, 0x1F, 0x1F, 0x19, 0x15,
  0xF7, 0x16, 0x1A, 0x1B, 0x16, 0x07,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x0C, 0x0C, 0x33, 0x33,
  0x33, 0x33, 0x33, 0x33, 0xC0, 0xC0,
  0x00, 0x00, 0x03, 0x03, 0xFF, 0xFF,
  0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0,
  0x00, 0x00, 0x00, 0xFC, 0xFC, 0x03,
  0x03, 0x03, 0x03, 0x03, 0x03, 0xFC,
  0xFC, 0x00, 0x00, 0x00, 0xFC, 0xFC,
  0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
  0xFF, 0xFF, 0x30, 0x30, 0xCC, 0xCC,
  0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
  0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
  0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
  0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  0x03, 0x07, 0x07, 0x07, 0x07, 0x01,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0x07, 0x07,
  0x03, 0x00, 0x00, 0x02, 0x04, 0x00,
  0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x03, 0x03, 0x03, 0x03,
  0x03, 0x03, 0x03, 0x03, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x03, 0x03, 0x03, 0x03, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
  0x03, 0x03, 0x03, 0x03, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
  0x03, 0x03, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

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

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

#ifndef KEYLOGGER_LENGTH
// #    ifdef OLED_DISPLAY_128X64


@@ 24,7 25,7 @@
// #    endif
#endif

static uint32_t oled_timer                       = 0;
uint32_t        oled_timer                       = 0;
static char     keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"};
static uint16_t log_timer                        = 0;



@@ 132,28 133,26 @@ void render_layer_state(void) {
    oled_write_P(PSTR(" "), false);
#endif
    oled_write_P(PSTR(OLED_RENDER_LAYER_RAISE), layer_state_is(_RAISE));
#if _MODS
#    ifdef OLED_DISPLAY_128X64
    oled_write_P(PSTR(" "), false);
#    endif
    oled_write_P(PSTR(OLED_RENDER_LAYER_MODS), layer_state_is(_MODS));
#endif
#ifdef OLED_DISPLAY_128X64
    oled_advance_page(true);
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR("GamePad"), layer_state_is(_GAMEPAD));
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR("Diablo"), layer_state_is(_DIABLO));
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR("Mouse"), layer_state_is(_MOUSE));
#endif
}

void render_keylock_status(uint8_t led_usb_state) {
    oled_write_P(PSTR(OLED_RENDER_LOCK_NAME), false);
#if !defined(OLED_DISPLAY_128X64)
    oled_write_P(PSTR(" "), false);
#endif
    oled_write_P(PSTR(OLED_RENDER_LOCK_NUML), led_usb_state & (1 << USB_LED_NUM_LOCK));
#ifdef OLED_DISPLAY_128X64
    oled_write_P(PSTR(" "), false);
#endif
    oled_write_P(PSTR(OLED_RENDER_LOCK_CAPS), led_usb_state & (1 << USB_LED_CAPS_LOCK));
#ifdef OLED_DISPLAY_128X64
    oled_write_P(PSTR(" "), false);
#endif
    oled_write_P(PSTR(OLED_RENDER_LOCK_SCLK), led_usb_state & (1 << USB_LED_SCROLL_LOCK));
#ifndef OLED_DISPLAY_128X64
    oled_advance_page(true);


@@ 161,20 160,18 @@ void render_keylock_status(uint8_t led_usb_state) {
}

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}};
    oled_write_P(PSTR(OLED_RENDER_MODS_NAME), false);
    oled_write_P(PSTR(OLED_RENDER_MODS_SFT), (modifiers & MOD_MASK_SHIFT));
#ifdef OLED_DISPLAY_128X64
    oled_write_P(mod_status[0], (modifiers & MOD_MASK_SHIFT));
    oled_write_P(mod_status[!keymap_config.swap_lctl_lgui ? 3 : 4], (modifiers & MOD_MASK_GUI));
#if !defined(OLED_DISPLAY_128X64)
    oled_write_P(PSTR(" "), false);
#endif
    oled_write_P(PSTR(OLED_RENDER_MODS_CTL), (modifiers & MOD_MASK_CTRL));
#ifdef OLED_DISPLAY_128X64
    oled_write_P(PSTR(" "), false);
#endif
    oled_write_P(PSTR(OLED_RENDER_MODS_ALT), (modifiers & MOD_MASK_ALT));
#ifdef OLED_DISPLAY_128X64
    oled_write_P(PSTR(" "), false);
    oled_write_P(mod_status[2], (modifiers & MOD_MASK_ALT));
    oled_write_P(mod_status[1], (modifiers & MOD_MASK_CTRL));
#if defined(OLED_DISPLAY_128X64)
    oled_advance_page(true);
#endif
    oled_write_P(PSTR(OLED_RENDER_MODS_GUI), (modifiers & MOD_MASK_GUI));
}

void render_bootmagic_status(void) {


@@ 204,41 201,71 @@ void render_bootmagic_status(void) {
#endif
        oled_write_P(logo[0][0], !is_bootmagic_on);
    }
#ifndef OLED_DISPLAY_128X64
    oled_write_P(PSTR(" "), false);
    oled_write_P(logo[1][1], is_bootmagic_on);
    oled_write_P(logo[0][1], !is_bootmagic_on);
#endif
    oled_write_P(PSTR(" "), false);
#ifdef OLED_DISPLAY_128X64
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NKRO), keymap_config.nkro);
    oled_write_P(PSTR(" "), false);
    oled_write_ln_P(PSTR(OLED_RENDER_BOOTMAGIC_NOGUI), !keymap_config.no_gui);
    oled_write_P(PSTR("Magic "), false);
    if (keymap_config.swap_lctl_lgui)
#endif
    {
        oled_write_P(logo[1][1], is_bootmagic_on);
    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);
    oled_write_P(PSTR(" "), false);
    if (keymap_config.swap_lctl_lgui) {
        oled_write_P(logo[1][1], is_bootmagic_on);
    } else {
#endif
        oled_write_P(logo[0][1], !is_bootmagic_on);
    }
#endif
    oled_write_P(PSTR(" "), false);
#ifdef OLED_DISPLAY_128X64
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_GRV), keymap_config.swap_grave_esc);
    oled_write_P(PSTR("  "), false);
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_CAPS), keymap_config.swap_control_capslock);
#ifdef OLED_DISPLAY_128X64
    oled_advance_page(true);
#else
    oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NKRO), keymap_config.nkro);
#endif
}

#if defined(POINTING_DEVICE_ENABLE)
extern bool tap_toggling;
#endif

void render_user_status(void) {
    oled_write_P(PSTR(OLED_RENDER_USER_NAME), false);
#if !defined(OLED_DISPLAY_128X64)
    oled_write_P(PSTR(" "), false);
#endif
#if defined(RGB_MATRIX_ENABLE)
    oled_write_P(PSTR(OLED_RENDER_USER_ANIM), userspace_config.rgb_matrix_idle_anim);
#    if !defined(OLED_DISPLAY_128X64)
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(OLED_RENDER_USER_LAYR), userspace_config.rgb_layer_change);
#    endif
#elif defined(POINTING_DEVICE_ENABLE)
    static const char PROGMEM mouse_lock[3] = {0xF2, 0xF3, 0};
    oled_write_P(mouse_lock, tap_toggling);
#endif
#ifdef AUDIO_ENABLE
    static const char PROGMEM audio_status[2][3] = {{0xE0, 0xE1, 0}, {0xE2, 0xE3, 0}};
    oled_write_P(audio_status[is_audio_on()], false);

#    ifdef AUDIO_CLICKY
    static const char PROGMEM audio_clicky_status[2][3] = {{0xF4, 0xF5, 0}, {0xF6, 0xF7, 0}};
    oled_write_P(audio_clicky_status[is_clicky_on() && is_audio_on()], false);
#        if !defined(OLED_DISPLAY_128X64)
    oled_write_P(PSTR(" "), false);
    oled_write_P(PSTR(OLED_RENDER_USER_NUKE), userspace_config.nuke_switch);
#ifdef OLED_DISPLAY_128X64
#        endif
#    endif
#endif

    static const char PROGMEM rgb_layer_status[2][3] = {{0xEE, 0xEF, 0}, {0xF0, 0xF1, 0}};
    oled_write_P(rgb_layer_status[userspace_config.rgb_layer_change], false);
    static const char PROGMEM nukem_good[2][3] = {{0xF8, 0xF9, 0}, {0xF6, 0xF7, 0}};
    oled_write_P(nukem_good[0], userspace_config.nuke_switch);
#if defined(OLED_DISPLAY_128X64)
    oled_advance_page(true);
#endif
}


@@ 253,23 280,55 @@ __attribute__((weak)) void oled_driver_render_logo(void) {
    oled_write_P(qmk_logo, false);
}

void render_wpm(void) {
#ifdef WPM_ENABLE
#    ifdef OLED_DISPLAY_128X64
    char wpm_counter[4];
#    else
    char wpm_counter[6];
#    endif
    snprintf(wpm_counter, sizeof(wpm_counter), "%3u", get_current_wpm());
    oled_write_P(PSTR(OLED_RENDER_WPM_COUNTER), false);
    oled_write(wpm_counter, false);
#endif
}

#ifdef KEYBOARD_handwired_dactyl_manuform_5x6_right_trackball
extern keyboard_config_t keyboard_config;
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]);
    oled_write_P(PSTR("  DPI: "), false);
    oled_write(dpi_status, false);
}
#endif

void render_status_secondary(void) {
#if !defined(SPLIT_TRANSPORT_MIRROR) || defined(OLED_DISPLAY_128X64)
#if defined(OLED_DISPLAY_128X64)
    oled_driver_render_logo();
#endif
    /* Show Keyboard Layout  */
    render_default_layer_state();
    render_layer_state();
    render_mod_status(get_mods() | get_oneshot_mods());
    render_keylogger_status();

    // render_keylogger_status();
    render_keylock_status(host_keyboard_leds());
}
// clang-format on

void render_status_main(void) {
#if defined(OLED_DISPLAY_128X64)
    oled_driver_render_logo();
    /* Show Keyboard Layout  */
    render_wpm();
#    ifdef KEYBOARD_handwired_dactyl_manuform_5x6_right_trackball
    render_pointing_dpi_status();
#    endif
    oled_write_P(PSTR("\n"), false);
#else
    render_default_layer_state();
#endif
    /* Show Keyboard Layout  */
    // render_keylock_status(host_keyboard_leds());
    render_bootmagic_status();
    render_user_status();

M users/drashna/oled_stuff.h => users/drashna/oled_stuff.h +13 -9
@@ 21,6 21,7 @@

void oled_driver_render_logo(void);
bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
extern uint32_t oled_timer;

#ifdef OLED_DISPLAY_128X64
#    define OLED_RENDER_KEYLOGGER "Keylogger: "


@@ 35,7 36,7 @@ bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
#    define OLED_RENDER_LAYOUT_EUCALYN "Eucalyn"
#    define OLED_RENDER_LAYOUT_CARPLAX "Carplax"

#    define OLED_RENDER_LAYER_NAME   "Layer:\n"
#    define OLED_RENDER_LAYER_NAME   "Layer:"
#    define OLED_RENDER_LAYER_LOWER  "Lower"
#    define OLED_RENDER_LAYER_RAISE  "Raise"
#    define OLED_RENDER_LAYER_ADJUST "Adjust"


@@ 46,7 47,7 @@ bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
#    define OLED_RENDER_LOCK_CAPS "CAPS"
#    define OLED_RENDER_LOCK_SCLK "SCLK"

#    define OLED_RENDER_MODS_NAME "Mods: "
#    define OLED_RENDER_MODS_NAME "Mods:"
#    define OLED_RENDER_MODS_SFT  "Sft"
#    define OLED_RENDER_MODS_CTL  "Ctl"
#    define OLED_RENDER_MODS_ALT  "Alt"


@@ 63,6 64,7 @@ bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
#    define OLED_RENDER_USER_LAYR "Layr"
#    define OLED_RENDER_USER_NUKE "Nuke"

#    define OLED_RENDER_WPM_COUNTER "WPM: "
#else
#    define OLED_RENDER_KEYLOGGER "KLogr"



@@ 83,15 85,15 @@ bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
#    define OLED_RENDER_LAYER_MODS   " Mods"

#    define OLED_RENDER_LOCK_NAME "Lock:"
#    define OLED_RENDER_LOCK_NUML "N"
#    define OLED_RENDER_LOCK_CAPS "C"
#    define OLED_RENDER_LOCK_SCLK "S"
#    define OLED_RENDER_LOCK_NUML "NumL"
#    define OLED_RENDER_LOCK_CAPS "CapL"
#    define OLED_RENDER_LOCK_SCLK "ScrL"

#    define OLED_RENDER_MODS_NAME "Mods: "
#    define OLED_RENDER_MODS_SFT  "S"
#    define OLED_RENDER_MODS_CTL  "C"
#    define OLED_RENDER_MODS_ALT  "A"
#    define OLED_RENDER_MODS_GUI  "G"
#    define OLED_RENDER_MODS_SFT  "Shft"
#    define OLED_RENDER_MODS_CTL  "Ctrl"
#    define OLED_RENDER_MODS_ALT  "Alt\n"
#    define OLED_RENDER_MODS_GUI  "GUI\n"

#    define OLED_RENDER_BOOTMAGIC_NAME  "BTMGK"
#    define OLED_RENDER_BOOTMAGIC_NKRO  "NKRO"


@@ 104,4 106,6 @@ bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
#    define OLED_RENDER_USER_LAYR "Layr"
#    define OLED_RENDER_USER_NUKE "Nuke"

#    define OLED_RENDER_WPM_COUNTER "WPM: "

#endif

M users/drashna/pimoroni_trackball.h => users/drashna/pimoroni_trackball.h +4 -4
@@ 23,13 23,13 @@
#    define TRACKBALL_ADDRESS 0x0A
#endif
#define TRACKBALL_WRITE ((TRACKBALL_ADDRESS << 1) | I2C_WRITE)
#define TRACKBALL_READ  ((TRACKBALL_ADDRESS << 1) | I2C_READ)
#define TRACKBALL_READ ((TRACKBALL_ADDRESS << 1) | I2C_READ)

void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white);
void trackball_check_click(bool pressed, report_mouse_t *mouse);
void trackball_register_button(bool pressed, enum mouse_buttons button);

float trackball_get_precision(void);
void    trackball_set_precision(float precision);
bool    trackball_is_scrolling(void);
void    trackball_set_scrolling(bool scroll);
void  trackball_set_precision(float precision);
bool  trackball_is_scrolling(void);
void  trackball_set_scrolling(bool scroll);

M users/drashna/process_records.c => users/drashna/process_records.c +3 -3
@@ 36,12 36,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {

    if (!(process_record_keymap(keycode, record) && process_record_secrets(keycode, record)
#ifdef RGB_MATRIX_ENABLE
        && process_record_user_rgb_matrix(keycode, record)
          && process_record_user_rgb_matrix(keycode, record)
#endif
#ifdef RGBLIGHT_ENABLE
        && process_record_user_rgb_light(keycode, record)
          && process_record_user_rgb_light(keycode, record)
#endif
    && true)) {
          && true)) {
        return false;
    }


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


M users/drashna/rgb_stuff.c => users/drashna/rgb_stuff.c +28 -24
@@ 14,15 14,17 @@
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "drashna.h"
#include "rgb_stuff.h"
#include "eeprom.h"
#ifdef RGBLIGHT_ENABLE

#    include "drashna.h"
#    include "rgb_stuff.h"
#    include "eeprom.h"

bool    has_initialized;
bool has_initialized;

void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val(), index); }

#ifdef RGBLIGHT_TWINKLE
#    ifdef RGBLIGHT_TWINKLE
static rgblight_fadeout lights[RGBLED_NUM];

/* Handler for fading/twinkling effect */


@@ 91,7 93,7 @@ void start_rgb_light(void) {

    rgblight_sethsv_at(light->hue, 255, light->life, light_index);
}
#endif
#    endif

bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) {
    uint16_t temp_keycode = keycode;


@@ 101,7 103,7 @@ bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) {
    }

    switch (temp_keycode) {
#ifdef RGBLIGHT_TWINKLE
#    ifdef RGBLIGHT_TWINKLE
        case KC_A ... KC_SLASH:
        case KC_F1 ... KC_F12:
        case KC_INSERT ... KC_UP:


@@ 112,20 114,20 @@ bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) {
                start_rgb_light();
            }
            break;
#endif  // RGBLIGHT_TWINKLE
#    endif  // RGBLIGHT_TWINKLE
    }
    return true;
}

#if defined(RGBLIGHT_STARTUP_ANIMATION)
static bool is_enabled;
static bool is_rgblight_startup;
static uint8_t old_hue;
#    if defined(RGBLIGHT_STARTUP_ANIMATION)
static bool     is_enabled;
static bool     is_rgblight_startup;
static uint8_t  old_hue;
static uint16_t rgblight_startup_loop_timer;
#endif
#    endif

void keyboard_post_init_rgb_light(void) {
#if defined(RGBLIGHT_STARTUP_ANIMATION)
#    if defined(RGBLIGHT_STARTUP_ANIMATION)
    is_enabled = rgblight_is_enabled();
    if (userspace_config.rgb_layer_change) {
        rgblight_enable_noeeprom();


@@ 136,7 138,7 @@ void keyboard_post_init_rgb_light(void) {
        rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
        is_rgblight_startup = true;
    }
#endif
#    endif
    layer_state_set_rgb_light(layer_state);
}



@@ 145,7 147,7 @@ void matrix_scan_rgb_light(void) {
    scan_rgblight_fadeout();
#    endif  // RGBLIGHT_ENABLE

#if defined(RGBLIGHT_STARTUP_ANIMATION)
#    if defined(RGBLIGHT_STARTUP_ANIMATION)
    if (is_rgblight_startup && is_keyboard_master()) {
        if (timer_elapsed(rgblight_startup_loop_timer) > 10) {
            static uint8_t counter;


@@ 163,7 165,7 @@ void matrix_scan_rgb_light(void) {
            }
        }
    }
#endif
#    endif
}

void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) {


@@ 173,16 175,16 @@ 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
#    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)) {
        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
#        ifdef RGBLIGHT_EFFECT_TWINKLE
                rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_TWINKLE + 5);
#    else
#        else
                rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3);
#    endif
#        endif
                break;
            case _MEDIA:
                rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1);


@@ 228,7 230,9 @@ layer_state_t layer_state_set_rgb_light(layer_state_t state) {
                break;
        }
    }
#endif  // RGBLIGHT_ENABLE
#    endif  // RGBLIGHT_ENABLE

    return state;
}

#endif

M users/drashna/rules.mk => users/drashna/rules.mk +24 -0
@@ 66,3 66,27 @@ ifeq ($(strip $(PIMORONI_TRACKBALL_ENABLE)), yes)
    SRC += pimoroni_trackball.c
    QUANTUM_LIB_SRC += i2c_master.c
endif


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
            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
        endif
    endif
endif

M users/drashna/wrappers.h => users/drashna/wrappers.h +86 -81
@@ 21,19 21,6 @@ Since our quirky block definitions are basically a list of comma separated
arguments, we need a wrapper in order for these definitions to be
expanded before being used as arguments to the LAYOUT_xxx macro.
*/
#if (!defined(LAYOUT) && defined(KEYMAP))
#    define LAYOUT KEYMAP
#endif

// clang-format off
#define LAYOUT_ergodox_wrapper(...)          LAYOUT_ergodox(__VA_ARGS__)
#define LAYOUT_ergodox_pretty_wrapper(...)   LAYOUT_ergodox_pretty(__VA_ARGS__)
#define KEYMAP_wrapper(...)                  LAYOUT(__VA_ARGS__)
#define LAYOUT_wrapper(...)                  LAYOUT(__VA_ARGS__)
#define LAYOUT_ortho_4x12_wrapper(...)       LAYOUT_ortho_4x12(__VA_ARGS__)
#define LAYOUT_ortho_5x12_wrapper(...)       LAYOUT_ortho_5x12(__VA_ARGS__)
#define LAYOUT_gergo_wrapper(...)            LAYOUT_gergo(__VA_ARGS__)
#define LAYOUT_split_3x6_3_wrapper(...)      LAYOUT_split_3x6_3(__VA_ARGS__)

/*
Blocks for each of the four major keyboard layouts


@@ 46,14 33,14 @@ NOTE: These are all the same length.  If you do a search/replace
  then you need to add/remove underscores to keep the
  lengths consistent.
*/
// clang-format off
#define _________________QWERTY_L1_________________       KC_Q,    KC_W,    KC_E,    KC_R,    KC_T
#define _________________QWERTY_L2_________________       KC_A,    KC_S,    KC_D,    KC_F,    KC_G
#define _________________QWERTY_L3_________________       KC_Z,    KC_X,    KC_C,    KC_V,    KC_B

#define _________________QWERTY_L1_________________        KC_Q,    KC_W,    KC_E,    KC_R,    KC_T
#define _________________QWERTY_L2_________________        KC_A,    KC_S,    KC_D,    KC_F,    KC_G
#define _________________QWERTY_L3_________________        KC_Z,    KC_X,    KC_C,    KC_V,    KC_B

#define _________________QWERTY_R1_________________        KC_Y,    KC_U,    KC_I,    KC_O,    KC_P
#define _________________QWERTY_R2_________________        KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN
#define _________________QWERTY_R3_________________        KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLASH
#define _________________QWERTY_R1_________________       KC_Y,    KC_U,    KC_I,    KC_O,    KC_P
#define _________________QWERTY_R2_________________       KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT
#define _________________QWERTY_R3_________________       KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH


#define _________________COLEMAK_L1________________       KC_Q,    KC_W,    KC_F,    KC_P,    KC_G


@@ 61,15 48,15 @@ NOTE: These are all the same length.  If you do a search/replace
#define _________________COLEMAK_L3________________       KC_Z,    KC_X,    KC_C,    KC_V,    KC_B

#define _________________COLEMAK_R1________________       KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN
#define _________________COLEMAK_R2________________       KC_H,    KC_N,    KC_E,    KC_I,    KC_O
#define _________________COLEMAK_R3________________       KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLASH
#define _________________COLEMAK_R2________________       KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT
#define _________________COLEMAK_R3________________       KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH

#define ______________COLEMAK_MOD_DH_L1____________       KC_Q,    KC_W,    KC_F,    KC_P,    KC_B
#define ______________COLEMAK_MOD_DH_L2____________       KC_A,    KC_R,    KC_S,    KC_T,    KC_G
#define ______________COLEMAK_MOD_DH_L3____________       KC_Z,    KC_X,    KC_C,    KC_D,    KC_V

#define ______________COLEMAK_MOD_DH_R1____________       KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN
#define ______________COLEMAK_MOD_DH_R2____________       KC_M,    KC_N,    KC_E,    KC_I,    KC_O
#define ______________COLEMAK_MOD_DH_R2____________       KC_M,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT
#define ______________COLEMAK_MOD_DH_R3____________       KC_K,    KC_H,    KC_COMM, KC_DOT,  KC_SLASH




@@ 78,7 65,7 @@ NOTE: These are all the same length.  If you do a search/replace
#define _________________DVORAK_L3_________________        KC_SCLN, KC_Q,    KC_J,   KC_K,     KC_X

#define _________________DVORAK_R1_________________        KC_F,    KC_G,    KC_C,    KC_R,    KC_L
#define _________________DVORAK_R2_________________        KC_D,    KC_H,    KC_T,    KC_N,    KC_S
#define _________________DVORAK_R2_________________        KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH
#define _________________DVORAK_R3_________________        KC_B,    KC_M,    KC_W,    KC_V,    KC_Z




@@ 87,88 74,106 @@ NOTE: These are all the same length.  If you do a search/replace
#define ________________DVORAK_AU_L3_______________        KC_SCLN, KC_Q,    KC_J,   KC_K,     KC_X

#define ________________DVORAK_AU_R1_______________        KC_F,    KC_G,    KC_C,    KC_R,    KC_L
#define ________________DVORAK_AU_R2_______________        KC_D,    KC_H,    KC_T,    KC_N,    KC_S
#define ________________DVORAK_AU_R2_______________        KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH
#define ________________DVORAK_AU_R3_______________        KC_B,    KC_M,    KC_W,    KC_V,    KC_Z

#define _________________WORKMAN_L1________________       KC_Q,    KC_D,    KC_R,   KC_W,     KC_B
#define _________________WORKMAN_L2________________       KC_A,    KC_S,    KC_H,   KC_T,     KC_G
#define _________________WORKMAN_L3________________       KC_Z,    KC_X,    KC_M,   KC_C,     KC_V
#define _________________WORKMAN_L1________________        KC_Q,    KC_D,    KC_R,   KC_W,     KC_B
#define _________________WORKMAN_L2________________        KC_A,    KC_S,    KC_H,   KC_T,     KC_G
#define _________________WORKMAN_L3________________        KC_Z,    KC_X,    KC_M,   KC_C,     KC_V

#define _________________WORKMAN_R1________________        KC_J,    KC_F,    KC_U,    KC_P,    KC_SCLN
#define _________________WORKMAN_R2________________        KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    KC_QUOT
#define _________________WORKMAN_R3________________        KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH


#define _________________WORKMAN_R1________________       KC_J,    KC_F,    KC_U,    KC_P,    KC_SCLN
#define _________________WORKMAN_R2________________       KC_Y,    KC_N,    KC_E,    KC_O,    KC_I
#define _________________WORKMAN_R3________________       KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLASH
#define _________________NORMAN_L1_________________        KC_Q,    KC_W,    KC_D,    KC_F,    KC_K
#define _________________NORMAN_L2_________________        KC_A,    KC_S,    KC_E,    KC_T,    KC_G
#define _________________NORMAN_L3_________________        KC_Z,    KC_X,    KC_C,    KC_V,    KC_B

#define _________________NORMAN_R1_________________        KC_J,    KC_U,    KC_R,    KC_L,    KC_SCLN
#define _________________NORMAN_R2_________________        KC_Y,    KC_N,    KC_I,    KC_O,    KC_U,    KC_QUOT
#define _________________NORMAN_R3_________________        KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH

#define _________________NORMAN_L1_________________       KC_Q,    KC_W,    KC_D,    KC_F,    KC_K
#define _________________NORMAN_L2_________________       KC_A,    KC_S,    KC_E,    KC_T,    KC_G
#define _________________NORMAN_L3_________________       KC_Z,    KC_X,    KC_C,    KC_V,    KC_B

#define _________________NORMAN_R1_________________       KC_J,    KC_U,    KC_R,    KC_L,    KC_SCLN
#define _________________NORMAN_R2_________________       KC_Y,    KC_N,    KC_I,    KC_O,    KC_U
#define _________________NORMAN_R3_________________       KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLASH
#define _________________MALTRON_L1________________        KC_Q,    KC_P,    KC_Y,    KC_C,    KC_B
#define _________________MALTRON_L2________________        KC_A,    KC_N,    KC_I,    KC_S,    KC_F
#define _________________MALTRON_L3________________        KC_SCLN, KC_SLSH, KC_J,    KC_G,    KC_COMM

#define _________________MALTRON_R1________________        KC_V,    KC_M,    KC_U,    KC_Z,    KC_L
#define _________________MALTRON_R2________________        KC_D,    KC_T,    KC_D,    KC_O,    KC_R,    KC_QUOT
#define _________________MALTRON_R3________________        KC_DOT,  KC_W,    KC_K,    KC_MINS, KC_X

#define _________________MALTRON_L1________________       KC_Q,    KC_P,    KC_Y,    KC_C,    KC_B
#define _________________MALTRON_L2________________       KC_A,    KC_N,    KC_I,    KC_S,    KC_F
#define _________________MALTRON_L3________________       KC_SCLN, KC_SLSH, KC_J,    KC_G,    KC_COMM

#define _________________MALTRON_R1________________       KC_V,    KC_M,    KC_U,    KC_Z,    KC_L
#define _________________MALTRON_R2________________       KC_D,    KC_T,    KC_D,    KC_O,    KC_R
#define _________________MALTRON_R3________________       KC_DOT,  KC_W,    KC_K,    KC_MINS, KC_X
#define _________________EUCALYN_L1________________        KC_Q,    KC_W,    KC_COMM, KC_DOT,  KC_SCLN
#define _________________EUCALYN_L2________________        KC_A,    KC_O,    KC_E,    KC_I,    KC_U
#define _________________EUCALYN_L3________________        KC_Z,    KC_X,    KC_C,    KC_V,    KC_F

#define _________________EUCALYN_R1________________        KC_M,    KC_R,    KC_D,    KC_Y,    KC_P
#define _________________EUCALYN_R2________________        KC_G,    KC_T,    KC_K,    KC_S,    KC_N,    KC_QUOT
#define _________________EUCALYN_R3________________        KC_B,    KC_H,    KC_J,    KC_L,    KC_SLSH

#define _________________EUCALYN_L1________________       KC_SLSH, KC_COMM, KC_DOT,  KC_F,    KC_Q
#define _________________EUCALYN_L2________________       KC_A,    KC_O,    KC_E,    KC_I,    KC_U
#define _________________EUCALYN_L3________________       KC_Z,    KC_X,    KC_C,    KC_V,    KC_W
// Qwerty-like
#define _____________CARPLAX_QFMLWY_L1_____________        KC_Q,    KC_F,    KC_M,    KC_L,    KC_W
#define _____________CARPLAX_QFMLWY_L2_____________        KC_D,    KC_S,    KC_T,    KC_N,    KC_R
#define _____________CARPLAX_QFMLWY_L3_____________        KC_Z,    KC_V,    KC_G,    KC_C,    KC_X

#define _________________EUCALYN_R1________________       KC_M,    KC_R,    KC_D,    KC_Y,    KC_P
#define _________________EUCALYN_R2________________       KC_G,    KC_T,    KC_K,    KC_S,    KC_N
#define _________________EUCALYN_R3________________       KC_B,    KC_H,    KC_J,    KC_L,    KC_SCLN
#define _____________CARPLAX_QFMLWY_R1_____________        KC_Y,    KC_U,    KC_O,    KC_B,    KC_J
#define _____________CARPLAX_QFMLWY_R2_____________        KC_I,    KC_A,    KC_E,    KC_H,    KC_SCLN, KC_QUOT
#define _____________CARPLAX_QFMLWY_R3_____________        KC_P,    KC_K,    KC_COMM, KC_DOT,  KC_SLSH

// Colemak like
#define _____________CARPLAX_QGMLWB_L1_____________        KC_Q,    KC_G,    KC_M,    KC_L,    KC_W
#define _____________CARPLAX_QGMLWB_L2_____________        KC_D,    KC_S,    KC_T,    KC_N,    KC_R
#define _____________CARPLAX_QGMLWB_L3_____________        KC_Z,    KC_X,    KC_C,    KC_F,    KC_J

#define _____________CARPLAX_QFMLWY_L1_____________       KC_Q,    KC_F,    KC_M,    KC_L,    KC_W
#define _____________CARPLAX_QFMLWY_L2_____________       KC_D,    KC_S,    KC_T,    KC_N,    KC_R
#define _____________CARPLAX_QFMLWY_L3_____________       KC_Z,    KC_V,    KC_G,    KC_C,    KC_X
#define _____________CARPLAX_QGMLWB_R1_____________        KC_B,    KC_Y,    KC_U,    KC_V,    KC_SCLN
#define _____________CARPLAX_QGMLWB_R2_____________        KC_I,    KC_A,    KC_E,    KC_O,    KC_H,    KC_QUOT
#define _____________CARPLAX_QGMLWB_R3_____________        KC_K,    KC_P,    KC_COMM, KC_DOT,  KC_SLSH

#define _____________CARPLAX_QFMLWY_R1_____________       KC_Y,    KC_U,    KC_O,    KC_B,    KC_J
#define _____________CARPLAX_QFMLWY_R2_____________       KC_I,    KC_A,    KC_E,    KC_H,    KC_SCLN
#define _____________CARPLAX_QFMLWY_R3_____________       KC_P,    KC_K,    KC_COMM, KC_DOT,  KC_SLSH
// colemak like, zxcv fixed
#define _____________CARPLAX_QGMLWY_L1_____________        KC_Q,    KC_G,    KC_M,    KC_L,    KC_W
#define _____________CARPLAX_QGMLWY_L2_____________        KC_D,    KC_S,    KC_T,    KC_N,    KC_R
#define _____________CARPLAX_QGMLWY_L3_____________        KC_Z,    KC_X,    KC_C,    KC_V,    KC_J

#define _____________CARPLAX_QGMLWY_R1_____________        KC_Y,    KC_F,    KC_U,    KC_B,    KC_SCLN
#define _____________CARPLAX_QGMLWY_R2_____________        KC_I,    KC_A,    KC_E,    KC_O,    KC_H,    KC_QUOT
#define _____________CARPLAX_QGMLWY_R3_____________        KC_K,    KC_P,    KC_COMM, KC_DOT,  KC_SLSH

#define _____________CARPLAX_QGMLWB_L1_____________       KC_Q,    KC_G,    KC_M,    KC_L,    KC_W
#define _____________CARPLAX_QGMLWB_L2_____________       KC_D,    KC_S,    KC_T,    KC_N,    KC_R
#define _____________CARPLAX_QGMLWB_L3_____________       KC_Z,   KC_X,    KC_C,    KC_F,    KC_J
// teeheehee
#define _____________CARPLAX_TNWCLR_L1_____________        KC_T,    KC_N,    KC_W,    KC_C,    KC_L
#define _____________CARPLAX_TNWCLR_L2_____________        KC_S,    KC_K,    KC_J,    KC_X,    KC_G
#define _____________CARPLAX_TNWCLR_L3_____________        KC_E,    KC_O,    KC_D,    KC_I,    KC_A

#define _____________CARPLAX_QGMLWB_R1_____________       KC_B,    KC_Y,    KC_U,    KC_V,    KC_SCLN
#define _____________CARPLAX_QGMLWB_R2_____________       KC_I,    KC_A,    KC_E,    KC_O,    KC_H
#define _____________CARPLAX_QGMLWB_R3_____________       KC_K,    KC_P,    KC_COMM, KC_DOT,  KC_SLSH
#define _____________CARPLAX_TNWCLR_R1_____________        KC_R,    KC_B,    KC_F,    KC_M,    KC_H
#define _____________CARPLAX_TNWCLR_R2_____________        KC_P,    KC_Q,    KC_Z,    KC_V,    KC_SCLN, KC_QUOT
#define _____________CARPLAX_TNWCLR_R3_____________        KC_U,    KC_Y,    KC_COMM, KC_DOT,  KC_SLSH


#define _____________CARPLAX_QGMLWY_L1_____________       KC_Q,    KC_G,    KC_M,    KC_L,    KC_W
#define _____________CARPLAX_QGMLWY_L2_____________       KC_D,    KC_S,    KC_T,    KC_N,    KC_R
#define _____________CARPLAX_QGMLWY_L3_____________       KC_Z,   KC_X,    KC_C,    KC_V,    KC_J
#define _________________WHITE_R1__________________        KC_V,    KC_Y,    KC_D,    KC_COMM, KC_QUOT
#define _________________WHITE_R2__________________        KC_A,    KC_T,    KC_H,    KC_E,    KC_B
#define _________________WHITE_R3__________________        KC_P,    KC_K,    KC_G,    KC_W,    KC_Q

#define _____________CARPLAX_QGMLWY_R1_____________       KC_Y,    KC_F,    KC_U,    KC_B,    KC_SCLN
#define _____________CARPLAX_QGMLWY_R2_____________       KC_I,    KC_A,    KC_E,    KC_O,    KC_H
#define _____________CARPLAX_QGMLWY_R3_____________       KC_K,    KC_P,    KC_COMM, KC_DOT,  KC_SLSH
#define _________________WHITE_L1__________________        KC_INT1, KC_J,    KC_M,    KC_L,    KC_U
#define _________________WHITE_L2__________________        KC_MINS, KC_C,    KC_S,    KC_N,    KC_O,    KC_I
#define _________________WHITE_L3__________________        KC_X,    KC_R,    KC_F,    KC_DOT,  KC_Z


#define _________________WHITE_R1__________________       KC_V,    KC_Y,    KC_D,    KC_COMM, KC_QUOT
#define _________________WHITE_R2__________________       KC_A,    KC_T,    KC_H,    KC_E,    KC_B
#define _________________WHITE_R3__________________       KC_P,    KC_K,    KC_G,    KC_W,    KC_Q
#define _________________HALMAK_L1_________________        KC_W,    KC_L,    KC_R,    KC_B,    KC_Z
#define _________________HALMAK_L2_________________        KC_S,    KC_H,    KC_N,    KC_T,    KC_COMM
#define _________________HALMAK_L3_________________        KC_F,    KC_M,    KC_V,    KC_V,    KC_SLASH

#define _________________WHITE_L1__________________       KC_INT1, KC_J,    KC_M,    KC_L,    KC_U
#define _________________WHITE_L2__________________       KC_MINS, KC_C,    KC_S,    KC_N,    KC_O  // KC_I
#define _________________WHITE_L3__________________       KC_X,    KC_R,    KC_F,    KC_DOT,  KC_Z
#define _________________HALMAK_R1_________________        KC_SCLN, KC_Q,    KC_U,    KC_D,    KC_J
#define _________________HALMAK_R2_________________        KC_DOT,  KC_A,    KC_E,    KC_O,    KC_I,    KC_QUOTE
#define _________________HALMAK_R3_________________        KC_G,    KC_P,    KC_X,    KC_K,    KC_Y


#define _________________HALMAK_L1_________________       KC_W,    KC_L,    KC_R,    KC_B,    KC_Z
#define _________________HALMAK_L2_________________       KC_S,    KC_H,    KC_N,    KC_T,    KC_COMM
#define _________________HALMAK_L3_________________       KC_F,    KC_M,    KC_V,    KC_V,    KC_SLASH
#define _________________HALMAK_L1_________________        KC_W,    KC_L,    KC_R,    KC_B,    KC_Z
#define _________________HALMAK_L2_________________        KC_S,    KC_H,    KC_N,    KC_T,    KC_COMM
#define _________________HALMAK_L3_________________        KC_F,    KC_M,    KC_V,    KC_V,    KC_SLASH

#define _________________HALMAK_R1_________________       KC_SCLN, KC_Q,    KC_U,    KC_D,    KC_J
#define _________________HALMAK_R2_________________       KC_DOT,  KC_A,    KC_E,    KC_O,    KC_I
#define _________________HALMAK_R3_________________       KC_G,    KC_P,    KC_X,    KC_K,    KC_Y
#define _________________HALMAK_R1_________________        KC_SCLN, KC_Q,    KC_U,    KC_D,    KC_J
#define _________________HALMAK_R2_________________        KC_DOT,  KC_A,    KC_E,    KC_O,    KC_I,    KC_QUOTE
#define _________________HALMAK_R3_________________        KC_G,    KC_P,    KC_X,    KC_K,    KC_Y


#define ________________NUMBER_LEFT________________       KC_1,    KC_2,    KC_3,    KC_4,    KC_5


@@ 185,7 190,7 @@ NOTE: These are all the same length.  If you do a search/replace

#define _________________LOWER_R1__________________        KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
#define _________________LOWER_R2__________________        _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR
#define _________________LOWER_R3__________________        _______, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT
#define _________________LOWER_R3__________________        _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END





@@ 195,7 200,7 @@ NOTE: These are all the same length.  If you do a search/replace

#define _________________RAISE_R1__________________        ________________NUMBER_RIGHT_______________
#define _________________RAISE_R2__________________        _______, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC
#define _________________RAISE_R3__________________        _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
#define _________________RAISE_R3__________________        _______, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT