Переглянути джерело

Merge remote-tracking branch 'origin/master' into develop

Drashna Jael're 4 роки тому
батько
коміт
146b042514
44 змінених файлів з 2513 додано та 752 видалено
  1. 3 2
      keyboards/c39/keymaps/drashna/keymap.c
  2. 3 2
      keyboards/gergo/keymaps/drashna/keymap.c
  3. 5 1
      keyboards/handwired/dactyl_manuform/5x6_right_trackball/5x6_right_trackball.c
  4. 1 0
      keyboards/handwired/dactyl_manuform/5x6_right_trackball/config.h
  5. 3 4
      keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/config.h
  6. 49 17
      keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/keymap.c
  7. 1 1
      keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/rules.mk
  8. 41 16
      keyboards/handwired/dactyl_manuform/5x6_right_trackball/pointer_transport.c
  9. 1 1
      keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk
  10. 3 2
      keyboards/keebio/iris/keymaps/drashna/keymap.c
  11. 8 10
      keyboards/keebio/viterbi/keymaps/drashna/keymap.c
  12. 0 2
      keyboards/kyria/keymaps/drashna/config.h
  13. 5 4
      keyboards/kyria/keymaps/drashna/keymap.c
  14. 1 1
      keyboards/kyria/keymaps/drashna/rules.mk
  15. 4 4
      keyboards/moonlander/keymaps/drashna/keymap.c
  16. 3 2
      keyboards/orthodox/keymaps/drashna/keymap.c
  17. 32 0
      keyboards/splitkb/zima/keymaps/drashna/config.h
  18. 140 0
      keyboards/splitkb/zima/keymaps/drashna/keymap.c
  19. 7 0
      keyboards/splitkb/zima/keymaps/drashna/readme.md
  20. 2 0
      keyboards/splitkb/zima/keymaps/drashna/rules.mk
  21. 9 6
      layouts/community/ergodox/drashna/keymap.c
  22. 3 2
      layouts/community/ortho_4x12/drashna/keymap.c
  23. 7 11
      layouts/community/ortho_5x12/drashna/keymap.c
  24. 2 0
      layouts/community/ortho_5x12/drashna/rules.mk
  25. 9 0
      layouts/community/split_3x6_3/drashna/chconf.h
  26. 13 15
      layouts/community/split_3x6_3/drashna/config.h
  27. 4 7
      layouts/community/split_3x6_3/drashna/keymap.c
  28. 10 6
      layouts/community/split_3x6_3/drashna/mcuconf.h
  29. 1 1
      layouts/community/split_3x6_3/drashna/rules.mk
  30. 35 1
      users/drashna/config.h
  31. 31 4
      users/drashna/drashna.c
  32. 4 0
      users/drashna/drashna.h
  33. 1306 0
      users/drashna/drashna_font.h
  34. 508 0
      users/drashna/drashna_transport.c
  35. 0 234
      users/drashna/font_gmk_bad.h
  36. 0 234
      users/drashna/hue_manitee_font.h
  37. 100 41
      users/drashna/oled_stuff.c
  38. 13 9
      users/drashna/oled_stuff.h
  39. 4 4
      users/drashna/pimoroni_trackball.h
  40. 3 3
      users/drashna/process_records.c
  41. 1 0
      users/drashna/process_records.h
  42. 28 24
      users/drashna/rgb_stuff.c
  43. 24 0
      users/drashna/rules.mk
  44. 86 81
      users/drashna/wrappers.h

+ 3 - 2
keyboards/c39/keymaps/drashna/keymap.c

@@ -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__)

+ 3 - 2
keyboards/gergo/keymaps/drashna/keymap.c

@@ -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, _______                            \
     )

+ 5 - 1
keyboards/handwired/dactyl_manuform/5x6_right_trackball/5x6_right_trackball.c

@@ -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]);
     }

+ 1 - 0
keyboards/handwired/dactyl_manuform/5x6_right_trackball/config.h

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

+ 3 - 4
keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/config.h

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

+ 49 - 17
keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/keymap.c

@@ -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;

+ 1 - 1
keyboards/handwired/dactyl_manuform/5x6_right_trackball/keymaps/drashna/rules.mk

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

+ 41 - 16
keyboards/handwired/dactyl_manuform/5x6_right_trackball/pointer_transport.c

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

+ 1 - 1
keyboards/handwired/dactyl_manuform/5x6_right_trackball/rules.mk

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

+ 3 - 2
keyboards/keebio/iris/keymaps/drashna/keymap.c

@@ -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                           \
   )

+ 8 - 10
keyboards/keebio/viterbi/keymaps/drashna/keymap.c

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

+ 0 - 2
keyboards/kyria/keymaps/drashna/config.h

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

+ 5 - 4
keyboards/kyria/keymaps/drashna/keymap.c

@@ -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(

+ 1 - 1
keyboards/kyria/keymaps/drashna/rules.mk

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

+ 4 - 4
keyboards/moonlander/keymaps/drashna/keymap.c

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

+ 3 - 2
keyboards/orthodox/keymaps/drashna/keymap.c

@@ -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__)

+ 32 - 0
keyboards/splitkb/zima/keymaps/drashna/config.h

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

+ 140 - 0
keyboards/splitkb/zima/keymaps/drashna/keymap.c

@@ -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
+}

+ 7 - 0
keyboards/splitkb/zima/keymaps/drashna/readme.md

@@ -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).

+ 2 - 0
keyboards/splitkb/zima/keymaps/drashna/rules.mk

@@ -0,0 +1,2 @@
+# is intentional.  won't compile under size, otherwise.
+USER_NAME := not_drashna

+ 9 - 6
layouts/community/ergodox/drashna/keymap.c

@@ -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,

+ 3 - 2
layouts/community/ortho_4x12/drashna/keymap.c

@@ -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  \
   )

+ 7 - 11
layouts/community/ortho_5x12/drashna/keymap.c

@@ -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________________

+ 2 - 0
layouts/community/ortho_5x12/drashna/rules.mk

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

+ 9 - 0
layouts/community/split_3x6_3/drashna/chconf.h

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

+ 13 - 15
layouts/community/split_3x6_3/drashna/config.h

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

+ 4 - 7
layouts/community/split_3x6_3/drashna/keymap.c

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

+ 10 - 6
layouts/community/split_3x6_3/drashna/mcuconf.h

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

+ 1 - 1
layouts/community/split_3x6_3/drashna/rules.mk

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

+ 35 - 1
users/drashna/config.h

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

+ 31 - 4
users/drashna/drashna.c

@@ -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();
 }
 

+ 4 - 0
users/drashna/drashna.h

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

+ 1306 - 0
users/drashna/drashna_font.h

@@ -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
+  };

+ 508 - 0
users/drashna/drashna_transport.c

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

+ 0 - 234
users/drashna/font_gmk_bad.h

@@ -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,
-};

+ 0 - 234
users/drashna/hue_manitee_font.h

@@ -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,
-};

+ 100 - 41
users/drashna/oled_stuff.c

@@ -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();

+ 13 - 9
users/drashna/oled_stuff.h

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

+ 4 - 4
users/drashna/pimoroni_trackball.h

@@ -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);

+ 3 - 3
users/drashna/process_records.c

@@ -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;
     }
 

+ 1 - 0
users/drashna/process_records.h

@@ -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)
 

+ 28 - 24
users/drashna/rgb_stuff.c

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

+ 24 - 0
users/drashna/rules.mk

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

+ 86 - 81
users/drashna/wrappers.h

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