diff --git a/keyboards/lily58/.noci b/keyboards/lily58/.noci
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/lily58/config.h b/keyboards/lily58/config.h
index 553b738b48f..57fc7fa7f97 100644
--- a/keyboards/lily58/config.h
+++ b/keyboards/lily58/config.h
@@ -18,5 +18,14 @@ along with this program. If not, see .
#pragma once
+#include "config_common.h"
+
+#ifndef SOFT_SERIAL_PIN
+#define SOFT_SERIAL_PIN D2
+#define SERIAL_USE_MULTI_TRANSACTION
+#endif
+
+#define DIODE_DIRECTION COL2ROW
+
// Use the lily version to get the Lily58 logo instead of the qmk logo
#define OLED_FONT_H "lib/glcdfont_lily.c"
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/config.h b/keyboards/lily58/keymaps/lily58l_vii33/config.h
new file mode 100644
index 00000000000..6c51a5a0e44
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/config.h
@@ -0,0 +1,87 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+Copyright 2020 Ben Roesner (keycapsss.com)
+Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
+
+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 .
+*/
+
+#pragma once
+
+/* Hand configuration needs to be set at flashing time:
+qmk flash -kb lily58/light -km lily58l_vii33 -bl dfu-split-left
+*/
+#define EE_HANDS
+
+/* Home row modifiers https://precondition.github.io/home-row-mods */
+#define TAPPING_TERM 200 // mod tap hold time in ms, any tap that’s shorter will be a tap, anything longer will be held. Default is 200
+#define TAPPING_TERM_PER_KEY
+#define TAPPING_FORCE_HOLD_PER_KEY
+#define TAPPING_TOGGLE 2
+
+
+#define ENCODER_DIRECTION_FLIP // Change analog encoder rotation direction -> cw: down / volume louder
+#define ENCODER_RESOLUTION 1
+
+#define NO_MUSIC_MODE
+
+/* Defined in other files. See ./keyboards/lily58/light/config.h:
+ RGBLIGHT_ENABLE
+ RGBLIGHT_SPLIT
+ RGBLIGHT_LIMIT_VAL
+*/
+
+#ifdef RGBLIGHT_ENABLE
+# define RGBLIGHT_SLEEP // the RGB lighting will be switched off when the host goes to sleep
+# define RGBLIGHT_HUE_STEP 1 // number of steps to cycle through the hue by
+# define RGBLIGHT_SAT_STEP 2 // number of steps to increment the saturation by
+# define RGBLIGHT_VAL_STEP 2 // number of steps to increment the brightness by
+
+# define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_STATIC_GRADIENT
+
+# define RGBLIGHT_EFFECT_ALTERNATING
+# define RGBLIGHT_EFFECT_BREATHING
+# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+// # define RGBLIGHT_EFFECT_SNAKE
+# define RGBLIGHT_EFFECT_STATIC_GRADIENT
+# undef RGBLIGHT_EFFECT_TWINKLE
+# undef RGBLIGHT_EFFECT_KNIGHT
+
+# undef RGBLIGHT_LIMIT_VAL
+# define RGBLIGHT_LIMIT_VAL 100
+
+/* Custom Lightning Layers */
+# define RGBLIGHT_LAYERS
+# define RGBLIGHT_MAX_LAYERS 1 // Default is 8. Performance impact -> reduced
+#endif
+
+
+/* OLED */
+#define OLED_TIMEOUT 240000
+#define OLED_FADE_OUT
+#define OLED_UPDATE_INTERVAL 100 // set oled update interval in ms (default: 0). improves matrix scan rate
+#define OLED_BRIGHTNESS 130
+
+/* Sync WPM to slave side */
+#define SPLIT_WPM_ENABLE
+//#define SPLIT_OLED_ENABLE
+
+
+/* ACTIVATE for Elite C rev3 controller on the slave side */
+// #define SPLIT_USB_DETECT
+// #define NO_USB_STARTUP_CHECK
+
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/enums.h b/keyboards/lily58/keymaps/lily58l_vii33/enums.h
new file mode 100644
index 00000000000..90d86328824
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/enums.h
@@ -0,0 +1,62 @@
+/*
+Global enum and define file for all c files
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+Copyright 2020 Ben Roesner (keycapsss.com)
+Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
+
+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 .
+*/
+
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _QWERTY, //0
+ _LOWER, //1
+ _UPPER, //2
+ _MOD, //3
+ _GAME //4
+};
+
+
+enum custom_keycodes {
+ CC_AE = SAFE_RANGE,
+ CC_OE,
+ CC_UE,
+ CC_BckDel,
+ CC_SLH,
+ CC_QUOT,
+ CC_APHO,
+ CC_SCOLN,
+ CC_COLN,
+ CC_EXLM,
+ CC_SAVRGB,
+ CC_ALRM,
+};
+
+
+/* HOME Row Modifiers */
+/* Left-hand home row mods */
+#define GUI_S LGUI_T(KC_S)
+#define ALT_D LALT_T(KC_D)
+#define CTL_F LCTL_T(KC_F)
+/* Right-hand home row mods */
+#define CTL_J RCTL_T(KC_J)
+#define ALT_K LALT_T(KC_K)
+#define GUI_L RGUI_T(KC_L)
+
+#define SHFT_QT LSFT_T(CC_QUOT)
+#define SHFT_AE RSFT_T(CC_AE)
\ No newline at end of file
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/keymap.c b/keyboards/lily58/keymaps/lily58l_vii33/keymap.c
new file mode 100644
index 00000000000..51697ccfd56
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/keymap.c
@@ -0,0 +1,248 @@
+ /* Copyright 2017 F_YUUCHI
+ * Copyright 2020 Drashna Jaelre <@drashna>
+ * Copyright 2020 Ben Roesner (keycapsss.com)
+ * Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
+ *
+ * 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 .
+ */
+
+
+#include QMK_KEYBOARD_H
+#include "enums.h"
+#include "oled.h"
+#include "process_record_user.h"
+
+
+
+/* Layer quick names */
+#define LOWER MO(_LOWER)
+#define UPPER MO(_UPPER)
+#define MOD TT(_MOD)
+#define GAME TG(_GAME)
+
+/* Key quick names */
+#define QC_AT S(KC_2) // @
+#define QC_EUR ALGR(KC_5) // €
+#define QC_SS ALGR(KC_S) // ß
+#define QC_SECT S(ALGR(KC_S)) // §
+#define QC_DEG S(ALGR(KC_SCLN)) // °
+#define QC_HAT S(KC_6) // ^
+#define QC_AND S(KC_7) // &
+#define QC_DQUT S(KC_QUOT) // "
+
+#define QC_UNDO LCTL(KC_Z)
+#define QC_REDO LCTL(KC_Y)
+#define QC_CTLX LCTL(KC_X)
+#define QC_CTLC LCTL(KC_C)
+#define QC_CTLV LCTL(KC_V)
+
+#define GMESCN LSFT(KC_F11)
+#define CTALDEL LCTL(LALT(KC_DEL)) // CTRL+ALT+DEL
+#define WINSCNS SGUI(KC_S) // WIN+SHIFT+S >> Screenshot
+#define MUTE_MI RCS(KC_M) // CTRL+SHIFT+M or Windows 11: WIN + Alt + K
+#define SHWI_T SGUI(KC_T) // WIN+SHIFT+T >> OCR
+
+#define WRDLFT C(KC_LEFT) // CTRL+LEFT (Word left)
+#define WRDRGT C(KC_RIGHT) // CTRL+RIGHT (Word right)
+
+
+/* Animation Speeds */
+//const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5};
+const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {200, 150, 100};
+
+
+#ifdef RGBLIGHT_LAYERS
+/* Lightning Layers as status indicators. -> Array of segments */
+const rgblight_segment_t PROGMEM mod_indicator[] = RGBLIGHT_LAYER_SEGMENTS(
+ {6, 4, HSV_GREEN} // First segment: Turn on 5 LEDs starting with #4
+);
+
+const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
+ mod_indicator // 0
+);
+
+void keyboard_post_init_user(void) {
+ rgblight_layers = my_rgb_layers; // Enable the LED layers
+}
+
+/* Callback when layer changes */
+layer_state_t layer_state_set_user(layer_state_t state) {
+ /* Set my_rgb_layer 0 when comparison is true (here: _MOD Layer active) */
+ rgblight_set_layer_state(0, layer_state_cmp(state, _MOD));
+ return state;
+}
+#endif
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* QWERTY Example
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Ü |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ' | A | S | D | F | G |-------. .-------| H | J | K | L | Ö | Ä |
+ * |------+------+------+------+------+------| Volume| | Scroll|------+------+------+------+------+------|
+ * | ` | Z | X | C | V | B |-------| |-------| N | M | , | . | ? |Enter |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | / | MOD |LOWER | /Space / \Space \ |BackSP|UPPER |Delete|
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+
+[_QWERTY] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, CC_UE,
+ SHFT_QT, KC_A, GUI_S, ALT_D, CTL_F, KC_G, KC_H, CTL_J, ALT_K, GUI_L, CC_OE, SHFT_AE,
+ CC_APHO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, MUTE_MI, KC_N, KC_M, CC_SCOLN, CC_COLN, CC_EXLM, KC_ENTER,
+ CC_SLH, MOD, LOWER, KC_SPC, KC_SPC, KC_BSPC, UPPER, KC_DEL
+),
+
+
+[_LOWER] = LAYOUT(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, SHWI_T, WINSCNS, QC_UNDO, QC_REDO, KC_ENTER, XXXXXXX, WRDLFT, KC_UP, WRDRGT, KC_PGUP, KC_F12,
+ _______, KC_BSPC, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
+ XXXXXXX, KC_DEL, QC_CTLX, QC_CTLC, QC_CTLV, XXXXXXX, _______, _______, XXXXXXX, KC_HOME, KC_BSPC, KC_END, XXXXXXX, KC_ENT,
+ _______, _______, _______, _______, _______, _______, _______, _______
+),
+
+
+[_UPPER] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, QC_AT, KC_TILD, QC_EUR, KC_PSCR, _______, KC_PAST, KC_LT, KC_LCBR, KC_RCBR, KC_PMNS, _______,
+ KC_PIPE, XXXXXXX, QC_SS, XXXXXXX, XXXXXXX, CTALDEL, KC_PSLS, KC_EQL, KC_LPRN, KC_RPRN, KC_PPLS, QC_DQUT,
+ QC_DEG, XXXXXXX, QC_CTLX, QC_CTLC, QC_CTLV, XXXXXXX, _______, _______, QC_HAT, KC_GT, KC_LBRC, KC_RBRC, QC_AND, KC_PENT,
+ _______, _______, _______, KC_LSFT, _______, _______, _______, _______
+),
+
+
+ [_MOD] = LAYOUT(
+ RGB_TOG, KC_1, KC_2, KC_3, KC_4, KC_5, RGB_M_P, RGB_M_B, RGB_M_SW, RGB_M_G, KC_COMMA, GAME,
+ RGB_MOD, XXXXXXX, KC_BSPC, KC_UP, KC_DEL, XXXXXXX, KC_PAST, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_PERC,
+ RGB_M_SN, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, KC_PSLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_EQL,
+ CC_ALRM, XXXXXXX, KC_HOME, XXXXXXX, KC_END, KC_NUM, CC_SAVRGB, _______, KC_P0, KC_P1, KC_P2, KC_P3, KC_DOT, KC_PENT,
+ XXXXXXX, _______, _______, KC_SPC, _______, _______, _______, _______
+),
+
+ [_GAME] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, GAME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PGUP,
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_F6, KC_PGDN,
+ KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, GMESCN, KC_F12, KC_N, KC_M, KC_LEFT, KC_UP, KC_RIGHT, KC_DOWN,
+ KC_CAPS, KC_LALT, KC_SPC, KC_SPC, KC_ENT, KC_BSPC, KC_F7, KC_DEL
+)
+
+};
+
+/* -------------------------------------------------------------------------------- */
+
+/* Different tapping timings */
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case CTL_F:
+ case CTL_J:
+ return TAPPING_TERM - 20;
+ case GUI_S:
+ case GUI_L:
+ return TAPPING_TERM + 150;
+ case SHFT_QT:
+ case SHFT_AE:
+ return TAPPING_TERM - 80;
+ case MOD:
+ return TAPPING_TERM - 70;
+ default:
+ return TAPPING_TERM;
+ }
+}
+
+
+/* Tapping Force Hold done per key. Better than general setting. See also https://github.com/qmk/qmk_firmware/blob/master/docs/tap_hold.md */
+bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case GUI_S:
+ case ALT_D:
+ case CTL_F:
+ case CTL_J:
+ case ALT_K:
+ case GUI_L:
+ case SHFT_QT:
+ case SHFT_AE:
+ return true;
+ default:
+ return false;
+ }
+}
+
+
+/* Rotary encoder */
+#ifdef ENCODER_ENABLE
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { // Encoder on master side
+ if (IS_LAYER_ON(_MOD)) // _MOD LAYER
+ {
+ if ( get_mods() & MOD_MASK_SHIFT ) {
+ if (clockwise) {
+ rgblight_increase_sat_noeeprom();
+ } else {
+ rgblight_decrease_sat_noeeprom();
+ }
+ } else {
+ if (clockwise) {
+ rgblight_increase_hue_noeeprom();
+ } else {
+ rgblight_decrease_hue_noeeprom();
+ }
+ }
+ } else { // _QWERTY LAYER and others
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ } else if (index == 1) { // Encoder on slave side
+ if(IS_LAYER_ON(_LOWER)) { // _LOWER LAYER
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ } else if (IS_LAYER_ON(_MOD)) // _MOD LAYER
+ {
+ if ( get_mods() & MOD_MASK_SHIFT ) {
+ if (clockwise) {
+ rgblight_increase_speed_noeeprom();
+ } else {
+ rgblight_decrease_speed_noeeprom();
+ }
+ } else {
+ if (clockwise) {
+ rgblight_increase_val_noeeprom();
+ } else {
+ rgblight_decrease_val_noeeprom();
+ }
+ }
+ } else { // _QWERTY LAYER and others
+ if (clockwise) {
+ tap_code(KC_DOWN);
+ } else {
+ tap_code(KC_UP);
+ }
+ }
+ }
+ return true;
+}
+#endif // ENCODER_ENABLE
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/oled.c b/keyboards/lily58/keymaps/lily58l_vii33/oled.c
new file mode 100644
index 00000000000..e33fafee093
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/oled.c
@@ -0,0 +1,334 @@
+/*
+SSD1306 OLED update loop, make sure to enable OLED_ENABLE=yes in rules.mk
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+Copyright 2020 Ben Roesner (keycapsss.com)
+Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
+
+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 .
+*/
+
+#ifdef OLED_ENABLE
+# include "oled.h"
+# include "enums.h"
+# include "process_record_user.h"
+
+uint8_t current_wpm = 0;
+
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (is_keyboard_master()) {
+ return OLED_ROTATION_270;
+ } else {
+ return OLED_ROTATION_270;
+ }
+}
+
+/* OLED keylogging was disabled */
+// #define KEYLOG_LEN 6
+// char keylog_str[KEYLOG_LEN] = {};
+// uint8_t keylogs_str_idx = 0;
+// uint16_t log_timer = 0;
+
+// const char code_to_name[60] = {
+// ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
+// 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
+// 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+// '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
+// 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
+// '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '
+// };
+
+// void add_keylog(uint16_t keycode) {
+// if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
+// keycode = keycode & 0xFF;
+// }
+
+// for (uint8_t i = KEYLOG_LEN - 1; i > 0; i--) {
+// keylog_str[i] = keylog_str[i - 1];
+// }
+
+// if (keycode < 60) {
+// keylog_str[0] = code_to_name[keycode];
+// }
+// keylog_str[KEYLOG_LEN - 1] = 0;
+
+// log_timer = timer_read();
+// }
+
+// void update_log(void) {
+// if (timer_elapsed(log_timer) > 750) {
+// add_keylog(0); // -> Gradually moves put in characters out of the image - needed for privacy reasons!
+// }
+// }
+
+// void render_keylogger_status(void) {
+// oled_write(keylog_str, false);
+// }
+
+
+void render_default_layer_state(void) {
+ switch (get_highest_layer(layer_state)) {
+ case _QWERTY:
+ oled_write_P(PSTR("QWRTY"), false);
+ break;
+ case _LOWER:
+ oled_write_P(PSTR("LOWER"), false);
+ break;
+ case _UPPER:
+ oled_write_P(PSTR("UPPER"), false);
+ break;
+ case _MOD:
+ oled_write_ln_P(PSTR("MOD"), true);
+ break;
+ case _GAME:
+ oled_write_ln_P(PSTR("GAME"), true);
+ break;
+ default:
+ oled_write_ln_P(PSTR("ndef"), true);
+ }
+}
+
+void render_keylock_status(led_t led_state) {
+ // oled_write_ln_P(PSTR("Lock"), false);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("N"), led_state.num_lock);
+ oled_write_P(PSTR("C"), led_state.caps_lock);
+ oled_write_P(PSTR("S"), led_state.scroll_lock);
+}
+
+void render_mod_status(uint8_t modifiers) {
+ // oled_write_ln_P(PSTR("Mods"), false);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("S"), (modifiers & MOD_MASK_SHIFT));
+ oled_write_P(PSTR("C"), (modifiers & MOD_MASK_CTRL));
+ oled_write_P(PSTR("A"), (modifiers & MOD_MASK_ALT));
+ oled_write_P(PSTR("G"), (modifiers & MOD_MASK_GUI));
+}
+
+void render_kb_status(void) {
+ render_logo();
+ oled_set_cursor(0, 3);
+ oled_write_P(PSTR("-----"), false); // Add a empty line
+
+ render_default_layer_state();
+ oled_write_P(PSTR("-----"), false); // Add a empty line
+
+ render_keylock_status(host_keyboard_led_state());
+ oled_write_P(PSTR("-----"), false);
+
+ render_mod_status(get_mods());
+ oled_write_P(PSTR("-----"), false);
+
+ // render_keylogger_status();
+
+ /* Write words per minute counter */
+ // oled_write_P(PSTR("WPM: "), false);
+ // oled_write(get_u8_str(get_current_wpm(), '0'), false);
+}
+
+
+
+/* Callback for OLED update cycle */
+/* ------------------------------ */
+uint8_t current_frame = 0;
+uint32_t anim_sleep_timer = 0;
+
+bool oled_task_user(void) {
+ current_wpm = get_current_wpm();
+
+ /* fixes screen on and off bug -> Turn on in process_record_user */
+ if (current_wpm > 0) {
+ oled_on();
+ anim_sleep_timer = timer_read32();
+ }
+ else if ( timer_elapsed32(anim_sleep_timer) > OLED_TIMEOUT && is_oled_on() ) {
+ oled_off();
+ return false;
+ }
+
+ if (is_oled_on() == true) { // Render enables screen, so only call it when screen is already on
+ // update_log();
+
+ if (is_keyboard_master()) {
+ render_kb_status();
+ render_luna(0, 13);
+ }
+ else {
+ render_right_oled();
+ }
+ }
+
+ return false;
+}
+/* ------------------------------ */
+
+
+/* ------ LUNA PET START ------ */
+
+/* settings */
+# define MIN_WALK_SPEED 1
+# define MIN_RUN_SPEED 40
+# define ANIM_FRAME_DURATION 250 // how long each frame lasts in ms
+# define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
+
+/* timers */
+uint32_t anim_timer = 0;
+
+bool lunaIsSneaking = false;
+bool lunaIsJumping = false;
+bool lunaIsBarking = false;
+bool lunaShowedJump = true;
+
+/* logic */
+void render_luna(int LUNA_X, int LUNA_Y) { // params: chunk position on LED font
+
+ /* Sit */
+ static const char PROGMEM sit[2][ANIM_SIZE] = {/* 'sit1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'sit2', 32x22px */
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+
+ /* Walk */
+ static const char PROGMEM walk[2][ANIM_SIZE] = {/* 'walk1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80, 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03, 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'walk2', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }};
+
+ /* Run */
+ static const char PROGMEM run[2][ANIM_SIZE] = {/* 'run1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'run2', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }};
+
+ /* Bark */
+ static const char PROGMEM bark[2][ANIM_SIZE] = {/* 'bark1', 32x22px */
+ {
+ 0x00, 0xc0, 0x20, 0x10, 0xd0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'bark2', 32x22px */
+ {
+ 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x2c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x20, 0x4a, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }};
+
+ /* Sneak */
+ static const char PROGMEM sneak[2][ANIM_SIZE] = {/* 'sneak1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x04, 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x09, 0x01, 0x80, 0x80, 0xab, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x02, 0x06, 0x18, 0x20, 0x20, 0x38, 0x08, 0x10, 0x18, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* '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,
+ }};
+
+ // current_wpm = get_current_wpm();
+
+ /* animation timer */
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+
+ /* jump */
+ if (lunaIsJumping || !lunaShowedJump) {
+ /* clear */
+ oled_set_cursor(LUNA_X, LUNA_Y + 2);
+ oled_write(" ", false);
+
+ oled_set_cursor(LUNA_X, LUNA_Y - 1);
+
+ lunaShowedJump = true;
+
+ } else {
+ /* clear */
+ oled_set_cursor(LUNA_X, LUNA_Y - 1);
+ oled_write(" ", false);
+
+ oled_set_cursor(LUNA_X, LUNA_Y);
+ }
+
+ /* switch frame */
+ current_frame = (current_frame + 1) % 2;
+
+ /* current status */
+ if (lunaIsBarking) {
+ oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE);
+
+ } else if (lunaIsSneaking) {
+ oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE);
+
+ } else if (current_wpm <= MIN_WALK_SPEED) {
+ oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE);
+
+ } else if (current_wpm <= MIN_RUN_SPEED) {
+ oled_write_raw_P(walk[abs(1 - current_frame)], ANIM_SIZE);
+
+ } else {
+ oled_write_raw_P(run[abs(1 - current_frame)], ANIM_SIZE);
+ }
+ }
+}
+/* ------ LUNA PET END ------ */
+
+
+/* Remders Lily58 logo. For different animations see https://github.com/vii33/mecha-keyboard-lily58l */
+void render_right_oled(void) {
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+
+ /* switch frame */
+ current_frame = (current_frame + 1) % 2;
+
+ static const char PROGMEM lily58_logo[2][512] = {
+ /* frame 1, 32x128px */
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,192,192,192,192,192,224,224,192,224,192,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,248, 94,175,255,255,255,255, 7, 7,255,255,255, 7, 7,255,255,255,255, 94,184,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 15,125,254,255,255,231,231,207,207,207,207,207,207,199,231,255,255,255,125, 30, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 3, 3, 1, 0, 0, 0, 1, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,208,240,112, 48,176,176,176,176,176, 48,112,240,208,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,240,247,247, 0,176,184, 15,239,224,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 11, 15, 15, 15, 15, 12, 13, 13, 12, 15, 15, 15, 11, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,192,128, 96, 16,136, 8, 16, 8,136, 16, 96,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 28, 62,129, 1, 0,112,249,248,121, 32, 1, 0, 1, 8, 3, 10, 2, 2,140,112, 0, 0, 0, 0, 0, 0, 0,192, 64, 32, 16, 24, 8,136,144, 18, 76,224,248,255,255, 2, 4, 4, 4, 4, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7,196,200,232,232,209, 17,216,236,239,207,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,254, 2, 2,254,254,254,254,254, 2,254, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 38, 74,254, 0, 0, 0, 0, 0, 0, 0, 0, 31,251,248, 24, 27, 27,251,251,251,248, 27,248, 24, 24, 24, 24, 24, 24, 24, 56,152,249,250, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0,255,255,255,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 73, 36,255,255, 0, 0, 0, 0, 0,
+ },
+ /* frame 2, 32x128px */
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,192,192,192,192,192,224,224,192,224,192,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,248,254, 95,175,255,255,255, 7, 7,255,255,255, 7, 7,255,255,255, 95,190,248,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 15,127,253,254,255,231,231,207,207,207,207,207,207,199,231,255,255,253,126, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 3, 3, 1, 0, 0, 0, 1, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,208,240,112, 48,176,176,176,176,176, 48,112,240,208,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,240,247,247, 0,176,184, 15,239,224,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 11, 15, 15, 15, 15, 12, 13, 13, 12, 15, 15, 15, 11, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,224,224, 64, 48,136, 68,132, 8,132, 68,136, 48,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 14, 31, 64, 0, 0, 56,124,252,188, 16, 0, 0, 0, 4, 1, 5, 1,129, 70, 56, 0, 0, 0, 0, 0, 0, 0,224,160, 16, 8, 12, 4,196,200, 9, 38,240,252,255,127, 1, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98,100,116,116,104, 8,108,118,119,103, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,254, 2, 2,254,254,254,254,254, 2,254, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 38, 74,254, 0, 0, 0, 0, 0, 0, 0, 0, 31,251,248, 24, 27, 27,251,251,251,248, 27,248, 24, 24, 24, 24, 24, 24, 24, 56,152,249,250, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0,255,255,255,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 73, 36,255,255, 0, 0, 0, 0, 0,
+ }
+ };
+
+ oled_write_raw_P(lily58_logo[abs(1 - current_frame)], 512);
+ }
+}
+
+
+/* vii33 logo. 32x8px */
+void render_logo(void) {
+ static const char PROGMEM vii33_logo[] = {
+ 0, 15, 48, 64, 48, 15, 0, 65,127, 65, 0, 65,127, 65, 0, 34, 65, 73, 73, 54, 0, 34, 65, 73, 73, 54, 0, 96, 24, 6, 1, 0,
+ };
+ oled_write_raw_P(vii33_logo, sizeof(vii33_logo));
+}
+
+
+#endif // OLED_ENABLE
+
+
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/oled.h b/keyboards/lily58/keymaps/lily58l_vii33/oled.h
new file mode 100644
index 00000000000..4752947a7ff
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/oled.h
@@ -0,0 +1,30 @@
+/*
+Header file for OLED code
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+Copyright 2020 Ben Roesner (keycapsss.com)
+Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
+
+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 .
+*/
+
+
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+void render_luna(int LUNA_X, int LUNA_Y);
+void render_logo(void);
+void render_right_oled(void);
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/process_record_user.c b/keyboards/lily58/keymaps/lily58l_vii33/process_record_user.c
new file mode 100644
index 00000000000..a95a977844f
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/process_record_user.c
@@ -0,0 +1,171 @@
+/*
+Process record user file (key pressed callback)
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+Copyright 2020 Ben Roesner (keycapsss.com)
+Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
+
+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 .
+*/
+
+#include "process_record_user.h"
+#include "enums.h"
+#include QMK_KEYBOARD_H
+
+uint8_t mods_state;
+
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ /* on key release */
+ if (record->event.pressed == false) {
+ /* Luna pet */
+ lunaIsJumping = false;
+ lunaIsSneaking = false;
+ lunaIsBarking = false;
+
+ return true; // Don't process keys further on key release (currently we don't need it)
+ }
+
+
+ mods_state = get_mods(); // Store the current modifier state in the variable for later reference
+
+ /* For OLED Key logger */
+ // if (record->event.pressed) {
+ // // add_keylog(keycode);
+ // }
+
+
+ switch (keycode)
+ {
+ case KC_SPC:
+ lunaIsJumping = true;
+ lunaShowedJump = false;
+ break;
+
+ case CTL_J:
+ case CTL_F:
+ lunaIsSneaking = true;
+ break;
+
+ case ALT_K:
+ case ALT_D:
+ lunaIsBarking = true;
+ break;
+
+ case SHFT_AE:
+ if (record->tap.count > 0) { // The key is being tapped.
+ tap_code16(ALGR(KC_Q)); // tapcode16() allows you to use modifiers!
+ return false;
+ }
+ break;
+
+ case CC_OE:
+ tap_code16(ALGR(KC_P));
+ break;
+
+ case CC_UE:
+ tap_code16(ALGR(KC_Y));
+ break;
+
+ case CC_BckDel:
+ if ( mods_state & MOD_MASK_SHIFT ) { // Shift pressed
+ del_mods(MOD_MASK_SHIFT); // cancel the shifts so they are not applied to the keycodes
+ tap_code(KC_DEL);
+ set_mods(mods_state);
+ }else { // No shift is pressed
+ tap_code(KC_BSPC);
+ }
+ break;
+
+ case CC_SLH:
+ if ( mods_state & MOD_MASK_SHIFT ) {
+ del_mods(MOD_MASK_SHIFT);
+ tap_code(KC_BSLS); // backslash
+ set_mods(mods_state);
+ }else {
+ tap_code(KC_SLSH); // /
+ }
+ break;
+
+ case CC_APHO:
+ if ( mods_state & MOD_MASK_SHIFT ) {
+ del_mods(MOD_MASK_SHIFT);
+ tap_code16(ALGR(KC_QUOT)); // ´ aigu
+ set_mods(mods_state);
+
+ }else {
+ tap_code(KC_GRV); // ` grave
+ tap_code(KC_SPC); // needed bc. of dead key
+ }
+ break;
+
+ case SHFT_QT:
+ if (record->tap.count > 0) { // The key is being tapped.
+ if ( mods_state & MOD_MASK_SHIFT ) {
+ tap_code(KC_QUOT); // "
+ tap_code(KC_SPC); // needed bc. of dead key
+ }else {
+ tap_code(KC_QUOT); // '
+ tap_code(KC_SPC); // needed bc. of dead key
+ }
+ return false; // important here to avoid ghost key strokes
+ }
+ break;
+
+ case CC_COLN:
+ if ( mods_state & MOD_MASK_SHIFT ) {
+ //del_mods(MOD_MASK_SHIFT);
+ tap_code(KC_SCLN); // :
+ }else {
+ tap_code(KC_DOT); // . (dot)
+ }
+ break;
+
+ case CC_SCOLN:
+ if ( mods_state & MOD_MASK_SHIFT ) {
+ del_mods(MOD_MASK_SHIFT);
+ tap_code(KC_SCLN); // ;
+ set_mods(mods_state);
+ }else {
+ tap_code(KC_COMM); // , (comma)
+ }
+ break;
+
+ case CC_EXLM:
+ if ( mods_state & MOD_MASK_SHIFT ) {
+ del_mods(MOD_MASK_SHIFT);
+ tap_code16(KC_EXLM); // !
+ set_mods(mods_state);
+ }else {
+ tap_code16(KC_QUES); // ?
+ }
+ break;
+
+ #ifdef RGBLIGHT_ENABLE
+ case CC_SAVRGB: // Saves color config to eeprom. Used to save eeprom write cycles
+ rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val());
+ rgblight_set_speed( rgblight_get_speed() );
+ break;
+
+ case CC_ALRM: // RGB alternate blinking
+ rgblight_mode(RGBLIGHT_MODE_ALTERNATING);
+ break;
+ #endif
+ }
+
+
+ return true;
+}
\ No newline at end of file
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/process_record_user.h b/keyboards/lily58/keymaps/lily58l_vii33/process_record_user.h
new file mode 100644
index 00000000000..96d2f3be229
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/process_record_user.h
@@ -0,0 +1,36 @@
+/*
+Header file for process_record_user
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+Copyright 2020 Ben Roesner (keycapsss.com)
+Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
+
+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 .
+*/
+
+
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record);
+
+extern bool lunaIsSneaking;
+extern bool lunaIsJumping;
+extern bool lunaIsBarking;
+extern bool lunaShowedJump;
+
+/* Logging of key taps is not used for now */
+// extern void add_keylog(uint16_t keycode);
\ No newline at end of file
diff --git a/keyboards/lily58/keymaps/lily58l_vii33/rules.mk b/keyboards/lily58/keymaps/lily58l_vii33/rules.mk
new file mode 100644
index 00000000000..b2ace83d799
--- /dev/null
+++ b/keyboards/lily58/keymaps/lily58l_vii33/rules.mk
@@ -0,0 +1,11 @@
+EXTRAKEY_ENABLE = yes
+OLED_ENABLE = yes
+LTO_ENABLE = yes # Smaller binary
+
+WPM_ENABLE = yes
+
+SRC += oled.c
+SRC += process_record_user.c
+
+
+# CONSOLE_ENABLE = yes # To debug via the qmk toolkit
\ No newline at end of file
diff --git a/keyboards/lily58/light/config.h b/keyboards/lily58/light/config.h
new file mode 100644
index 00000000000..a8719ef46f2
--- /dev/null
+++ b/keyboards/lily58/light/config.h
@@ -0,0 +1,47 @@
+/*
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+Copyright 2017 F_YUUCHI
+Copyright 2020 Ben Roesner (keycapsss.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 .
+*/
+
+#pragma once
+
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 6
+
+// wiring of each half
+#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 }
+#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+#define SOFT_SERIAL_PIN D2
+
+#define RGB_DI_PIN D3
+#define RGBLED_SPLIT { 35, 35 }
+#define RGBLED_NUM 70
+#define RGBLIGHT_SPLIT
+#define RGBLIGHT_LIMIT_VAL 120
+
+#define ENCODERS_PAD_A { F4 }
+#define ENCODERS_PAD_B { F5 }
+#define ENCODERS_PAD_A_RIGHT { F5 }
+#define ENCODERS_PAD_B_RIGHT { F4 }
\ No newline at end of file
diff --git a/keyboards/lily58/light/info.json b/keyboards/lily58/light/info.json
index 1c556e429a6..67e83109528 100644
--- a/keyboards/lily58/light/info.json
+++ b/keyboards/lily58/light/info.json
@@ -8,114 +8,15 @@
"pid": "0x4C4C",
"device_version": "1.0.0"
},
- "features": {
- "bootmagic": true,
- "encoder": true,
- "oled": true,
- "rgblight": true
- },
- "matrix_pins": {
- "cols": ["F6", "F7", "B1", "B3", "B2", "B6"],
- "rows": ["C6", "D7", "E6", "B4", "B5"]
- },
- "diode_direction": "COL2ROW",
- "encoder": {
- "rotary": [
- {"pin_a": "F4", "pin_b": "F5"}
- ]
- },
- "split": {
- "enabled": true,
- "soft_serial_pin": "D2",
- "encoder": {
- "right": {
- "rotary": [
- {"pin_a": "F5", "pin_b": "F4"}
- ]
- }
- }
- },
- "ws2812": {
- "pin": "D3"
- },
- "rgblight": {
- "led_count": 70,
- "max_brightness": 120,
- "split_count": [35, 35]
- },
- "processor": "atmega32u4",
- "bootloader": "caterina",
"layouts": {
"LAYOUT": {
"layout": [
- {"matrix": [0, 0], "x": 0, "y": 0.5},
- {"matrix": [0, 1], "x": 1, "y": 0.375},
- {"matrix": [0, 2], "x": 2, "y": 0.125},
- {"matrix": [0, 3], "x": 3, "y": 0},
- {"matrix": [0, 4], "x": 4, "y": 0.125},
- {"matrix": [0, 5], "x": 5, "y": 0.25},
-
- {"matrix": [5, 5], "x": 10.5, "y": 0.25},
- {"matrix": [5, 4], "x": 11.5, "y": 0.125},
- {"matrix": [5, 3], "x": 12.5, "y": 0},
- {"matrix": [5, 2], "x": 13.5, "y": 0.125},
- {"matrix": [5, 1], "x": 14.5, "y": 0.375},
- {"matrix": [5, 0], "x": 15.5, "y": 0.5},
-
- {"matrix": [1, 0], "x": 0, "y": 1.5},
- {"matrix": [1, 1], "x": 1, "y": 1.375},
- {"matrix": [1, 2], "x": 2, "y": 1.125},
- {"matrix": [1, 3], "x": 3, "y": 1},
- {"matrix": [1, 4], "x": 4, "y": 1.125},
- {"matrix": [1, 5], "x": 5, "y": 1.25},
-
- {"matrix": [6, 5], "x": 10.5, "y": 1.25},
- {"matrix": [6, 4], "x": 11.5, "y": 1.125},
- {"matrix": [6, 3], "x": 12.5, "y": 1},
- {"matrix": [6, 2], "x": 13.5, "y": 1.125},
- {"matrix": [6, 1], "x": 14.5, "y": 1.375},
- {"matrix": [6, 0], "x": 15.5, "y": 1.5},
-
- {"matrix": [2, 0], "x": 0, "y": 2.5},
- {"matrix": [2, 1], "x": 1, "y": 2.375},
- {"matrix": [2, 2], "x": 2, "y": 2.125},
- {"matrix": [2, 3], "x": 3, "y": 2},
- {"matrix": [2, 4], "x": 4, "y": 2.125},
- {"matrix": [2, 5], "x": 5, "y": 2.25},
-
- {"matrix": [7, 5], "x": 10.5, "y": 2.25},
- {"matrix": [7, 4], "x": 11.5, "y": 2.125},
- {"matrix": [7, 3], "x": 12.5, "y": 2},
- {"matrix": [7, 2], "x": 13.5, "y": 2.125},
- {"matrix": [7, 1], "x": 14.5, "y": 2.375},
- {"matrix": [7, 0], "x": 15.5, "y": 2.5},
-
- {"matrix": [3, 0], "x": 0, "y": 3.5},
- {"matrix": [3, 1], "x": 1, "y": 3.375},
- {"matrix": [3, 2], "x": 2, "y": 3.125},
- {"matrix": [3, 3], "x": 3, "y": 3},
- {"matrix": [3, 4], "x": 4, "y": 3.125},
- {"matrix": [3, 5], "x": 5, "y": 3.25},
- {"matrix": [4, 5], "x": 6, "y": 2.75},
-
- {"matrix": [9, 5], "x": 9.5, "y": 2.75},
- {"matrix": [8, 5], "x": 10.5, "y": 3.25},
- {"matrix": [8, 4], "x": 11.5, "y": 3.125},
- {"matrix": [8, 3], "x": 12.5, "y": 3},
- {"matrix": [8, 2], "x": 13.5, "y": 3.125},
- {"matrix": [8, 1], "x": 14.5, "y": 3.375},
- {"matrix": [8, 0], "x": 15.5, "y": 3.5},
-
- {"matrix": [4, 1], "x": 2.5, "y": 4.125},
- {"matrix": [4, 2], "x": 3.5, "y": 4.15},
- {"matrix": [4, 3], "x": 4.5, "y": 4.25},
- {"matrix": [4, 4], "x": 6, "y": 4.25, "h": 1.5},
-
- {"matrix": [9, 4], "x": 9.5, "y": 4.25, "h": 1.5},
- {"matrix": [9, 3], "x": 11, "y": 4.25},
- {"matrix": [9, 2], "x": 12, "y": 4.15},
- {"matrix": [9, 1], "x": 13, "y": 4.15}
+ {"x":0, "y":0.5}, {"x":1, "y":0.375}, {"x":2, "y":0.125}, {"x":3, "y":0}, {"x":4, "y":0.125}, {"x":5, "y":0.25}, {"x":10.5, "y":0.25}, {"x":11.5, "y":0.125}, {"x":12.5, "y":0}, {"x":13.5, "y":0.125}, {"x":14.5, "y":0.375}, {"x":15.5, "y":0.5},
+ {"x":0, "y":1.5}, {"x":1, "y":1.375}, {"x":2, "y":1.125}, {"x":3, "y":1}, {"x":4, "y":1.125}, {"x":5, "y":1.25}, {"x":10.5, "y":1.25}, {"x":11.5, "y":1.125}, {"x":12.5, "y":1}, {"x":13.5, "y":1.125}, {"x":14.5, "y":1.375}, {"x":15.5, "y":1.5},
+ {"x":0, "y":2.5}, {"x":1, "y":2.375}, {"x":2, "y":2.125}, {"x":3, "y":2}, {"x":4, "y":2.125}, {"x":5, "y":2.25}, {"x":10.5, "y":2.25}, {"x":11.5, "y":2.125}, {"x":12.5, "y":2}, {"x":13.5, "y":2.125}, {"x":14.5, "y":2.375}, {"x":15.5, "y":2.5},
+ {"x":0, "y":3.5}, {"x":1, "y":3.375}, {"x":2, "y":3.125}, {"x":3, "y":3}, {"x":4, "y":3.125}, {"x":5, "y":3.25}, {"x":6, "y":2.75}, {"x":9.5, "y":2.75}, {"x":10.5, "y":3.25}, {"x":11.5, "y":3.125}, {"x":12.5, "y":3}, {"x":13.5, "y":3.125}, {"x":14.5, "y":3.375}, {"x":15.5, "y":3.5},
+ {"x":2.5, "y":4.125}, {"x":3.5, "y":4.15}, {"x":4.5, "y":4.25}, {"x":6, "y":4.25, "h":1.5}, {"x":9.5, "y":4.25, "h":1.5}, {"x":11, "y":4.25}, {"x":12, "y":4.15}, {"x":13, "y":4.15}
]
}
}
-}
+}
\ No newline at end of file
diff --git a/keyboards/lily58/light/light.c b/keyboards/lily58/light/light.c
new file mode 100644
index 00000000000..92ca8d178fe
--- /dev/null
+++ b/keyboards/lily58/light/light.c
@@ -0,0 +1,15 @@
+/*
+Copyright 2020 Ben Roesner (keycapsss.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 .
+*/
+
+#include "lily58.h"
diff --git a/keyboards/lily58/light/light.h b/keyboards/lily58/light/light.h
new file mode 100644
index 00000000000..230b6863a1d
--- /dev/null
+++ b/keyboards/lily58/light/light.h
@@ -0,0 +1,50 @@
+#pragma once
+
+#include "lily58.h"
+
+#include "quantum.h"
+
+
+#ifndef FLIP_HALF
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
+ L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
+ L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
+ L30, L31, L32, L33, L34, L35, L45, R40, R30, R31, R32, R33, R34, R35, \
+ L41, L42, L43, L44, R41, R42, R43, R44 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { KC_NO, L41, L42, L43, L44, L45 }, \
+ { R05, R04, R03, R02, R01, R00 }, \
+ { R15, R14, R13, R12, R11, R10 }, \
+ { R25, R24, R23, R22, R21, R20 }, \
+ { R35, R34, R33, R32, R31, R30 }, \
+ { KC_NO, R44, R43, R42, R41, R40 } \
+ }
+#else
+// Keymap with right side flipped
+// (TRRS jack on both halves are to the right)
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
+ L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
+ L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
+ L30, L31, L32, L33, L34, L35, L45, R30, R31, R32, R33, R34, R35, R45, \
+ L41, L42, L43, L44, R41, R42, R43, R44 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { KC_NO, L41, L42, L43, L44, L45 }, \
+ { R00, R01, R02, R03, R04, R05 }, \
+ { R10, R11, R12, R13, R14, R15 }, \
+ { R20, R21, R22, R23, R24, R25 }, \
+ { R30, R31, R32, R33, R34, R35 }, \
+ { KC_NO, R41, R42, R43, R44, R45 } \
+ }
+#endif
\ No newline at end of file
diff --git a/keyboards/lily58/light/rules.mk b/keyboards/lily58/light/rules.mk
index 4da205a168c..e12f85902f7 100644
--- a/keyboards/lily58/light/rules.mk
+++ b/keyboards/lily58/light/rules.mk
@@ -1 +1,5 @@
-LTO_ENABLE = yes
+ENCODER_ENABLE = yes # ENables the use of one or more encoders
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB light
+LTO_ENABLE = yes # significantly reduce the compiled size, but disable the legacy TMK Macros and Functions features
+# Bootloader selection
+BOOTLOADER = atmel-dfu
\ No newline at end of file
diff --git a/keyboards/lily58/lily58.c b/keyboards/lily58/lily58.c
new file mode 100644
index 00000000000..6108d70b906
--- /dev/null
+++ b/keyboards/lily58/lily58.c
@@ -0,0 +1 @@
+#include "lily58.h"
diff --git a/keyboards/lily58/lily58.h b/keyboards/lily58/lily58.h
new file mode 100644
index 00000000000..c0820300324
--- /dev/null
+++ b/keyboards/lily58/lily58.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#ifdef KEYBOARD_lily58_rev1
+ #include "rev1.h"
+#elif KEYBOARD_lily58_light
+ #include "light.h"
+#elif KEYBOARD_lily58_glow_enc
+ #include "glow_enc.h"
+#endif
diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk
index a63bd42ad37..d6635f73479 100644
--- a/keyboards/lily58/rules.mk
+++ b/keyboards/lily58/rules.mk
@@ -1 +1,23 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306 # OLED display
+SPLIT_KEYBOARD = yes
+
DEFAULT_FOLDER = lily58/rev1