diff --git a/keyboards/arisu/keymaps/kbdksp/config.h b/keyboards/arisu/keymaps/kbdksp/config.h
new file mode 100644
index 00000000000..ef154e8744d
--- /dev/null
+++ b/keyboards/arisu/keymaps/kbdksp/config.h
@@ -0,0 +1,37 @@
+#pragma once
+
+
+#define RGB_DI_PIN F5
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 18
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #define RGBLIGHT_VAL_STEP 8
+ #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+ #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
+/*== all animations enable ==*/
+ #define RGBLIGHT_ANIMATIONS
+ #define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+ #define RGB_MATRIX_KEYPRESSES
+/*== or choose animations ==*/
+// #define RGBLIGHT_EFFECT_BREATHING
+// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+// #define RGBLIGHT_EFFECT_SNAKE
+// #define RGBLIGHT_EFFECT_KNIGHT
+// #define RGBLIGHT_EFFECT_CHRISTMAS
+// #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+// #define RGBLIGHT_EFFECT_RGB_TEST
+// #define RGBLIGHT_EFFECT_ALTERNATING
+#endif
+
+#define VIAL_KEYBOARD_UID {0x12, 0x38, 0xDA, 0x0C, 0x13, 0xD5, 0xE1, 0x3D}
+
+#define VIAL_ENCODER_DEFAULT { KC_VOLU, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+
+#define VIAL_UNLOCK_COMBO_ROWS { 0, 0 }
+#define VIAL_UNLOCK_COMBO_COLS { 0, 3 }
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
+
+#define ENCODERS_PAD_A { F6 }
+#define ENCODERS_PAD_B { F7 }
diff --git a/keyboards/arisu/keymaps/kbdksp/keymap.c b/keyboards/arisu/keymaps/kbdksp/keymap.c
new file mode 100644
index 00000000000..9a7d85359f4
--- /dev/null
+++ b/keyboards/arisu/keymaps/kbdksp/keymap.c
@@ -0,0 +1,57 @@
+/* Copyright 2019 Fate
+ *
+ * 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
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, MO(1),
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
+ _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (!clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ return true;
+}
+
+#endif
diff --git a/keyboards/arisu/keymaps/kbdksp/rules.mk b/keyboards/arisu/keymaps/kbdksp/rules.mk
new file mode 100644
index 00000000000..9e8e009d19e
--- /dev/null
+++ b/keyboards/arisu/keymaps/kbdksp/rules.mk
@@ -0,0 +1,8 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+ENCODER_ENABLE = yes
+VIAL_ENCODERS_ENABLE = yes
+LTO_ENABLE = yes
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+QMK_SETTINGS = no
+VIAL_INSECURE = yes
diff --git a/keyboards/arisu/keymaps/kbdksp/vial.json b/keyboards/arisu/keymaps/kbdksp/vial.json
new file mode 100644
index 00000000000..b075c8727d8
--- /dev/null
+++ b/keyboards/arisu/keymaps/kbdksp/vial.json
@@ -0,0 +1,270 @@
+{
+ "name": "ARISU",
+ "vendorId": "0xFA7E",
+ "productId": "0x0000",
+ "lighting": "qmk_rgblight",
+ "matrix": { "rows": 5, "cols": 15 },
+ "layouts": {
+ "keymap": [
+ [
+ {
+ "y": 0.38,
+ "x": 3.75
+ },
+ "0,2",
+ {
+ "x": 8.5
+ },
+ "0,11",
+ {
+ "x": 3.25,
+ "c": "#777777"
+ },
+ "1,14",
+ {"x": 0.25}
+ ,"0,0\n\n\n\n\n\n\n\n\ne","0,1\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "y": -0.8799999999999999,
+ "x": 1.75,
+ "c": "#aaaaaa"
+ },
+ "0,0",
+ {
+ "c": "#cccccc"
+ },
+ "0,1",
+ {
+ "x": 10.5
+ },
+ "0,12",
+ {
+ "c": "#aaaaaa"
+ },
+ "0,13",
+ "0,14"
+ ],
+ [
+ {
+ "y": -0.1200000000000001,
+ "x": 17.75,
+ "c": "#777777"
+ },
+ "2,14"
+ ],
+ [
+ {
+ "y": -0.8799999999999999,
+ "x": 1.5,
+ "c": "#aaaaaa",
+ "w": 1.5
+ },
+ "1,0",
+ {
+ "c": "#cccccc"
+ },
+ "1,1",
+ {
+ "x": 10
+ },
+ "1,11",
+ "1,12",
+ {
+ "w": 1.5
+ },
+ "1,13"
+ ],
+ [
+ {
+ "y": -0.1200000000000001,
+ "x": 18,
+ "c": "#777777"
+ },
+ "3,14"
+ ],
+ [
+ {
+ "y": -0.8799999999999999,
+ "x": 1.25,
+ "c": "#aaaaaa",
+ "w": 1.75
+ },
+ "2,0",
+ {
+ "c": "#cccccc"
+ },
+ "2,1",
+ {
+ "x": 9.5
+ },
+ "2,10",
+ "2,11",
+ {
+ "c": "#777777",
+ "w": 2.25
+ },
+ "2,12"
+ ],
+ [
+ {
+ "x": 1,
+ "c": "#aaaaaa",
+ "w": 2.25
+ },
+ "3,0",
+ {
+ "c": "#cccccc"
+ },
+ "3,1",
+ {
+ "x": 9.75
+ },
+ "3,10",
+ {
+ "c": "#aaaaaa",
+ "w": 1.75
+ },
+ "3,11"
+ ],
+ [
+ {
+ "y": -0.75,
+ "x": 17
+ },
+ "3,13"
+ ],
+ [
+ {
+ "y": -0.25,
+ "x": 1,
+ "w": 1.5
+ },
+ "4,0"
+ ],
+ [
+ {
+ "y": -0.75,
+ "x": 16
+ },
+ "4,12",
+ "4,13",
+ "4,14"
+ ],
+ [
+ {
+ "r": 12,
+ "rx": 4.75,
+ "ry": 1.5,
+ "y": -1,
+ "c": "#cccccc"
+ },
+ "0,3",
+ "0,4",
+ "0,5",
+ "0,6"
+ ],
+ [
+ {
+ "x": -0.5
+ },
+ "1,2",
+ "1,3",
+ "1,4",
+ "1,5"
+ ],
+ [
+ {
+ "x": -0.25
+ },
+ "2,2",
+ "2,3",
+ "2,4",
+ "2,5"
+ ],
+ [
+ {
+ "x": 0.25
+ },
+ "3,2",
+ "3,3",
+ "3,4",
+ "3,5"
+ ],
+ [
+ {
+ "x": 0.25,
+ "c": "#aaaaaa",
+ "w": 1.5
+ },
+ "4,2",
+ {
+ "c": "#cccccc",
+ "w": 2
+ },
+ "4,4",
+ {
+ "c": "#aaaaaa"
+ },
+ "4,5"
+ ],
+ [
+ {
+ "r": -12,
+ "rx": 13.5,
+ "y": -1,
+ "x": -4.25,
+ "c": "#cccccc"
+ },
+ "0,7",
+ "0,8",
+ "0,9",
+ "0,10"
+ ],
+ [
+ {
+ "x": -4.75
+ },
+ "1,6",
+ "1,7",
+ "1,8",
+ "1,9",
+ "1,10"
+ ],
+ [
+ {
+ "x": -4.5
+ },
+ "2,6",
+ "2,7",
+ "2,8",
+ "2,9"
+ ],
+ [
+ {
+ "y": 1,
+ "x": -4.75,
+ "w": 2.75
+ },
+ "4,7",
+ {
+ "c": "#aaaaaa",
+ "w": 1.5
+ },
+ "4,9"
+ ],
+ [
+ {
+ "ry": 1.75,
+ "y": 1.75,
+ "x": -4.25,
+ "c": "#cccccc"
+ },
+ "3,6",
+ "3,7",
+ "3,8",
+ "3,9"
+ ]
+ ]
+ }
+ }
diff --git a/keyboards/arisu/keymaps/sendyyeah/config.h b/keyboards/arisu/keymaps/sendyyeah/config.h
new file mode 100644
index 00000000000..ef154e8744d
--- /dev/null
+++ b/keyboards/arisu/keymaps/sendyyeah/config.h
@@ -0,0 +1,37 @@
+#pragma once
+
+
+#define RGB_DI_PIN F5
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 18
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #define RGBLIGHT_VAL_STEP 8
+ #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+ #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
+/*== all animations enable ==*/
+ #define RGBLIGHT_ANIMATIONS
+ #define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+ #define RGB_MATRIX_KEYPRESSES
+/*== or choose animations ==*/
+// #define RGBLIGHT_EFFECT_BREATHING
+// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+// #define RGBLIGHT_EFFECT_SNAKE
+// #define RGBLIGHT_EFFECT_KNIGHT
+// #define RGBLIGHT_EFFECT_CHRISTMAS
+// #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+// #define RGBLIGHT_EFFECT_RGB_TEST
+// #define RGBLIGHT_EFFECT_ALTERNATING
+#endif
+
+#define VIAL_KEYBOARD_UID {0x12, 0x38, 0xDA, 0x0C, 0x13, 0xD5, 0xE1, 0x3D}
+
+#define VIAL_ENCODER_DEFAULT { KC_VOLU, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+
+#define VIAL_UNLOCK_COMBO_ROWS { 0, 0 }
+#define VIAL_UNLOCK_COMBO_COLS { 0, 3 }
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
+
+#define ENCODERS_PAD_A { F6 }
+#define ENCODERS_PAD_B { F7 }
diff --git a/keyboards/arisu/keymaps/sendyyeah/keymap.c b/keyboards/arisu/keymaps/sendyyeah/keymap.c
new file mode 100644
index 00000000000..560e12d857c
--- /dev/null
+++ b/keyboards/arisu/keymaps/sendyyeah/keymap.c
@@ -0,0 +1,57 @@
+/* Copyright 2019 Fate
+ *
+ * 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
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, MO(1),
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
+ _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (!clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ return true;
+}
+
+#endif
diff --git a/keyboards/arisu/keymaps/sendyyeah/rules.mk b/keyboards/arisu/keymaps/sendyyeah/rules.mk
new file mode 100644
index 00000000000..9e8e009d19e
--- /dev/null
+++ b/keyboards/arisu/keymaps/sendyyeah/rules.mk
@@ -0,0 +1,8 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+ENCODER_ENABLE = yes
+VIAL_ENCODERS_ENABLE = yes
+LTO_ENABLE = yes
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+QMK_SETTINGS = no
+VIAL_INSECURE = yes
diff --git a/keyboards/arisu/keymaps/sendyyeah/vial.json b/keyboards/arisu/keymaps/sendyyeah/vial.json
new file mode 100644
index 00000000000..b075c8727d8
--- /dev/null
+++ b/keyboards/arisu/keymaps/sendyyeah/vial.json
@@ -0,0 +1,270 @@
+{
+ "name": "ARISU",
+ "vendorId": "0xFA7E",
+ "productId": "0x0000",
+ "lighting": "qmk_rgblight",
+ "matrix": { "rows": 5, "cols": 15 },
+ "layouts": {
+ "keymap": [
+ [
+ {
+ "y": 0.38,
+ "x": 3.75
+ },
+ "0,2",
+ {
+ "x": 8.5
+ },
+ "0,11",
+ {
+ "x": 3.25,
+ "c": "#777777"
+ },
+ "1,14",
+ {"x": 0.25}
+ ,"0,0\n\n\n\n\n\n\n\n\ne","0,1\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "y": -0.8799999999999999,
+ "x": 1.75,
+ "c": "#aaaaaa"
+ },
+ "0,0",
+ {
+ "c": "#cccccc"
+ },
+ "0,1",
+ {
+ "x": 10.5
+ },
+ "0,12",
+ {
+ "c": "#aaaaaa"
+ },
+ "0,13",
+ "0,14"
+ ],
+ [
+ {
+ "y": -0.1200000000000001,
+ "x": 17.75,
+ "c": "#777777"
+ },
+ "2,14"
+ ],
+ [
+ {
+ "y": -0.8799999999999999,
+ "x": 1.5,
+ "c": "#aaaaaa",
+ "w": 1.5
+ },
+ "1,0",
+ {
+ "c": "#cccccc"
+ },
+ "1,1",
+ {
+ "x": 10
+ },
+ "1,11",
+ "1,12",
+ {
+ "w": 1.5
+ },
+ "1,13"
+ ],
+ [
+ {
+ "y": -0.1200000000000001,
+ "x": 18,
+ "c": "#777777"
+ },
+ "3,14"
+ ],
+ [
+ {
+ "y": -0.8799999999999999,
+ "x": 1.25,
+ "c": "#aaaaaa",
+ "w": 1.75
+ },
+ "2,0",
+ {
+ "c": "#cccccc"
+ },
+ "2,1",
+ {
+ "x": 9.5
+ },
+ "2,10",
+ "2,11",
+ {
+ "c": "#777777",
+ "w": 2.25
+ },
+ "2,12"
+ ],
+ [
+ {
+ "x": 1,
+ "c": "#aaaaaa",
+ "w": 2.25
+ },
+ "3,0",
+ {
+ "c": "#cccccc"
+ },
+ "3,1",
+ {
+ "x": 9.75
+ },
+ "3,10",
+ {
+ "c": "#aaaaaa",
+ "w": 1.75
+ },
+ "3,11"
+ ],
+ [
+ {
+ "y": -0.75,
+ "x": 17
+ },
+ "3,13"
+ ],
+ [
+ {
+ "y": -0.25,
+ "x": 1,
+ "w": 1.5
+ },
+ "4,0"
+ ],
+ [
+ {
+ "y": -0.75,
+ "x": 16
+ },
+ "4,12",
+ "4,13",
+ "4,14"
+ ],
+ [
+ {
+ "r": 12,
+ "rx": 4.75,
+ "ry": 1.5,
+ "y": -1,
+ "c": "#cccccc"
+ },
+ "0,3",
+ "0,4",
+ "0,5",
+ "0,6"
+ ],
+ [
+ {
+ "x": -0.5
+ },
+ "1,2",
+ "1,3",
+ "1,4",
+ "1,5"
+ ],
+ [
+ {
+ "x": -0.25
+ },
+ "2,2",
+ "2,3",
+ "2,4",
+ "2,5"
+ ],
+ [
+ {
+ "x": 0.25
+ },
+ "3,2",
+ "3,3",
+ "3,4",
+ "3,5"
+ ],
+ [
+ {
+ "x": 0.25,
+ "c": "#aaaaaa",
+ "w": 1.5
+ },
+ "4,2",
+ {
+ "c": "#cccccc",
+ "w": 2
+ },
+ "4,4",
+ {
+ "c": "#aaaaaa"
+ },
+ "4,5"
+ ],
+ [
+ {
+ "r": -12,
+ "rx": 13.5,
+ "y": -1,
+ "x": -4.25,
+ "c": "#cccccc"
+ },
+ "0,7",
+ "0,8",
+ "0,9",
+ "0,10"
+ ],
+ [
+ {
+ "x": -4.75
+ },
+ "1,6",
+ "1,7",
+ "1,8",
+ "1,9",
+ "1,10"
+ ],
+ [
+ {
+ "x": -4.5
+ },
+ "2,6",
+ "2,7",
+ "2,8",
+ "2,9"
+ ],
+ [
+ {
+ "y": 1,
+ "x": -4.75,
+ "w": 2.75
+ },
+ "4,7",
+ {
+ "c": "#aaaaaa",
+ "w": 1.5
+ },
+ "4,9"
+ ],
+ [
+ {
+ "ry": 1.75,
+ "y": 1.75,
+ "x": -4.25,
+ "c": "#cccccc"
+ },
+ "3,6",
+ "3,7",
+ "3,8",
+ "3,9"
+ ]
+ ]
+ }
+ }
diff --git a/keyboards/cookpad_pad/config.h b/keyboards/cookpad_pad/config.h
new file mode 100644
index 00000000000..fd90d387118
--- /dev/null
+++ b/keyboards/cookpad_pad/config.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#ifdef WS2812_DI_PIN
+ #define RGBLED_NUM 3
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #define RGBLIGHT_VAL_STEP 8
+ #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+ #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
+/*== or choose animations ==*/
+ #define RGBLIGHT_EFFECT_BREATHING
+ #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+ #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+ #define RGBLIGHT_EFFECT_SNAKE
+ #define RGBLIGHT_EFFECT_KNIGHT
+ #define RGBLIGHT_EFFECT_CHRISTMAS
+ #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+ #define RGBLIGHT_EFFECT_RGB_TEST
+ #define RGBLIGHT_EFFECT_ALTERNATING
+#endif
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/cookpad_pad.c b/keyboards/cookpad_pad/cookpad_pad.c
new file mode 100644
index 00000000000..2c9de114e11
--- /dev/null
+++ b/keyboards/cookpad_pad/cookpad_pad.c
@@ -0,0 +1,25 @@
+#ifndef COOKPAD_PAD_H
+#define COOKPAD_PAD_H
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K01, K02, K03, \
+ K11, K12, K13 \
+) \
+{ \
+ { K01, K02, K03 }, \
+ { K11, K12, K13 }, \
+}
+
+
+#define LAYOUT_kc( \
+ A1, A2, A3, \
+ B1, B2, B3 \
+ ) \
+ LAYOUT( \
+ KC_##A1, KC_##A2, KC_##A3, \
+ KC_##B1, KC_##B2, KC_##B3 \
+ )
+
+#endif
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/cookpad_pad.h b/keyboards/cookpad_pad/cookpad_pad.h
new file mode 100644
index 00000000000..2c9de114e11
--- /dev/null
+++ b/keyboards/cookpad_pad/cookpad_pad.h
@@ -0,0 +1,25 @@
+#ifndef COOKPAD_PAD_H
+#define COOKPAD_PAD_H
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K01, K02, K03, \
+ K11, K12, K13 \
+) \
+{ \
+ { K01, K02, K03 }, \
+ { K11, K12, K13 }, \
+}
+
+
+#define LAYOUT_kc( \
+ A1, A2, A3, \
+ B1, B2, B3 \
+ ) \
+ LAYOUT( \
+ KC_##A1, KC_##A2, KC_##A3, \
+ KC_##B1, KC_##B2, KC_##B3 \
+ )
+
+#endif
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/info.json b/keyboards/cookpad_pad/info.json
new file mode 100644
index 00000000000..8d19206e809
--- /dev/null
+++ b/keyboards/cookpad_pad/info.json
@@ -0,0 +1,61 @@
+{
+ "keyboard_name": "Cookpad Pad",
+ "manufacturer": "Cookpad",
+ "lighting": "none",
+ "matrix": {
+ "rows": 2,
+ "cols": 3
+ },
+ "macros": [
+ [
+ {
+ "action": "tap",
+ "keycodes": ["KC_LCTL", "KC_LGUI", "KC_LEFT"]
+ }
+ ],
+ [
+ {
+ "action": "tap",
+ "keycodes": ["KC_LCTL", "KC_LGUI", "KC_RIGHT"]
+ }
+ ]
+ ],
+ "layout": "LAYOUT",
+ "layers": [
+ [
+ "LCTL(KC_C)" , "LCTL(KC_V)" , "SGUI(KC_S)",
+ "QK_MACRO_0" , "QK_MACRO_1" , "TG(1)"
+ ],
+ [
+ "KC_MPRV", "KC_MPLY", "KC_MNXT",
+ "KC_VOLD", "KC_VOLU" , "TG(0)"
+ ]
+ ],
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [1, 0], "x": 1, "y": 1},
+ {"matrix": [1, 0], "x": 2, "y": 1}
+ ]
+ }
+ },
+ "matrix_pins": {
+ "cols": ["F6", "F5", "F4"],
+ "rows": ["F7", "B1"]
+ },
+ "ws2812": {
+ "pin": "D3"
+ },
+ "diode_direction": "COL2ROW",
+ "processor": "atmega32u4",
+ "bootloader": "caterina",
+ "usb": {
+ "vid": "0xFEED",
+ "pid": "0x0000",
+ "device_version": "0.0.1"
+ }
+}
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/keymaps/default/config.h b/keyboards/cookpad_pad/keymaps/default/config.h
new file mode 100644
index 00000000000..661eec1444c
--- /dev/null
+++ b/keyboards/cookpad_pad/keymaps/default/config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+// place overrides here
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/keymaps/default/keymap.c b/keyboards/cookpad_pad/keymaps/default/keymap.c
new file mode 100644
index 00000000000..51502091d28
--- /dev/null
+++ b/keyboards/cookpad_pad/keymaps/default/keymap.c
@@ -0,0 +1,34 @@
+#include "cookpad_pad.h"
+
+#define _BASE 0
+#define _FN1 1
+
+#define KC_ KC_TRANSPARENT
+#define KC_DFN1 LT(_FN1, KC_D)
+
+#define KC_RTOG RGB_TOG
+#define KC_RMOF RGB_MODE_FORWARD
+#define KC_RMOR RGB_MODE_REVERSE
+#define KC_RHUI RGB_HUI
+#define KC_RHUD RGB_HUD
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT_kc(
+ // |----|----|----|
+ C , O , K ,
+ // |----|----|----|
+ P , A ,DFN1
+ // |----|----|----|
+ ),
+
+ [_FN1] = LAYOUT_kc(
+ // |----|----|----|
+ RMOF,RHUI,RTOG,
+ // |----|----|----|
+ RMOR,RHUD,
+ // |----|----|----|
+ )
+
+
+};
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/keymaps/vial/config.h b/keyboards/cookpad_pad/keymaps/vial/config.h
new file mode 100644
index 00000000000..39a69c15be1
--- /dev/null
+++ b/keyboards/cookpad_pad/keymaps/vial/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+// place overrides here
+
+#define VIAL_KEYBOARD_UID {0x95, 0xC5, 0xD9, 0x03, 0x08, 0x5C, 0x63, 0x8B}
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/keymaps/vial/keymap.c b/keyboards/cookpad_pad/keymaps/vial/keymap.c
new file mode 100644
index 00000000000..7a02b40afcd
--- /dev/null
+++ b/keyboards/cookpad_pad/keymaps/vial/keymap.c
@@ -0,0 +1,28 @@
+#include "cookpad_pad.h"
+
+#define _BASE 0
+#define _FN1 1
+
+#define KC_ KC_TRANSPARENT
+#define KC_DFN1 LT(_FN1, KC_D)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT(
+ // |----|----|----|
+ LCTL(KC_C) , LCTL(KC_V) , SGUI(KC_S) ,
+ // |----|----|----|
+ QK_MACRO_0 , QK_MACRO_1 , TG(1)
+ // |----|----|----|
+ ),
+
+ [_FN1] = LAYOUT(
+ // |----|----|----|
+ KC_MPRV, KC_MPLY, KC_MNXT,
+ // |----|----|----|
+ KC_VOLD, KC_VOLU , TG(0)
+ // |----|----|----|
+ )
+
+
+};
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/keymaps/vial/rules.mk b/keyboards/cookpad_pad/keymaps/vial/rules.mk
new file mode 100644
index 00000000000..4af3eddf41f
--- /dev/null
+++ b/keyboards/cookpad_pad/keymaps/vial/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_INSECURE = yes
+LTO_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/keymaps/vial/vial.json b/keyboards/cookpad_pad/keymaps/vial/vial.json
new file mode 100644
index 00000000000..01fc29949bd
--- /dev/null
+++ b/keyboards/cookpad_pad/keymaps/vial/vial.json
@@ -0,0 +1,23 @@
+{
+ "keyboard_name": "Cookpad Pad",
+ "manufacturer": "Cookpad",
+ "lighting": "none",
+ "matrix": {
+ "rows": 2,
+ "cols": 3
+ },
+ "layouts": {
+ "keymap": [
+ [
+ "0,0",
+ "0,1",
+ "0,2"
+ ],
+ [
+ "1,0",
+ "1,1",
+ "1,2"
+ ]
+ ]
+ }
+}
\ No newline at end of file
diff --git a/keyboards/cookpad_pad/rules.mk b/keyboards/cookpad_pad/rules.mk
new file mode 100644
index 00000000000..ab0f8992ba3
--- /dev/null
+++ b/keyboards/cookpad_pad/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+F_CPU = 16000000
+
+# Target architecture
+ARCH = AVR8
+
+# Input clock frequency.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = no # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
\ No newline at end of file
diff --git a/keyboards/crkbd/keymaps/vial/rules.mk b/keyboards/crkbd/keymaps/vial/rules.mk
index a0082d9f233..42d10bd569e 100644
--- a/keyboards/crkbd/keymaps/vial/rules.mk
+++ b/keyboards/crkbd/keymaps/vial/rules.mk
@@ -1,6 +1,7 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
LTO_ENABLE = yes
+VIAL_INSECURE = yes
RGBLIGHT_ENABLE = yes
RGB_MATRIX_ENABLE = no # Can't have RGBLIGHT and RGB_MATRIX at the same time.
diff --git a/keyboards/kbdksp/cacah/cacah.c b/keyboards/kbdksp/cacah/cacah.c
new file mode 100755
index 00000000000..7ee30ac450b
--- /dev/null
+++ b/keyboards/kbdksp/cacah/cacah.c
@@ -0,0 +1,17 @@
+ /* Copyright 2023 sendz
+ *
+ * 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 "cacah.h"
diff --git a/keyboards/kbdksp/cacah/cacah.h b/keyboards/kbdksp/cacah/cacah.h
new file mode 100755
index 00000000000..af37153c945
--- /dev/null
+++ b/keyboards/kbdksp/cacah/cacah.h
@@ -0,0 +1,43 @@
+/* Copyright 2023 sendz
+ *
+ * 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 "quantum.h"
+
+/* This is a shortcut to help you visually see your layout.
+ *
+ * The first section contains all of the arguments representing the physical
+ * layout of the board and position of the keys.
+ *
+ * The second converts the arguments into a two-dimensional array which
+ * represents the switch matrix.
+ */
+
+ #define LAYOUT_ortho(\
+ L00, L01, L02, L03, \
+ L10, L11, L12, L13, \
+ L20, L21, L22, L23, \
+ L30, L31, L32, L33, \
+ L40, L41, L42, L43 \
+ ) \
+ { \
+ { L00, L01, L02, L03}, \
+ { L10, L11, L12, L13}, \
+ { L20, L21, L22, L23}, \
+ { L30, L31, L32, L33}, \
+ { L40, L41, L42, L43} \
+ }
diff --git a/keyboards/kbdksp/cacah/config.h b/keyboards/kbdksp/cacah/config.h
new file mode 100755
index 00000000000..935474494e2
--- /dev/null
+++ b/keyboards/kbdksp/cacah/config.h
@@ -0,0 +1,34 @@
+/* Copyright 2023 sendz
+ *
+ * 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 */
+
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 4
+
+/* Keyboard Matrix Assignments */
+// clang-format off
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
diff --git a/keyboards/kbdksp/cacah/info.json b/keyboards/kbdksp/cacah/info.json
new file mode 100755
index 00000000000..0614bfbddd5
--- /dev/null
+++ b/keyboards/kbdksp/cacah/info.json
@@ -0,0 +1,145 @@
+{
+ "keyboard_name": "Cacah",
+ "url": "",
+ "manufacturer": "Keyboard Kasep",
+ "maintainer": "sendz",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x4341",
+ "vid": "0x7370"
+ },
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": [
+ "GP2",
+ "GP3",
+ "GP4",
+ "GP8",
+ "GP9"
+ ],
+ "cols": [
+ "GP18",
+ "GP19",
+ "GP0",
+ "GP1"
+ ]
+ },
+ "encoder": {
+ "enabled": true,
+ "rotary": [
+ {
+ "pin_a": "GP16",
+ "pin_b": "GP17",
+ "resolution": 4
+ }
+ ]
+ },
+ "layouts": {
+ "LAYOUT_ortho": {
+ "layout": [
+ {
+ "label": "0,0",
+ "x": 0,
+ "y": 0
+ },
+ {
+ "label": "0,1",
+ "x": 1,
+ "y": 0
+ },
+ {
+ "label": "0,2",
+ "x": 2,
+ "y": 0
+ },
+ {
+ "label": "0,3",
+ "x": 3,
+ "y": 0
+ },
+ {
+ "label": "1,0",
+ "x": 0,
+ "y": 1
+ },
+ {
+ "label": "1,1",
+ "x": 1,
+ "y": 1
+ },
+ {
+ "label": "1,2",
+ "x": 2,
+ "y": 1
+ },
+ {
+ "label": "1,1",
+ "x": 3,
+ "y": 1
+ },
+ {
+ "label": "2,0",
+ "x": 0,
+ "y": 2
+ },
+ {
+ "label": "2,1",
+ "x": 1,
+ "y": 2
+ },
+ {
+ "label": "2,2",
+ "x": 2,
+ "y": 2
+ },
+ {
+ "label": "2,3",
+ "x": 3,
+ "y": 2
+ },
+ {
+ "label": "3,0",
+ "x": 0,
+ "y": 3
+ },
+ {
+ "label": "3,1",
+ "x": 1,
+ "y": 3
+ },
+ {
+ "label": "3,2",
+ "x": 2,
+ "y": 3
+ },
+ {
+ "label": "3,1",
+ "x": 3,
+ "y": 3
+ },
+ {
+ "label": "4,0",
+ "x": 0,
+ "y": 4
+ },
+ {
+ "label": "4,1",
+ "x": 1,
+ "y": 4
+ },
+ {
+ "label": "4,2",
+ "x": 2,
+ "y": 4
+ },
+ {
+ "label": "4,3",
+ "x": 3,
+ "y": 4
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/kbdksp/cacah/keymaps/vial/config.h b/keyboards/kbdksp/cacah/keymaps/vial/config.h
new file mode 100755
index 00000000000..1dd58ed76af
--- /dev/null
+++ b/keyboards/kbdksp/cacah/keymaps/vial/config.h
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0xC6, 0xED, 0xDB, 0x0C, 0x58, 0x33, 0x3F, 0x0C}
+
+#define VIAL_ENCODER_DEFAULT { \
+ KC_VOLU, KC_VOLD, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+}
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
diff --git a/keyboards/kbdksp/cacah/keymaps/vial/keymap.c b/keyboards/kbdksp/cacah/keymaps/vial/keymap.c
new file mode 100755
index 00000000000..3bfc2e3e782
--- /dev/null
+++ b/keyboards/kbdksp/cacah/keymaps/vial/keymap.c
@@ -0,0 +1,58 @@
+ /* Copyright 2023 sendz
+ *
+ * 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
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho(
+ LT(1, KC_NUM_LOCK), KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_P4, KC_P5, KC_P6, KC_NUBS,
+ KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_P0, KC_PDOT, KC_PENT
+ ),
+ [1] = LAYOUT_ortho(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, QK_BOOT, _______
+ ),
+ [2] = LAYOUT_ortho(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ ),
+ [3] = LAYOUT_ortho(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ )
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI) },
+ [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) },
+ [3] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
+ // Encoder 1 Encoder 2
+};
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/cacah/keymaps/vial/rules.mk b/keyboards/kbdksp/cacah/keymaps/vial/rules.mk
new file mode 100755
index 00000000000..7e44761b11c
--- /dev/null
+++ b/keyboards/kbdksp/cacah/keymaps/vial/rules.mk
@@ -0,0 +1,5 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_ENCODERS_ENABLE = yes
+VIAL_INSECURE = yes
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/kbdksp/cacah/keymaps/vial/vial.json b/keyboards/kbdksp/cacah/keymaps/vial/vial.json
new file mode 100755
index 00000000000..97db2ede6bf
--- /dev/null
+++ b/keyboards/kbdksp/cacah/keymaps/vial/vial.json
@@ -0,0 +1,76 @@
+{
+ "name": "Cacah",
+ "vendorId": "0x7370",
+ "productId": "0x4341",
+ "lighting": "none",
+ "matrix": {
+ "rows": 5,
+ "cols": 4
+ },
+ "layouts": {
+ "labels": [
+ "2 x 1U +",
+ "2 x 1U Enter",
+ "2 x 1U 0"
+ ],
+ "keymap": [
+ {
+ "name": "Cacah VIAL",
+ "author": "KBDKSP"
+ },
+ [
+ "0,0",
+ "0,1",
+ "0,2",
+ "0,3",
+ {
+ "x": 0.25
+ },
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ "0,1\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ "1,0",
+ "1,1",
+ "1,2",
+ "1,3\n\n\n0,1",
+ {
+ "x": -1,
+ "h": 2
+ },
+ "1,3\n\n\n0,0"
+ ],
+ [
+ "2,0",
+ "2,1",
+ "2,2",
+ "2,3\n\n\n0,1"
+ ],
+ [
+ "3,0",
+ "3,1",
+ "3,2",
+ "3,3\n\n\n1,1",
+ {
+ "x": -1,
+ "h": 2
+ },
+ "3,3\n\n\n1,0"
+ ],
+ [
+ "4,0\n\n\n2,1",
+ {
+ "x": -1,
+ "w": 2
+ },
+ "4,0\n\n\n2,0",
+ {
+ "x": -1
+ },
+ "4,1\n\n\n2,1",
+ "4,2",
+ "4,3\n\n\n1,1"
+ ]
+ ]
+ }
+}
\ No newline at end of file
diff --git a/keyboards/kbdksp/cacah/rules.mk b/keyboards/kbdksp/cacah/rules.mk
new file mode 100755
index 00000000000..d6a5c02ce29
--- /dev/null
+++ b/keyboards/kbdksp/cacah/rules.mk
@@ -0,0 +1,17 @@
+# MCU name
+MCU = RP2040
+# Bootloader selection
+BOOTLOADER = rp2040
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = yes # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+# AUDIO_DRIVER = pwm_software
diff --git a/keyboards/kbdksp/cengek/keyboard.json b/keyboards/kbdksp/cengek/keyboard.json
new file mode 100644
index 00000000000..4ce0e3dcce5
--- /dev/null
+++ b/keyboards/kbdksp/cengek/keyboard.json
@@ -0,0 +1,51 @@
+{
+ "manufacturer": "KBDKSPa",
+ "keyboard_name": "Cengek",
+ "maintainer": "Sendy Aditya Suryana",
+ "bootloader": "rp2040",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "oled": true,
+ "encoder": true
+ },
+ "encoder": {
+ "enabled": true,
+ "rotary": [
+ {"pin_a": "GP2", "pin_b": "GP3"},
+ {"pin_a": "GP4", "pin_b": "GP5"},
+ {"pin_a": "GP12", "pin_b": "GP13"}
+ ],
+ "resolution": 1
+ },
+ "matrix_pins": {
+ "direct": [
+ ["GP27", "GP28", "GP29"],
+ ["GP14", "GP15", "GP26"]
+ ]
+ },
+ "processor": "RP2040",
+ "url": "",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x636E",
+ "vid": "0x7370"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1, "y": 1},
+ {"matrix": [1, 2], "x": 2, "y": 1}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/kbdksp/cengek/keymaps/default/keymap.c b/keyboards/kbdksp/cengek/keymaps/default/keymap.c
new file mode 100644
index 00000000000..27fbe946023
--- /dev/null
+++ b/keyboards/kbdksp/cengek/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┐
+ * │ 4 │ 5 │ 6 │
+ * ├───┼───┼───┤
+ * │ 1 │ 2 │ 3 │
+ * └───┴───┴───┘
+ */
+ [0] = LAYOUT(
+ KC_P4, KC_P5, KC_P6,
+ KC_P1, KC_P2, KC_P3
+ )
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][3] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_WH_D, KC_WH_U), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}
+}
+#endif
+
+#ifdef OLED_ENABLE
+bool oled_task_user(void) {
+ oled_on();
+
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR(" KBD "), false);
+ oled_write_P(PSTR(" KSP "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ oled_write_P(PSTR(" CEN "), false);
+ oled_write_P(PSTR(" GEK "), false);
+ return false;
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/cengek/keymaps/vial/config.h b/keyboards/kbdksp/cengek/keymaps/vial/config.h
new file mode 100644
index 00000000000..5cf6688b9d1
--- /dev/null
+++ b/keyboards/kbdksp/cengek/keymaps/vial/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0x95, 0xE2, 0x8D, 0xCB, 0x66, 0x3E, 0x84, 0x62}
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
\ No newline at end of file
diff --git a/keyboards/kbdksp/cengek/keymaps/vial/keymap.c b/keyboards/kbdksp/cengek/keymaps/vial/keymap.c
new file mode 100644
index 00000000000..505a18924d2
--- /dev/null
+++ b/keyboards/kbdksp/cengek/keymaps/vial/keymap.c
@@ -0,0 +1,44 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┐
+ * │ 4 │ 5 │ 6 │
+ * ├───┼───┼───┤
+ * │ 1 │ 2 │ 3 │
+ * └───┴───┴───┘
+ */
+ [0] = LAYOUT(
+ KC_P4, KC_P5, KC_P6,
+ KC_P1, KC_P2, KC_P3
+ )
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [0] = {
+ ENCODER_CCW_CW(KC_VOLD, KC_VOLU),
+ ENCODER_CCW_CW(KC_WH_D, KC_WH_U),
+ ENCODER_CCW_CW(KC_TRNS, KC_TRNS)
+ },
+};
+#endif
+
+#ifdef OLED_ENABLE
+bool oled_task_user(void) {
+ oled_on();
+
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR(" KBD "), false);
+ oled_write_P(PSTR(" KSP "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ oled_write_P(PSTR(" CEN "), false);
+ oled_write_P(PSTR(" GEK "), false);
+ return false;
+};
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/cengek/keymaps/vial/rules.mk b/keyboards/kbdksp/cengek/keymaps/vial/rules.mk
new file mode 100644
index 00000000000..c336d4f6e77
--- /dev/null
+++ b/keyboards/kbdksp/cengek/keymaps/vial/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_INSECURE = yes
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/kbdksp/cengek/keymaps/vial/vial.json b/keyboards/kbdksp/cengek/keymaps/vial/vial.json
new file mode 100644
index 00000000000..7d4a5cc053c
--- /dev/null
+++ b/keyboards/kbdksp/cengek/keymaps/vial/vial.json
@@ -0,0 +1,53 @@
+{
+ "name": "Cengek",
+ "lighting": "qmk_rgblight",
+ "vendorId": "0x7370",
+ "productId": "0x0287",
+ "matrix": {
+ "rows": 2,
+ "cols": 3
+ },
+ "layouts": {
+ "keymap": [
+ {
+ "name": "Cengek"
+ },
+ [
+ "0,0",
+ "0,1",
+ "0,2"
+ ],
+ [
+ "1,0",
+ "1,1",
+ "1,2"
+ ],
+ [
+ {
+ "w": 0.5
+ },
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "0,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "1,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "1,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "2,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "2,1\n\n\n\n\n\n\n\n\ne"
+ ]
+ ]
+ }
+}
\ No newline at end of file
diff --git a/keyboards/kbdksp/cengek/readme.md b/keyboards/kbdksp/cengek/readme.md
new file mode 100644
index 00000000000..382a10be16b
--- /dev/null
+++ b/keyboards/kbdksp/cengek/readme.md
@@ -0,0 +1,27 @@
+# kbdksp/cengek
+
+
+
+*A short description of the keyboard/project*
+
+* Keyboard Maintainer: [Sendy Aditya Suryana](https://github.com/Sendy Aditya Suryana)
+* Hardware Supported: *The PCBs, controllers supported*
+* Hardware Availability: *Links to where you can find this hardware*
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kbdksp/cengek:default
+
+Flashing example for this keyboard:
+
+ make kbdksp/cengek:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
+* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/kbdksp/cengek/rules.mk b/keyboards/kbdksp/cengek/rules.mk
new file mode 100644
index 00000000000..9a3b7a32800
--- /dev/null
+++ b/keyboards/kbdksp/cengek/rules.mk
@@ -0,0 +1,4 @@
+OLED_DRIVER = ssd1306
+RGBLIGHT_ENABLE = yes
+RGBLIGHT_DRIVER = ws2812
+WS2812_DRIVER = vendor
diff --git a/keyboards/kbdksp/geulis/config.h b/keyboards/kbdksp/geulis/config.h
new file mode 100644
index 00000000000..7bd908b4dae
--- /dev/null
+++ b/keyboards/kbdksp/geulis/config.h
@@ -0,0 +1,78 @@
+ /* Copyright 2022 sendz
+ *
+ * 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 "config_common.h"
+
+#define OLED_DISPLAY_128X32
+#define I2C1_SCL_PIN GP3
+#define I2C1_SDA_PIN GP2
+#define I2C_DRIVER I2CD1
+#define OLED_BRIGHTNESS 128
+#define OLED_FONT_H "keyboards/kbdksp/iteung/fonts/glcdfont.c"
+// #define MASTER_RIGHT
+
+/* key matrix size */
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 6
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN GP0
+#define SERIAL_USART_RX_PIN GP1
+
+#define VBUS_SENSE GP12
+// #define MASTER_LEFT
+
+#include "config_rp2040.h"
+
+#define OLED_TIMEOUT 0
+#define CUSTOM_OLED_TIMEOUT 10000
+
+
+#ifdef RGBLIGHT_ENABLE
+ #define WS2812_DI_PIN GP13
+ #define WS2812_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the WS2812 implementation uses the PIO0 peripheral
+
+ #define RGBLIGHT_EFFECT_BREATHING
+ #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+ #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+ #define RGBLIGHT_EFFECT_SNAKE
+ #define RGBLIGHT_EFFECT_KNIGHT
+ #define RGBLIGHT_EFFECT_CHRISTMAS
+ #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+ #define RGBLIGHT_EFFECT_RGB_TEST
+ #define RGBLIGHT_EFFECT_ALTERNATING
+ #define RGBLIGHT_EFFECT_TWINKLE
+
+ #define RGBLED_NUM 16
+
+ #define RGBLED_SPLIT { 8, 8 }
+
+ #define RGBLIGHT_LIMIT_VAL 120
+ #define RGBLIGHT_HUE_STEP 10
+ #define RGBLIGHT_SAT_STEP 17
+ #define RGBLIGHT_VAL_STEP 17
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulis/config_rp2040.h b/keyboards/kbdksp/geulis/config_rp2040.h
new file mode 100644
index 00000000000..4ada22afd4e
--- /dev/null
+++ b/keyboards/kbdksp/geulis/config_rp2040.h
@@ -0,0 +1,75 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* ---------------------------
+ * RP2040 OLED Configuration
+ * ---------------------------
+ */
+#define I2C1_CLOCK_SPEED 400000
+#define OLED_UPDATE_INTERVAL 1
+#define OLED_I2C_TIMEOUT 1
+
+/* ---------------------------
+ * RP2040 Split Configuration
+ * ---------------------------
+ */
+#define SPLIT_WPM_ENABLE
+
+/* ---------------------------
+ * RP2040 Debounce
+ * ---------------------------
+ */
+#undef DEBOUNCE
+#define DEBOUNCE 1
+
+/* ---------------------------
+ * RP2040 RGB Configuration
+ * ---------------------------
+ */
+#ifdef RGB_MATRIX_ENABLE
+ #define ENABLE_RGB_MATRIX_ALPHAS_MODS
+ #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+ #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+ #define ENABLE_RGB_MATRIX_BREATHING
+ #define ENABLE_RGB_MATRIX_BAND_SAT
+ #define ENABLE_RGB_MATRIX_BAND_VAL
+ #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+ #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+ #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+ #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+ #define ENABLE_RGB_MATRIX_CYCLE_ALL
+ #define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+ #define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+ #define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+ #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+ #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+ #define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+ #define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+ #define ENABLE_RGB_MATRIX_DUAL_BEACON
+ #define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+ #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+ #define ENABLE_RGB_MATRIX_RAINDROPS
+ #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+ #define ENABLE_RGB_MATRIX_HUE_BREATHING
+ #define ENABLE_RGB_MATRIX_HUE_PENDULUM
+ #define ENABLE_RGB_MATRIX_HUE_WAVE
+ #define ENABLE_RGB_MATRIX_PIXEL_RAIN
+ #define ENABLE_RGB_MATRIX_PIXEL_FLOW
+ #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+ #define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+ #define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+ #define ENABLE_RGB_MATRIX_SPLASH
+ #define ENABLE_RGB_MATRIX_MULTISPLASH
+ #define ENABLE_RGB_MATRIX_SOLID_SPLASH
+ #define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulis/fonts/glcdfont.c b/keyboards/kbdksp/geulis/fonts/glcdfont.c
new file mode 100755
index 00000000000..fd84399afb5
--- /dev/null
+++ b/keyboards/kbdksp/geulis/fonts/glcdfont.c
@@ -0,0 +1,244 @@
+ /* Copyright 2020 sendyyeah
+ *
+ * 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 "progmem.h"
+
+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, 0x66, 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, 0x5E, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+ 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x26, 0x16, 0x08, 0x34, 0x32, 0x00,
+ 0x36, 0x4A, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x3C, 0x42, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x3C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0xA0, 0x60, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x00, 0x44, 0x7E, 0x40, 0x00, 0x00,
+ 0x64, 0x52, 0x52, 0x52, 0x4C, 0x00,
+ 0x22, 0x42, 0x4A, 0x4A, 0x36, 0x00,
+ 0x38, 0x24, 0x22, 0x7E, 0x20, 0x00,
+ 0x2E, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x3C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x62, 0x1A, 0x06, 0x00,
+ 0x34, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x4C, 0x52, 0x52, 0x52, 0x3C, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x00, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x00, 0x22, 0x14, 0x08, 0x00,
+ 0x00, 0x04, 0x52, 0x0A, 0x04, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x12, 0x12, 0x7C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x42, 0x00,
+ 0x7E, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x4A, 0x00,
+ 0x7E, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
+ 0x3C, 0x42, 0x42, 0x52, 0x72, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x7E, 0x00,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x42, 0x3E, 0x00, 0x00,
+ 0x7E, 0x10, 0x08, 0x14, 0x62, 0x00,
+ 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7E, 0x04, 0x08, 0x04, 0x7E, 0x00,
+ 0x7E, 0x04, 0x08, 0x10, 0x7E, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x12, 0x12, 0x12, 0x0C, 0x00,
+ 0x3C, 0x42, 0x52, 0x22, 0x5C, 0x00,
+ 0x7C, 0x12, 0x12, 0x32, 0x5E, 0x00,
+ 0x4C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x7E, 0x02, 0x02, 0x00,
+ 0x3E, 0x40, 0x40, 0x40, 0x3E, 0x00,
+ 0x1E, 0x20, 0x40, 0x20, 0x1E, 0x00,
+ 0x3E, 0x40, 0x38, 0x40, 0x3E, 0x00,
+ 0x62, 0x14, 0x08, 0x14, 0x62, 0x00,
+ 0x06, 0x08, 0x70, 0x08, 0x06, 0x00,
+ 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00,
+ 0x00, 0x7E, 0x42, 0x42, 0x00, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x00, 0x42, 0x42, 0x7E, 0x00,
+ 0x08, 0x04, 0x02, 0x04, 0x08, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x00, 0x06, 0x0A, 0x00, 0x00,
+ 0x60, 0x54, 0x54, 0x54, 0x7C, 0x00,
+ 0x7E, 0x48, 0x48, 0x48, 0x30, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x48, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x7E, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x58, 0x00,
+ 0x00, 0x08, 0x7C, 0x0A, 0x00, 0x00,
+ 0x98, 0xA4, 0xA4, 0xA4, 0x78, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x70, 0x00,
+ 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3A, 0x00, 0x00,
+ 0x7E, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x7E, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x04, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0xFC, 0x24, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x24, 0xFC, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x00, 0x04, 0x7E, 0x44, 0x00, 0x00,
+ 0x3C, 0x40, 0x40, 0x40, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x5C, 0xA0, 0xA0, 0xA0, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x7E, 0xFF, 0x81, 0xBF, 0xBF, 0xBF,
+ 0xBF, 0xF9, 0xF7, 0x8F, 0xF7, 0xF9,
+ 0xFF, 0x83, 0xED, 0xED, 0xCD, 0xA3,
+ 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0x81, 0xB5, 0xB5, 0xB5, 0xCB,
+ 0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xC3,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFE, 0x01, 0x61, 0xF1, 0xF9, 0xFD,
+ 0x61, 0xF1, 0xF9, 0xFD, 0x01, 0xFE,
+ 0xFE, 0x01, 0xFD, 0xF9, 0xF1, 0x61,
+ 0xFD, 0xF9, 0xF1, 0x61, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0x01, 0x61,
+ 0xF1, 0xF9, 0xFD, 0x01, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0xF9, 0xF1,
+ 0x61, 0x01, 0xFD, 0x01, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF0, 0x08, 0x04, 0xC4, 0x24, 0x24,
+ 0x24, 0xC4, 0x04, 0x08, 0xF0, 0x00,
+ 0xF0, 0xF8, 0xFC, 0x3C, 0xDC, 0xDC,
+ 0xDC, 0x3C, 0xFC, 0xF8, 0xF0, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x08, 0x09, 0x0B,
+ 0x08, 0x08, 0x09, 0x0B, 0x08, 0x07,
+ 0x07, 0x08, 0x0B, 0x09, 0x08, 0x08,
+ 0x0B, 0x09, 0x08, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x08, 0x08,
+ 0x08, 0x09, 0x0B, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x09, 0x08,
+ 0x08, 0x08, 0x0B, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x10, 0x13, 0x11, 0x11,
+ 0x11, 0x13, 0x10, 0x08, 0x07, 0x00,
+ 0x07, 0x0F, 0x1F, 0x1C, 0x1E, 0x1E,
+ 0x1E, 0x1C, 0x1F, 0x0F, 0x07, 0x00,
+ 0xFE, 0x01, 0xF1, 0xF9, 0xFD, 0xFD,
+ 0x05, 0x05, 0x09, 0xF1, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x06, 0x3F,
+ 0x3F, 0x06, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x18, 0x3F,
+ 0x3F, 0x18, 0x08, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x09, 0x0B, 0x0B,
+ 0x0A, 0x0A, 0x09, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/keyboards/kbdksp/geulis/geulis.c b/keyboards/kbdksp/geulis/geulis.c
new file mode 100644
index 00000000000..9d93fd3e558
--- /dev/null
+++ b/keyboards/kbdksp/geulis/geulis.c
@@ -0,0 +1,18 @@
+ /* Copyright 2022 sendz
+ *
+ * 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 "geulis.h"
+
diff --git a/keyboards/kbdksp/geulis/geulis.h b/keyboards/kbdksp/geulis/geulis.h
new file mode 100644
index 00000000000..04718715562
--- /dev/null
+++ b/keyboards/kbdksp/geulis/geulis.h
@@ -0,0 +1,21 @@
+#pragma once
+#include "quantum.h"
+
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
+ L10, L11, L12, L13, L14, L15, L35, R30, R10, R11, R12, R13, R14, R15, \
+ L20, L21, L22, L23, L24, L25, L44, L45, R41, R40, R20, R21, R22, R23, R24, R25, \
+ L30, L31, L32, L33, L34, R31, R32, R33, R34, R35 \
+ ) \
+ { \
+ { 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, KC_NO, KC_NO, KC_NO, 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, KC_NO, KC_NO, KC_NO, R41, R40 } \
+ }
diff --git a/keyboards/kbdksp/geulis/halconf.h b/keyboards/kbdksp/geulis/halconf.h
new file mode 100644
index 00000000000..62d2b694c51
--- /dev/null
+++ b/keyboards/kbdksp/geulis/halconf.h
@@ -0,0 +1,8 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next
diff --git a/keyboards/kbdksp/geulis/info.json b/keyboards/kbdksp/geulis/info.json
new file mode 100644
index 00000000000..15364db0bc3
--- /dev/null
+++ b/keyboards/kbdksp/geulis/info.json
@@ -0,0 +1,39 @@
+{
+ "keyboard_name": "Iteung",
+ "manufacturer": "KBDKSP",
+ "url": "tokopedia.com/kbdksp",
+ "maintainer": "Sendy ",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x7370",
+ "pid": "0x0287",
+ "device_version": "0.0.1"
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": ["GP28", "GP15", "GP26", "GP27", "GP14"],
+ "cols": ["GP9", "GP8", "GP7", "GP4", "GP5", "GP6"]
+ },
+ "encoder": {
+ "enabled": true,
+ "rotary": [
+ {"pin_a": "GP10", "pin_b": "GP11", "resolution": 2}
+ ]
+ },
+ "split": {
+ "enabled": true,
+ "encoder": {
+ "right": {
+ "rotary": [
+ {"pin_a": "GP10", "pin_b": "GP11", "resolution": 2}
+ ]
+ }
+ }
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [{"label":"0,3", "x":3, "y":1.2}, {"label":"4,3", "x":11, "y":1.2}, {"label":"4,4", "x":10, "y":1.25}, {"label":"0,2", "x":2, "y":1.3499999999999999}, {"label":"0,4", "x":4, "y":1.3499999999999999}, {"label":"4,2", "x":12, "y":1.3499999999999999}, {"label":"0,0", "x":0, "y":1.5}, {"label":"0,1", "x":1, "y":1.5}, {"label":"0,5", "x":5, "y":1.5}, {"label":"4,5", "x":9, "y":1.5}, {"label":"4,1", "x":13, "y":1.5}, {"label":"4,0", "x":14, "y":1.5}, {"label":"1,3", "x":3, "y":2.2}, {"label":"5,3", "x":11, "y":2.2}, {"label":"3,5", "x":6.25, "y":2.25}, {"label":"7,5", "x":7.75, "y":2.25}, {"label":"1,2", "x":2, "y":2.35}, {"label":"1,4", "x":4, "y":2.35}, {"label":"5,4", "x":10, "y":2.35}, {"label":"5,2", "x":12, "y":2.35}, {"label":"1,0", "x":0, "y":2.5}, {"label":"1,1", "x":1, "y":2.5}, {"label":"1,5", "x":5, "y":2.5}, {"label":"5,5", "x":9, "y":2.5}, {"label":"5,1", "x":13, "y":2.5}, {"label":"5,0", "x":14, "y":2.5}, {"label":"2,3", "x":3, "y":3.2}, {"label":"6,3", "x":11, "y":3.2}, {"label":"4,4", "x":6.25, "y":3.25, "w":0.5}, {"label":"4,5", "x":6.75, "y":3.25, "w":0.5}, {"label":"8,5", "x":7.75, "y":3.25, "w":0.5}, {"label":"8,4", "x":8.25, "y":3.25, "w":0.5}, {"label":"2,2", "x":2, "y":3.35}, {"label":"2,4", "x":4, "y":3.35}, {"label":"6,4", "x":10, "y":3.35}, {"label":"6,2", "x":12, "y":3.35}, {"label":"2,0", "x":0, "y":3.5}, {"label":"2,1", "x":1, "y":3.5}, {"label":"2,5", "x":5, "y":3.5}, {"label":"6,5", "x":9, "y":3.5}, {"label":"6,1", "x":13, "y":3.5}, {"label":"6,0", "x":14, "y":3.5}, {"label":"3,1", "x":2.75, "y":4.3500000000000005}, {"label":"3,2", "x":3.75, "y":4.3500000000000005}, {"label":"7,2", "x":10.25, "y":4.3500000000000005}, {"label":"3,0", "x":1.75, "y":4.5}, {"label":"7,1", "x":11, "y":9.85}, {"label":"7,0", "x":11.75, "y":15.35}, {"label":"3,3", "x":0, "y":16.35}, {"label":"3,4", "x":0.1, "y":17.1, "h":1.5}, {"label":"7,4", "x":-1.1, "y":17.85, "h":1.5}, {"label":"7,3", "x":-1.0, "y":18.85}]
+ }
+ }
+}
diff --git a/keyboards/kbdksp/geulis/jpe230.h b/keyboards/kbdksp/geulis/jpe230.h
new file mode 100644
index 00000000000..2792f6a3796
--- /dev/null
+++ b/keyboards/kbdksp/geulis/jpe230.h
@@ -0,0 +1,20 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+bool shift_pressed;
+bool alt_pressed;
+bool ctrl_pressed;
+bool gui_pressed;
+
+/* ---------------------------
+ * Custom OLED Fncs Prototypes
+ * ---------------------------
+ */
+void render_slave_oled(void);
+void render_master_oled(void);
+void oled_timer_reset(void);
+void set_keylog(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/kbdksp/geulis/keymaps/vial/config.h b/keyboards/kbdksp/geulis/keymaps/vial/config.h
new file mode 100644
index 00000000000..338d68ac31b
--- /dev/null
+++ b/keyboards/kbdksp/geulis/keymaps/vial/config.h
@@ -0,0 +1,71 @@
+/* Copyright 2023 KBDKSP
+ *
+ * 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 .
+ */
+
+// clang-format off
+
+#pragma once
+
+// Vial Support
+#define VIAL_KEYBOARD_UID {0xEF, 0xC8, 0x32, 0x24, 0xED, 0x6A, 0x99, 0xC3}
+
+#define VIAL_ENCODER_DEFAULT { \
+ KC_VOLU, KC_VOLD, \
+ KC_PGUP, KC_PGDN, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS \
+}
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
+
+/* ---------------------------
+ * Common Spit Configuration
+ * ---------------------------
+ */
+#define SPLIT_OLED_ENABLE
+
+/* ---------------------------
+ * Common Bootmagic Lite
+ * ---------------------------
+ */
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
+
+/* ---------------------------
+ * Common RGB Configuration
+ * ---------------------------
+ */
+#ifdef RGB_MATRIX_ENABLE
+ #define RGB_DISABLE_WHEN_USB_SUSPENDED
+ #define RGB_DISABLE_TIMEOUT CUSTOM_OLED_TIMEOUT
+ #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 128
+ #define RGB_MATRIX_DEFAULT_HUE 215
+ #define RGB_MATRIX_DEFAULT_SAT 255
+ #define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
+#endif
+
+/* ---------------------------
+ * Common other Configuration
+ * ---------------------------
+ */
+#define ENABLE_COMPILE_KEYCODE
+
+
+#define VIAL_UNLOCK_COMBO_ROWS { 0, 0 }
+#define VIAL_UNLOCK_COMBO_COLS { 0, 3 }
diff --git a/keyboards/kbdksp/geulis/keymaps/vial/keymap.c b/keyboards/kbdksp/geulis/keymaps/vial/keymap.c
new file mode 100644
index 00000000000..786db493085
--- /dev/null
+++ b/keyboards/kbdksp/geulis/keymaps/vial/keymap.c
@@ -0,0 +1,113 @@
+/* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ * Modification for Vial support by Drew Petersen
+ *
+ * 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 .
+ */
+
+// clang-format off
+
+#include
+char wpm_str[10];
+#include QMK_KEYBOARD_H
+
+// Default keymap. This can be changed in Vial. Use oled.c to change beavior that Vial cannot change.
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY WINDOWS
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[0] = LAYOUT(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_MUTE, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL, MO(1), KC_SPC, KC_ENT, MO(2), KC_MINS, KC_EQL, KC_RGUI
+),
+/* LOWER
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[1] = LAYOUT(
+ KC_GRV, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, _______, _______,
+ _______, _______, RGB_TOG, RGB_MOD, RGB_VAI, _______, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______,
+ KC_CAPS, _______, _______, RGB_RMOD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/* RAISE
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[2] = LAYOUT(
+ _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, _______, KC_UP, _______, _______, KC_BSPC,
+ _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
+ _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/*
+ * COLEMAK
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[3] = LAYOUT(
+ KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_MUTE, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI, KC_LALT, KC_LCTL, KC_TRNS, KC_ENT, KC_SPC, KC_TRNS, KC_RCTL, KC_RALT, KC_RGUI
+),
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_WH_D, KC_WH_U) },
+ [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+};
+#endif
diff --git a/keyboards/kbdksp/geulis/keymaps/vial/rules.mk b/keyboards/kbdksp/geulis/keymaps/vial/rules.mk
new file mode 100644
index 00000000000..4cc00fb29f6
--- /dev/null
+++ b/keyboards/kbdksp/geulis/keymaps/vial/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+# VIAL_INSECURE = yes
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/kbdksp/geulis/keymaps/vial/vial.json b/keyboards/kbdksp/geulis/keymaps/vial/vial.json
new file mode 100644
index 00000000000..6314b01c679
--- /dev/null
+++ b/keyboards/kbdksp/geulis/keymaps/vial/vial.json
@@ -0,0 +1,391 @@
+{
+ "name": "Iteung",
+ "vendorId": "0x7370",
+ "productId": "0x0287",
+ "lighting": "qmk_rgblight",
+ "matrix": { "rows": 10, "cols": 6 },
+ "layouts": {
+ "keymap": [
+ [
+ {
+ "y": 1.2,
+ "x": 3,
+ "p": "CHICKLET",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "0,3",
+ {
+ "x": 7
+ },
+ "4,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25,
+ "f": 3,
+ "w": 0.5
+ },
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "0,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.5,
+ "w": 0.5
+ },
+ "1,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "1,0\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "y": -0.9999999999999998,
+ "x": 10,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "4,4"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2
+ },
+ "0,2",
+ {
+ "x": 1
+ },
+ "0,4",
+ {
+ "x": 7
+ },
+ "4,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa"
+ },
+ "0,0",
+ {
+ "c": "#cccccc"
+ },
+ "0,1",
+ {
+ "x": 3
+ },
+ "0,5",
+ {
+ "a": 7,
+ "f": 6,
+ "w": 3,
+ "h": 2.75,
+ "d": true
+ },
+ "",
+ {
+ "a": 4,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "4,5",
+ {
+ "x": 3
+ },
+ "4,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "4,0"
+ ],
+ [
+ {
+ "y": -0.2999999999999998,
+ "x": 3,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "1,3",
+ {
+ "x": 7
+ },
+ "5,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25
+ },
+ "3,5",
+ {
+ "x": 0.5
+ },
+ "7,5"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2
+ },
+ "1,2",
+ {
+ "x": 1,
+ "n": true
+ },
+ "1,4",
+ {
+ "x": 5,
+ "n": true
+ },
+ "5,4",
+ {
+ "x": 1
+ },
+ "5,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "1,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "1,1",
+ {
+ "x": 3
+ },
+ "1,5",
+ {
+ "x": 3
+ },
+ "5,5",
+ {
+ "x": 3
+ },
+ "5,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "5,0"
+ ],
+ [
+ {
+ "y": -0.2999999999999998,
+ "x": 3,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,3",
+ {
+ "x": 7
+ },
+ "6,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25,
+ "f": 3,
+ "w": 0.5
+ },
+ "4,4",
+ {
+ "w": 0.5
+ },
+ "4,5",
+ {
+ "x": 0.5,
+ "w": 0.5
+ },
+ "8,5",
+ {
+ "w": 0.5
+ },
+ "8,4"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,2",
+ {
+ "x": 1
+ },
+ "2,4",
+ {
+ "x": 5
+ },
+ "6,4",
+ {
+ "x": 1
+ },
+ "6,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "2,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,1",
+ {
+ "x": 3
+ },
+ "2,5",
+ {
+ "x": 3
+ },
+ "6,5",
+ {
+ "x": 3
+ },
+ "6,1",
+ {
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "6,0"
+ ],
+ [
+ {
+ "y": -0.15000000000000036,
+ "x": 2.75,
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "3,1",
+ "3,2",
+ {
+ "x": 5.5
+ },
+ "7,2"
+ ],
+ [
+ {
+ "y": -0.8499999999999996,
+ "x": 1.75
+ },
+ "3,0"
+ ],
+ [
+ {
+ "rx": 0.25,
+ "y": 4.35,
+ "x": 11
+ },
+ "7,1"
+ ],
+ [
+ {
+ "rx": 0.5,
+ "y": 4.5,
+ "x": 11.75
+ },
+ "7,0"
+ ],
+ [
+ {
+ "r": 15,
+ "rx": 5,
+ "ry": 4.5,
+ "c": "#777777"
+ },
+ "3,3"
+ ],
+ [
+ {
+ "r": 30,
+ "rx": 6.25,
+ "y": -0.25,
+ "x": 0.09999999999999964,
+ "c": "#aaaaaa",
+ "h": 1.5
+ },
+ "3,4"
+ ],
+ [
+ {
+ "r": -30,
+ "rx": 8.75,
+ "y": -0.25,
+ "x": -1.0999999999999996,
+ "f": 8,
+ "fa": [
+ 1
+ ],
+ "h": 1.5
+ },
+ "7,4"
+ ],
+ [
+ {
+ "r": -15,
+ "rx": 10,
+ "x": -1,
+ "c": "#777777",
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "7,3"
+ ]
+ ]
+ }
+}
diff --git a/keyboards/kbdksp/geulis/mcuconf.h b/keyboards/kbdksp/geulis/mcuconf.h
new file mode 100644
index 00000000000..7548f5b4290
--- /dev/null
+++ b/keyboards/kbdksp/geulis/mcuconf.h
@@ -0,0 +1,11 @@
+// Copyright 2022 Steven Karrmann (@skarrmann)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef RP_I2C_USE_I2C0
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C0 FALSE
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/kbdksp/geulis/oled/oled_handler.c b/keyboards/kbdksp/geulis/oled/oled_handler.c
new file mode 100644
index 00000000000..e2b56e4b9ea
--- /dev/null
+++ b/keyboards/kbdksp/geulis/oled/oled_handler.c
@@ -0,0 +1,42 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#ifdef OLED_ENABLE
+uint8_t logged_row;
+uint8_t logged_col;
+uint32_t oled_timer = 0;
+
+__attribute__ ((weak)) void handle_oled_keypress(uint16_t keycode, keyrecord_t *record) {}
+
+__attribute__ ((weak)) oled_rotation_t rotate_master(oled_rotation_t rotation) {return rotation;}
+__attribute__ ((weak)) oled_rotation_t rotate_slave(oled_rotation_t rotation) {return rotation;}
+
+void oled_timer_reset(void) { oled_timer = timer_read32(); }
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+
+ if (!is_keyboard_master()) {
+ return rotate_slave(rotation);
+ }
+
+ return rotate_master(rotation);
+}
+
+
+void set_keylog(uint16_t keycode, keyrecord_t *record) {
+ logged_row = record->event.key.row;
+ logged_col = record->event.key.col;
+
+ handle_oled_keypress(keycode, record);
+}
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ render_master_oled();
+ } else {
+ render_slave_oled();
+ }
+ return false;
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulis/oled/rp2040/master/oled_master_handler.c b/keyboards/kbdksp/geulis/oled/rp2040/master/oled_master_handler.c
new file mode 100644
index 00000000000..41e76a44e94
--- /dev/null
+++ b/keyboards/kbdksp/geulis/oled/rp2040/master/oled_master_handler.c
@@ -0,0 +1,38 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+
+// static const char PROGMEM ICON_LAYER[] = {0x80, 0x81, 0x82, 0x83, 0};
+
+void render_master_oled(void) {
+ oled_on();
+
+ oled_write_P(PSTR(" KBD "), false);
+ oled_write_P(PSTR(" KSP "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ oled_write_P(PSTR(" ITE "), false);
+ oled_write_P(PSTR(" UNG "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+ oled_write_P(PSTR("_____"), false);
+ oled_write_ln_P(PSTR(""), false);
+ oled_write_ln_P(PSTR(""), false);
+
+ char layer_string[8] = {0};
+ sprintf(layer_string, "LYR %d", get_highest_layer(layer_state));
+ oled_write(layer_string, false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_P(PSTR("CAPS "), led_usb_state.caps_lock);
+ oled_write_P(PSTR("SHIFT"), shift_pressed);
+ oled_write_P(PSTR("CTRL "), ctrl_pressed);
+ oled_write_P(PSTR("GUI "), gui_pressed);
+ oled_write_P(PSTR("ALT "), alt_pressed);
+}
+
+oled_rotation_t rotate_master(oled_rotation_t rotation) {return OLED_ROTATION_270;}
diff --git a/keyboards/kbdksp/geulis/oled/rp2040/slave/oled_slave_handler.c b/keyboards/kbdksp/geulis/oled/rp2040/slave/oled_slave_handler.c
new file mode 100644
index 00000000000..525038bd397
--- /dev/null
+++ b/keyboards/kbdksp/geulis/oled/rp2040/slave/oled_slave_handler.c
@@ -0,0 +1,120 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#include
+
+char wpm_str[10];
+
+// WPM-responsive animation stuff here
+# define IDLE_FRAMES 5
+# define IDLE_SPEED 20 // below this wpm value your animation will idle
+
+// #define PREP_FRAMES 1 // uncomment if >1
+
+# define TAP_FRAMES 2
+# define TAP_SPEED 40 // above this wpm value typing animation to trigger
+
+# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
+// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
+# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
+
+uint32_t anim_timer = 0;
+uint32_t anim_sleep = 0;
+uint8_t current_idle_frame = 0;
+// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1
+uint8_t current_tap_frame = 0;
+
+// Code containing pixel art, contains:
+// 5 idle frames, 1 prep frame, and 2 tap frames
+
+// To make your own pixel art:
+// save a png/jpeg of an 128x32 image (resource: https://www.pixilart.com/draw )
+// follow this guide up to and including "CONVERT YOUR IMAGE" https://docs.splitkb.com/hc/en-us/articles/360013811280-How-do-I-convert-an-image-for-use-on-an-OLED-display-
+// replace numbers in brackets with your own
+// if you start getting errors when compiling make sure you didn't accedentally delete a bracket
+static void render_anim(void) {
+ static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x82, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x34, 0xc4, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x31, 0xc1, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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}};
+ static const char PROGMEM prep[][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00}};
+ static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x98, 0xc0, 0x88, 0x88, 0x8c, 0x9c, 0x1c, 0x1e, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x0f, 0x07, 0x03, 0x03, 0x61, 0xf0, 0xf8, 0xfc, 0x60, 0x01, 0x01, 0x01, 0x3c, 0x78, 0xf8, 0xf0, 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},
+ };
+
+ // assumes 1 frame prep stage
+ void animation_phase(void) {
+ if (get_current_wpm() <= IDLE_SPEED) {
+ current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
+ oled_write_raw_P(idle[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE);
+ }
+ if (get_current_wpm() > IDLE_SPEED && get_current_wpm() < TAP_SPEED) {
+ // oled_write_raw_P(prep[abs((PREP_FRAMES-1)-current_prep_frame)], ANIM_SIZE); // uncomment if IDLE_FRAMES >1
+ oled_write_raw_P(prep[0], ANIM_SIZE); // remove if IDLE_FRAMES >1
+ }
+ if (get_current_wpm() >= TAP_SPEED) {
+ current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES;
+ oled_write_raw_P(tap[abs((TAP_FRAMES - 1) - current_tap_frame)], ANIM_SIZE);
+ }
+ }
+ if (get_current_wpm() != 000) {
+ oled_on(); // not essential but turns on animation OLED with any alpha keypress
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ anim_sleep = timer_read32();
+ } else {
+ if (timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
+ oled_off();
+ } else {
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ }
+ }
+}
+
+static const char PROGMEM KDBKSP[] = {0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0};
+
+void render_slave_oled(void) {
+ oled_on();
+
+ render_anim();
+
+ oled_write_P(KDBKSP, false);
+
+ oled_set_cursor(0, 1);
+ sprintf(wpm_str, "WPM:%03d", get_current_wpm()); // edit the string to change wwhat shows up, edit %03d to change how many digits show up
+ oled_write(wpm_str, false);
+}
+
+oled_rotation_t rotate_slave(oled_rotation_t rotation) {return OLED_ROTATION_0;}
diff --git a/keyboards/kbdksp/geulis/process_record.c b/keyboards/kbdksp/geulis/process_record.c
new file mode 100644
index 00000000000..39ecda05f62
--- /dev/null
+++ b/keyboards/kbdksp/geulis/process_record.c
@@ -0,0 +1,63 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#ifdef OLED_ENABLE
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ oled_timer_reset();
+ set_keylog(keycode, record);
+
+ switch (keycode) {
+ case QK_BOOT:
+ // rgb_matrix_set_color_all(30, 0, 0);
+ // rgb_matrix_driver.flush();
+ oled_off();
+ return true;
+ }
+ }
+ return true;
+}
+
+void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
+switch (keycode) {
+ case KC_LSFT:
+ case KC_RSFT:
+ if (record->event.pressed) {
+ shift_pressed = true;
+ } else {
+ shift_pressed = false;
+ }
+ break;
+ case KC_LALT:
+ case KC_RALT:
+ if (record->event.pressed) {
+ alt_pressed = true;
+ } else {
+ alt_pressed = false;
+ }
+ break;
+ case KC_LCTL:
+ case KC_RCTL:
+ if (record->event.pressed) {
+ ctrl_pressed = true;
+ } else {
+ ctrl_pressed = false;
+ }
+ break;
+ case KC_LGUI:
+ case KC_RGUI:
+ if (record->event.pressed) {
+ gui_pressed = true;
+ } else {
+ gui_pressed = false;
+ }
+ break;
+ default:
+ gui_pressed = false;
+ ctrl_pressed = false;
+ alt_pressed = false;
+ shift_pressed = false;
+ }
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulis/rules.mk b/keyboards/kbdksp/geulis/rules.mk
new file mode 100644
index 00000000000..be8543a9af4
--- /dev/null
+++ b/keyboards/kbdksp/geulis/rules.mk
@@ -0,0 +1,24 @@
+
+MCU = RP2040
+BOARD = GENERIC_RP_RP2040
+# Bootloader selection
+BOOTLOADER = rp2040
+
+# SPLIT_KEYBOARD = yes
+SERIAL_DRIVER = vendor
+EXTRAKEY_ENABLE = yes # Audio control and System control
+MOUSEKEY_ENABLE = yes
+
+OLED_ENABLE = yes
+OLED_DRIVER = ssd1306
+
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+WS2812_DRIVER = vendor
+
+SRC += oled/oled_handler.c process_record.c
+
+DEBUG_MATRIX_SCAN_RATE_ENABLE = yes
+WPM_ENABLE = yes
+CONSOLE_ENABLE = yes
+SRC += oled/rp2040/master/oled_master_handler.c \
+ oled/rp2040/slave/oled_slave_handler.c
diff --git a/keyboards/kbdksp/geulisv/config.h b/keyboards/kbdksp/geulisv/config.h
new file mode 100644
index 00000000000..073b67985fb
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/config.h
@@ -0,0 +1,55 @@
+ /* Copyright 2024 sendz
+ *
+ * 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 "config_rp2040.h"
+
+#pragma once
+#define OLED_DISPLAY_128X32
+#define I2C1_SCL_PIN GP3
+#define I2C1_SDA_PIN GP2
+#define I2C_DRIVER I2CD1
+#define OLED_FONT_H "keyboards/kbdksp/geulisv/fonts/glcdfont.c"
+
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN GP0
+#define SERIAL_USART_RX_PIN GP1
+
+#define VBUS_SENSE GP12
+#define ENCODER_RESOLUTION 1
+
+#ifdef RGBLIGHT_ENABLE
+ #define WS2812_DI_PIN GP13
+ #define WS2812_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the WS2812 implementation uses the PIO0 peripheral
+
+ #define RGBLIGHT_EFFECT_BREATHING
+ #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+ #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+ #define RGBLIGHT_EFFECT_SNAKE
+ #define RGBLIGHT_EFFECT_KNIGHT
+ #define RGBLIGHT_EFFECT_CHRISTMAS
+ #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+ #define RGBLIGHT_EFFECT_RGB_TEST
+ #define RGBLIGHT_EFFECT_ALTERNATING
+ #define RGBLIGHT_EFFECT_TWINKLE
+
+ #define RGBLIGHT_LED_COUNT 16
+
+ #define RGBLED_SPLIT { 8, 8 }
+
+ #define RGBLIGHT_LIMIT_VAL 120
+ #define RGBLIGHT_HUE_STEP 10
+ #define RGBLIGHT_SAT_STEP 17
+ #define RGBLIGHT_VAL_STEP 17
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulisv/config_rp2040.h b/keyboards/kbdksp/geulisv/config_rp2040.h
new file mode 100644
index 00000000000..4ada22afd4e
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/config_rp2040.h
@@ -0,0 +1,75 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* ---------------------------
+ * RP2040 OLED Configuration
+ * ---------------------------
+ */
+#define I2C1_CLOCK_SPEED 400000
+#define OLED_UPDATE_INTERVAL 1
+#define OLED_I2C_TIMEOUT 1
+
+/* ---------------------------
+ * RP2040 Split Configuration
+ * ---------------------------
+ */
+#define SPLIT_WPM_ENABLE
+
+/* ---------------------------
+ * RP2040 Debounce
+ * ---------------------------
+ */
+#undef DEBOUNCE
+#define DEBOUNCE 1
+
+/* ---------------------------
+ * RP2040 RGB Configuration
+ * ---------------------------
+ */
+#ifdef RGB_MATRIX_ENABLE
+ #define ENABLE_RGB_MATRIX_ALPHAS_MODS
+ #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+ #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+ #define ENABLE_RGB_MATRIX_BREATHING
+ #define ENABLE_RGB_MATRIX_BAND_SAT
+ #define ENABLE_RGB_MATRIX_BAND_VAL
+ #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+ #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+ #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+ #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+ #define ENABLE_RGB_MATRIX_CYCLE_ALL
+ #define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+ #define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+ #define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+ #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+ #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+ #define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+ #define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+ #define ENABLE_RGB_MATRIX_DUAL_BEACON
+ #define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+ #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+ #define ENABLE_RGB_MATRIX_RAINDROPS
+ #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+ #define ENABLE_RGB_MATRIX_HUE_BREATHING
+ #define ENABLE_RGB_MATRIX_HUE_PENDULUM
+ #define ENABLE_RGB_MATRIX_HUE_WAVE
+ #define ENABLE_RGB_MATRIX_PIXEL_RAIN
+ #define ENABLE_RGB_MATRIX_PIXEL_FLOW
+ #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+ #define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+ #define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+ #define ENABLE_RGB_MATRIX_SPLASH
+ #define ENABLE_RGB_MATRIX_MULTISPLASH
+ #define ENABLE_RGB_MATRIX_SOLID_SPLASH
+ #define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulisv/fonts/glcdfont.c b/keyboards/kbdksp/geulisv/fonts/glcdfont.c
new file mode 100755
index 00000000000..fd84399afb5
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/fonts/glcdfont.c
@@ -0,0 +1,244 @@
+ /* Copyright 2020 sendyyeah
+ *
+ * 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 "progmem.h"
+
+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, 0x66, 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, 0x5E, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+ 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x26, 0x16, 0x08, 0x34, 0x32, 0x00,
+ 0x36, 0x4A, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x3C, 0x42, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x3C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0xA0, 0x60, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x00, 0x44, 0x7E, 0x40, 0x00, 0x00,
+ 0x64, 0x52, 0x52, 0x52, 0x4C, 0x00,
+ 0x22, 0x42, 0x4A, 0x4A, 0x36, 0x00,
+ 0x38, 0x24, 0x22, 0x7E, 0x20, 0x00,
+ 0x2E, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x3C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x62, 0x1A, 0x06, 0x00,
+ 0x34, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x4C, 0x52, 0x52, 0x52, 0x3C, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x00, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x00, 0x22, 0x14, 0x08, 0x00,
+ 0x00, 0x04, 0x52, 0x0A, 0x04, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x12, 0x12, 0x7C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x42, 0x00,
+ 0x7E, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x4A, 0x00,
+ 0x7E, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
+ 0x3C, 0x42, 0x42, 0x52, 0x72, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x7E, 0x00,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x42, 0x3E, 0x00, 0x00,
+ 0x7E, 0x10, 0x08, 0x14, 0x62, 0x00,
+ 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7E, 0x04, 0x08, 0x04, 0x7E, 0x00,
+ 0x7E, 0x04, 0x08, 0x10, 0x7E, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x12, 0x12, 0x12, 0x0C, 0x00,
+ 0x3C, 0x42, 0x52, 0x22, 0x5C, 0x00,
+ 0x7C, 0x12, 0x12, 0x32, 0x5E, 0x00,
+ 0x4C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x7E, 0x02, 0x02, 0x00,
+ 0x3E, 0x40, 0x40, 0x40, 0x3E, 0x00,
+ 0x1E, 0x20, 0x40, 0x20, 0x1E, 0x00,
+ 0x3E, 0x40, 0x38, 0x40, 0x3E, 0x00,
+ 0x62, 0x14, 0x08, 0x14, 0x62, 0x00,
+ 0x06, 0x08, 0x70, 0x08, 0x06, 0x00,
+ 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00,
+ 0x00, 0x7E, 0x42, 0x42, 0x00, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x00, 0x42, 0x42, 0x7E, 0x00,
+ 0x08, 0x04, 0x02, 0x04, 0x08, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x00, 0x06, 0x0A, 0x00, 0x00,
+ 0x60, 0x54, 0x54, 0x54, 0x7C, 0x00,
+ 0x7E, 0x48, 0x48, 0x48, 0x30, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x48, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x7E, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x58, 0x00,
+ 0x00, 0x08, 0x7C, 0x0A, 0x00, 0x00,
+ 0x98, 0xA4, 0xA4, 0xA4, 0x78, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x70, 0x00,
+ 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3A, 0x00, 0x00,
+ 0x7E, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x7E, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x04, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0xFC, 0x24, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x24, 0xFC, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x00, 0x04, 0x7E, 0x44, 0x00, 0x00,
+ 0x3C, 0x40, 0x40, 0x40, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x5C, 0xA0, 0xA0, 0xA0, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x7E, 0xFF, 0x81, 0xBF, 0xBF, 0xBF,
+ 0xBF, 0xF9, 0xF7, 0x8F, 0xF7, 0xF9,
+ 0xFF, 0x83, 0xED, 0xED, 0xCD, 0xA3,
+ 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0x81, 0xB5, 0xB5, 0xB5, 0xCB,
+ 0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xC3,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFE, 0x01, 0x61, 0xF1, 0xF9, 0xFD,
+ 0x61, 0xF1, 0xF9, 0xFD, 0x01, 0xFE,
+ 0xFE, 0x01, 0xFD, 0xF9, 0xF1, 0x61,
+ 0xFD, 0xF9, 0xF1, 0x61, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0x01, 0x61,
+ 0xF1, 0xF9, 0xFD, 0x01, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0xF9, 0xF1,
+ 0x61, 0x01, 0xFD, 0x01, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF0, 0x08, 0x04, 0xC4, 0x24, 0x24,
+ 0x24, 0xC4, 0x04, 0x08, 0xF0, 0x00,
+ 0xF0, 0xF8, 0xFC, 0x3C, 0xDC, 0xDC,
+ 0xDC, 0x3C, 0xFC, 0xF8, 0xF0, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x08, 0x09, 0x0B,
+ 0x08, 0x08, 0x09, 0x0B, 0x08, 0x07,
+ 0x07, 0x08, 0x0B, 0x09, 0x08, 0x08,
+ 0x0B, 0x09, 0x08, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x08, 0x08,
+ 0x08, 0x09, 0x0B, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x09, 0x08,
+ 0x08, 0x08, 0x0B, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x10, 0x13, 0x11, 0x11,
+ 0x11, 0x13, 0x10, 0x08, 0x07, 0x00,
+ 0x07, 0x0F, 0x1F, 0x1C, 0x1E, 0x1E,
+ 0x1E, 0x1C, 0x1F, 0x0F, 0x07, 0x00,
+ 0xFE, 0x01, 0xF1, 0xF9, 0xFD, 0xFD,
+ 0x05, 0x05, 0x09, 0xF1, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x06, 0x3F,
+ 0x3F, 0x06, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x18, 0x3F,
+ 0x3F, 0x18, 0x08, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x09, 0x0B, 0x0B,
+ 0x0A, 0x0A, 0x09, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/keyboards/kbdksp/geulisv/jpe230.h b/keyboards/kbdksp/geulisv/jpe230.h
new file mode 100644
index 00000000000..2792f6a3796
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/jpe230.h
@@ -0,0 +1,20 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+bool shift_pressed;
+bool alt_pressed;
+bool ctrl_pressed;
+bool gui_pressed;
+
+/* ---------------------------
+ * Custom OLED Fncs Prototypes
+ * ---------------------------
+ */
+void render_slave_oled(void);
+void render_master_oled(void);
+void oled_timer_reset(void);
+void set_keylog(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/kbdksp/geulisv/keyboard.json b/keyboards/kbdksp/geulisv/keyboard.json
new file mode 100644
index 00000000000..6d969e2dc92
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/keyboard.json
@@ -0,0 +1,123 @@
+{
+ "manufacturer": "KBDKSP",
+ "keyboard_name": "Geulis",
+ "maintainer": "sendz",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "build": {
+ "lto": true
+ },
+ "encoder": {
+ "enabled": true,
+ "rotary": [
+ {"pin_a": "GP10", "pin_b": "GP11"}
+ ],
+ "resolution": 1
+ },
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "oled": true,
+ "encoder": true,
+ "wpm": true
+ },
+ "matrix_pins": {
+ "cols": [
+ "GP9",
+ "GP8",
+ "GP7",
+ "GP4",
+ "GP5",
+ "GP6"
+ ],
+ "rows": [
+ "GP28",
+ "GP15",
+ "GP26",
+ "GP27",
+ "GP14"
+ ]
+ },
+ "processor": "RP2040",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x0287",
+ "vid": "0x7370"
+ },
+ "split": {
+ "enabled": true
+ },
+ "layouts": {
+ "LAYOUT_split_3x6_3": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0,"y": 1.5},
+ {"matrix": [0, 1], "x": 1,"y": 1.5},
+ {"matrix": [0, 2], "x": 2,"y": 1.3499999999999999},
+ {"matrix": [0, 3], "x": 3,"y": 1.2},
+ {"matrix": [0, 4], "x": 4,"y": 1.3499999999999999},
+ {"matrix": [0, 5], "x": 5,"y": 1.5},
+
+ {"matrix": [5, 5], "x": 9,"y": 1.5},
+ {"matrix": [5, 4], "x": 10,"y": 1.25},
+ {"matrix": [5, 3], "x": 11,"y": 1.2},
+ {"matrix": [5, 2], "x": 12,"y": 1.3499999999999999},
+ {"matrix": [5, 1], "x": 13,"y": 1.5},
+ {"matrix": [5, 0], "x": 14,"y": 1.5},
+
+ {"matrix": [1, 0], "x": 0,"y": 2.5},
+ {"matrix": [1, 1], "x": 1,"y": 2.5},
+ {"matrix": [1, 2], "x": 2,"y": 2.35},
+ {"matrix": [1, 3], "x": 3,"y": 2.2},
+ {"matrix": [1, 4], "x": 4,"y": 2.35},
+ {"matrix": [1, 5], "x": 5,"y": 2.5},
+
+ {"matrix": [3, 5], "x": 6.25,"y": 2.25},
+ {"matrix": [8, 5], "x": 7.75,"y": 2.25},
+
+ {"matrix": [6, 5], "x": 9,"y": 2.5},
+ {"matrix": [6, 4], "x": 10,"y": 2.35},
+ {"matrix": [6, 3], "x": 11,"y": 2.2},
+ {"matrix": [6, 2], "x": 12,"y": 2.35},
+ {"matrix": [6, 1], "x": 13,"y": 2.5},
+ {"matrix": [6, 0], "x": 14,"y": 2.5},
+
+ {"matrix": [2, 0], "x": 0,"y": 3.5},
+ {"matrix": [2, 1], "x": 1,"y": 3.5},
+ {"matrix": [2, 2], "x": 2,"y": 3.35},
+ {"matrix": [2, 3], "x": 3,"y": 3.2},
+ {"matrix": [2, 4], "x": 4,"y": 3.35},
+ {"matrix": [2, 5], "x": 5,"y": 3.5},
+
+ {"matrix": [4, 4], "x": 10,"y": 1.25, "w": 0.5},
+ {"matrix": [4, 5],"x": 6.75,"y": 3.25, "w": 0.5},
+
+ {"matrix": [9, 5],"x": 7.75,"y": 3.25, "w": 0.5},
+ {"matrix": [9, 4],"x": 8.25,"y": 3.25, "w": 0.5},
+
+ {"matrix": [7, 5], "x": 9,"y": 3.5},
+ {"matrix": [7, 4], "x": 10,"y": 3.35},
+ {"matrix": [7, 3], "x": 11,"y": 3.2},
+ {"matrix": [7, 2], "x": 12,"y": 3.35},
+ {"matrix": [7, 1], "x": 13,"y": 3.5},
+ {"matrix": [7, 0], "x": 14,"y": 3.5},
+ {"matrix": [3, 0], "x": 1.75,"y": 4.5},
+
+ {"matrix": [3, 1], "x": 2.75,"y": 4.3500000000000005},
+ {"matrix": [3, 2], "x": 3.75,"y": 4.3500000000000005},
+ {"matrix": [3, 3], "x": 0,"y": 16.35},
+ {"matrix": [3, 4],"x": 0.1,"y": 17.1, "h": 1.5},
+
+ {"matrix": [8, 4],"x": 0,"y": 17.85, "h": 1.5},
+ {"matrix": [8, 3], "x": 0,"y": 18.85},
+ {"matrix": [8, 2], "x": 10.25,"y": 4.3500000000000005},
+ {"matrix": [8, 1], "x": 11,"y": 9.85},
+ {"matrix": [8, 0], "x": 11.75,"y": 15.35}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulisv/keymaps/default/keymap.c b/keyboards/kbdksp/geulisv/keymaps/default/keymap.c
new file mode 100644
index 00000000000..ffbd1365d02
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/keymaps/default/keymap.c
@@ -0,0 +1,113 @@
+/* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ * Modification for Vial support by Drew Petersen
+ *
+ * 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 .
+ */
+
+// clang-format off
+
+#include
+char wpm_str[10];
+#include QMK_KEYBOARD_H
+
+// Default keymap. This can be changed in Vial. Use oled.c to change beavior that Vial cannot change.
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY WINDOWS
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[0] = LAYOUT_split_3x6_3(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_MUTE, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL, MO(1), KC_SPC, KC_ENT, MO(2), KC_MINS, KC_EQL, KC_RGUI
+),
+/* LOWER
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[1] = LAYOUT_split_3x6_3(
+ KC_GRV, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, _______, _______,
+ _______, _______, RGB_TOG, RGB_MOD, RGB_VAI, _______, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______,
+ KC_CAPS, _______, _______, RGB_RMOD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/* RAISE
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[2] = LAYOUT_split_3x6_3(
+ _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, _______, KC_UP, _______, _______, KC_BSPC,
+ _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
+ _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/*
+ * COLEMAK
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[3] = LAYOUT_split_3x6_3(
+ KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_MUTE, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI, KC_LALT, KC_LCTL, KC_TRNS, KC_ENT, KC_SPC, KC_TRNS, KC_RCTL, KC_RALT, KC_RGUI
+),
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_WH_D, KC_WH_U) },
+ [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+};
+#endif
diff --git a/keyboards/kbdksp/geulisv/keymaps/vial/config.h b/keyboards/kbdksp/geulisv/keymaps/vial/config.h
new file mode 100644
index 00000000000..39fcfc0bc57
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/keymaps/vial/config.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0x3D, 0xDC, 0x35, 0xC3, 0x6D, 0x4A, 0x9C, 0x49}
+
+#define VIAL_ENCODER_DEFAULT { \
+ KC_VOLU, KC_VOLD, \
+ KC_PGUP, KC_PGDN, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS \
+}
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
diff --git a/keyboards/kbdksp/geulisv/keymaps/vial/keymap.c b/keyboards/kbdksp/geulisv/keymaps/vial/keymap.c
new file mode 100644
index 00000000000..ffbd1365d02
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/keymaps/vial/keymap.c
@@ -0,0 +1,113 @@
+/* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ * Modification for Vial support by Drew Petersen
+ *
+ * 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 .
+ */
+
+// clang-format off
+
+#include
+char wpm_str[10];
+#include QMK_KEYBOARD_H
+
+// Default keymap. This can be changed in Vial. Use oled.c to change beavior that Vial cannot change.
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY WINDOWS
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[0] = LAYOUT_split_3x6_3(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_MUTE, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL, MO(1), KC_SPC, KC_ENT, MO(2), KC_MINS, KC_EQL, KC_RGUI
+),
+/* LOWER
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[1] = LAYOUT_split_3x6_3(
+ KC_GRV, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, _______, _______,
+ _______, _______, RGB_TOG, RGB_MOD, RGB_VAI, _______, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______,
+ KC_CAPS, _______, _______, RGB_RMOD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/* RAISE
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[2] = LAYOUT_split_3x6_3(
+ _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, _______, KC_UP, _______, _______, KC_BSPC,
+ _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
+ _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/*
+ * COLEMAK
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[3] = LAYOUT_split_3x6_3(
+ KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_MUTE, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI, KC_LALT, KC_LCTL, KC_TRNS, KC_ENT, KC_SPC, KC_TRNS, KC_RCTL, KC_RALT, KC_RGUI
+),
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_WH_D, KC_WH_U) },
+ [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+};
+#endif
diff --git a/keyboards/kbdksp/geulisv/keymaps/vial/rules.mk b/keyboards/kbdksp/geulisv/keymaps/vial/rules.mk
new file mode 100644
index 00000000000..8c9cbd98a86
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/keymaps/vial/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_INSECURE = yes
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/kbdksp/geulisv/keymaps/vial/vial.json b/keyboards/kbdksp/geulisv/keymaps/vial/vial.json
new file mode 100644
index 00000000000..bd4bfe2f0f0
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/keymaps/vial/vial.json
@@ -0,0 +1,394 @@
+{
+ "name": "Geulis",
+ "vendorId": "0x7370",
+ "productId": "0x0287",
+ "lighting": "qmk_rgblight",
+ "matrix": {
+ "rows": 10,
+ "cols": 6
+ },
+ "layouts": {
+ "keymap": [
+ [
+ {
+ "y": 0.2,
+ "x": 3,
+ "p": "CHICKLET",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "0,3",
+ {
+ "x": 7
+ },
+ "5,3"
+ ],
+ [
+ {
+ "y": -0.95,
+ "x": 6.25,
+ "f": 3,
+ "w": 0.5
+ },
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "0,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.5,
+ "w": 0.5
+ },
+ "1,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "1,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 1.25,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "5,4"
+ ],
+ [
+ {
+ "y": -0.9,
+ "x": 2
+ },
+ "0,2",
+ {
+ "x": 1
+ },
+ "0,4",
+ {
+ "x": 7
+ },
+ "5,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa"
+ },
+ "0,0",
+ {
+ "c": "#cccccc"
+ },
+ "0,1",
+ {
+ "x": 3
+ },
+ "0,5",
+ {
+ "a": 7,
+ "f": 6,
+ "w": 3,
+ "h": 2.75,
+ "d": true
+ },
+ "",
+ {
+ "a": 4,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "5,5",
+ {
+ "x": 3
+ },
+ "5,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "5,0"
+ ],
+ [
+ {
+ "y": -0.30000000000000004,
+ "x": 3,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "1,3",
+ {
+ "x": 7
+ },
+ "6,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25
+ },
+ "3,5",
+ {
+ "x": 0.5
+ },
+ "8,5"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2
+ },
+ "1,2",
+ {
+ "x": 1,
+ "n": true
+ },
+ "1,4",
+ {
+ "x": 5,
+ "n": true
+ },
+ "6,4",
+ {
+ "x": 1
+ },
+ "6,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "1,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "1,1",
+ {
+ "x": 3
+ },
+ "1,5",
+ {
+ "x": 3
+ },
+ "6,5",
+ {
+ "x": 3
+ },
+ "6,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "6,0"
+ ],
+ [
+ {
+ "y": -0.2999999999999998,
+ "x": 3,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,3",
+ {
+ "x": 7
+ },
+ "7,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25,
+ "f": 3,
+ "w": 0.5
+ },
+ "4,4",
+ {
+ "w": 0.5
+ },
+ "4,5",
+ {
+ "x": 0.5,
+ "w": 0.5
+ },
+ "9,5",
+ {
+ "w": 0.5
+ },
+ "9,4"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,2",
+ {
+ "x": 1
+ },
+ "2,4",
+ {
+ "x": 5
+ },
+ "7,4",
+ {
+ "x": 1
+ },
+ "7,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "2,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,1",
+ {
+ "x": 3
+ },
+ "2,5",
+ {
+ "x": 3
+ },
+ "7,5",
+ {
+ "x": 3
+ },
+ "7,1",
+ {
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "7,0"
+ ],
+ [
+ {
+ "y": -0.1499999999999999,
+ "x": 2.75,
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "3,1",
+ "3,2",
+ {
+ "x": 5.5
+ },
+ "8,2"
+ ],
+ [
+ {
+ "y": -0.8499999999999996,
+ "x": 1.75
+ },
+ "3,0"
+ ],
+ [
+ {
+ "rx": 0.25,
+ "y": 3.35,
+ "x": 11
+ },
+ "8,1"
+ ],
+ [
+ {
+ "rx": 0.5,
+ "y": 3.5,
+ "x": 11.75
+ },
+ "8,0"
+ ],
+ [
+ {
+ "r": 15,
+ "rx": 5,
+ "ry": 4.5,
+ "y": -1,
+ "x": -0.25,
+ "c": "#777777"
+ },
+ "3,3"
+ ],
+ [
+ {
+ "r": 30,
+ "rx": 6.25,
+ "y": -1,
+ "x": -0.40000000000000036,
+ "c": "#aaaaaa",
+ "h": 1.5
+ },
+ "3,4"
+ ],
+ [
+ {
+ "r": -30,
+ "rx": 8.75,
+ "y": -1,
+ "x": -0.5999999999999996,
+ "f": 8,
+ "fa": [
+ 1
+ ],
+ "h": 1.5
+ },
+ "8,4"
+ ],
+ [
+ {
+ "r": -15,
+ "rx": 10,
+ "y": -1,
+ "x": -0.75,
+ "c": "#777777",
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "8,3"
+ ]
+ ]
+ }
+}
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulisv/mcuconf.h b/keyboards/kbdksp/geulisv/mcuconf.h
new file mode 100644
index 00000000000..7548f5b4290
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/mcuconf.h
@@ -0,0 +1,11 @@
+// Copyright 2022 Steven Karrmann (@skarrmann)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef RP_I2C_USE_I2C0
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C0 FALSE
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/kbdksp/geulisv/oled/oled_handler.c b/keyboards/kbdksp/geulisv/oled/oled_handler.c
new file mode 100644
index 00000000000..e2b56e4b9ea
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/oled/oled_handler.c
@@ -0,0 +1,42 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#ifdef OLED_ENABLE
+uint8_t logged_row;
+uint8_t logged_col;
+uint32_t oled_timer = 0;
+
+__attribute__ ((weak)) void handle_oled_keypress(uint16_t keycode, keyrecord_t *record) {}
+
+__attribute__ ((weak)) oled_rotation_t rotate_master(oled_rotation_t rotation) {return rotation;}
+__attribute__ ((weak)) oled_rotation_t rotate_slave(oled_rotation_t rotation) {return rotation;}
+
+void oled_timer_reset(void) { oled_timer = timer_read32(); }
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+
+ if (!is_keyboard_master()) {
+ return rotate_slave(rotation);
+ }
+
+ return rotate_master(rotation);
+}
+
+
+void set_keylog(uint16_t keycode, keyrecord_t *record) {
+ logged_row = record->event.key.row;
+ logged_col = record->event.key.col;
+
+ handle_oled_keypress(keycode, record);
+}
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ render_master_oled();
+ } else {
+ render_slave_oled();
+ }
+ return false;
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulisv/oled/rp2040/master/oled_master_handler.c b/keyboards/kbdksp/geulisv/oled/rp2040/master/oled_master_handler.c
new file mode 100644
index 00000000000..85e8c4ccfc4
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/oled/rp2040/master/oled_master_handler.c
@@ -0,0 +1,38 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+
+// static const char PROGMEM ICON_LAYER[] = {0x80, 0x81, 0x82, 0x83, 0};
+
+void render_master_oled(void) {
+ oled_on();
+
+ oled_write_P(PSTR(" KBD "), false);
+ oled_write_P(PSTR(" KSP "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ oled_write_P(PSTR(" GEU "), false);
+ oled_write_P(PSTR(" LIS "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+ oled_write_P(PSTR("_____"), false);
+ oled_write_ln_P(PSTR(""), false);
+ oled_write_ln_P(PSTR(""), false);
+
+ char layer_string[8] = {0};
+ sprintf(layer_string, "LYR %d", get_highest_layer(layer_state));
+ oled_write(layer_string, false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_P(PSTR("CAPS "), led_usb_state.caps_lock);
+ oled_write_P(PSTR("SHIFT"), shift_pressed);
+ oled_write_P(PSTR("CTRL "), ctrl_pressed);
+ oled_write_P(PSTR("GUI "), gui_pressed);
+ oled_write_P(PSTR("ALT "), alt_pressed);
+}
+
+oled_rotation_t rotate_master(oled_rotation_t rotation) {return OLED_ROTATION_270;}
diff --git a/keyboards/kbdksp/geulisv/oled/rp2040/slave/oled_slave_handler.c b/keyboards/kbdksp/geulisv/oled/rp2040/slave/oled_slave_handler.c
new file mode 100644
index 00000000000..525038bd397
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/oled/rp2040/slave/oled_slave_handler.c
@@ -0,0 +1,120 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#include
+
+char wpm_str[10];
+
+// WPM-responsive animation stuff here
+# define IDLE_FRAMES 5
+# define IDLE_SPEED 20 // below this wpm value your animation will idle
+
+// #define PREP_FRAMES 1 // uncomment if >1
+
+# define TAP_FRAMES 2
+# define TAP_SPEED 40 // above this wpm value typing animation to trigger
+
+# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
+// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
+# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
+
+uint32_t anim_timer = 0;
+uint32_t anim_sleep = 0;
+uint8_t current_idle_frame = 0;
+// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1
+uint8_t current_tap_frame = 0;
+
+// Code containing pixel art, contains:
+// 5 idle frames, 1 prep frame, and 2 tap frames
+
+// To make your own pixel art:
+// save a png/jpeg of an 128x32 image (resource: https://www.pixilart.com/draw )
+// follow this guide up to and including "CONVERT YOUR IMAGE" https://docs.splitkb.com/hc/en-us/articles/360013811280-How-do-I-convert-an-image-for-use-on-an-OLED-display-
+// replace numbers in brackets with your own
+// if you start getting errors when compiling make sure you didn't accedentally delete a bracket
+static void render_anim(void) {
+ static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x82, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x34, 0xc4, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x31, 0xc1, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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}};
+ static const char PROGMEM prep[][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00}};
+ static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x98, 0xc0, 0x88, 0x88, 0x8c, 0x9c, 0x1c, 0x1e, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x0f, 0x07, 0x03, 0x03, 0x61, 0xf0, 0xf8, 0xfc, 0x60, 0x01, 0x01, 0x01, 0x3c, 0x78, 0xf8, 0xf0, 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},
+ };
+
+ // assumes 1 frame prep stage
+ void animation_phase(void) {
+ if (get_current_wpm() <= IDLE_SPEED) {
+ current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
+ oled_write_raw_P(idle[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE);
+ }
+ if (get_current_wpm() > IDLE_SPEED && get_current_wpm() < TAP_SPEED) {
+ // oled_write_raw_P(prep[abs((PREP_FRAMES-1)-current_prep_frame)], ANIM_SIZE); // uncomment if IDLE_FRAMES >1
+ oled_write_raw_P(prep[0], ANIM_SIZE); // remove if IDLE_FRAMES >1
+ }
+ if (get_current_wpm() >= TAP_SPEED) {
+ current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES;
+ oled_write_raw_P(tap[abs((TAP_FRAMES - 1) - current_tap_frame)], ANIM_SIZE);
+ }
+ }
+ if (get_current_wpm() != 000) {
+ oled_on(); // not essential but turns on animation OLED with any alpha keypress
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ anim_sleep = timer_read32();
+ } else {
+ if (timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
+ oled_off();
+ } else {
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ }
+ }
+}
+
+static const char PROGMEM KDBKSP[] = {0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0};
+
+void render_slave_oled(void) {
+ oled_on();
+
+ render_anim();
+
+ oled_write_P(KDBKSP, false);
+
+ oled_set_cursor(0, 1);
+ sprintf(wpm_str, "WPM:%03d", get_current_wpm()); // edit the string to change wwhat shows up, edit %03d to change how many digits show up
+ oled_write(wpm_str, false);
+}
+
+oled_rotation_t rotate_slave(oled_rotation_t rotation) {return OLED_ROTATION_0;}
diff --git a/keyboards/kbdksp/geulisv/process_record.c b/keyboards/kbdksp/geulisv/process_record.c
new file mode 100644
index 00000000000..39ecda05f62
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/process_record.c
@@ -0,0 +1,63 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#ifdef OLED_ENABLE
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ oled_timer_reset();
+ set_keylog(keycode, record);
+
+ switch (keycode) {
+ case QK_BOOT:
+ // rgb_matrix_set_color_all(30, 0, 0);
+ // rgb_matrix_driver.flush();
+ oled_off();
+ return true;
+ }
+ }
+ return true;
+}
+
+void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
+switch (keycode) {
+ case KC_LSFT:
+ case KC_RSFT:
+ if (record->event.pressed) {
+ shift_pressed = true;
+ } else {
+ shift_pressed = false;
+ }
+ break;
+ case KC_LALT:
+ case KC_RALT:
+ if (record->event.pressed) {
+ alt_pressed = true;
+ } else {
+ alt_pressed = false;
+ }
+ break;
+ case KC_LCTL:
+ case KC_RCTL:
+ if (record->event.pressed) {
+ ctrl_pressed = true;
+ } else {
+ ctrl_pressed = false;
+ }
+ break;
+ case KC_LGUI:
+ case KC_RGUI:
+ if (record->event.pressed) {
+ gui_pressed = true;
+ } else {
+ gui_pressed = false;
+ }
+ break;
+ default:
+ gui_pressed = false;
+ ctrl_pressed = false;
+ alt_pressed = false;
+ shift_pressed = false;
+ }
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/geulisv/readme.md b/keyboards/kbdksp/geulisv/readme.md
new file mode 100644
index 00000000000..6eafdc0fe6a
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/readme.md
@@ -0,0 +1,27 @@
+# kbdksp/geulisv1
+
+
+
+*A short description of the keyboard/project*
+
+* Keyboard Maintainer: [KBDKSP](https://github.com/sendz)
+* Hardware Supported: *The PCBs, controllers supported*
+* Hardware Availability: *Links to where you can find this hardware*
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kbdksp/geulisv1:default
+
+Flashing example for this keyboard:
+
+ make kbdksp/geulisv1:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
+* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/kbdksp/geulisv/rules.mk b/keyboards/kbdksp/geulisv/rules.mk
new file mode 100644
index 00000000000..bdb17f8e2e1
--- /dev/null
+++ b/keyboards/kbdksp/geulisv/rules.mk
@@ -0,0 +1,14 @@
+SERIAL_DRIVER = vendor
+
+OLED_DRIVER = ssd1306
+
+SRC += oled/oled_handler.c process_record.c
+
+DEBUG_MATRIX_SCAN_RATE_ENABLE = yes
+
+SRC += oled/rp2040/master/oled_master_handler.c \
+ oled/rp2040/slave/oled_slave_handler.c
+
+RGBLIGHT_ENABLE = yes
+RGBLIGHT_DRIVER = ws2812
+WS2812_DRIVER = vendor
diff --git a/keyboards/kbdksp/hd48ap/config.h b/keyboards/kbdksp/hd48ap/config.h
new file mode 100755
index 00000000000..432ae252a75
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/config.h
@@ -0,0 +1,57 @@
+ /* Copyright 2022 sendz
+ *
+ * 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 "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x7370
+#define PRODUCT_ID 0x3438
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Keyboard Kasep
+#define PRODUCT HD48AP
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 7
+
+/* Keyboard Matrix Assignments */
+#define MATRIX_ROW_PINS { D3, D2, D7, E6, B2, B6, B5, B4 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, D5 }
+#define UNUSED_PINS
+
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+/* encoder support */
+#define ENCODERS_PAD_A { D4 } // 4 + 4
+#define ENCODERS_PAD_B { C6 } // 4 + 4
+#define ENCODER_RESOLUTION 2
+
+#define OLED_FONT_H "fonts/glcdfont.c"
+#define OLED_DISPLAY_128X64
diff --git a/keyboards/kbdksp/hd48ap/fonts/glcdfont.c b/keyboards/kbdksp/hd48ap/fonts/glcdfont.c
new file mode 100755
index 00000000000..fd84399afb5
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/fonts/glcdfont.c
@@ -0,0 +1,244 @@
+ /* Copyright 2020 sendyyeah
+ *
+ * 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 "progmem.h"
+
+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, 0x66, 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, 0x5E, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+ 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x26, 0x16, 0x08, 0x34, 0x32, 0x00,
+ 0x36, 0x4A, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x3C, 0x42, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x3C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0xA0, 0x60, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x00, 0x44, 0x7E, 0x40, 0x00, 0x00,
+ 0x64, 0x52, 0x52, 0x52, 0x4C, 0x00,
+ 0x22, 0x42, 0x4A, 0x4A, 0x36, 0x00,
+ 0x38, 0x24, 0x22, 0x7E, 0x20, 0x00,
+ 0x2E, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x3C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x62, 0x1A, 0x06, 0x00,
+ 0x34, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x4C, 0x52, 0x52, 0x52, 0x3C, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x00, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x00, 0x22, 0x14, 0x08, 0x00,
+ 0x00, 0x04, 0x52, 0x0A, 0x04, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x12, 0x12, 0x7C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x42, 0x00,
+ 0x7E, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x4A, 0x00,
+ 0x7E, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
+ 0x3C, 0x42, 0x42, 0x52, 0x72, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x7E, 0x00,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x42, 0x3E, 0x00, 0x00,
+ 0x7E, 0x10, 0x08, 0x14, 0x62, 0x00,
+ 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7E, 0x04, 0x08, 0x04, 0x7E, 0x00,
+ 0x7E, 0x04, 0x08, 0x10, 0x7E, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x12, 0x12, 0x12, 0x0C, 0x00,
+ 0x3C, 0x42, 0x52, 0x22, 0x5C, 0x00,
+ 0x7C, 0x12, 0x12, 0x32, 0x5E, 0x00,
+ 0x4C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x7E, 0x02, 0x02, 0x00,
+ 0x3E, 0x40, 0x40, 0x40, 0x3E, 0x00,
+ 0x1E, 0x20, 0x40, 0x20, 0x1E, 0x00,
+ 0x3E, 0x40, 0x38, 0x40, 0x3E, 0x00,
+ 0x62, 0x14, 0x08, 0x14, 0x62, 0x00,
+ 0x06, 0x08, 0x70, 0x08, 0x06, 0x00,
+ 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00,
+ 0x00, 0x7E, 0x42, 0x42, 0x00, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x00, 0x42, 0x42, 0x7E, 0x00,
+ 0x08, 0x04, 0x02, 0x04, 0x08, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x00, 0x06, 0x0A, 0x00, 0x00,
+ 0x60, 0x54, 0x54, 0x54, 0x7C, 0x00,
+ 0x7E, 0x48, 0x48, 0x48, 0x30, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x48, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x7E, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x58, 0x00,
+ 0x00, 0x08, 0x7C, 0x0A, 0x00, 0x00,
+ 0x98, 0xA4, 0xA4, 0xA4, 0x78, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x70, 0x00,
+ 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3A, 0x00, 0x00,
+ 0x7E, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x7E, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x04, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0xFC, 0x24, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x24, 0xFC, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x00, 0x04, 0x7E, 0x44, 0x00, 0x00,
+ 0x3C, 0x40, 0x40, 0x40, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x5C, 0xA0, 0xA0, 0xA0, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x7E, 0xFF, 0x81, 0xBF, 0xBF, 0xBF,
+ 0xBF, 0xF9, 0xF7, 0x8F, 0xF7, 0xF9,
+ 0xFF, 0x83, 0xED, 0xED, 0xCD, 0xA3,
+ 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0x81, 0xB5, 0xB5, 0xB5, 0xCB,
+ 0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xC3,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFE, 0x01, 0x61, 0xF1, 0xF9, 0xFD,
+ 0x61, 0xF1, 0xF9, 0xFD, 0x01, 0xFE,
+ 0xFE, 0x01, 0xFD, 0xF9, 0xF1, 0x61,
+ 0xFD, 0xF9, 0xF1, 0x61, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0x01, 0x61,
+ 0xF1, 0xF9, 0xFD, 0x01, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0xF9, 0xF1,
+ 0x61, 0x01, 0xFD, 0x01, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF0, 0x08, 0x04, 0xC4, 0x24, 0x24,
+ 0x24, 0xC4, 0x04, 0x08, 0xF0, 0x00,
+ 0xF0, 0xF8, 0xFC, 0x3C, 0xDC, 0xDC,
+ 0xDC, 0x3C, 0xFC, 0xF8, 0xF0, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x08, 0x09, 0x0B,
+ 0x08, 0x08, 0x09, 0x0B, 0x08, 0x07,
+ 0x07, 0x08, 0x0B, 0x09, 0x08, 0x08,
+ 0x0B, 0x09, 0x08, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x08, 0x08,
+ 0x08, 0x09, 0x0B, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x09, 0x08,
+ 0x08, 0x08, 0x0B, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x10, 0x13, 0x11, 0x11,
+ 0x11, 0x13, 0x10, 0x08, 0x07, 0x00,
+ 0x07, 0x0F, 0x1F, 0x1C, 0x1E, 0x1E,
+ 0x1E, 0x1C, 0x1F, 0x0F, 0x07, 0x00,
+ 0xFE, 0x01, 0xF1, 0xF9, 0xFD, 0xFD,
+ 0x05, 0x05, 0x09, 0xF1, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x06, 0x3F,
+ 0x3F, 0x06, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x18, 0x3F,
+ 0x3F, 0x18, 0x08, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x09, 0x0B, 0x0B,
+ 0x0A, 0x0A, 0x09, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/keyboards/kbdksp/hd48ap/hd48ap.c b/keyboards/kbdksp/hd48ap/hd48ap.c
new file mode 100755
index 00000000000..3afd7398bb8
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/hd48ap.c
@@ -0,0 +1,17 @@
+ /* Copyright 2022 sendz
+ *
+ * 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 "hd48ap.h"
diff --git a/keyboards/kbdksp/hd48ap/hd48ap.h b/keyboards/kbdksp/hd48ap/hd48ap.h
new file mode 100755
index 00000000000..dc152ff10cf
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/hd48ap.h
@@ -0,0 +1,45 @@
+/* Copyright 2022 sendz
+ *
+ * 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 "quantum.h"
+
+/* This is a shortcut to help you visually see your layout.
+ *
+ * The first section contains all of the arguments representing the physical
+ * layout of the board and position of the keys.
+ *
+ * The second converts the arguments into a two-dimensional array which
+ * represents the switch matrix.
+ */
+
+#define LAYOUT_ortho(\
+ L00, L10, L01, L11, L02, L12, L03, L13, L04, L14, L05, L15, \
+ L20, L30, L21, L31, L22, L32, L23, L33, L24, L34, L25, L35, \
+ L56, L40, L50, L41, L51, L42, L52, L43, L53, L44, L54, L45, L55, \
+ L76, L60, L70, L61, L71, L62, L72, L63, L73, L64, L74, L65, L75 \
+) \
+{ \
+ { L00, L01, L02, L03, L04, L05, KC_NO }, \
+ { L10, L11, L12, L13, L14, L15, KC_NO }, \
+ { L20, L21, L22, L23, L24, L25, KC_NO }, \
+ { L30, L31, L32, L33, L34, L35, KC_NO }, \
+ { L40, L41, L42, L43, L44, L45, KC_NO }, \
+ { L50, L51, L52, L53, L54, L55, L56 }, \
+ { L60, L61, L62, L63, L64, L65, KC_NO }, \
+ { L70, L71, L72, L73, L74, L75, L76 } \
+}
diff --git a/keyboards/kbdksp/hd48ap/info.json b/keyboards/kbdksp/hd48ap/info.json
new file mode 100755
index 00000000000..a7f3f03c54b
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/info.json
@@ -0,0 +1,256 @@
+{
+ "keyboard_name": "HD48AP",
+ "url": "",
+ "maintainer": "Keyboard Kasep",
+ "layouts": {
+ "LAYOUT_ortho": {
+ "layout": [
+ {
+ "label": "Tab",
+ "x": 1.25,
+ "y": 0
+ },
+ {
+ "label": "Q",
+ "x": 2.25,
+ "y": 0
+ },
+ {
+ "label": "W",
+ "x": 3.25,
+ "y": 0
+ },
+ {
+ "label": "E",
+ "x": 4.25,
+ "y": 0
+ },
+ {
+ "label": "R",
+ "x": 5.25,
+ "y": 0
+ },
+ {
+ "label": "T",
+ "x": 6.25,
+ "y": 0
+ },
+ {
+ "label": "Y",
+ "x": 7.25,
+ "y": 0
+ },
+ {
+ "label": "U",
+ "x": 8.25,
+ "y": 0
+ },
+ {
+ "label": "I",
+ "x": 9.25,
+ "y": 0
+ },
+ {
+ "label": "O",
+ "x": 10.25,
+ "y": 0
+ },
+ {
+ "label": "P",
+ "x": 11.25,
+ "y": 0
+ },
+ {
+ "label": "Back Space",
+ "x": 12.25,
+ "y": 0
+ },
+ {
+ "label": "Esc",
+ "x": 1.25,
+ "y": 1
+ },
+ {
+ "label": "A",
+ "x": 2.25,
+ "y": 1
+ },
+ {
+ "label": "S",
+ "x": 3.25,
+ "y": 1
+ },
+ {
+ "label": "D",
+ "x": 4.25,
+ "y": 1
+ },
+ {
+ "label": "F",
+ "x": 5.25,
+ "y": 1
+ },
+ {
+ "label": "G",
+ "x": 6.25,
+ "y": 1
+ },
+ {
+ "label": "H",
+ "x": 7.25,
+ "y": 1
+ },
+ {
+ "label": "J",
+ "x": 8.25,
+ "y": 1
+ },
+ {
+ "label": "K",
+ "x": 9.25,
+ "y": 1
+ },
+ {
+ "label": "L",
+ "x": 10.25,
+ "y": 1
+ },
+ {
+ "label": ";",
+ "x": 11.25,
+ "y": 1
+ },
+ {
+ "label": "'",
+ "x": 12.25,
+ "y": 1
+ },
+ {
+ "x": 0,
+ "y": 2
+ },
+ {
+ "label": "Shift",
+ "x": 1.25,
+ "y": 2
+ },
+ {
+ "label": "Z",
+ "x": 2.25,
+ "y": 2
+ },
+ {
+ "label": "X",
+ "x": 3.25,
+ "y": 2
+ },
+ {
+ "label": "C",
+ "x": 4.25,
+ "y": 2
+ },
+ {
+ "label": "V",
+ "x": 5.25,
+ "y": 2
+ },
+ {
+ "label": "B",
+ "x": 6.25,
+ "y": 2
+ },
+ {
+ "label": "N",
+ "x": 7.25,
+ "y": 2
+ },
+ {
+ "label": "M",
+ "x": 8.25,
+ "y": 2
+ },
+ {
+ "label": ",",
+ "x": 9.25,
+ "y": 2
+ },
+ {
+ "label": ".",
+ "x": 10.25,
+ "y": 2
+ },
+ {
+ "label": "/",
+ "x": 11.25,
+ "y": 2
+ },
+ {
+ "label": "Return",
+ "x": 12.25,
+ "y": 2
+ },
+ {
+ "x": 0,
+ "y": 3
+ },
+ {
+ "x": 1.25,
+ "y": 3
+ },
+ {
+ "label": "Ctrl",
+ "x": 2.25,
+ "y": 3
+ },
+ {
+ "label": "Alt",
+ "x": 3.25,
+ "y": 3
+ },
+ {
+ "label": "Super",
+ "x": 4.25,
+ "y": 3
+ },
+ {
+ "label": "⇓",
+ "x": 5.25,
+ "y": 3
+ },
+ {
+ "x": 6.25,
+ "y": 3
+ },
+ {
+ "x": 7.25,
+ "y": 3
+ },
+ {
+ "label": "⇑",
+ "x": 8.25,
+ "y": 3
+ },
+ {
+ "label": "←",
+ "x": 9.25,
+ "y": 3
+ },
+ {
+ "label": "↓",
+ "x": 10.25,
+ "y": 3
+ },
+ {
+ "label": "↑",
+ "x": 11.25,
+ "y": 3
+ },
+ {
+ "label": "→",
+ "x": 12.25,
+ "y": 3
+ }
+ ]
+ }
+ }
+}
diff --git a/keyboards/kbdksp/hd48ap/keymaps/vial/config.h b/keyboards/kbdksp/hd48ap/keymaps/vial/config.h
new file mode 100755
index 00000000000..fab6eb79cf1
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/keymaps/vial/config.h
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0x66, 0x8F, 0x22, 0x2F, 0x54, 0xB4, 0xD9, 0x99}
+
+#define VIAL_ENCODER_DEFAULT { \
+ KC_VOLU, KC_VOLD, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+}
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 4
diff --git a/keyboards/kbdksp/hd48ap/keymaps/vial/keymap.c b/keyboards/kbdksp/hd48ap/keymaps/vial/keymap.c
new file mode 100755
index 00000000000..b5df7efbfaa
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/keymaps/vial/keymap.c
@@ -0,0 +1,215 @@
+/* Copyright 2022 sendz
+ *
+ * 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
+char wpm_str[10];
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _QWERTY = 0,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_ortho(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_MUTE, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ KC_MUTE, KC_LCTL, KC_LALT, KC_LALT, KC_LGUI, _RAISE, _RAISE, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ [_LOWER] = LAYOUT_ortho(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ [_RAISE] = LAYOUT_ortho(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+
+ [_ADJUST] = LAYOUT_ortho(
+ _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL ,
+ _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______,
+ _______, _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (!clockwise) {
+ tap_code_delay(KC_VOLU, 10);
+ } else {
+ tap_code_delay(KC_VOLD, 10);
+ }
+ }
+ return false;
+}
+
+#endif
+
+#ifdef OLED_ENABLE
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ return OLED_ROTATION_180; // flips the display 180 degrees if offhand
+
+ return rotation;
+}
+
+// WPM-responsive animation stuff here
+# define IDLE_FRAMES 5
+# define IDLE_SPEED 20 // below this wpm value your animation will idle
+
+// #define PREP_FRAMES 1 // uncomment if >1
+
+# define TAP_FRAMES 2
+# define TAP_SPEED 40 // above this wpm value typing animation to trigger
+
+# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
+// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
+# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
+
+uint32_t anim_timer = 0;
+uint32_t anim_sleep = 0;
+uint8_t current_idle_frame = 0;
+// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1
+uint8_t current_tap_frame = 0;
+
+// Code containing pixel art, contains:
+// 5 idle frames, 1 prep frame, and 2 tap frames
+
+// To make your own pixel art:
+// save a png/jpeg of an 128x32 image (resource: https://www.pixilart.com/draw )
+// follow this guide up to and including "CONVERT YOUR IMAGE" https://docs.splitkb.com/hc/en-us/articles/360013811280-How-do-I-convert-an-image-for-use-on-an-OLED-display-
+// replace numbers in brackets with your own
+// if you start getting errors when compiling make sure you didn't accedentally delete a bracket
+static void render_anim(void) {
+ static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x82, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x34, 0xc4, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x31, 0xc1, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 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, 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}};
+ static const char PROGMEM prep[][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00}};
+ static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x98, 0xc0, 0x88, 0x88, 0x8c, 0x9c, 0x1c, 0x1e, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 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, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 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, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x0f, 0x07, 0x03, 0x03, 0x61, 0xf0, 0xf8, 0xfc, 0x60, 0x01, 0x01, 0x01, 0x3c, 0x78, 0xf8, 0xf0, 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},
+ };
+
+ // assumes 1 frame prep stage
+ void animation_phase(void) {
+ if (get_current_wpm() <= IDLE_SPEED) {
+ current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
+ oled_write_raw_P(idle[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE);
+ }
+ if (get_current_wpm() > IDLE_SPEED && get_current_wpm() < TAP_SPEED) {
+ // oled_write_raw_P(prep[abs((PREP_FRAMES-1)-current_prep_frame)], ANIM_SIZE); // uncomment if IDLE_FRAMES >1
+ oled_write_raw_P(prep[0], ANIM_SIZE); // remove if IDLE_FRAMES >1
+ }
+ if (get_current_wpm() >= TAP_SPEED) {
+ current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES;
+ oled_write_raw_P(tap[abs((TAP_FRAMES - 1) - current_tap_frame)], ANIM_SIZE);
+ }
+ }
+ if (get_current_wpm() != 000) {
+ oled_on(); // not essential but turns on animation OLED with any alpha keypress
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ anim_sleep = timer_read32();
+ } else {
+ if (timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
+ oled_off();
+ } else {
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ }
+ }
+}
+
+
+bool oled_task_user(void) {
+
+ static const char PROGMEM ICON_LAYER[] = {0x80, 0x81, 0x82, 0x83, 0};
+ static const char PROGMEM KDBKSP[] = {0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0};
+
+ oled_write_P(ICON_LAYER, false);
+
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ oled_write_P(PSTR("QWERTY"), false);
+ break;
+ case 1:
+ oled_write_P(PSTR("LOWER "), false);
+ break;
+ case 2:
+ oled_write_P(PSTR("RAISE "), false);
+ break;
+ case 3:
+ oled_write_P(PSTR("ADJUST"), false);
+ break;
+ default:
+ oled_write_P(PSTR("UNDEF "), false);
+ }
+
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(KDBKSP, false);
+
+ render_anim();
+ oled_set_cursor(0, 1);
+ sprintf(wpm_str, "WPM:%03d", get_current_wpm()); // edit the string to change wwhat shows up, edit %03d to change how many digits show up
+ oled_write(wpm_str, false); // writes wpm on top left corner of string
+
+ return false;
+}
+
+#endif
diff --git a/keyboards/kbdksp/hd48ap/keymaps/vial/rules.mk b/keyboards/kbdksp/hd48ap/keymaps/vial/rules.mk
new file mode 100755
index 00000000000..24842c64247
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/keymaps/vial/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_ENCODERS_ENABLE = yes
+VIAL_INSECURE = yes
diff --git a/keyboards/kbdksp/hd48ap/keymaps/vial/vial.json b/keyboards/kbdksp/hd48ap/keymaps/vial/vial.json
new file mode 100755
index 00000000000..27b3e8c6d00
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/keymaps/vial/vial.json
@@ -0,0 +1,108 @@
+{
+ "name": "Euy 40 Combo",
+ "vendorId": "0x5359",
+ "productId": "0x4534",
+ "lighting": "none",
+ "matrix": {
+ "rows": 8,
+ "cols": 7
+ },
+ "layouts": {
+ "keymap": [
+ [
+ {
+ "x": 2.25
+ },
+ "0,0",
+ "1,0",
+ "0,1",
+ "1,1",
+ "0,2",
+ "1,2",
+ "0,3",
+ "1,3",
+ "0,4",
+ "1,4",
+ "0,5",
+ "1,5"
+ ],
+ [
+ {
+ "x": 2.25
+ },
+ "2,0",
+ "3,0",
+ "2,1",
+ "3,1",
+ "2,2",
+ "3,2",
+ "2,3",
+ "3,3",
+ "2,4",
+ "3,4",
+ "2,5",
+ "3,5"
+ ],
+ [
+ "5,6",
+ {
+ "h": 0.5
+ },
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.25
+ },
+ "4,0",
+ "5,0",
+ "4,1",
+ "5,1",
+ "4,2",
+ "5,2",
+ "4,3",
+ "5,3",
+ "4,4",
+ "5,4",
+ "4,5",
+ "5,5"
+ ],
+ [
+ {
+ "y": -0.5,
+ "x": 1,
+ "h": 0.5
+ },
+ "0,1\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "y": -0.5,
+ "x": 2.25
+ },
+ "6,0",
+ "7,0",
+ "6,1",
+ "7,1",
+ "6,2",
+ "7,2\n\n\n0,0",
+ {
+ "x": -1,
+ "w": 2,
+ "n": true
+ },
+ "7,2\n\n\n0,1",
+ {
+ "x": -1
+ },
+ "6,3\n\n\n0,0",
+ "7,3",
+ "6,4",
+ "7,4",
+ "6,5",
+ "7,5"
+ ]
+ ],
+ "labels": [
+ ["Spacebar", "All 1u", "2u Center"]
+ ]
+ }
+}
diff --git a/keyboards/kbdksp/hd48ap/rules.mk b/keyboards/kbdksp/hd48ap/rules.mk
new file mode 100755
index 00000000000..bae775cf985
--- /dev/null
+++ b/keyboards/kbdksp/hd48ap/rules.mk
@@ -0,0 +1,15 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+EXTRAKEY_ENABLE = yes # Audio control and System control
+LTO_ENABLE = yes
+ENCODER_ENABLE = yes
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306
+WPM_ENABLE = yes
+QMK_SETTINGS = no
+TAP_DANCE_ENABLE = no
+COMBO_ENABLE = no
diff --git a/keyboards/kbdksp/iteung/config.h b/keyboards/kbdksp/iteung/config.h
new file mode 100644
index 00000000000..a6fad915bc6
--- /dev/null
+++ b/keyboards/kbdksp/iteung/config.h
@@ -0,0 +1,93 @@
+ /* Copyright 2022 sendz
+ *
+ * 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 "config_rp2040.h"
+#pragma once
+
+// #include "config_common.h"
+
+#define OLED_DISPLAY_128X32
+#define I2C1_SCL_PIN GP3
+#define I2C1_SDA_PIN GP2
+#define I2C_DRIVER I2CD1
+#define OLED_BRIGHTNESS 128
+#define OLED_FONT_H "keyboards/kbdksp/iteung/fonts/glcdfont.c"
+// #define MASTER_RIGHT
+
+/* ---------------------------
+ * Right-half (slave) OLED: eye + WPM + RP2040 + temperature
+ * ---------------------------
+ */
+
+// Custom split transaction used to push the eye gaze target master -> slave.
+#define SPLIT_TRANSACTION_IDS_KB RPC_ID_KB_EYE_SYNC
+
+// Rotation of the right-half OLED. The left half uses OLED_ROTATION_270.
+// If the right screen comes out upside-down, flip this to OLED_ROTATION_90
+// (and, if needed, toggle EYE_INVERT_X / EYE_INVERT_Y below).
+#define OLED_SLAVE_ROTATION OLED_ROTATION_270
+#define EYE_INVERT_X 0
+#define EYE_INVERT_Y 0
+
+// Eye tuning.
+// EYE_INERTIA: how fast the pupil chases the target each frame, 0.0-1.0.
+// Higher = snappier / less inertia, lower = slower / more lag.
+#define EYE_INERTIA 0.35f
+#define EYE_FRAME_MS 50 // eye animation/update interval (ms) -> ~20 fps
+#define EYE_RETURN_MS 3000 // return pupil to center after this idle time (ms)
+#define EYE_MAX_OFFSET 7 // max pupil travel from center (px)
+#define EYE_BLINK_MIN_MS 3000
+#define EYE_BLINK_MAX_MS 5000
+#define EYE_BLINK_DURATION_MS 120
+
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN GP0
+#define SERIAL_USART_RX_PIN GP1
+
+#define VBUS_SENSE GP12
+
+#define OLED_TIMEOUT 0
+#define CUSTOM_OLED_TIMEOUT 10000
+#define DIODE_DIRECTION COL2ROW
+
+#define ANALOG_JOYSTICK_X_AXIS_PIN GP14
+#define ANALOG_JOYSTICK_Y_AXIS_PIN GP15
+#define ANALOG_JOYSTICK_SPEED_REGULATOR 15
+
+#ifdef RGBLIGHT_ENABLE
+ #define WS2812_DI_PIN GP13
+ #define WS2812_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the WS2812 implementation uses the PIO0 peripheral
+
+ #define RGBLIGHT_EFFECT_BREATHING
+ #define RGBLIGHT_EFFECT_RAINBOW_MOOD
+ #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+ #define RGBLIGHT_EFFECT_SNAKE
+ #define RGBLIGHT_EFFECT_KNIGHT
+ #define RGBLIGHT_EFFECT_CHRISTMAS
+ #define RGBLIGHT_EFFECT_STATIC_GRADIENT
+ #define RGBLIGHT_EFFECT_RGB_TEST
+ #define RGBLIGHT_EFFECT_ALTERNATING
+ #define RGBLIGHT_EFFECT_TWINKLE
+
+ #define RGBLIGHT_LED_COUNT 16
+
+ #define RGBLED_SPLIT { 8, 8 }
+
+ #define RGBLIGHT_LIMIT_VAL 120
+ #define RGBLIGHT_HUE_STEP 10
+ #define RGBLIGHT_SAT_STEP 17
+ #define RGBLIGHT_VAL_STEP 17
+#endif
diff --git a/keyboards/kbdksp/iteung/config_rp2040.h b/keyboards/kbdksp/iteung/config_rp2040.h
new file mode 100644
index 00000000000..8e7312e6d15
--- /dev/null
+++ b/keyboards/kbdksp/iteung/config_rp2040.h
@@ -0,0 +1,75 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+/* ---------------------------
+ * RP2040 OLED Configuration
+ * ---------------------------
+ */
+#define I2C1_CLOCK_SPEED 400000
+#define OLED_UPDATE_INTERVAL 1
+#define OLED_I2C_TIMEOUT 1
+
+/* ---------------------------
+ * RP2040 Split Configuration
+ * ---------------------------
+ */
+#define SPLIT_WPM_ENABLE
+
+/* ---------------------------
+ * RP2040 Debounce
+ * ---------------------------
+ */
+#undef DEBOUNCE
+#define DEBOUNCE 10
+
+/* ---------------------------
+ * RP2040 RGB Configuration
+ * ---------------------------
+ */
+#ifdef RGB_MATRIX_ENABLE
+ #define ENABLE_RGB_MATRIX_ALPHAS_MODS
+ #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+ #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+ #define ENABLE_RGB_MATRIX_BREATHING
+ #define ENABLE_RGB_MATRIX_BAND_SAT
+ #define ENABLE_RGB_MATRIX_BAND_VAL
+ #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+ #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+ #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+ #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+ #define ENABLE_RGB_MATRIX_CYCLE_ALL
+ #define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+ #define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+ #define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+ #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+ #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+ #define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+ #define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+ #define ENABLE_RGB_MATRIX_DUAL_BEACON
+ #define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+ #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+ #define ENABLE_RGB_MATRIX_RAINDROPS
+ #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+ #define ENABLE_RGB_MATRIX_HUE_BREATHING
+ #define ENABLE_RGB_MATRIX_HUE_PENDULUM
+ #define ENABLE_RGB_MATRIX_HUE_WAVE
+ #define ENABLE_RGB_MATRIX_PIXEL_RAIN
+ #define ENABLE_RGB_MATRIX_PIXEL_FLOW
+ #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+ #define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+ #define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+ #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+ #define ENABLE_RGB_MATRIX_SPLASH
+ #define ENABLE_RGB_MATRIX_MULTISPLASH
+ #define ENABLE_RGB_MATRIX_SOLID_SPLASH
+ #define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/iteung/fonts/glcdfont.c b/keyboards/kbdksp/iteung/fonts/glcdfont.c
new file mode 100755
index 00000000000..fd84399afb5
--- /dev/null
+++ b/keyboards/kbdksp/iteung/fonts/glcdfont.c
@@ -0,0 +1,244 @@
+ /* Copyright 2020 sendyyeah
+ *
+ * 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 "progmem.h"
+
+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, 0x66, 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, 0x5E, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+ 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x26, 0x16, 0x08, 0x34, 0x32, 0x00,
+ 0x36, 0x4A, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x3C, 0x42, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x3C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0xA0, 0x60, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x00, 0x44, 0x7E, 0x40, 0x00, 0x00,
+ 0x64, 0x52, 0x52, 0x52, 0x4C, 0x00,
+ 0x22, 0x42, 0x4A, 0x4A, 0x36, 0x00,
+ 0x38, 0x24, 0x22, 0x7E, 0x20, 0x00,
+ 0x2E, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x3C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x62, 0x1A, 0x06, 0x00,
+ 0x34, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x4C, 0x52, 0x52, 0x52, 0x3C, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x00, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x00, 0x22, 0x14, 0x08, 0x00,
+ 0x00, 0x04, 0x52, 0x0A, 0x04, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x12, 0x12, 0x7C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x34, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x42, 0x00,
+ 0x7E, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x4A, 0x4A, 0x4A, 0x4A, 0x00,
+ 0x7E, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
+ 0x3C, 0x42, 0x42, 0x52, 0x72, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x7E, 0x00,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x42, 0x3E, 0x00, 0x00,
+ 0x7E, 0x10, 0x08, 0x14, 0x62, 0x00,
+ 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7E, 0x04, 0x08, 0x04, 0x7E, 0x00,
+ 0x7E, 0x04, 0x08, 0x10, 0x7E, 0x00,
+ 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00,
+ 0x7E, 0x12, 0x12, 0x12, 0x0C, 0x00,
+ 0x3C, 0x42, 0x52, 0x22, 0x5C, 0x00,
+ 0x7C, 0x12, 0x12, 0x32, 0x5E, 0x00,
+ 0x4C, 0x4A, 0x4A, 0x4A, 0x32, 0x00,
+ 0x02, 0x02, 0x7E, 0x02, 0x02, 0x00,
+ 0x3E, 0x40, 0x40, 0x40, 0x3E, 0x00,
+ 0x1E, 0x20, 0x40, 0x20, 0x1E, 0x00,
+ 0x3E, 0x40, 0x38, 0x40, 0x3E, 0x00,
+ 0x62, 0x14, 0x08, 0x14, 0x62, 0x00,
+ 0x06, 0x08, 0x70, 0x08, 0x06, 0x00,
+ 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00,
+ 0x00, 0x7E, 0x42, 0x42, 0x00, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x00, 0x42, 0x42, 0x7E, 0x00,
+ 0x08, 0x04, 0x02, 0x04, 0x08, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x00, 0x06, 0x0A, 0x00, 0x00,
+ 0x60, 0x54, 0x54, 0x54, 0x7C, 0x00,
+ 0x7E, 0x48, 0x48, 0x48, 0x30, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x48, 0x00,
+ 0x30, 0x48, 0x48, 0x48, 0x7E, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x58, 0x00,
+ 0x00, 0x08, 0x7C, 0x0A, 0x00, 0x00,
+ 0x98, 0xA4, 0xA4, 0xA4, 0x78, 0x00,
+ 0x7E, 0x08, 0x08, 0x08, 0x70, 0x00,
+ 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3A, 0x00, 0x00,
+ 0x7E, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x7E, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x04, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0xFC, 0x24, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x24, 0xFC, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x00, 0x04, 0x7E, 0x44, 0x00, 0x00,
+ 0x3C, 0x40, 0x40, 0x40, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x5C, 0xA0, 0xA0, 0xA0, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x7E, 0xFF, 0x81, 0xBF, 0xBF, 0xBF,
+ 0xBF, 0xF9, 0xF7, 0x8F, 0xF7, 0xF9,
+ 0xFF, 0x83, 0xED, 0xED, 0xCD, 0xA3,
+ 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0x81, 0xB5, 0xB5, 0xB5, 0xCB,
+ 0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xC3,
+ 0xFF, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFE, 0x01, 0x61, 0xF1, 0xF9, 0xFD,
+ 0x61, 0xF1, 0xF9, 0xFD, 0x01, 0xFE,
+ 0xFE, 0x01, 0xFD, 0xF9, 0xF1, 0x61,
+ 0xFD, 0xF9, 0xF1, 0x61, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0x01, 0x61,
+ 0xF1, 0xF9, 0xFD, 0x01, 0x01, 0xFE,
+ 0xFE, 0x01, 0x01, 0xFD, 0xF9, 0xF1,
+ 0x61, 0x01, 0xFD, 0x01, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF0, 0x08, 0x04, 0xC4, 0x24, 0x24,
+ 0x24, 0xC4, 0x04, 0x08, 0xF0, 0x00,
+ 0xF0, 0xF8, 0xFC, 0x3C, 0xDC, 0xDC,
+ 0xDC, 0x3C, 0xFC, 0xF8, 0xF0, 0x00,
+ 0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
+ 0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
+ 0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
+ 0xF6, 0xEE, 0xFE, 0xFE, 0xFC, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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, 0x81, 0xEF, 0xF7, 0xEB, 0x9D,
+ 0xFF, 0xB3, 0xB5, 0xB5, 0xB5, 0xCD,
+ 0xFF, 0x81, 0xED, 0xED, 0xED, 0xF3,
+ 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x08, 0x09, 0x0B,
+ 0x08, 0x08, 0x09, 0x0B, 0x08, 0x07,
+ 0x07, 0x08, 0x0B, 0x09, 0x08, 0x08,
+ 0x0B, 0x09, 0x08, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x08, 0x08,
+ 0x08, 0x09, 0x0B, 0x08, 0x08, 0x07,
+ 0x07, 0x08, 0x08, 0x0B, 0x09, 0x08,
+ 0x08, 0x08, 0x0B, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x10, 0x13, 0x11, 0x11,
+ 0x11, 0x13, 0x10, 0x08, 0x07, 0x00,
+ 0x07, 0x0F, 0x1F, 0x1C, 0x1E, 0x1E,
+ 0x1E, 0x1C, 0x1F, 0x0F, 0x07, 0x00,
+ 0xFE, 0x01, 0xF1, 0xF9, 0xFD, 0xFD,
+ 0x05, 0x05, 0x09, 0xF1, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x06, 0x3F,
+ 0x3F, 0x06, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x18, 0x3F,
+ 0x3F, 0x18, 0x08, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x1C, 0x22, 0x41, 0x7F, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x10, 0x18, 0x1C, 0x18, 0x10, 0x00,
+ 0x1C, 0x3E, 0x3E, 0x22, 0x1C, 0x00,
+ 0x04, 0x0C, 0x1C, 0x0C, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x08, 0x08, 0x09, 0x0B, 0x0B,
+ 0x0A, 0x0A, 0x09, 0x08, 0x08, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/keyboards/kbdksp/iteung/halconf.h b/keyboards/kbdksp/iteung/halconf.h
new file mode 100644
index 00000000000..3050c616a71
--- /dev/null
+++ b/keyboards/kbdksp/iteung/halconf.h
@@ -0,0 +1,9 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_ADC TRUE
+
+#include_next
diff --git a/keyboards/kbdksp/iteung/jpe230.h b/keyboards/kbdksp/iteung/jpe230.h
new file mode 100644
index 00000000000..58dc5d8cd22
--- /dev/null
+++ b/keyboards/kbdksp/iteung/jpe230.h
@@ -0,0 +1,30 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+bool shift_pressed;
+bool alt_pressed;
+bool ctrl_pressed;
+bool gui_pressed;
+
+/* ---------------------------
+ * Eye gaze target (right-half OLED)
+ * ---------------------------
+ * Range -100..100. On the master these are computed from the last keypress;
+ * they are then pushed to the slave over RPC_ID_KB_EYE_SYNC. The slave eases
+ * the rendered pupil toward this target.
+ */
+extern int8_t g_eye_tx;
+extern int8_t g_eye_ty;
+
+/* ---------------------------
+ * Custom OLED Fncs Prototypes
+ * ---------------------------
+ */
+void render_slave_oled(void);
+void render_master_oled(void);
+void oled_timer_reset(void);
+void set_keylog(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/kbdksp/iteung/keyboard.json b/keyboards/kbdksp/iteung/keyboard.json
new file mode 100644
index 00000000000..ed24a250ebd
--- /dev/null
+++ b/keyboards/kbdksp/iteung/keyboard.json
@@ -0,0 +1,140 @@
+{
+ "keyboard_name": "Iteung",
+ "manufacturer": "KBDKSP",
+ "url": "tokopedia.com/kbdksp",
+ "maintainer": "Sendy ",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x7370",
+ "pid": "0x0287",
+ "device_version": "1.1.0"
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": ["GP29", "GP28", "GP15", "GP26", "GP27", "GP14"],
+ "cols": ["GP9", "GP8", "GP7", "GP4", "GP5", "GP6"]
+ },
+ "build": {
+ "lto": true
+ },
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "oled": true,
+ "encoder": true,
+ "wpm": true
+ },
+ "encoder": {
+ "enabled": true,
+ "rotary": [
+ {"pin_a": "GP10", "pin_b": "GP11" }
+ ],
+ "resolution": 1
+ },
+ "split": {
+ "enabled": true,
+ "encoder": {
+ "right": {
+ "rotary": [
+ {"pin_a": "GP10", "pin_b": "GP11", "resolution": 1}
+ ]
+ }
+ }
+ },
+ "layouts": {
+ "LAYOUT_split_4x6": {
+ "layout": [
+
+ {"matrix":[0, 0], "x":0, "y":0.5},
+ {"matrix":[0, 1], "x":1, "y":0.5},
+ {"matrix":[0, 2], "x":2, "y":0.35000000000000003},
+ {"matrix":[0, 3], "x":3, "y":0.2},
+ {"matrix":[0, 4], "x":4, "y":0.35000000000000003},
+ {"matrix":[0, 5], "x":5, "y":0.5},
+
+ {"matrix":[6, 5], "x":9, "y":0.5},
+ {"matrix":[6, 4], "x":10, "y":0.25000000000000006},
+ {"matrix":[6, 3], "x":11, "y":0.2},
+ {"matrix":[6, 2], "x":12, "y":0.35000000000000003},
+ {"matrix":[6, 1], "x":13, "y":0.5},
+ {"matrix":[6, 0], "x":14, "y":0.5},
+
+
+
+ {"matrix":[1, 0], "x":0, "y":1.5},
+ {"matrix":[1, 1], "x":1, "y":1.5},
+ {"matrix":[1, 2], "x":2, "y":1.35},
+ {"matrix":[1, 3], "x":3, "y":1.2},
+ {"matrix":[1, 4], "x":4, "y":1.35},
+ {"matrix":[1, 5], "x":5, "y":1.5},
+
+ {"matrix":[7, 5], "x":9, "y":1.5},
+ {"matrix":[7, 4], "x":10, "y":1.25},
+ {"matrix":[7, 3], "x":11, "y":1.2},
+ {"matrix":[7, 2], "x":12, "y":1.35},
+ {"matrix":[7, 1], "x":13, "y":1.5},
+ {"matrix":[7, 0], "x":14, "y":1.5},
+
+
+
+ {"matrix":[2, 0], "x":0, "y":2.5},
+ {"matrix":[2, 1], "x":1, "y":2.5},
+ {"matrix":[2, 2], "x":2, "y":2.35},
+ {"matrix":[2, 3], "x":3, "y":2.2},
+ {"matrix":[2, 4], "x":4, "y":2.35},
+ {"matrix":[2, 5], "x":5, "y":2.5},
+
+ {"matrix":[4, 5], "x":6.25, "y":2.0},
+ {"matrix":[10, 5], "x":7.75, "y":2.0},
+
+ {"matrix":[8, 5], "x":9, "y":2.5},
+ {"matrix":[8, 4], "x":10, "y":2.35},
+ {"matrix":[8, 3], "x":11, "y":2.2},
+ {"matrix":[8, 2], "x":12, "y":2.35},
+ {"matrix":[8, 1], "x":13, "y":2.5},
+ {"matrix":[8, 0], "x":14, "y":2.5},
+
+
+
+ {"matrix":[3, 0], "x":0, "y":3.5},
+ {"matrix":[3, 1], "x":1, "y":3.5},
+ {"matrix":[3, 2], "x":2, "y":3.35},
+ {"matrix":[3, 3], "x":3, "y":3.2},
+ {"matrix":[3, 4], "x":4, "y":3.35},
+ {"matrix":[3, 5], "x":5, "y":3.5},
+
+ {"matrix":[5, 4], "x":6.25, "y":3.0, "w":0.5},
+ {"matrix":[5, 5], "x":6.75, "y":3.0, "w":0.5},
+
+ {"matrix":[11, 5], "x":7.75, "y":3.0, "w":0.5},
+ {"matrix":[11, 4], "x":8.25, "y":3.0, "w":0.5},
+
+ {"matrix":[9, 5], "x":9, "y":3.5},
+ {"matrix":[9, 4], "x":10, "y":3.35},
+ {"matrix":[9, 3], "x":11, "y":3.2},
+ {"matrix":[9, 2], "x":12, "y":3.35},
+ {"matrix":[9, 1], "x":13, "y":3.5},
+ {"matrix":[9, 0], "x":14, "y":3.5},
+
+
+
+ {"matrix":[4, 0], "x":1.75, "y":4.5},
+ {"matrix":[4, 1], "x":2.75, "y":4.3500000000000005},
+ {"matrix":[4, 2], "x":3.75, "y":4.3500000000000005},
+ {"matrix":[4, 3], "x":0, "y":16.35},
+ {"matrix":[4, 4], "x":0.1, "y":17.1, "h":1.5},
+
+ {"matrix":[10, 4], "x":4.25, "y":26.1, "h":1.5},
+ {"matrix":[10, 3], "x":7.5, "y":25.1},
+ {"matrix":[10, 2], "x":10.25, "y":4.3500000000000005},
+ {"matrix":[10, 1], "x":11, "y":9.85},
+ {"matrix":[10, 0], "x":11.75, "y":15.35}
+ ]
+ }
+ }
+}
diff --git a/keyboards/kbdksp/iteung/keymaps/vial/config.h b/keyboards/kbdksp/iteung/keymaps/vial/config.h
new file mode 100644
index 00000000000..2ed9432399f
--- /dev/null
+++ b/keyboards/kbdksp/iteung/keymaps/vial/config.h
@@ -0,0 +1,70 @@
+/* Copyright 2023 sendz
+ *
+ * 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 .
+ */
+
+// clang-format off
+
+#pragma once
+
+// Vial Support
+#define VIAL_KEYBOARD_UID {0x6C, 0x4E, 0xA2, 0x1E, 0x08, 0xE7, 0xF3, 0x09}
+
+#define VIAL_ENCODER_DEFAULT { \
+ KC_VOLU, KC_VOLD, \
+ KC_PGUP, KC_PGDN, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS \
+}
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 10
+
+/* ---------------------------
+ * Common Spit Configuration
+ * ---------------------------
+ */
+#define SPLIT_OLED_ENABLE
+
+/* ---------------------------
+ * Common Bootmagic Lite
+ * ---------------------------
+ */
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
+
+/* ---------------------------
+ * Common RGB Configuration
+ * ---------------------------
+ */
+#ifdef RGB_MATRIX_ENABLE
+ #define RGB_DISABLE_WHEN_USB_SUSPENDED
+ #define RGB_DISABLE_TIMEOUT CUSTOM_OLED_TIMEOUT
+ #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 128
+ #define RGB_MATRIX_DEFAULT_HUE 215
+ #define RGB_MATRIX_DEFAULT_SAT 255
+ #define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
+#endif
+
+/* ---------------------------
+ * Common other Configuration
+ * ---------------------------
+ */
+#define ENABLE_COMPILE_KEYCODE
+
+#define VIAL_UNLOCK_COMBO_ROWS { 0, 0 }
+#define VIAL_UNLOCK_COMBO_COLS { 0, 3 }
diff --git a/keyboards/kbdksp/iteung/keymaps/vial/keymap.c b/keyboards/kbdksp/iteung/keymaps/vial/keymap.c
new file mode 100644
index 00000000000..f73884cf1f9
--- /dev/null
+++ b/keyboards/kbdksp/iteung/keymaps/vial/keymap.c
@@ -0,0 +1,125 @@
+/* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ * Modification for Vial support by Drew Petersen
+ *
+ * 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 .
+ */
+
+// clang-format off
+
+#include
+char wpm_str[10];
+#include QMK_KEYBOARD_H
+
+// Default keymap. This can be changed in Vial. Use oled.c to change beavior that Vial cannot change.
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[0] = LAYOUT_split_4x6(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_MUTE, XXXXXXX,KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL, MO(1), KC_SPC, KC_ENT, MO(2), KC_MINS, KC_EQL, KC_RGUI
+),
+/* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[1] = LAYOUT_split_4x6(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_GRV, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, _______, _______,
+ _______, _______, RGB_TOG, RGB_MOD, RGB_VAI, _______, _______, _______,KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______,
+ KC_CAPS, _______, _______, RGB_RMOD,RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/* RAISE
+ * ,----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[2] = LAYOUT_split_4x6(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_INS, KC_PSCR, KC_APP,XXXXXXX, XXXXXXX, KC_PGUP, _______, KC_UP, _______, _______, KC_BSPC,
+ _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
+ _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE,XXXXXXX, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/*
+ * COLEMAK
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[3] = LAYOUT_split_4x6(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_MUTE, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, _______, _______, _______, _______, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI, KC_LALT, KC_LCTL, KC_TRNS, KC_ENT, KC_SPC, KC_TRNS, KC_RCTL, KC_RALT, KC_RGUI
+),
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_WH_D, KC_WH_U) },
+ [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+ [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
+};
+#endif
diff --git a/keyboards/kbdksp/iteung/keymaps/vial/rules.mk b/keyboards/kbdksp/iteung/keymaps/vial/rules.mk
new file mode 100644
index 00000000000..8c9cbd98a86
--- /dev/null
+++ b/keyboards/kbdksp/iteung/keymaps/vial/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_INSECURE = yes
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/kbdksp/iteung/keymaps/vial/vial.json b/keyboards/kbdksp/iteung/keymaps/vial/vial.json
new file mode 100644
index 00000000000..98d0f87c577
--- /dev/null
+++ b/keyboards/kbdksp/iteung/keymaps/vial/vial.json
@@ -0,0 +1,460 @@
+{
+ "name": "Iteung",
+ "vendorId": "0x7370",
+ "productId": "0x0287",
+ "lighting": "qmk_rgblight",
+ "matrix": { "rows": 12, "cols": 6 },
+ "layouts": {
+ "keymap": [
+ [
+ {
+ "y": 0.19999999999999996,
+ "x": 3,
+ "p": "CHICKLET",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "0,3",
+ {
+ "x": 7
+ },
+ "6,3"
+ ],
+ [
+ {
+ "y": -0.95,
+ "x": 10
+ },
+ "6,4"
+ ],
+ [
+ {
+ "y": -0.9,
+ "x": 2
+ },
+ "0,2",
+ {
+ "x": 1
+ },
+ "0,4",
+ {
+ "x": 7
+ },
+ "6,2"
+ ],
+ [
+ {
+ "y": -0.85,
+ "c": "#aaaaaa",
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "0,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "0,1",
+ {
+ "x": 3
+ },
+ "0,5",
+ {
+ "x": 3
+ },
+ "6,5",
+ {
+ "x": 3
+ },
+ "6,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "6,0"
+ ],
+ [
+ {
+ "y": -0.5,
+ "x": 6.25,
+ "c": "#cccccc",
+ "f": 3,
+ "w": 0.5
+ },
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "0,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.5,
+ "w": 0.5
+ },
+ "1,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "w": 0.5
+ },
+ "1,0\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "y": -0.8,
+ "x": 3,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "1,3",
+ {
+ "x": 7
+ },
+ "7,3"
+ ],
+ [
+ {
+ "y": -0.95,
+ "x": 10
+ },
+ "7,4"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2
+ },
+ "1,2",
+ {
+ "x": 1
+ },
+ "1,4",
+ {
+ "x": 7
+ },
+ "7,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa"
+ },
+ "1,0",
+ {
+ "c": "#cccccc"
+ },
+ "1,1",
+ {
+ "x": 3
+ },
+ "1,5",
+ {
+ "a": 7,
+ "f": 6,
+ "w": 3,
+ "h": 2.75,
+ "d": true
+ },
+ "",
+ {
+ "a": 4,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "7,5",
+ {
+ "x": 3
+ },
+ "7,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "7,0"
+ ],
+ [
+ {
+ "y": -0.5,
+ "x": 6.25,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "4,5",
+ {
+ "x": 0.5
+ },
+ "9,5"
+ ],
+ [
+ {
+ "y": -0.7999999999999998,
+ "x": 3
+ },
+ "2,3",
+ {
+ "x": 7
+ },
+ "8,3"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "x": 2
+ },
+ "2,2",
+ {
+ "x": 1,
+ "n": true
+ },
+ "2,4",
+ {
+ "x": 5,
+ "n": true
+ },
+ "8,4",
+ {
+ "x": 1
+ },
+ "8,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "2,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,1",
+ {
+ "x": 3
+ },
+ "2,5",
+ {
+ "x": 3
+ },
+ "8,5",
+ {
+ "x": 3
+ },
+ "8,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "8,0"
+ ],
+ [
+ {
+ "y": -0.5,
+ "x": 6.25,
+ "c": "#cccccc",
+ "f": 3,
+ "w": 0.5
+ },
+ "5,4",
+ {
+ "w": 0.5
+ },
+ "5,5",
+ {
+ "x": 0.5,
+ "w": 0.5
+ },
+ "11,5",
+ {
+ "w": 0.5
+ },
+ "11,4"
+ ],
+ [
+ {
+ "y": -0.7999999999999998,
+ "x": 3,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "3,3",
+ {
+ "x": 7
+ },
+ "9,3"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "x": 2
+ },
+ "3,2",
+ {
+ "x": 1
+ },
+ "3,4",
+ {
+ "x": 5
+ },
+ "9,4",
+ {
+ "x": 1
+ },
+ "9,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "3,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "3,1",
+ {
+ "x": 3
+ },
+ "3,5",
+ {
+ "x": 3
+ },
+ "9,5",
+ {
+ "x": 3
+ },
+ "9,1",
+ {
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "9,0"
+ ],
+ [
+ {
+ "y": -0.15000000000000036,
+ "x": 2.75,
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "4,1",
+ "4,2",
+ {
+ "x": 5.5
+ },
+ "10,2"
+ ],
+ [
+ {
+ "y": -0.8499999999999996,
+ "x": 1.75
+ },
+ "4,0"
+ ],
+ [
+ {
+ "rx": 0.25,
+ "y": 4.35,
+ "x": 11
+ },
+ "10,1"
+ ],
+ [
+ {
+ "rx": 0.5,
+ "y": 4.5,
+ "x": 11.75
+ },
+ "10,0"
+ ],
+ [
+ {
+ "r": 15,
+ "rx": 5,
+ "ry": 4.5,
+ "c": "#777777"
+ },
+ "4,3"
+ ],
+ [
+ {
+ "r": 30,
+ "rx": 6.25,
+ "y": -0.25,
+ "x": 0.09999999999999964,
+ "c": "#aaaaaa",
+ "h": 1.5
+ },
+ "4,4"
+ ],
+ [
+ {
+ "r": -30,
+ "rx": 8.75,
+ "y": -0.25,
+ "x": -1.0999999999999996,
+ "f": 8,
+ "fa": [
+ 1
+ ],
+ "h": 1.5
+ },
+ "10,4"
+ ],
+ [
+ {
+ "r": -15,
+ "rx": 10,
+ "x": -1,
+ "c": "#777777",
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "10,3"
+ ]
+ ]
+ }
+}
diff --git a/keyboards/kbdksp/iteung/mcuconf.h b/keyboards/kbdksp/iteung/mcuconf.h
new file mode 100644
index 00000000000..293688396b8
--- /dev/null
+++ b/keyboards/kbdksp/iteung/mcuconf.h
@@ -0,0 +1,14 @@
+// Copyright 2022 Steven Karrmann (@skarrmann)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef RP_I2C_USE_I2C0
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C0 FALSE
+#define RP_I2C_USE_I2C1 TRUE
+
+#undef RP_ADC_USE_ADC1
+#define RP_ADC_USE_ADC1 TRUE
\ No newline at end of file
diff --git a/keyboards/kbdksp/iteung/oled/oled_handler.c b/keyboards/kbdksp/iteung/oled/oled_handler.c
new file mode 100644
index 00000000000..3f89d8d5dba
--- /dev/null
+++ b/keyboards/kbdksp/iteung/oled/oled_handler.c
@@ -0,0 +1,115 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#include "transactions.h"
+#ifdef OLED_ENABLE
+uint8_t logged_row;
+uint8_t logged_col;
+uint32_t oled_timer = 0;
+
+// Eye gaze target, shared with the slave OLED renderer (see jpe230.h).
+int8_t g_eye_tx = 0;
+int8_t g_eye_ty = 0;
+// Timestamp of the last keypress on the master, used to recenter the eye.
+static uint32_t eye_input_timer = 0;
+
+// Map a keypress (matrix position) to an eye gaze target.
+// Horizontal: derived from the key's physical column relative to board center.
+// Left half -> look left, right half -> look right.
+// Vertical: derived from the matrix row.
+// number row -> up, home row -> ~neutral, bottom row / thumbs -> down.
+// This reproduces: 6 -> up-right, n -> down-right, w -> left, b -> down-left.
+static void eye_set_target_from_key(keyrecord_t *record) {
+ uint8_t row = record->event.key.row; // logical row 0..11 (left 0-5, right 6-11)
+ uint8_t col = record->event.key.col; // 0..5
+ bool right = row >= 6;
+ uint8_t vis_row = row % 6; // 0 num, 1 top, 2 home, 3 bottom, 4/5 thumb
+
+ // Physical x across the whole board (0=far left .. 14=far right), center = 7.
+ // Left half: x = col (0..5). Right half: x = 14 - col (9..14).
+ int16_t phys_x = right ? (14 - (int16_t)col) : (int16_t)col;
+ int16_t tx = (phys_x - 7) * 100 / 7; // -100..100
+
+ int16_t ty;
+ switch (vis_row) {
+ case 0: ty = -100; break; // number row -> up
+ case 1: ty = -10; break; // top alpha -> ~neutral
+ case 2: ty = 25; break; // home row -> slightly down
+ case 3: ty = 80; break; // bottom row -> down
+ default: ty = 100; break; // thumb cluster -> down
+ }
+
+ if (tx > 100) tx = 100; else if (tx < -100) tx = -100;
+ g_eye_tx = (int8_t)tx;
+ g_eye_ty = (int8_t)ty;
+ eye_input_timer = timer_read32();
+}
+
+// Slave-side: receive the gaze target pushed by the master.
+static void eye_sync_handler(uint8_t in_buflen, const void *in_data, uint8_t out_buflen, void *out_data) {
+ if (in_buflen >= 2) {
+ const int8_t *d = (const int8_t *)in_data;
+ g_eye_tx = d[0];
+ g_eye_ty = d[1];
+ }
+}
+
+void keyboard_post_init_kb(void) {
+ transaction_register_rpc(RPC_ID_KB_EYE_SYNC, eye_sync_handler);
+ keyboard_post_init_user();
+}
+
+void housekeeping_task_kb(void) {
+ if (is_keyboard_master()) {
+ static uint32_t last_send = 0;
+ // Recenter the eye after a period of no typing.
+ if (timer_elapsed32(eye_input_timer) > EYE_RETURN_MS) {
+ g_eye_tx = 0;
+ g_eye_ty = 0;
+ }
+ if (timer_elapsed32(last_send) > 50) {
+ int8_t payload[2] = {g_eye_tx, g_eye_ty};
+ if (transaction_rpc_send(RPC_ID_KB_EYE_SYNC, sizeof(payload), payload)) {
+ last_send = timer_read32();
+ }
+ }
+ }
+ housekeeping_task_user();
+}
+
+__attribute__ ((weak)) void handle_oled_keypress(uint16_t keycode, keyrecord_t *record) {}
+
+__attribute__ ((weak)) oled_rotation_t rotate_master(oled_rotation_t rotation) {return rotation;}
+__attribute__ ((weak)) oled_rotation_t rotate_slave(oled_rotation_t rotation) {return rotation;}
+
+void oled_timer_reset(void) { oled_timer = timer_read32(); }
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+
+ if (!is_keyboard_master()) {
+ return rotate_slave(rotation);
+ }
+
+ return rotate_master(rotation);
+}
+
+
+void set_keylog(uint16_t keycode, keyrecord_t *record) {
+ logged_row = record->event.key.row;
+ logged_col = record->event.key.col;
+
+ eye_set_target_from_key(record);
+
+ handle_oled_keypress(keycode, record);
+}
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ render_master_oled();
+ } else {
+ render_slave_oled();
+ }
+ return false;
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/iteung/oled/rp2040/master/oled_master_handler.c b/keyboards/kbdksp/iteung/oled/rp2040/master/oled_master_handler.c
new file mode 100644
index 00000000000..41e76a44e94
--- /dev/null
+++ b/keyboards/kbdksp/iteung/oled/rp2040/master/oled_master_handler.c
@@ -0,0 +1,38 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+
+// static const char PROGMEM ICON_LAYER[] = {0x80, 0x81, 0x82, 0x83, 0};
+
+void render_master_oled(void) {
+ oled_on();
+
+ oled_write_P(PSTR(" KBD "), false);
+ oled_write_P(PSTR(" KSP "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ oled_write_P(PSTR(" ITE "), false);
+ oled_write_P(PSTR(" UNG "), false);
+
+ oled_write_ln_P(PSTR(""), false);
+ oled_write_P(PSTR("_____"), false);
+ oled_write_ln_P(PSTR(""), false);
+ oled_write_ln_P(PSTR(""), false);
+
+ char layer_string[8] = {0};
+ sprintf(layer_string, "LYR %d", get_highest_layer(layer_state));
+ oled_write(layer_string, false);
+
+ oled_write_ln_P(PSTR(""), false);
+
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_P(PSTR("CAPS "), led_usb_state.caps_lock);
+ oled_write_P(PSTR("SHIFT"), shift_pressed);
+ oled_write_P(PSTR("CTRL "), ctrl_pressed);
+ oled_write_P(PSTR("GUI "), gui_pressed);
+ oled_write_P(PSTR("ALT "), alt_pressed);
+}
+
+oled_rotation_t rotate_master(oled_rotation_t rotation) {return OLED_ROTATION_270;}
diff --git a/keyboards/kbdksp/iteung/oled/rp2040/slave/oled_slave_handler.c b/keyboards/kbdksp/iteung/oled/rp2040/slave/oled_slave_handler.c
new file mode 100644
index 00000000000..d466846a517
--- /dev/null
+++ b/keyboards/kbdksp/iteung/oled/rp2040/slave/oled_slave_handler.c
@@ -0,0 +1,200 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#include "transactions.h"
+#include
+#include
+#include
+
+/* ---------------------------------------------------------------------------
+ * Right-half (slave) OLED, rendered vertically (32 wide x 128 tall).
+ *
+ * [ animated eye ] pupil tracks the last typed key, blinks, recenters
+ * -----
+ * WPM
+ * 000 live WPM, never blanks (shows 000 when idle)
+ * -----
+ * RP "RP2040" stacked (only 5 chars fit per line)
+ * 2040
+ * 23C RP2040 internal die temperature
+ * ------------------------------------------------------------------------- */
+
+// Eye geometry (logical coordinates, in the rotated 32x128 frame).
+#define EYE_CX 16 // eye center x
+#define EYE_CY 19 // eye center y
+#define EYE_R 15 // eyeball radius
+#define EYE_PR 5 // pupil radius
+#define EYE_REGION_BOTTOM 38 // clear/redraw the eye within y = 0..EYE_REGION_BOTTOM
+
+// Text rows (8 px each). Rows 0..4 are the eye; rows 5..6 are a blank gap.
+#define ROW_DIV1 7
+#define ROW_WPM_LABEL 8
+#define ROW_WPM_VALUE 9
+#define ROW_DIV2 10
+#define ROW_RP1 11
+#define ROW_RP2 12
+#define ROW_TEMP 13
+
+/* ------------------------------ Temperature ------------------------------ */
+// RP2040 on-die temperature sensor is wired to ADC channel 4. ChibiOS does
+// not expose it through QMK's analog wrapper, so drive the ADC directly.
+
+static const ADCConfig adc_cfg = {0, 0, false};
+static const ADCConversionGroup adc_grp = {
+ false, // not circular (one-shot)
+ 1, // one channel
+ NULL, // end callback
+ NULL, // error callback
+ RP_ADC_CHTS, // channel mask: temperature sensor (CH4)
+};
+static adcsample_t adc_buf[1];
+static bool adc_started = false;
+
+static int read_temp_c(void) {
+ if (!adc_started) {
+ adcStart(&ADCD1, &adc_cfg);
+ adcRPEnableTS(&ADCD1);
+ adc_started = true;
+ }
+ adcConvert(&ADCD1, &adc_grp, adc_buf, 1);
+ // 12-bit sample over 3.3V reference; datasheet transfer function.
+ float voltage = adc_buf[0] * (3.3f / 4096.0f);
+ float temp_c = 27.0f - (voltage - 0.706f) / 0.001721f;
+ return (int)(temp_c + 0.5f);
+}
+
+/* --------------------------------- Eye ----------------------------------- */
+
+static float pupil_x = 0.0f; // current eased pupil offset (px)
+static float pupil_y = 0.0f;
+static bool blinking = false;
+static uint32_t blink_timer = 0; // time since last blink ended / started
+static uint32_t blink_len = EYE_BLINK_MIN_MS;
+
+static void eye_clear_region(void) {
+ for (uint8_t y = 0; y <= EYE_REGION_BOTTOM; y++) {
+ for (uint8_t x = 0; x < 32; x++) {
+ oled_write_pixel(x, y, false);
+ }
+ }
+}
+
+static void eye_draw(int16_t px, int16_t py, bool closed) {
+ eye_clear_region();
+
+ if (closed) {
+ // Closed eye: a short horizontal lid line.
+ for (uint8_t x = EYE_CX - 11; x <= EYE_CX + 11; x++) {
+ oled_write_pixel(x, EYE_CY, true);
+ oled_write_pixel(x, EYE_CY + 1, true);
+ }
+ return;
+ }
+
+ // Eyeball outline (ring).
+ for (int16_t y = -EYE_R; y <= EYE_R; y++) {
+ for (int16_t x = -EYE_R; x <= EYE_R; x++) {
+ int16_t d2 = x * x + y * y;
+ if (d2 <= EYE_R * EYE_R && d2 >= (EYE_R - 1) * (EYE_R - 1)) {
+ oled_write_pixel(EYE_CX + x, EYE_CY + y, true);
+ }
+ }
+ }
+
+ // Filled pupil, offset by the eased gaze.
+ int16_t cx = EYE_CX + px;
+ int16_t cy = EYE_CY + py;
+ for (int16_t y = -EYE_PR; y <= EYE_PR; y++) {
+ for (int16_t x = -EYE_PR; x <= EYE_PR; x++) {
+ if (x * x + y * y <= EYE_PR * EYE_PR) {
+ oled_write_pixel(cx + x, cy + y, true);
+ }
+ }
+ }
+}
+
+static void eye_update_and_draw(void) {
+ // Resolve the gaze target into a pixel offset, honoring optional inversion.
+ float tx = g_eye_tx / 100.0f * EYE_MAX_OFFSET;
+ float ty = g_eye_ty / 100.0f * EYE_MAX_OFFSET;
+#if EYE_INVERT_X
+ tx = -tx;
+#endif
+#if EYE_INVERT_Y
+ ty = -ty;
+#endif
+
+ // Inertia: ease the pupil toward the target.
+ pupil_x += (tx - pupil_x) * EYE_INERTIA;
+ pupil_y += (ty - pupil_y) * EYE_INERTIA;
+
+ // Blink scheduling (semi-random interval).
+ if (blinking) {
+ if (timer_elapsed32(blink_timer) > EYE_BLINK_DURATION_MS) {
+ blinking = false;
+ blink_timer = timer_read32();
+ blink_len = EYE_BLINK_MIN_MS + (rand() % (EYE_BLINK_MAX_MS - EYE_BLINK_MIN_MS + 1));
+ }
+ } else if (timer_elapsed32(blink_timer) > blink_len) {
+ blinking = true;
+ blink_timer = timer_read32();
+ }
+
+ eye_draw((int16_t)(pupil_x + (pupil_x >= 0 ? 0.5f : -0.5f)),
+ (int16_t)(pupil_y + (pupil_y >= 0 ? 0.5f : -0.5f)),
+ blinking);
+}
+
+/* ------------------------------- Render ---------------------------------- */
+
+void render_slave_oled(void) {
+ static uint32_t frame_timer = 0;
+ static uint32_t temp_timer = 0;
+ static int temp_c = 0;
+
+ oled_on(); // ever-present: never sleep the eye
+
+ if (timer_elapsed32(frame_timer) < EYE_FRAME_MS) {
+ return;
+ }
+ frame_timer = timer_read32();
+
+ eye_update_and_draw();
+
+ char buf[8];
+
+ // Section divider.
+ oled_set_cursor(0, ROW_DIV1);
+ oled_write_P(PSTR("-----"), false);
+
+ // WPM.
+ oled_set_cursor(0, ROW_WPM_LABEL);
+ oled_write_P(PSTR("WPM"), false);
+ snprintf(buf, sizeof(buf), "%03d", get_current_wpm());
+ oled_set_cursor(0, ROW_WPM_VALUE);
+ oled_write(buf, false);
+
+ // Section divider.
+ oled_set_cursor(0, ROW_DIV2);
+ oled_write_P(PSTR("-----"), false);
+
+ // RP2040 (stacked: "RP2040" does not fit in 5 chars per line).
+ oled_set_cursor(0, ROW_RP1);
+ oled_write_P(PSTR("RP"), false);
+ oled_set_cursor(0, ROW_RP2);
+ oled_write_P(PSTR("2040"), false);
+
+ // Temperature (refreshed ~1 Hz).
+ if (timer_elapsed32(temp_timer) > 1000 || temp_timer == 0) {
+ temp_c = read_temp_c();
+ temp_timer = timer_read32();
+ }
+ char tmp[8];
+ snprintf(tmp, sizeof(tmp), "%dC", temp_c);
+ snprintf(buf, sizeof(buf), "%-5s", tmp); // left-justify, pad to clear stale chars
+ oled_set_cursor(0, ROW_TEMP);
+ oled_write(buf, false);
+}
+
+oled_rotation_t rotate_slave(oled_rotation_t rotation) { return OLED_SLAVE_ROTATION; }
diff --git a/keyboards/kbdksp/iteung/process_record.c b/keyboards/kbdksp/iteung/process_record.c
new file mode 100644
index 00000000000..39ecda05f62
--- /dev/null
+++ b/keyboards/kbdksp/iteung/process_record.c
@@ -0,0 +1,63 @@
+// Copyright 2022 Jose Pablo Ramirez (@jpe230)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "jpe230.h"
+#ifdef OLED_ENABLE
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ oled_timer_reset();
+ set_keylog(keycode, record);
+
+ switch (keycode) {
+ case QK_BOOT:
+ // rgb_matrix_set_color_all(30, 0, 0);
+ // rgb_matrix_driver.flush();
+ oled_off();
+ return true;
+ }
+ }
+ return true;
+}
+
+void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
+switch (keycode) {
+ case KC_LSFT:
+ case KC_RSFT:
+ if (record->event.pressed) {
+ shift_pressed = true;
+ } else {
+ shift_pressed = false;
+ }
+ break;
+ case KC_LALT:
+ case KC_RALT:
+ if (record->event.pressed) {
+ alt_pressed = true;
+ } else {
+ alt_pressed = false;
+ }
+ break;
+ case KC_LCTL:
+ case KC_RCTL:
+ if (record->event.pressed) {
+ ctrl_pressed = true;
+ } else {
+ ctrl_pressed = false;
+ }
+ break;
+ case KC_LGUI:
+ case KC_RGUI:
+ if (record->event.pressed) {
+ gui_pressed = true;
+ } else {
+ gui_pressed = false;
+ }
+ break;
+ default:
+ gui_pressed = false;
+ ctrl_pressed = false;
+ alt_pressed = false;
+ shift_pressed = false;
+ }
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/kbdksp/iteung/rules.mk b/keyboards/kbdksp/iteung/rules.mk
new file mode 100644
index 00000000000..c6bdcba90f9
--- /dev/null
+++ b/keyboards/kbdksp/iteung/rules.mk
@@ -0,0 +1,18 @@
+# SPLIT_KEYBOARD = yes
+SERIAL_DRIVER = vendor
+
+OLED_DRIVER = ssd1306
+
+SRC += oled/oled_handler.c process_record.c
+
+DEBUG_MATRIX_SCAN_RATE_ENABLE = yes
+
+SRC += oled/rp2040/master/oled_master_handler.c \
+ oled/rp2040/slave/oled_slave_handler.c
+# POINTING_DEVICE_ENABLE = yes
+# POINTING_DEVICE_DRIVER = analog_joystick
+# ANALOG_DRIVER_REQUIRED = yes
+
+RGBLIGHT_ENABLE = yes
+RGBLIGHT_DRIVER = ws2812
+WS2812_DRIVER = vendor
diff --git a/keyboards/sendyyeah/euy40/config.h b/keyboards/sendyyeah/euy40/config.h
new file mode 100644
index 00000000000..b2e684aa731
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/config.h
@@ -0,0 +1,62 @@
+ /* Copyright 2022 sendyyeah
+ *
+ * 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 "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x5359
+#define PRODUCT_ID 0x4534
+#define DEVICE_VER 0x0001
+#define MANUFACTURER sendyyeah
+#define PRODUCT Euy40 Combo
+
+/* key matrix size */
+#define MATRIX_ROWS 16
+#define MATRIX_COLS 6
+
+/* Keyboard Matrix Assignments */
+#define MATRIX_ROW_PINS { F4, F5, F6, F7, B1, B3, B2, B6 }
+#define MATRIX_COL_PINS { D1, D0, D4, C6, D7, E6 }
+#define UNUSED_PINS
+
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+
+/*
+ * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
+ */
+#define SOFT_SERIAL_PIN D3 // or D1, D2, D3, E6
+
+/* encoder support */
+#define ENCODERS_PAD_A { B4 }
+#define ENCODERS_PAD_B { B5 }
+#define ENCODERS_PAD_A_RIGHT { B4 }
+#define ENCODERS_PAD_B_RIGHT { B5 }
+#define ENCODER_RESOLUTION 2
diff --git a/keyboards/sendyyeah/euy40/euy40.c b/keyboards/sendyyeah/euy40/euy40.c
new file mode 100644
index 00000000000..8f9fd8627b2
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/euy40.c
@@ -0,0 +1,17 @@
+ /* Copyright 2022 sendyyeah
+ *
+ * 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 "euy40.h"
diff --git a/keyboards/sendyyeah/euy40/euy40.h b/keyboards/sendyyeah/euy40/euy40.h
new file mode 100644
index 00000000000..9341da02ad1
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/euy40.h
@@ -0,0 +1,78 @@
+/* Copyright 2022 sendyyeah
+ *
+ * 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 "quantum.h"
+
+/* This is a shortcut to help you visually see your layout.
+ *
+ * The first section contains all of the arguments representing the physical
+ * layout of the board and position of the keys.
+ *
+ * The second converts the arguments into a two-dimensional array which
+ * represents the switch matrix.
+ */
+
+#define LAYOUT_ortho_macropad(\
+ L00, L10, L01, L11, L02, L12, L03, L13, L04, L14, L05, L15, R00, R10, R01, R11, \
+ L20, L30, L21, L31, L22, L32, L23, L33, L24, L34, L25, L35, R20, R30, R21, R31, \
+ L40, L50, L41, L51, L42, L52, L43, L53, L44, L54, L45, L55, R40, R50, R41, R51, \
+ L60, L70, L61, L71, L62, L72, L63, L73, L64, L74, L65, L75, R60, R70, R61, R71 \
+) \
+{ \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { L40, L41, L42, L43, L44, L45 }, \
+ { L50, L51, L52, L53, L54, L55 }, \
+ { L60, L61, L62, L63, L64, L65 }, \
+ { L70, L71, L72, L73, L74, L75 }, \
+ { R00, R01, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R10, R11, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R20, R21, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R30, R31, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R40, R41, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R50, R51, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R60, R61, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R70, R71, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
+
+#define LAYOUT_ortho_longboi(\
+ L00, L10, L01, L11, L02, L12, L03, L13, L04, L14, L05, L15, R00, R10, R01, R11, R02, R12, R03, R13, R04, R14, R05, R15, \
+ L20, L30, L21, L31, L22, L32, L23, L33, L24, L34, L25, L35, R20, R30, R21, R31, R22, R32, R23, R33, R24, R34, R25, R35, \
+ L40, L50, L41, L51, L42, L52, L43, L53, L44, L54, L45, L55, R40, R50, R41, R51, R42, R52, R43, R53, R44, R54, R45, R55, \
+ L60, L70, L61, L71, L62, L72, L63, L73, L64, L74, L65, L75, R60, R70, R61, R71, R62, R72, R63, R73, R64, R74, R65, R75 \
+) \
+{ \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { L40, L41, L42, L43, L44, L45 }, \
+ { L50, L51, L52, L53, L54, L55 }, \
+ { L60, L61, L62, L63, L64, L65 }, \
+ { L70, L71, L72, L73, L74, L75 }, \
+ { R00, R01, R02, R03, R04, R05 }, \
+ { R10, R11, R12, R13, R14, R15 }, \
+ { R20, R21, R22, R23, R24, R25 }, \
+ { R30, R31, R32, R33, R34, R35 }, \
+ { R40, R41, R42, R43, R44, R45 }, \
+ { R50, R51, R52, R53, R54, R55 }, \
+ { R60, R61, R62, R63, R64, R65 }, \
+ { R70, R71, R72, R73, R74, R75 }, \
+}
diff --git a/keyboards/sendyyeah/euy40/info.json b/keyboards/sendyyeah/euy40/info.json
new file mode 100644
index 00000000000..91625c27551
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/info.json
@@ -0,0 +1,10 @@
+{
+ "keyboard_name": "Euy40 Series",
+ "url": "",
+ "maintainer": "sendz",
+ "layouts": {
+ "LAYOUT_ortho_4x16": {
+ "layout": [{"label":"Tab", "x":0, "y":0}, {"label":"Q", "x":1, "y":0}, {"label":"W", "x":2, "y":0}, {"label":"E", "x":3, "y":0}, {"label":"R", "x":4, "y":0}, {"label":"T", "x":5, "y":0}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0}, {"label":"Back Space", "x":11, "y":0}, {"x":12.5, "y":0}, {"x":13.5, "y":0}, {"x":14.5, "y":0}, {"x":15.5, "y":0}, {"label":"Esc", "x":0, "y":1}, {"label":"A", "x":1, "y":1}, {"label":"S", "x":2, "y":1}, {"label":"D", "x":3, "y":1}, {"label":"F", "x":4, "y":1}, {"label":"G", "x":5, "y":1}, {"label":"H", "x":6, "y":1}, {"label":"J", "x":7, "y":1}, {"label":"K", "x":8, "y":1}, {"label":"L", "x":9, "y":1}, {"label":";", "x":10, "y":1}, {"label":"'", "x":11, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1}, {"x":14.5, "y":1}, {"x":15.5, "y":1}, {"label":"Shift", "x":0, "y":2}, {"label":"Z", "x":1, "y":2}, {"label":"X", "x":2, "y":2}, {"label":"C", "x":3, "y":2}, {"label":"V", "x":4, "y":2}, {"label":"B", "x":5, "y":2}, {"label":"N", "x":6, "y":2}, {"label":"M", "x":7, "y":2}, {"label":",", "x":8, "y":2}, {"label":".", "x":9, "y":2}, {"label":"/", "x":10, "y":2}, {"label":"Return", "x":11, "y":2}, {"x":12.5, "y":2}, {"x":13.5, "y":2}, {"x":14.5, "y":2}, {"x":15.5, "y":2}, {"x":0, "y":3}, {"label":"Ctrl", "x":1, "y":3}, {"label":"Alt", "x":2, "y":3}, {"label":"Super", "x":3, "y":3}, {"label":"⇓", "x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"label":"⇑", "x":7, "y":3}, {"label":"←", "x":8, "y":3}, {"label":"↓", "x":9, "y":3}, {"label":"↑", "x":10, "y":3}, {"label":"→", "x":11, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3}, {"x":15.5, "y":3}]
+ }
+ }
+}
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_longboi/config.h b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/config.h
new file mode 100644
index 00000000000..9cdc6a77d43
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/config.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0xBB, 0x25, 0x78, 0x78, 0xFD, 0x38, 0xB3, 0x6D}
+
+#define VIAL_ENCODER_DEFAULT { KC_VOLU, KC_VOLD, KC_PGUP, KC_PGDOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_longboi/keymap.c b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/keymap.c
new file mode 100644
index 00000000000..a59041f7e9a
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/keymap.c
@@ -0,0 +1,68 @@
+/* Copyright 2022 sendyyeah
+ *
+ * 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
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _QWERTY = 0,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_ortho_longboi(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_LCTL, KC_LALT, KC_LALT, KC_LGUI, _RAISE, _RAISE, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [_LOWER] = LAYOUT_ortho_longboi(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [_RAISE] = LAYOUT_ortho_longboi(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NLCK
+ )
+};
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code_delay(KC_VOLU, 10);
+ } else {
+ tap_code_delay(KC_VOLD, 10);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code_delay(KC_PGDOWN, 10);
+ } else {
+ tap_code_delay(KC_PGUP, 10);
+ }
+ }
+ return false;
+}
+
+#endif
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_longboi/rules.mk b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/rules.mk
new file mode 100644
index 00000000000..24842c64247
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_ENCODERS_ENABLE = yes
+VIAL_INSECURE = yes
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_longboi/vial.json b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/vial.json
new file mode 100644
index 00000000000..47de4d39e2c
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_longboi/vial.json
@@ -0,0 +1,225 @@
+{
+ "name": "Euy 40 Combo",
+ "vendorId": "0x5359",
+ "productId": "0x4534",
+ "lighting": "none",
+ "matrix": {
+ "rows": 16,
+ "cols": 12
+ },
+ "layouts": {
+ "keymap": [
+ {
+ "name": "Euy Combo Longboi"
+ },
+ [
+ {
+ "x": 2.25,
+ "c": "#aaaaaa"
+ },
+ "0,0",
+ {
+ "c": "#cccccc"
+ },
+ "1,0",
+ "0,1",
+ "1,1",
+ "0,2",
+ "1,2",
+ "0,3",
+ "1,3",
+ "0,4",
+ "1,4",
+ "0,5",
+ {
+ "c": "#aaaaaa"
+ },
+ "1,5",
+ {
+ "x": 3,
+ "c": "#cccccc"
+ },
+ "8,0",
+ "9,0",
+ "8,1",
+ "9,1",
+ "8,2",
+ "9,2",
+ "8,3",
+ "9,3",
+ "8,4",
+ "9,4",
+ "8,5",
+ "9,5"
+ ],
+ [
+ {
+ "x": 2.25,
+ "c": "#aaaaaa"
+ },
+ "2,0",
+ {
+ "c": "#cccccc"
+ },
+ "3,0",
+ "2,1",
+ "3,1",
+ "2,2",
+ "3,2",
+ "2,3",
+ "3,3",
+ "2,4",
+ "3,4",
+ "2,5",
+ "3,5",
+ {
+ "x": 3
+ },
+ "10,0",
+ "11,0",
+ "10,1",
+ "11,1",
+ "10,2",
+ "11,2",
+ "10,3",
+ "11,3",
+ "10,4",
+ "11,4",
+ "10,5",
+ "11,5"
+ ],
+ [
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ "0,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.25,
+ "c": "#aaaaaa"
+ },
+ "4,0",
+ {
+ "c": "#cccccc"
+ },
+ "5,0",
+ "4,1",
+ "5,1",
+ "4,2",
+ "5,2",
+ "4,3",
+ "5,3",
+ "4,4",
+ "5,4",
+ "4,5",
+ {
+ "c": "#aaaaaa"
+ },
+ "5,5",
+ {
+ "x": 0.75,
+ "c": "#cccccc"
+ },
+ "1,0\n\n\n\n\n\n\n\n\ne",
+ "1,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.25
+ },
+ "12,0",
+ "13,0",
+ "12,1",
+ "13,1",
+ "12,2",
+ "13,2",
+ "12,3",
+ "13,3",
+ "12,4",
+ "13,4",
+ "12,5",
+ "13,5"
+ ],
+ [
+ {
+ "x": 2.25,
+ "c": "#aaaaaa"
+ },
+ "6,0",
+ "7,0",
+ "6,1",
+ "7,1",
+ "6,2\n\n\n0,0",
+ {
+ "c": "#cccccc"
+ },
+ "7,2\n\n\n0,0",
+ "6,3\n\n\n0,0",
+ {
+ "c": "#aaaaaa"
+ },
+ "7,3\n\n\n0,0",
+ "6,4",
+ "7,4",
+ "6,5",
+ "7,5",
+ {
+ "x": 3,
+ "c": "#cccccc"
+ },
+ "14,0",
+ "15,0",
+ "14,1",
+ "15,1",
+ "14,2\n\n\n1,0",
+ "15,2\n\n\n1,0",
+ "14,3\n\n\n1,0",
+ "15,3\n\n\n1,0",
+ "14,4",
+ "15,4",
+ "14,5",
+ "15,5"
+ ],
+ [
+ {
+ "y": 0.25,
+ "x": 6.25
+ },
+ "6,2\n\n\n0,1",
+ {
+ "w": 2
+ },
+ "7,2\n\n\n0,1",
+ "7,3\n\n\n0,1",
+ {
+ "x": 11
+ },
+ "14,2\n\n\n1,1",
+ {
+ "w": 2
+ },
+ "15,2\n\n\n1,1",
+ "15,3\n\n\n1,1"
+ ],
+ [
+ {
+ "x": 6.25,
+ "w": 2
+ },
+ "6,2\n\n\n0,2",
+ {
+ "w": 2
+ },
+ "6,3\n\n\n0,2",
+ {
+ "x": 11,
+ "w": 2
+ },
+ "14,2\n\n\n1,2",
+ {
+ "w": 2
+ },
+ "14,3\n\n\n1,2"
+ ]
+ ],
+ "labels": [
+ ["Left Bottom Row", "All 1u", "2u Center", "2u + 2u Center"],
+ ["Right Bottom Row", "All 1u", "2u Center", "2u + 2u Center"]
+ ]
+ }
+}
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_macropad/config.h b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/config.h
new file mode 100644
index 00000000000..94189fdfdc2
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/config.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+
+/* Split hand configration */
+#define SPLIT_HAND_MATRIX_GRID D4, F4
+#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT
+
+#define VIAL_KEYBOARD_UID {0xBB, 0x25, 0x78, 0x78, 0xFD, 0x38, 0xB3, 0x6D}
+
+#define VIAL_ENCODER_DEFAULT { KC_VOLU, KC_VOLD, KC_PGUP, KC_PGDOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_macropad/keymap.c b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/keymap.c
new file mode 100644
index 00000000000..bd6db2b642f
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/keymap.c
@@ -0,0 +1,68 @@
+/* Copyright 2022 sendyyeah
+ *
+ * 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
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _QWERTY = 0,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_ortho_macropad(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PMNS,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LALT, KC_LALT, KC_LGUI, _RAISE, _RAISE, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_P0, KC_PDOT, KC_PSLS, KC_PAST
+ ),
+
+ [_LOWER] = LAYOUT_ortho_macropad(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, _______, _______, _______, _______,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, _______, _______,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, KC_NLCK
+ ),
+
+ [_RAISE] = LAYOUT_ortho_macropad(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______, _______, _______, _______,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, _______, _______, _______,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, KC_NLCK
+ )
+};
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code_delay(KC_VOLU, 10);
+ } else {
+ tap_code_delay(KC_VOLD, 10);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code_delay(KC_PGDOWN, 10);
+ } else {
+ tap_code_delay(KC_PGUP, 10);
+ }
+ }
+ return false;
+}
+
+#endif
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_macropad/rules.mk b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/rules.mk
new file mode 100644
index 00000000000..24842c64247
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+VIAL_ENCODERS_ENABLE = yes
+VIAL_INSECURE = yes
diff --git a/keyboards/sendyyeah/euy40/keymaps/combo_macropad/vial.json b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/vial.json
new file mode 100644
index 00000000000..d688c2cc985
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/combo_macropad/vial.json
@@ -0,0 +1,174 @@
+{
+ "name": "Euy 40 Combo",
+ "vendorId": "0x5359",
+ "productId": "0x4534",
+ "lighting": "none",
+ "matrix": {
+ "rows": 16,
+ "cols": 6
+ },
+ "layouts": {
+ "keymap": [
+ {
+ "name": "Euy Combo"
+ },
+ [
+ {
+ "x": 2.25,
+ "c": "#aaaaaa"
+ },
+ "0,0",
+ {
+ "c": "#cccccc"
+ },
+ "1,0",
+ "0,1",
+ "1,1",
+ "0,2",
+ "1,2",
+ "0,3",
+ "1,3",
+ "0,4",
+ "1,4",
+ "0,5",
+ {
+ "c": "#aaaaaa"
+ },
+ "1,5",
+ {
+ "x": 0.5,
+ "c": "#cccccc"
+ },
+ "8,0",
+ "9,0",
+ "8,1",
+ "9,1"
+ ],
+ [
+ {
+ "x": 2.25,
+ "c": "#aaaaaa"
+ },
+ "2,0",
+ {
+ "c": "#cccccc"
+ },
+ "3,0",
+ "2,1",
+ "3,1",
+ "2,2",
+ "3,2",
+ "2,3",
+ "3,3",
+ "2,4",
+ "3,4",
+ "2,5",
+ "3,5",
+ {
+ "x": 0.5
+ },
+ "10,0",
+ "11,0",
+ "10,1",
+ "11,1"
+ ],
+ [
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ "0,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.25,
+ "c": "#aaaaaa"
+ },
+ "4,0",
+ {
+ "c": "#cccccc"
+ },
+ "5,0",
+ "4,1",
+ "5,1",
+ "4,2",
+ "5,2",
+ "4,3",
+ "5,3",
+ "4,4",
+ "5,4",
+ "4,5",
+ {
+ "c": "#aaaaaa"
+ },
+ "5,5",
+ {
+ "x": 0.5,
+ "c": "#cccccc"
+ },
+ "12,0",
+ "13,0",
+ "12,1",
+ "13,1",
+ {
+ "x": 0.25
+ },
+ "1,0\n\n\n\n\n\n\n\n\ne",
+ "1,1\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "x": 2.25,
+ "c": "#aaaaaa"
+ },
+ "6,0",
+ "7,0",
+ "6,1",
+ "7,1",
+ "6,2\n\n\n0,0",
+ {
+ "c": "#cccccc"
+ },
+ "7,2\n\n\n0,0",
+ "6,3\n\n\n0,0",
+ {
+ "c": "#aaaaaa"
+ },
+ "7,3\n\n\n0,0",
+ "6,4",
+ "7,4",
+ "6,5",
+ "7,5",
+ {
+ "x": 0.5,
+ "c": "#cccccc"
+ },
+ "14,0",
+ "15,0",
+ "14,1",
+ "15,1"
+ ],
+ [
+ {
+ "y": 0.25,
+ "x": 6.25
+ },
+ "6,2\n\n\n0,1",
+ {
+ "w": 2
+ },
+ "7,2\n\n\n0,1",
+ "7,3\n\n\n0,1"
+ ],
+ [
+ {
+ "x": 6.25,
+ "w": 2
+ },
+ "6,2\n\n\n0,2",
+ {
+ "w": 2
+ },
+ "6,3\n\n\n0,2"
+ ]
+ ],
+ "labels": [
+ ["Bottom Row", "All 1u", "2u Center", "2u + 2u Center"]
+ ]
+ }
+}
diff --git a/keyboards/sendyyeah/euy40/keymaps/default/keymap.c b/keyboards/sendyyeah/euy40/keymaps/default/keymap.c
new file mode 100644
index 00000000000..5f1d1f4bb61
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/keymaps/default/keymap.c
@@ -0,0 +1,76 @@
+/* Copyright 2022 sendyyeah
+ *
+ * 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
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _QWERTY = 0,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_ortho_macropad(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PMNS,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LALT, KC_LALT, KC_LGUI, _RAISE, _RAISE, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_P0, KC_PDOT, KC_PSLS, KC_PAST
+ ),
+
+ [_LOWER] = LAYOUT_ortho_macropad(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, _______, _______, _______, _______,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, _______, _______,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, KC_NLCK
+ ),
+
+ [_RAISE] = LAYOUT_ortho_macropad(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______, _______, _______, _______,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, _______, _______, _______,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, KC_NLCK
+ ),
+
+
+ [_ADJUST] = LAYOUT_ortho_macropad(
+ _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , _______, _______, _______, _______,
+ _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NLCK
+ )
+};
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code_delay(KC_VOLU, 10);
+ } else {
+ tap_code_delay(KC_VOLD, 10);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code_delay(KC_PGDOWN, 10);
+ } else {
+ tap_code_delay(KC_PGUP, 10);
+ }
+ }
+ return false;
+}
+
+#endif
diff --git a/keyboards/sendyyeah/euy40/rules.mk b/keyboards/sendyyeah/euy40/rules.mk
new file mode 100644
index 00000000000..717cb5b9fd2
--- /dev/null
+++ b/keyboards/sendyyeah/euy40/rules.mk
@@ -0,0 +1,10 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+EXTRAKEY_ENABLE = yes # Audio control and System control
+SPLIT_KEYBOARD = yes
+LTO_ENABLE = yes
+ENCODER_ENABLE = yes
diff --git a/keyboards/sofle/keymaps/vial/config.h b/keyboards/sofle/keymaps/vial/config.h
new file mode 100644
index 00000000000..0cc40f6a5ad
--- /dev/null
+++ b/keyboards/sofle/keymaps/vial/config.h
@@ -0,0 +1,52 @@
+/* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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
+
+/* By default left side is selected as master,
+see https://docs.qmk.fm/#/feature_split_keyboard?id=setting-handedness
+for more options. */
+
+#if defined(KEYBOARD_sofle_rev1)
+// Add RGB underglow and top facing lighting
+# define WS2812_DI_PIN D3
+# define RGBLED_NUM 70
+# define RGBLED_SPLIT \
+ { 36, 36 }
+# ifdef RGB_MATRIX_ENABLE
+# define RGB_MATRIX_LED_COUNT RGBLED_NUM
+# define RGB_MATRIX_SPLIT RGBLED_SPLIT
+# define SPLIT_TRANSPORT_MIRROR
+# else
+# define RGBLIGHT_EFFECT_BREATHING
+# define RGBLIGHT_EFFECT_RAINBOW_MOOD
+# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+# define RGBLIGHT_EFFECT_SNAKE
+# define RGBLIGHT_EFFECT_KNIGHT
+# define RGBLIGHT_EFFECT_CHRISTMAS
+# define RGBLIGHT_EFFECT_STATIC_GRADIENT
+# define RGBLIGHT_EFFECT_RGB_TEST
+# define RGBLIGHT_EFFECT_ALTERNATING
+# define RGBLIGHT_EFFECT_TWINKLE
+# define RGBLIGHT_LIMIT_VAL 120
+# define RGBLIGHT_HUE_STEP 10
+# define RGBLIGHT_SAT_STEP 17
+# define RGBLIGHT_VAL_STEP 17
+# endif
+#endif
+
+#define VIAL_KEYBOARD_UID {0x25, 0xCF, 0x7A, 0xB8, 0xFD, 0xE3, 0xAA, 0x69}
diff --git a/keyboards/sofle/keymaps/vial/keymap.c b/keyboards/sofle/keymaps/vial/keymap.c
new file mode 100644
index 00000000000..21717a7a6c2
--- /dev/null
+++ b/keyboards/sofle/keymaps/vial/keymap.c
@@ -0,0 +1,119 @@
+ /* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 "oled.c"
+
+#ifdef ENCODER_MAP_ENABLE
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGDN, KC_PGUP) },
+ [1] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
+ [2] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
+ [3] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD)}
+};
+#endif
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[0] = LAYOUT(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, XXXXXXX,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL, MO(2), KC_ENT, KC_SPC, MO(3), KC_RCTL, KC_RALT, KC_RGUI
+),
+/*
+ * COLEMAK
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `-----------------------------------' '------''---------------------------'
+ */
+
+[1] = LAYOUT(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, XXXXXXX,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL,KC_TRNS, KC_ENT, KC_SPC, KC_TRNS, KC_RCTL, KC_RALT, KC_RGUI
+),
+/* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[2] = LAYOUT(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE,
+ _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/* RAISE
+ * ,----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| |--------| |-------| | LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[3] = LAYOUT(
+ _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______,
+ _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, _______, KC_UP, _______,_______, KC_BSPC,
+ _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
+ _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+)
+};
diff --git a/keyboards/sofle/keymaps/vial/oled.c b/keyboards/sofle/keymaps/vial/oled.c
new file mode 100644
index 00000000000..74f06cedc54
--- /dev/null
+++ b/keyboards/sofle/keymaps/vial/oled.c
@@ -0,0 +1,85 @@
+ /* Copyright 2020 Josef Adamcik
+ * Modification for VIA support and RGB underglow by Jens Bonk-Wiltfang
+ *
+ * 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 .
+ */
+
+//Sets up what the OLED screens display.
+
+#ifdef OLED_ENABLE
+
+static void render_logo(void) {
+ 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
+ };
+
+ oled_write_P(qmk_logo, false);
+}
+
+static void print_status_narrow(void) {
+ // Print current mode
+ oled_write_P(PSTR("\n\n"), false);
+
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ oled_write_ln_P(PSTR("Qwrt"), false);
+ break;
+ case 1:
+ oled_write_ln_P(PSTR("Clmk"), false);
+ break;
+ default:
+ oled_write_P(PSTR("Mod\n"), false);
+ break;
+ }
+ oled_write_P(PSTR("\n\n"), false);
+ // Print current layer
+ oled_write_ln_P(PSTR("LAYER"), false);
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ case 1:
+ oled_write_P(PSTR("Base\n"), false);
+ break;
+ case 2:
+ oled_write_P(PSTR("Raise"), false);
+ break;
+ case 3:
+ oled_write_P(PSTR("Lower"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("Undef"), false);
+ }
+ oled_write_P(PSTR("\n\n"), false);
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock);
+}
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (is_keyboard_master()) {
+ return OLED_ROTATION_270;
+ }
+ return rotation;
+}
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ print_status_narrow();
+ } else {
+ render_logo();
+ }
+ return false;
+}
+
+#endif
diff --git a/keyboards/sofle/keymaps/vial/readme.md b/keyboards/sofle/keymaps/vial/readme.md
new file mode 100644
index 00000000000..8470c69bcfb
--- /dev/null
+++ b/keyboards/sofle/keymaps/vial/readme.md
@@ -0,0 +1,14 @@
+# VIA keymap for Sofle
+
+Layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/gists/76efb423a46cbbea75465cb468eef7ff) and [adjust layer](http://www.keyboard-layout-editor.com/#/gists/4bcf66f922cfd54da20ba04905d56bd4)
+
+
+Features:
+
+- Symmetric modifiers (CMD/Super, Alt/Opt, Ctrl, Shift)
+- Modes for Qwerty and Colemak support
+- The OLED on master half shows selected mode and caps lock state and is rotated.
+- Left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN.
+- Via support
+- RGB underglow support
+
diff --git a/keyboards/sofle/keymaps/vial/rules.mk b/keyboards/sofle/keymaps/vial/rules.mk
new file mode 100644
index 00000000000..5ad6ac7bb74
--- /dev/null
+++ b/keyboards/sofle/keymaps/vial/rules.mk
@@ -0,0 +1,10 @@
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306
+ENCODER_ENABLE = yes
+CONSOLE_ENABLE = no
+EXTRAKEY_ENABLE = yes
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+LTO_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/sofle/keymaps/vial/vial.json b/keyboards/sofle/keymaps/vial/vial.json
new file mode 100644
index 00000000000..7f164b8beb4
--- /dev/null
+++ b/keyboards/sofle/keymaps/vial/vial.json
@@ -0,0 +1,437 @@
+{
+ "name": "Sofle",
+ "vendorId": "0xFC32",
+ "productId": "0x0287",
+ "keycodes": ["qmk_lighting"],
+ "menus": ["qmk_rgblight"],
+ "matrix": {"rows": 10, "cols": 6},
+ "layouts": {
+ "keymap": [
+ [
+ {
+ "y": 0.2,
+ "x": 3,
+ "p": "CHICKLET",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "0,3",
+ {
+ "x": 7
+ },
+ "5,3"
+ ],
+ [
+ {
+ "y": -0.95,
+ "x": 10
+ },
+ "5,4"
+ ],
+ [
+ {
+ "y": -0.9,
+ "x": 2
+ },
+ "0,2",
+ {
+ "x": 1
+ },
+ "0,4",
+ {
+ "x": 7
+ },
+ "5,2"
+ ],
+ [
+ {
+ "y": -0.85,
+ "c": "#aaaaaa",
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "0,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "0,1",
+ {
+ "x": 3
+ },
+ "0,5",
+ {
+ "x": 3
+ },
+ "5,5",
+ {
+ "x": 3
+ },
+ "5,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "5,0"
+ ],
+ [
+ {
+ "y": -0.30000000000000004,
+ "x": 3,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "1,3",
+ {
+ "x": 7
+ },
+ "6,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25,
+ "f": 3
+ },
+ "0,0\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.5
+ },
+ "1,0\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "y": -0.9999999999999998,
+ "x": 10,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "6,4"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2
+ },
+ "1,2",
+ {
+ "x": 1
+ },
+ "1,4",
+ {
+ "x": 7
+ },
+ "6,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa"
+ },
+ "1,0",
+ {
+ "c": "#cccccc"
+ },
+ "1,1",
+ {
+ "x": 3
+ },
+ "1,5",
+ {
+ "x": 3
+ },
+ "6,5",
+ {
+ "x": 3
+ },
+ "6,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "6,0"
+ ],
+ [
+ {
+ "y": -0.2999999999999998,
+ "x": 3,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,3",
+ {
+ "x": 7
+ },
+ "7,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25,
+ "f": 3
+ },
+ "0,1\n\n\n\n\n\n\n\n\ne",
+ {
+ "x": 0.5
+ },
+ "1,1\n\n\n\n\n\n\n\n\ne"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2,
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,2",
+ {
+ "x": 1,
+ "n": true
+ },
+ "2,4",
+ {
+ "x": 5,
+ "n": true
+ },
+ "7,4",
+ {
+ "x": 1
+ },
+ "7,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "2,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "2,1",
+ {
+ "x": 3
+ },
+ "2,5",
+ {
+ "x": 3
+ },
+ "7,5",
+ {
+ "x": 3
+ },
+ "7,1",
+ {
+ "c": "#aaaaaa",
+ "f": 6,
+ "fa": [
+ 1
+ ]
+ },
+ "7,0"
+ ],
+ [
+ {
+ "y": -0.2999999999999998,
+ "x": 3,
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "3,3",
+ {
+ "x": 7
+ },
+ "8,3"
+ ],
+ [
+ {
+ "y": -0.9500000000000002,
+ "x": 6.25
+ },
+ "4,5",
+ {
+ "x": 0.5
+ },
+ "9,5"
+ ],
+ [
+ {
+ "y": -0.8999999999999999,
+ "x": 2
+ },
+ "3,2",
+ {
+ "x": 1
+ },
+ "3,4",
+ {
+ "x": 5
+ },
+ "8,4",
+ {
+ "x": 1
+ },
+ "8,2"
+ ],
+ [
+ {
+ "y": -0.8500000000000001,
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "3,0",
+ {
+ "c": "#cccccc",
+ "f": 8,
+ "fa": [
+ 1
+ ]
+ },
+ "3,1",
+ {
+ "x": 3
+ },
+ "3,5",
+ {
+ "x": 3
+ },
+ "8,5",
+ {
+ "x": 3
+ },
+ "8,1",
+ {
+ "c": "#aaaaaa",
+ "f": 5,
+ "fa": [
+ 1
+ ]
+ },
+ "8,0"
+ ],
+ [
+ {
+ "y": -0.15000000000000036,
+ "x": 2.75,
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "4,1",
+ "4,2",
+ {
+ "x": 5.5
+ },
+ "9,2"
+ ],
+ [
+ {
+ "y": -0.8499999999999996,
+ "x": 1.75
+ },
+ "4,0"
+ ],
+ [
+ {
+ "rx": 0.25,
+ "y": 4.35,
+ "x": 11
+ },
+ "9,1"
+ ],
+ [
+ {
+ "rx": 0.5,
+ "y": 4.5,
+ "x": 11.75
+ },
+ "9,0"
+ ],
+ [
+ {
+ "r": 15,
+ "rx": 5,
+ "ry": 4.5,
+ "c": "#777777"
+ },
+ "4,3"
+ ],
+ [
+ {
+ "r": 30,
+ "rx": 6.25,
+ "y": -0.25,
+ "x": 0.09999999999999964,
+ "c": "#aaaaaa",
+ "h": 1.5
+ },
+ "4,4"
+ ],
+ [
+ {
+ "r": -30,
+ "rx": 8.75,
+ "y": -0.25,
+ "x": -1.0999999999999996,
+ "f": 8,
+ "fa": [
+ 1
+ ],
+ "h": 1.5
+ },
+ "9,4"
+ ],
+ [
+ {
+ "r": -15,
+ "rx": 10,
+ "x": -1,
+ "c": "#777777",
+ "f": 9,
+ "fa": [
+ 1
+ ]
+ },
+ "9,3"
+ ]
+ ]
+ }
+ }
\ No newline at end of file
diff --git a/keyboards/tanuki/keymaps/vial/config.h b/keyboards/tanuki/keymaps/vial/config.h
new file mode 100644
index 00000000000..e9ba90d343e
--- /dev/null
+++ b/keyboards/tanuki/keymaps/vial/config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#define VIAL_KEYBOARD_UID {0xF5, 0xFA, 0x6D, 0xFC, 0x81, 0x4A, 0xE9, 0x7E}
\ No newline at end of file
diff --git a/keyboards/tanuki/keymaps/vial/keymap.c b/keyboards/tanuki/keymaps/vial/keymap.c
new file mode 100644
index 00000000000..e4987ef8cb2
--- /dev/null
+++ b/keyboards/tanuki/keymaps/vial/keymap.c
@@ -0,0 +1,120 @@
+#include QMK_KEYBOARD_H
+
+// custom type to store stuff in EEPROM
+typedef union {
+ uint32_t raw;
+ struct {
+ bool layer_rgb :1;
+ };
+} user_config_t;
+
+user_config_t user_config;
+
+// Layer definitions
+#define _BL 0
+#define _DL 1
+#define _UL 2
+#define _GL 3
+#define _BK 4
+
+// Custom keycode to toggle normal RGB or per-layer RGB
+enum custom_keycodes {
+ CUSTRGB = SAFE_RANGE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[_BL] = LAYOUT(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, TG(_GL),
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_QUOT, KC_SLSH, KC_ENT,
+ KC_LCTL, KC_LALT, KC_COMMA, LT(_DL,KC_SPC), LT(_UL,KC_SPC), KC_DOT, KC_LGUI),
+
+[_DL] = LAYOUT(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
+ KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[_UL] = LAYOUT(
+ KC_GRV, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_PIPE, KC_BSLS, KC_PLUS, KC_UNDS, KC_MINS, KC_EQL, KC_DEL,
+ KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS,
+ KC_TRNS, CUSTRGB, RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAD, RGB_VAD, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_MOD, RGB_HUI, KC_TRNS, KC_TRNS, RGB_SAI, RGB_VAI),
+
+[_GL] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS)
+
+};
+
+void keyboard_post_init_user(void) {
+ user_config.raw = eeconfig_read_user();
+ if(user_config.layer_rgb) {
+ rgblight_enable_noeeprom();
+ rgblight_mode_noeeprom(1);
+ rgblight_sethsv_noeeprom(0,10,255);
+ }
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ // This code switches underglow color by active layer, if the user has enabled the feature
+ if(user_config.layer_rgb) {
+ switch (get_highest_layer(state)) {
+ case _BL:
+ rgblight_sethsv_noeeprom(0,10,255);
+ rgblight_mode_noeeprom(1);
+ break;
+ case _DL:
+ rgblight_sethsv_noeeprom(130,200,255);
+ rgblight_mode_noeeprom(1);
+ break;
+ case _UL:
+ rgblight_sethsv_noeeprom(170,200,255);
+ rgblight_mode_noeeprom(1);
+ break;
+ case _GL:
+ rgblight_sethsv_noeeprom(0,180,255);
+ rgblight_mode_noeeprom(1);
+ break;
+ }
+ }
+ return state;
+}
+
+bool process_record_user (uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case CUSTRGB: // if the user toggled per-layer RGB, update the config and refresh the RGB color
+ if(record->event.pressed) {
+ user_config.layer_rgb ^= 1;
+ eeconfig_update_user(user_config.raw);
+ if (user_config.layer_rgb) {
+ layer_state_set(layer_state);
+ }
+ }
+ return false;
+ break;
+ case RGB_MOD:
+ case RGB_SAD:
+ case RGB_SAI:
+ case RGB_HUI:
+ case RGB_VAD:
+ case RGB_VAI:
+ if(user_config.layer_rgb && record->event.pressed) {
+ return false; // if layer RGB is on, ignore attempts to change RGB settings
+ }
+ break;
+ }
+ return true;
+}
+
+void eeconfig_init_user(void) { // in case EEPROM is reset, set up our custom config
+ user_config.raw = 0;
+ user_config.layer_rgb = true; // enable per-layer RGB by default
+ eeconfig_update_user(user_config.raw);
+ rgblight_enable();
+ rgblight_sethsv(0,10,255);
+ rgblight_mode(1);
+}
diff --git a/keyboards/tanuki/keymaps/vial/rules.mk b/keyboards/tanuki/keymaps/vial/rules.mk
new file mode 100644
index 00000000000..e8a66cb4bbe
--- /dev/null
+++ b/keyboards/tanuki/keymaps/vial/rules.mk
@@ -0,0 +1,5 @@
+VIA_ENABLE = yes
+VIAL_ENABLE = yes
+LTO_ENABLE = yes
+VIAL_INSECURE = yes
+QMK_SETTINGS = no
\ No newline at end of file
diff --git a/keyboards/tanuki/keymaps/vial/vial.json b/keyboards/tanuki/keymaps/vial/vial.json
new file mode 100644
index 00000000000..0d6561348de
--- /dev/null
+++ b/keyboards/tanuki/keymaps/vial/vial.json
@@ -0,0 +1,18 @@
+{
+ "name": "Tanuki",
+ "vendorId": "0xFEED",
+ "productId": "0x6464",
+ "lighting": "qmk_rgblight",
+ "matrix": {
+ "rows": 4,
+ "cols": 11
+ },
+ "layouts": {
+ "keymap": [
+ [{"c":"#777777"},"3,1",{"c":"#cccccc"},"0,0","0,1","0,2","0,3","0,4","0,5","0,6","0,7","0,8","0,9",{"c":"#aaaaaa","w":1.25},"0,10"],
+ [{"w":1.25},"3,0",{"c":"#cccccc"},"1,0","1,1","1,2","1,3","1,4","1,5","1,6","1,7","1,8","1,9","1,10"],
+ [{"x":0.25,"c":"#aaaaaa","w":1.5},"2,0",{"c":"#cccccc"},"2,1","2,2","2,3","2,4","2,5","2,6","2,7","2,8","2,9",{"c":"#777777","w":1.25},"2,10"],
+ [{"x":1.25,"c":"#aaaaaa","w":1.25},"3,2","3,3",{"c":"#cccccc"},"3,4",{"w":2},"3,5",{"w":2},"3,6","3,8",{"c":"#aaaaaa","w":1.25},"3,9"]
+ ]
+ }
+}
\ No newline at end of file