From 3fa49a03d196040e8ee0c4ae8cad7a392fe35caa Mon Sep 17 00:00:00 2001
From: Victor <VictorN076@gmail.com>
Date: Wed, 5 Jun 2024 18:15:17 -0500
Subject: [PATCH] Backing up OLED32/64 work

---
 .../rollow/keymaps/t4corun/rules.mk           |   1 +
 keyboards/klor/keymaps/t4corun/keymap.c       |  13 +-
 keyboards/klor/keymaps/t4corun/rules.mk       |   3 +
 qmk.json                                      |   1 -
 users/t4corun/features/keyoverride.h          |   1 +
 users/t4corun/features/luna.c                 |  71 +++++++++
 users/t4corun/features/{oled.h => luna.h}     | 120 +-------------
 users/t4corun/features/{oled.c => oled32.c}   |  87 +---------
 users/t4corun/features/oled32.h               | 111 +++++++++++++
 users/t4corun/features/oled64.c               |  44 ++++++
 users/t4corun/features/oled64.h               | 149 ++++++++++++++++++
 users/t4corun/rules.mk                        |   6 +-
 12 files changed, 401 insertions(+), 206 deletions(-)
 create mode 100644 users/t4corun/features/luna.c
 rename users/t4corun/features/{oled.h => luna.h} (63%)
 rename users/t4corun/features/{oled.c => oled32.c} (70%)
 create mode 100644 users/t4corun/features/oled32.h
 create mode 100644 users/t4corun/features/oled64.c
 create mode 100644 users/t4corun/features/oled64.h

diff --git a/keyboards/barbellboards/rollow/keymaps/t4corun/rules.mk b/keyboards/barbellboards/rollow/keymaps/t4corun/rules.mk
index ef9cbaeb..fc0cdd7c 100644
--- a/keyboards/barbellboards/rollow/keymaps/t4corun/rules.mk
+++ b/keyboards/barbellboards/rollow/keymaps/t4corun/rules.mk
@@ -5,4 +5,5 @@
 #	keyboards\barbellboards\rollow\info.json
 #	keyboards\barbellboards\rollow\rules.mk
 
+LTO_ENABLE = no
 CONVERT_TO = promicro_rp2040
\ No newline at end of file
diff --git a/keyboards/klor/keymaps/t4corun/keymap.c b/keyboards/klor/keymaps/t4corun/keymap.c
index 690aa5a7..11db598d 100644
--- a/keyboards/klor/keymaps/t4corun/keymap.c
+++ b/keyboards/klor/keymaps/t4corun/keymap.c
@@ -32,16 +32,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 #if defined(ENCODER_MAP_ENABLE)
 
-/* These are horizontal encoders. Found I have to make it opposite the rotary encoders for it to feel intuitive*/
 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
 
-  [_QWERTY]     = { ENCODER_CCW_CW(KC_WH_D, KC_WH_U), ENCODER_CCW_CW(KC_VOLU, KC_VOLD)  },
-  [_COLEMAK_DH] = { ENCODER_CCW_CW(KC_WH_D, KC_WH_U), ENCODER_CCW_CW(KC_VOLU, KC_VOLD)  },
-  [_GAME]       = { ENCODER_CCW_CW(KC_WH_D, KC_WH_U), ENCODER_CCW_CW(KC_VOLU, KC_VOLD)  },
-  [_NAVIGATION] = { ENCODER_CCW_CW(ZOOMIN,  ZOOMOUT), ENCODER_CCW_CW(___x___, ___x___)  },
-  [_NUMBER]     = { ENCODER_CCW_CW(___x___, ___x___), ENCODER_CCW_CW(KC_RGHT, KC_LEFT)  },
+  [_QWERTY]     = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)  },
+  [_COLEMAK_DH] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)  },
+  [_GAME]       = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)  },
+  [_NAVIGATION] = { ENCODER_CCW_CW(ZOOMOUT, ZOOMIN),  ENCODER_CCW_CW(___x___, ___x___)  },
+  [_NUMBER]     = { ENCODER_CCW_CW(___x___, ___x___), ENCODER_CCW_CW(KC_LEFT, KC_RGHT)  },
   [_SYMBOL]     = { ENCODER_CCW_CW(___x___, ___x___), ENCODER_CCW_CW(___x___, ___x___)  },
-  [_CONFIG]     = { ENCODER_CCW_CW(BASELYR, RBSELYR), ENCODER_CCW_CW(TR_RMOD, TR_RRMD)  }
+  [_CONFIG]     = { ENCODER_CCW_CW(RBSELYR, BASELYR), ENCODER_CCW_CW(TR_RRMD, TR_RMOD)  }
 
 };
 
diff --git a/keyboards/klor/keymaps/t4corun/rules.mk b/keyboards/klor/keymaps/t4corun/rules.mk
index 956e11ac..fabb46eb 100644
--- a/keyboards/klor/keymaps/t4corun/rules.mk
+++ b/keyboards/klor/keymaps/t4corun/rules.mk
@@ -1,5 +1,7 @@
 # override userspace defaults
 
+ENCODER_MAP_ENABLE = yes
+
 # override keyboard defaults
 #	keyboards\klor\info.json
 #	keyboards\klor\rules.mk
@@ -7,6 +9,7 @@
 AUDIO_ENABLE = yes
 HAPTIC_ENABLE = yes
 RGB_MATRIX_ENABLE = yes
+SWAP_HANDS_ENABLE = no 
 
 # Choose your layout
 KLOR_CONFIG = saegewerk
\ No newline at end of file
diff --git a/qmk.json b/qmk.json
index af6e7139..a9d451de 100644
--- a/qmk.json
+++ b/qmk.json
@@ -2,7 +2,6 @@
     "userspace_version": "1.0",
     "build_targets": [
 
-		["ploopyco/trackball_nano", "lkbm"],
 		["crkbd/rev1", "t4corun"],
 		["bastardkb/charybdis/3x5/v2/splinky_3", "t4corun"],
 		["planck/rev6", "t4corun"],
diff --git a/users/t4corun/features/keyoverride.h b/users/t4corun/features/keyoverride.h
index 2a576cc3..8d56cfb9 100644
--- a/users/t4corun/features/keyoverride.h
+++ b/users/t4corun/features/keyoverride.h
@@ -1,2 +1,3 @@
 #pragma once
+
 #include "t4corun.h"
\ No newline at end of file
diff --git a/users/t4corun/features/luna.c b/users/t4corun/features/luna.c
new file mode 100644
index 00000000..9650095a
--- /dev/null
+++ b/users/t4corun/features/luna.c
@@ -0,0 +1,71 @@
+#include "luna.h"
+
+static uint32_t luna_anim_timer = 0;
+static uint8_t luna_current_frame = 0;
+
+void render_luna(void) {
+
+#if OLED_TIMEOUT > 0
+  // the animation prevents the normal timeout from occuring
+  if (last_input_activity_elapsed() > OLED_TIMEOUT && last_led_activity_elapsed() > OLED_TIMEOUT) {
+    oled_off();
+    return;
+  } else {
+    oled_on();
+  }
+#endif //OLED_TIMEOUT
+
+  if (timer_elapsed32(luna_anim_timer) > OLED_LUNA_ANIM_FRAME_DURATION) {
+    luna_anim_timer = timer_read32();
+    animate_luna(OLED_LUNA_X, OLED_LUNA_Y);
+  }
+
+}
+
+void animate_luna(int LUNA_X, int LUNA_Y) {
+
+  uint8_t current_mod = get_mods();
+  uint8_t current_osm = get_oneshot_mods();
+
+  // Make Luna Jump when spacebar is pressed
+  // Only works when Luna is rendered on Master Slide
+  if (isLunaJumping() || !isJumpShown()) {
+    /* clear */
+    oled_set_cursor(LUNA_X, LUNA_Y + 2);
+    oled_write("     ", false);
+    oled_set_cursor(LUNA_X, LUNA_Y - 1);
+
+    setLunaJumped();
+  } else {
+    /* clear */
+    oled_set_cursor(LUNA_X, LUNA_Y - 1);
+    oled_write("     ", false);
+    oled_set_cursor(LUNA_X, LUNA_Y);
+  }
+
+  luna_current_frame = (luna_current_frame + 1) % 2;
+
+  // Animate based on status
+  if (host_keyboard_led_state().caps_lock || is_caps_word_on()) {
+
+    oled_write_raw_P(bark[luna_current_frame], OLED_LUNA_ANIM_SIZE);
+
+  } else if ((current_mod | current_osm) & MOD_MASK_CTRL) {
+
+    oled_write_raw_P(sneak[luna_current_frame], OLED_LUNA_ANIM_SIZE);
+
+  } else if (get_current_wpm() <= OLED_LUNA_MIN_WALK_SPEED) {
+
+    oled_write_raw_P(sit[luna_current_frame], OLED_LUNA_ANIM_SIZE);
+
+  } else if (get_current_wpm() <= OLED_LUNA_MIN_RUN_SPEED) {
+
+    oled_write_raw_P(walk[luna_current_frame], OLED_LUNA_ANIM_SIZE);
+
+  } else {
+
+    oled_write_raw_P(run[luna_current_frame], OLED_LUNA_ANIM_SIZE);
+
+  }
+
+}  
\ No newline at end of file
diff --git a/users/t4corun/features/oled.h b/users/t4corun/features/luna.h
similarity index 63%
rename from users/t4corun/features/oled.h
rename to users/t4corun/features/luna.h
index 3ca91925..f55bfd6f 100644
--- a/users/t4corun/features/oled.h
+++ b/users/t4corun/features/luna.h
@@ -2,123 +2,9 @@
 
 #include "t4corun.h"
 
-#define OLED_RENDER_KEYLOCK_NAME      "Lock"
-#define OLED_RENDER_MODS_NAME         "Mods"
-#define OLED_RENDER_FEATURE_NAME      "Feat"
-#define OLED_RENDER_WPM_NAME          "Wpm"
-
-#define OLED_RENDER_LAYOUT_QWERTY     "QWRTY"
-#define OLED_RENDER_LAYOUT_COLEMAK_DH "CLMAK"
-#define OLED_RENDER_LAYOUT_GAME       "GAME"
-
-#define OLED_RENDER_LAYER_BASE        " Def"
-#define OLED_RENDER_LAYER_NAVIGATION  " Nav"
-#define OLED_RENDER_LAYER_NUMBER      " Num"
-#define OLED_RENDER_LAYER_SYMBOL      " Sym"
-#define OLED_RENDER_LAYER_CONFIG      " Cfg"
-
-
 // LUNA PET Variables
-#if defined(WPM_ENABLE)
-#   define OLED_LUNA_X                   0
-#   define OLED_LUNA_Y                   13
-#   define OLED_LUNA_MIN_WALK_SPEED      10
-#   define OLED_LUNA_MIN_RUN_SPEED       40
-#   define OLED_LUNA_ANIM_FRAME_DURATION 200  // how long each frame lasts in ms
-#   define OLED_LUNA_ANIM_SIZE           96   // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
-
-void              render_luna(void);
-void              animate_luna(int LUNA_X, int LUNA_Y);
-#endif //WPM_ENABLE
-
-
-
-void              render_default_layer_state(void);
-void              render_layer_state(void);
-void              render_keylock_status(void);
-void              render_mod_status(void);
-void              render_feature_status(void);
-bool              oled_task_user(void);
-oled_rotation_t   oled_init_user(oled_rotation_t rotation);
-
-
-static const char PROGMEM scroll_off[]  = {0x8D, 0};
-static const char PROGMEM scroll_on[]   = {0x8E, 0};
-
-static const char PROGMEM num_off[]     = {0xAD, 0};
-static const char PROGMEM num_on[]      = {0xAE, 0};
-
-static const char PROGMEM caps_off[]    = {0xCD, 0};
-static const char PROGMEM caps_on[]     = {0xCE, 0};
-
-static const char PROGMEM shift_off[]   = {0x85, 0x86, 0};
-static const char PROGMEM shift_on[]    = {0x87, 0x88, 0};
-
-static const char PROGMEM ctrl_off[]    = {0xA9, 0xAA, 0};
-static const char PROGMEM ctrl_on[]     = {0xAB, 0xAC, 0};
-
-static const char PROGMEM alt_off[]     = {0xA5, 0xA6, 0};
-static const char PROGMEM alt_on[]      = {0xA7, 0xA8, 0};
-
-static const char PROGMEM gui_off[]     = {0x89, 0x8A, 0};
-static const char PROGMEM gui_on[]      = {0x8B, 0x8C, 0};
-
-static const char PROGMEM rgb_off[]     = {0xC5, 0xC6, 0};
-static const char PROGMEM rgb_on[]      = {0xC7, 0xC8, 0};
-
-static const char PROGMEM dragscr_off[] = {0xC9, 0xCA, 0};
-static const char PROGMEM dragscr_on[]  = {0xCB, 0xCC, 0};
-
-static const char PROGMEM sound_off[]   = {0x8F, 0x90, 0};
-static const char PROGMEM sound_on[]    = {0xAF, 0xB0, 0};
-
-static const char PROGMEM haptic_off[]  = {0x91, 0x92, 0};
-static const char PROGMEM haptic_on[]   = {0xB1, 0xB2, 0};
-
-static const char PROGMEM lyr_cfg[] = {
-  0xE1, 0xD1, 0xD2, 0xD3, 0xE1,
-  0xE1, 0xBA, 0xBB, 0xBC, 0xE1,
-  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
-  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
-};
-
-static const char PROGMEM lyr_sym[] = {
-  0xE1, 0x97, 0x98, 0x99, 0xE1,
-  0xE1, 0xDA, 0xDB, 0xDC, 0xE1,
-  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
-  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
-};
-
-static const char PROGMEM lyr_num[] = {
-  0xE1, 0x97, 0x98, 0x99, 0xE1,
-  0xE1, 0x9A, 0x9B, 0x9C, 0xE1,
-  0xE1, 0xBA, 0xBB, 0xBC, 0xE1,
-  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
-};
-
-static const char PROGMEM lyr_nav[] = {
-  0xE1, 0x97, 0x98, 0x99, 0xE1,
-  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
-  0xE1, 0xDA, 0xDB, 0xDC, 0xE1,
-  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
-};
-
-static const char PROGMEM lyr_def[] = {
-  0xE1, 0x97, 0x98, 0x99, 0xE1,
-  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
-  0xE1, 0x9A, 0x9B, 0x9C, 0xE1,
-  0xE1, 0xD4, 0xD5, 0xD6, 0xE1, 0x00
-};
-
-static const char PROGMEM qmk_logo_small[] = {
-  0xE1, 0x9D, 0x9E, 0x9F, 0xE1,
-  0xE1, 0xBD, 0xBE, 0xBF, 0xE1,
-  0xE1, 0xDD, 0xDE, 0xDF, 0xE1, 0x00
-};
-
-
-
-#if defined(WPM_ENABLE)
+void render_luna(void);
+void animate_luna(int LUNA_X, int LUNA_Y);
 
 // Luna Sit
 static const char PROGMEM sit[2][OLED_LUNA_ANIM_SIZE] = {
@@ -164,5 +50,3 @@ static const char PROGMEM sneak[2][OLED_LUNA_ANIM_SIZE] = {
   /* 'sneak2', 32x22px */
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x20, 0x40, 0x80, 0xc0, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x40, 0x55, 0x82, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x04, 0x18, 0x10, 0x08, 0x10, 0x20, 0x28, 0x34, 0x06, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,}
 };
-
-#endif //WPM_ENABLE
\ No newline at end of file
diff --git a/users/t4corun/features/oled.c b/users/t4corun/features/oled32.c
similarity index 70%
rename from users/t4corun/features/oled.c
rename to users/t4corun/features/oled32.c
index 2b12d253..1aaba4fc 100644
--- a/users/t4corun/features/oled.c
+++ b/users/t4corun/features/oled32.c
@@ -1,84 +1,8 @@
-#include "oled.h"
-
-/* LUNA PET START */
+#include "oled32.h"
 
 #if defined(WPM_ENABLE)
-
-static uint32_t luna_anim_timer = 0;
-static uint8_t luna_current_frame = 0;
-
-void render_luna(void) {
-
-#if OLED_TIMEOUT > 0
-  // the animation prevents the normal timeout from occuring
-  if (last_input_activity_elapsed() > OLED_TIMEOUT && last_led_activity_elapsed() > OLED_TIMEOUT) {
-    oled_off();
-    return;
-  } else {
-    oled_on();
-  }
-#endif //OLED_TIMEOUT
-
-  if (timer_elapsed32(luna_anim_timer) > OLED_LUNA_ANIM_FRAME_DURATION) {
-    luna_anim_timer = timer_read32();
-    animate_luna(OLED_LUNA_X, OLED_LUNA_Y);
-  }
-
-}
-
-void animate_luna(int LUNA_X, int LUNA_Y) {
-
-  uint8_t current_mod = get_mods();
-  uint8_t current_osm = get_oneshot_mods();
-
-  // Make Luna Jump when spacebar is pressed
-  // Only works when Luna is rendered on Master Slide
-  if (isLunaJumping() || !isJumpShown()) {
-    /* clear */
-    oled_set_cursor(LUNA_X, LUNA_Y + 2);
-    oled_write("     ", false);
-    oled_set_cursor(LUNA_X, LUNA_Y - 1);
-
-    setLunaJumped();
-  } else {
-    /* clear */
-    oled_set_cursor(LUNA_X, LUNA_Y - 1);
-    oled_write("     ", false);
-    oled_set_cursor(LUNA_X, LUNA_Y);
-  }
-
-  luna_current_frame = (luna_current_frame + 1) % 2;
-
-  // Animate based on status
-  if (host_keyboard_led_state().caps_lock || is_caps_word_on()) {
-
-    oled_write_raw_P(bark[luna_current_frame], OLED_LUNA_ANIM_SIZE);
-
-  } else if ((current_mod | current_osm) & MOD_MASK_CTRL) {
-
-    oled_write_raw_P(sneak[luna_current_frame], OLED_LUNA_ANIM_SIZE);
-
-  } else if (get_current_wpm() <= OLED_LUNA_MIN_WALK_SPEED) {
-
-    oled_write_raw_P(sit[luna_current_frame], OLED_LUNA_ANIM_SIZE);
-
-  } else if (get_current_wpm() <= OLED_LUNA_MIN_RUN_SPEED) {
-
-    oled_write_raw_P(walk[luna_current_frame], OLED_LUNA_ANIM_SIZE);
-
-  } else {
-
-    oled_write_raw_P(run[luna_current_frame], OLED_LUNA_ANIM_SIZE);
-
-  }
-
-}
-
-#endif //WPM_ENABLE
-
-/* KEYBOARD PET END */
-
-
+  #include "luna.c"
+#endif
 
 
 // Prints the current base layer
@@ -246,5 +170,10 @@ bool oled_task_user(void) {
 
 
 oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+  
+  //OLED_ROTATION_270 for Rollow/Corne/Swoop
+  //OLED_ROTATION_0 for KLOR
+
   return OLED_ROTATION_270;
+
 }
diff --git a/users/t4corun/features/oled32.h b/users/t4corun/features/oled32.h
new file mode 100644
index 00000000..6a3975a8
--- /dev/null
+++ b/users/t4corun/features/oled32.h
@@ -0,0 +1,111 @@
+#pragma once
+
+#include "t4corun.h"
+
+#define OLED_RENDER_KEYLOCK_NAME      "Lock"
+#define OLED_RENDER_MODS_NAME         "Mods"
+#define OLED_RENDER_FEATURE_NAME      "Feat"
+#define OLED_RENDER_WPM_NAME          "Wpm"
+
+#define OLED_RENDER_LAYOUT_QWERTY     "QWRTY"
+#define OLED_RENDER_LAYOUT_COLEMAK_DH "CLMAK"
+#define OLED_RENDER_LAYOUT_GAME       "GAME"
+
+#define OLED_RENDER_LAYER_BASE        " Def"
+#define OLED_RENDER_LAYER_NAVIGATION  " Nav"
+#define OLED_RENDER_LAYER_NUMBER      " Num"
+#define OLED_RENDER_LAYER_SYMBOL      " Sym"
+#define OLED_RENDER_LAYER_CONFIG      " Cfg"
+
+// LUNA PET Variables
+#if defined(WPM_ENABLE)
+#   define OLED_LUNA_X                   0
+#   define OLED_LUNA_Y                   13
+#   define OLED_LUNA_MIN_WALK_SPEED      10
+#   define OLED_LUNA_MIN_RUN_SPEED       40
+#   define OLED_LUNA_ANIM_FRAME_DURATION 200  // how long each frame lasts in ms
+#   define OLED_LUNA_ANIM_SIZE           96   // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
+#endif //WPM_ENABLE
+
+
+
+void render_default_layer_state(void);
+void render_layer_state(void);
+void render_keylock_status(void);
+void render_mod_status(void);
+void render_feature_status(void);
+
+
+static const char PROGMEM scroll_off[]  = {0x8D, 0};
+static const char PROGMEM scroll_on[]   = {0x8E, 0};
+
+static const char PROGMEM num_off[]     = {0xAD, 0};
+static const char PROGMEM num_on[]      = {0xAE, 0};
+
+static const char PROGMEM caps_off[]    = {0xCD, 0};
+static const char PROGMEM caps_on[]     = {0xCE, 0};
+
+static const char PROGMEM shift_off[]   = {0x85, 0x86, 0};
+static const char PROGMEM shift_on[]    = {0x87, 0x88, 0};
+
+static const char PROGMEM ctrl_off[]    = {0xA9, 0xAA, 0};
+static const char PROGMEM ctrl_on[]     = {0xAB, 0xAC, 0};
+
+static const char PROGMEM alt_off[]     = {0xA5, 0xA6, 0};
+static const char PROGMEM alt_on[]      = {0xA7, 0xA8, 0};
+
+static const char PROGMEM gui_off[]     = {0x89, 0x8A, 0};
+static const char PROGMEM gui_on[]      = {0x8B, 0x8C, 0};
+
+static const char PROGMEM rgb_off[]     = {0xC5, 0xC6, 0};
+static const char PROGMEM rgb_on[]      = {0xC7, 0xC8, 0};
+
+static const char PROGMEM dragscr_off[] = {0xC9, 0xCA, 0};
+static const char PROGMEM dragscr_on[]  = {0xCB, 0xCC, 0};
+
+static const char PROGMEM sound_off[]   = {0x8F, 0x90, 0};
+static const char PROGMEM sound_on[]    = {0xAF, 0xB0, 0};
+
+static const char PROGMEM haptic_off[]  = {0x91, 0x92, 0};
+static const char PROGMEM haptic_on[]   = {0xB1, 0xB2, 0};
+
+static const char PROGMEM lyr_cfg[] = {
+  0xE1, 0xD1, 0xD2, 0xD3, 0xE1,
+  0xE1, 0xBA, 0xBB, 0xBC, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_sym[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0xDA, 0xDB, 0xDC, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_num[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0x9A, 0x9B, 0x9C, 0xE1,
+  0xE1, 0xBA, 0xBB, 0xBC, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_nav[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0xDA, 0xDB, 0xDC, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_def[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0x9A, 0x9B, 0x9C, 0xE1,
+  0xE1, 0xD4, 0xD5, 0xD6, 0xE1, 0x00
+};
+
+static const char PROGMEM qmk_logo_small[] = {
+  0xE1, 0x9D, 0x9E, 0x9F, 0xE1,
+  0xE1, 0xBD, 0xBE, 0xBF, 0xE1,
+  0xE1, 0xDD, 0xDE, 0xDF, 0xE1, 0x00
+};
\ No newline at end of file
diff --git a/users/t4corun/features/oled64.c b/users/t4corun/features/oled64.c
new file mode 100644
index 00000000..4c71e325
--- /dev/null
+++ b/users/t4corun/features/oled64.c
@@ -0,0 +1,44 @@
+#include "oled64.h"
+
+#if defined(WPM_ENABLE)
+  #include "luna.c"
+#endif
+
+
+// Coordinate the OLED rendering
+bool oled_task_user(void) {
+
+  if (is_keyboard_master()) {
+    /*
+    oled_write_P(PSTR("123456789012345678901"), true);
+    oled_write_ln_P(PSTR("2"), false);
+    oled_write_ln_P(PSTR("3"), false);
+    oled_write_ln_P(PSTR("4"), false);
+    oled_write_ln_P(PSTR("5"), false);
+    oled_write_ln_P(PSTR("6"), false);
+    oled_write_ln_P(PSTR("7"), false);
+    oled_write_ln_P(PSTR("8"), false);
+    //oled_write_ln_P(PSTR("9"), false);
+*/
+
+#if defined(WPM_ENABLE)
+    render_luna();
+#endif
+
+  } else {
+    oled_write_raw_P(klor_face, sizeof(klor_face));
+  }
+
+  return false;
+
+}
+
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+  
+  //OLED_ROTATION_270 for Rollow/Corne/Swoop
+  //OLED_ROTATION_180 for KLOR
+
+  return OLED_ROTATION_270;
+
+}
diff --git a/users/t4corun/features/oled64.h b/users/t4corun/features/oled64.h
new file mode 100644
index 00000000..28ca0534
--- /dev/null
+++ b/users/t4corun/features/oled64.h
@@ -0,0 +1,149 @@
+#pragma once
+
+#include "t4corun.h"
+
+#define OLED_RENDER_KEYLOCK_NAME      "Lock"
+#define OLED_RENDER_MODS_NAME         "Mods"
+#define OLED_RENDER_FEATURE_NAME      "Feat"
+#define OLED_RENDER_WPM_NAME          "Wpm"
+
+#define OLED_RENDER_LAYOUT_QWERTY     "QWRTY"
+#define OLED_RENDER_LAYOUT_COLEMAK_DH "CLMAK"
+#define OLED_RENDER_LAYOUT_GAME       "GAME"
+
+#define OLED_RENDER_LAYER_BASE        " Def"
+#define OLED_RENDER_LAYER_NAVIGATION  " Nav"
+#define OLED_RENDER_LAYER_NUMBER      " Num"
+#define OLED_RENDER_LAYER_SYMBOL      " Sym"
+#define OLED_RENDER_LAYER_CONFIG      " Cfg"
+
+// LUNA PET Variables
+#if defined(WPM_ENABLE)
+#   define OLED_LUNA_X                   0
+#   define OLED_LUNA_Y                   5
+#   define OLED_LUNA_MIN_WALK_SPEED      10
+#   define OLED_LUNA_MIN_RUN_SPEED       40
+#   define OLED_LUNA_ANIM_FRAME_DURATION 200  // how long each frame lasts in ms
+#   define OLED_LUNA_ANIM_SIZE           96   // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
+#endif //WPM_ENABLE
+
+void render_default_layer_state(void);
+void render_layer_state(void);
+void render_keylock_status(void);
+void render_mod_status(void);
+void render_feature_status(void);
+
+
+static const char PROGMEM scroll_off[]  = {0x8D, 0};
+static const char PROGMEM scroll_on[]   = {0x8E, 0};
+
+static const char PROGMEM num_off[]     = {0xAD, 0};
+static const char PROGMEM num_on[]      = {0xAE, 0};
+
+static const char PROGMEM caps_off[]    = {0xCD, 0};
+static const char PROGMEM caps_on[]     = {0xCE, 0};
+
+static const char PROGMEM shift_off[]   = {0x85, 0x86, 0};
+static const char PROGMEM shift_on[]    = {0x87, 0x88, 0};
+
+static const char PROGMEM ctrl_off[]    = {0xA9, 0xAA, 0};
+static const char PROGMEM ctrl_on[]     = {0xAB, 0xAC, 0};
+
+static const char PROGMEM alt_off[]     = {0xA5, 0xA6, 0};
+static const char PROGMEM alt_on[]      = {0xA7, 0xA8, 0};
+
+static const char PROGMEM gui_off[]     = {0x89, 0x8A, 0};
+static const char PROGMEM gui_on[]      = {0x8B, 0x8C, 0};
+
+static const char PROGMEM rgb_off[]     = {0xC5, 0xC6, 0};
+static const char PROGMEM rgb_on[]      = {0xC7, 0xC8, 0};
+
+static const char PROGMEM dragscr_off[] = {0xC9, 0xCA, 0};
+static const char PROGMEM dragscr_on[]  = {0xCB, 0xCC, 0};
+
+static const char PROGMEM sound_off[]   = {0x8F, 0x90, 0};
+static const char PROGMEM sound_on[]    = {0xAF, 0xB0, 0};
+
+static const char PROGMEM haptic_off[]  = {0x91, 0x92, 0};
+static const char PROGMEM haptic_on[]   = {0xB1, 0xB2, 0};
+
+static const char PROGMEM lyr_cfg[] = {
+  0xE1, 0xD1, 0xD2, 0xD3, 0xE1,
+  0xE1, 0xBA, 0xBB, 0xBC, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_sym[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0xDA, 0xDB, 0xDC, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_num[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0x9A, 0x9B, 0x9C, 0xE1,
+  0xE1, 0xBA, 0xBB, 0xBC, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_nav[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0xDA, 0xDB, 0xDC, 0xE1,
+  0xE1, 0xD7, 0xD8, 0xD9, 0xE1, 0x00
+};
+
+static const char PROGMEM lyr_def[] = {
+  0xE1, 0x97, 0x98, 0x99, 0xE1,
+  0xE1, 0xB7, 0xB8, 0xB9, 0xE1,
+  0xE1, 0x9A, 0x9B, 0x9C, 0xE1,
+  0xE1, 0xD4, 0xD5, 0xD6, 0xE1, 0x00
+};
+
+static const char PROGMEM qmk_logo_small[] = {
+  0xE1, 0x9D, 0x9E, 0x9F, 0xE1,
+  0xE1, 0xBD, 0xBE, 0xBF, 0xE1,
+  0xE1, 0xDD, 0xDE, 0xDF, 0xE1, 0x00
+};
+
+
+#if defined(KEYBOARD_klor)
+
+static const char PROGMEM klor_face[] = {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 
+    0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 
+    0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 // KEYBOARD_klor
\ No newline at end of file
diff --git a/users/t4corun/rules.mk b/users/t4corun/rules.mk
index 09ebc8a7..98bdc39f 100644
--- a/users/t4corun/rules.mk
+++ b/users/t4corun/rules.mk
@@ -53,7 +53,11 @@ INTROSPECTION_KEYMAP_C += features/combo.c
 # include optional code for enabled features for each keyboard
 
 ifeq ($(strip $(OLED_ENABLE)), yes)
-  SRC += features/oled.c
+  ifeq ($(filter $(KEYBOARD), klor klor/2040),)
+    SRC += features/oled32.c
+  else
+    SRC += features/oled64.c
+  endif
 endif
 
 ifeq ($(strip $(AUDIO_ENABLE)), yes)