~ruther/qmk_firmware

1dca3a8e3a416c26e071e90f5be785f0aef4fa26 — QMK Bot 4 years ago 75da5e9 + 9107c38
Merge remote-tracking branch 'origin/master' into develop
A keyboards/handwired/marauder/config.h => keyboards/handwired/marauder/config.h +70 -0
@@ 0,0 1,70 @@
/* Copyright 2021 BB-66
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4D52
#define PRODUCT_ID      0x0001
#define DEVICE_VER      0x0001
#define MANUFACTURER    BB-66
#define PRODUCT         Minshara Marauder

/* key matrix size */
#define MATRIX_ROWS 12
#define MATRIX_COLS 9

/*
 * Keyboard Matrix Assignments
 *
 * Change this to how you wired your keyboard
 * COLS: AVR pins used for columns, left to right
 * ROWS: AVR pins used for rows, top to bottom
 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
 *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
 *
 */
#define MATRIX_ROW_PINS { D0, D4, C6, D7, E6, B4, B5, B7, D5, C7, F1, F0 }
#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, F5, F4, B0 }

#define DIODE_DIRECTION COL2ROW

#define RGB_DI_PIN D1
#ifdef RGB_DI_PIN
    #define RGBLED_NUM 20
    #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
// /*== 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

// generated by KBFirmware JSON to QMK Parser
// https://noroadsleft.github.io/kbf_qmk_converter/

A keyboards/handwired/marauder/info.json => keyboards/handwired/marauder/info.json +108 -0
@@ 0,0 1,108 @@
{
    "keyboard_name": "Minshara Marauder",
    "url": "https://imgur.com/a/TvsXpq5",
    "maintainer": "BB-66",
    "width": 19.25,
    "height": 6.5,
    "layouts": {
        "LAYOUT": {
            "layout": [
                {"label":"K00 (D0,B6)", "x":0, "y":0},
                {"label":"K01 (D0,B2)", "x":2, "y":0},
                {"label":"K02 (D0,B3)", "x":3, "y":0},
                {"label":"K03 (D0,B1)", "x":4, "y":0},
                {"label":"K04 (D0,F7)", "x":5, "y":0},
                {"label":"K05 (D0,F6)", "x":6.5, "y":0},
                {"label":"K06 (D0,F5)", "x":7.5, "y":0},
                {"label":"K07 (D0,F4)", "x":8.5, "y":0},
                {"label":"K08 (D0,B0)", "x":9.5, "y":0},
                {"label":"K68 (B5,B0)", "x":11, "y":0},
                {"label":"K67 (B5,F4)", "x":12, "y":0},
                {"label":"K66 (B5,F5)", "x":13, "y":0},
                {"label":"K65 (B5,F6)", "x":14, "y":0},
                {"label":"K63 (B5,B1)", "x":15.25, "y":0},
                {"label":"K62 (B5,B3)", "x":16.25, "y":0},
                {"label":"K61 (B5,B2)", "x":17.25, "y":0},
                {"label":"K60 (B5,B6)", "x":18.25, "y":0},
                {"label":"K10 (D4,B6)", "x":0, "y":1.5},
                {"label":"K11 (D4,B2)", "x":1, "y":1.5},
                {"label":"K12 (D4,B3)", "x":2, "y":1.5},
                {"label":"K13 (D4,B1)", "x":3, "y":1.5},
                {"label":"K14 (D4,F7)", "x":4, "y":1.5},
                {"label":"K15 (D4,F6)", "x":5, "y":1.5},
                {"label":"K16 (D4,F5)", "x":6, "y":1.5},
                {"label":"K17 (D4,F4)", "x":7, "y":1.5},
                {"label":"K18 (D4,B0)", "x":8, "y":1.5},
                {"label":"K78 (B7,B0)", "x":9, "y":1.5},
                {"label":"K77 (B7,F4)", "x":10, "y":1.5},
                {"label":"K76 (B7,F5)", "x":11, "y":1.5},
                {"label":"K75 (B7,F6)", "x":12, "y":1.5},
                {"label":"K74 (B7,F7)", "x":13, "y":1.5, "w":2},
                {"label":"K73 (B7,B1)", "x":15.25, "y":1.5},
                {"label":"K72 (B7,B3)", "x":16.25, "y":1.5},
                {"label":"K71 (B7,B2)", "x":17.25, "y":1.5},
                {"label":"K70 (B7,B6)", "x":18.25, "y":1.5},
                {"label":"K20 (C6,B6)", "x":0, "y":2.5, "w":1.5},
                {"label":"K21 (C6,B2)", "x":1.5, "y":2.5},
                {"label":"K22 (C6,B3)", "x":2.5, "y":2.5},
                {"label":"K23 (C6,B1)", "x":3.5, "y":2.5},
                {"label":"K24 (C6,F7)", "x":4.5, "y":2.5},
                {"label":"K25 (C6,F6)", "x":5.5, "y":2.5},
                {"label":"K26 (C6,F5)", "x":6.5, "y":2.5},
                {"label":"K27 (C6,F4)", "x":7.5, "y":2.5},
                {"label":"K28 (C6,B0)", "x":8.5, "y":2.5},
                {"label":"K88 (D5,B0)", "x":9.5, "y":2.5},
                {"label":"K87 (D5,F4)", "x":10.5, "y":2.5},
                {"label":"K86 (D5,F5)", "x":11.5, "y":2.5},
                {"label":"K85 (D5,F6)", "x":12.5, "y":2.5},
                {"label":"K84 (D5,F7)", "x":13.5, "y":2.5, "w":1.5},
                {"label":"K83 (D5,B1)", "x":15.25, "y":2.5},
                {"label":"K82 (D5,B3)", "x":16.25, "y":2.5},
                {"label":"K81 (D5,B2)", "x":17.25, "y":2.5},
                {"label":"K80 (D5,B6)", "x":18.25, "y":2.5, "h":2},
                {"label":"K30 (D7,B6)", "x":0, "y":3.5, "w":1.75},
                {"label":"K31 (D7,B2)", "x":1.75, "y":3.5},
                {"label":"K32 (D7,B3)", "x":2.75, "y":3.5},
                {"label":"K33 (D7,B1)", "x":3.75, "y":3.5},
                {"label":"K34 (D7,F7)", "x":4.75, "y":3.5},
                {"label":"K35 (D7,F6)", "x":5.75, "y":3.5},
                {"label":"K36 (D7,F5)", "x":6.75, "y":3.5},
                {"label":"K37 (D7,F4)", "x":7.75, "y":3.5},
                {"label":"K38 (D7,B0)", "x":8.75, "y":3.5},
                {"label":"K98 (C7,B0)", "x":9.75, "y":3.5},
                {"label":"K97 (C7,F4)", "x":10.75, "y":3.5},
                {"label":"K96 (C7,F5)", "x":11.75, "y":3.5},
                {"label":"K95 (C7,F6)", "x":12.75, "y":3.5, "w":2.25},
                {"label":"K93 (C7,B1)", "x":15.25, "y":3.5},
                {"label":"K92 (C7,B3)", "x":16.25, "y":3.5},
                {"label":"K91 (C7,B2)", "x":17.25, "y":3.5},
                {"label":"K40 (E6,B6)", "x":0, "y":4.5, "w":2.25},
                {"label":"K41 (E6,B2)", "x":2.25, "y":4.5},
                {"label":"K42 (E6,B3)", "x":3.25, "y":4.5},
                {"label":"K43 (E6,B1)", "x":4.25, "y":4.5},
                {"label":"K44 (E6,F7)", "x":5.25, "y":4.5},
                {"label":"K45 (E6,F6)", "x":6.25, "y":4.5},
                {"label":"K46 (E6,F5)", "x":7.25, "y":4.5},
                {"label":"K47 (E6,F4)", "x":8.25, "y":4.5},
                {"label":"K48 (E6,B0)", "x":9.25, "y":4.5},
                {"label":"KA8 (F1,B0)", "x":10.25, "y":4.5},
                {"label":"KA7 (F1,F4)", "x":11.25, "y":4.5},
                {"label":"KA6 (F1,F5)", "x":12.25, "y":4.5, "w":2.75},
                {"label":"KA3 (F1,B1)", "x":15.25, "y":4.5},
                {"label":"KA2 (F1,B3)", "x":16.25, "y":4.5},
                {"label":"KA1 (F1,B2)", "x":17.25, "y":4.5},
                {"label":"KA0 (F1,B6)", "x":18.25, "y":4.5, "h":2},
                {"label":"K50 (B4,B6)", "x":0, "y":5.5, "w":1.5},
                {"label":"K51 (B4,B2)", "x":1.5, "y":5.5},
                {"label":"K52 (B4,B3)", "x":2.5, "y":5.5, "w":1.5},
                {"label":"K56 (B4,F5)", "x":4, "y":5.5, "w":7},
                {"label":"KB7 (F0,F4)", "x":11, "y":5.5, "w":1.5},
                {"label":"KB6 (F0,F5)", "x":12.5, "y":5.5},
                {"label":"KB4 (F0,F7)", "x":13.5, "y":5.5, "w":1.5},
                {"label":"KB3 (F0,B1)", "x":15.25, "y":5.5, "w":2},
                {"label":"KB1 (F0,B2)", "x":17.25, "y":5.5}
            ]
        }
    }
    ,"meta": "https://noroadsleft.github.io/kbf_qmk_converter/"
}

A keyboards/handwired/marauder/keymaps/default/keymap.c => keyboards/handwired/marauder/keymaps/default/keymap.c +29 -0
@@ 0,0 1,29 @@
/* Copyright 2021 BB-66
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = LAYOUT(
        KC_ESC,           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_PAUS, KC_PSCR, KC_SLCK, KC_ESC,
        KC_GRV,  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_NLCK, KC_KP_SLSH, KC__KP_ASTR, KC_KP_MINS,
        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_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS,
        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,                KC_KP_4, KC_KP_5, KC_CP_6,
        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_KP_1, KC_KP_2, KC_KP_3, KC__PENT,
        KC_LCTL,     KC_LGUI, KC_LALT,                             KC_SPC,                                 KC_RALT,     KC_RGUI, KC_RCTL,        KC_KP_0,          KC_KP_DOT
    ),

};

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

#include "marauder.h"

// generated by KBFirmware JSON to QMK Parser
// https://noroadsleft.github.io/kbf_qmk_converter/

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

#pragma once

#include "quantum.h"

#define LAYOUT( \
    K00,      K01, K02, K03, K04,   K05, K06, K07, K08,    K68, K67, K66, K65,  K63, K62, K61, K60,  \
    K10, K11, K12, K13, K14, K15, K16, K17, K18, K78, K77, K76, K75, K74,       K73, K72, K71, K70,  \
    K20,   K21, K22, K23, K24, K25, K26, K27, K28, K88, K87, K86, K85, K84,     K83, K82, K81, K80,  \
    K30,    K31, K32, K33, K34, K35, K36, K37, K38, K98, K97, K96, K95,         K93, K92, K91,       \
    K40,       K41, K42, K43, K44, K45, K46, K47, K48, KA8, KA7, KA6,           KA3, KA2, KA1, KA0,  \
    K50,   K51, K52,                  K56,                 KB7,   KB6, KB4,     KB3,      KB1        \
) { \
    { K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08   }, \
    { K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18   }, \
    { K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28   }, \
    { K30,   K31,   K32,   K33,   K34,   K35,   K36,   K37,   K38   }, \
    { K40,   K41,   K42,   K43,   K44,   K45,   K46,   K47,   K48   }, \
    { K50,   K51,   K52,   KC_NO, KC_NO, KC_NO, K56,   KC_NO, KC_NO }, \
    { K60,   K61,   K62,   K63,   KC_NO, K65,   K66,   K67,   K68   }, \
    { K70,   K71,   K72,   K73,   K74,   K75,   K76,   K77,   K78   }, \
    { K80,   K81,   K82,   K83,   K84,   K85,   K86,   K87,   K88   }, \
    { KC_NO, K91,   K92,   K93,   KC_NO, K95,   K96,   K97,   K98   }, \
    { KA0,   KA1,   KA2,   KA3,   KC_NO, KC_NO, KA6,   KA7,   KA8   }, \
    { KC_NO, KB1,   KC_NO, KB3,   KB4,   KC_NO, KB6,   KB7,   KC_NO }, \
}

// generated by KBFirmware JSON to QMK Parser
// https://noroadsleft.github.io/kbf_qmk_converter/

A keyboards/handwired/marauder/rules.mk => keyboards/handwired/marauder/rules.mk +26 -0
@@ 0,0 1,26 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = atmel-dfu

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = yes        # Console for debug
COMMAND_ENABLE = yes        # 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 = yes            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no       # Enable Bluetooth
AUDIO_ENABLE = no           # Audio output
LTO_ENABLE = yes            # Link Time Optimization, shrinks the output slightly

# generated by KBFirmware JSON to QMK Parser
# https://noroadsleft.github.io/kbf_qmk_converter/

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

#include "config_common.h"

#define VENDOR_ID       0x4D65
#define PRODUCT_ID      0x3222
#define DEVICE_VER      0x0001
#define MANUFACTURER    Merge
#define PRODUCT         UM-70

#define MATRIX_ROWS 10
#define MATRIX_COLS 8

#define MATRIX_ROW_PINS { B0, B1, B2, B3, B7 }
#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, D6, D4 }
#define UNUSED_PINS

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

#define SOFT_SERIAL_PIN D2
#define SPLIT_USB_DETECT
#define MASTER_LEFT
#define SPLIT_MODS_ENABLE

#define RGB_DI_PIN D3
#define RGBLIGHT_SPLIT
#define RGBLED_NUM 83
#define RGBLED_SPLIT { 39, 44 }
#ifdef RGB_MATRIX_ENABLE
#    define DRIVER_LED_TOTAL RGBLED_NUM
#    define RGB_MATRIX_SPLIT RGBLED_SPLIT
#endif
#define RGBLIGHT_SLEEP
#define RGBLIGHT_LIMIT_VAL 150

#define DEBOUNCE 5

#define B6_AUDIO

#ifdef AUDIO_ENABLE
  #define STARTUP_SONG SONG(STARTUP_SOUND)
#endif

#define ENCODERS_PAD_A { B4 }
#define ENCODERS_PAD_B { B5 }

#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0
\ No newline at end of file

A keyboards/merge/um70/info.json => keyboards/merge/um70/info.json +21 -0
@@ 0,0 1,21 @@
{
    "keyboard_name": "UM-70",
    "url": "https://mergedesign.store/um-70",
    "maintainer": "duoshock",
    "width": 18.75,
    "height": 5.25,
    "layouts": {
        "LAYOUT_rspace_2u_bksp": {
            "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0, "w":2}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":1.25}, {"x":6.5, "y":4, "w":2.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
        },
        "LAYOUT_rspace_split_bksp": {
            "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":1.25}, {"x":6.5, "y":4, "w":2.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
        },
        "LAYOUT_lspace_2u_bksp": {
            "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0, "w":2}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":2.25}, {"x":7.5, "y":4, "w":1.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
        },
        "LAYOUT_lspace_split_bksp": {
            "layout": [{"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.75, "y":0}, {"x":1.5, "y":1, "w":1.5}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":17.75, "y":1}, {"x":0, "y":2}, {"x":1.5, "y":2, "w":1.75}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":17.75, "y":2}, {"x":0, "y":3}, {"x":1.5, "y":3, "w":2.25}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.5, "y":3.25}, {"x":0, "y":4}, {"x":1.5, "y":4, "w":1.25}, {"x":2.75, "y":4, "w":1.25}, {"x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":2.25}, {"x":7.5, "y":4, "w":1.25}, {"x":9.5, "y":4, "w":2.75}, {"x":12.25, "y":4, "w":1.5}, {"x":13.75, "y":4, "w":1.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}]
        }
    }
}

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

#include QMK_KEYBOARD_H
#include <stdio.h>

enum layer_names {
    _BASE,
    _ONE,
    _TWO,
    _THREE
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

/*
 *          .---------------------------.          .-------------------------------.        .---.
 *          |Esc|  1|  2|  3|  4|  5|  6|          |  7|  8|  9|  0|  -|  =|  Bsp  |        |EC |
 *          |-------------------------.          .---------------------------------|        |---|
 *          |Tab  |  Q|  W|  E|  R|  T|          |  Y|  U|  I|  O|  P|  [|  ]|  \  |        |Hom|
 *   .---.  |-------------------------.          '---------------------------------|        |---|
 *   |M0 |  |CapsL |  A|  S|  D|  F|  G|          |  H|  J|  K|  L|  ;|  :|   Retn |        |End|
 *   |---|  |----------------------------.        '--------------------------------|  .---. '---'
 *   |M1 |  |Shft    |  Z|  X|  C|  V|  B|          |  N|  M|  ,|  ,|  /|  Shift|     |Up | 
 *   |---|  |----------------------------|          |---------------------------' .-----------.
 *   |M2 |  |Ctl |Gui |Alt |Fn0 |Space   |          |    Space|   Alt|   Ctl|     |Lef|Dow|Rig|
 *   '---'  '----------------------------'          '-----------------------'     '-----------'
 */

[_BASE] = LAYOUT_rspace_2u_bksp(
            KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,                KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL,   KC_BSPC,          KC_MUTE,
            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_HOME,
    KC_1,   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,         KC_END,
    KC_2,   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_3,   KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC,                   KC_SPC, KC_RALT, KC_RCTL,                               KC_LEFT, KC_DOWN, KC_RGHT
),

[_ONE] = LAYOUT_rspace_2u_bksp(
                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_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_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_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                 KC_TRNS, KC_TRNS, KC_TRNS,                                        KC_TRNS, KC_TRNS, KC_TRNS
),
[_TWO] = LAYOUT_rspace_2u_bksp(
                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_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_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_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                 KC_TRNS, KC_TRNS, KC_TRNS,                                        KC_TRNS, KC_TRNS, KC_TRNS
),
[_THREE] = LAYOUT_rspace_2u_bksp(
                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_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_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_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                 KC_TRNS, KC_TRNS, KC_TRNS,                                        KC_TRNS, KC_TRNS, KC_TRNS
),
};

void encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) { /* Master Left */
        if (clockwise) {
            tap_code(KC_VOLU);
        } else {
            tap_code(KC_VOLD);
        }
    } else if (index == 1) { /* Master Right */
        if (clockwise) {
            tap_code(KC_VOLU);
        } else {
            tap_code(KC_VOLD);
        }
    }
}


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

oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    if (is_keyboard_master()) {
        return OLED_ROTATION_90;
    }

    return rotation;
}

static void render_logo(void) {
    static const char PROGMEM raw_logo[] = {
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,192,192,224,224,224,224,224,224,224,224,224,224,224,224,224,224,192,192,128,128,192,192,224,224,224,224,224,224,224,224,192,192,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 15,  3,  1,  0,  1,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,254,254,254,  0,  0,  0,  0,  0,  0,254,254,254,  0,  0,  0,254,254,254,252,248,224,192,128,224,248,252,254,254,254,  0,  0,128,128,128,128,128,128,  0, 14, 14, 14, 14,142,238,254,254,126, 30,  4,224,248,252, 62, 30, 14, 14, 14, 30, 62,252,248,240,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
        0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,240,192,128,  0,128,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127, 63, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 63, 63,124,112,112,112,112,124, 63, 63, 15,  0,  0,  0,127,127,127,  0,  1,  7, 15, 15,  7,  1,  0,127,127,127,  0,  0,  3,  3,  3,  3,  3,  3,  1,  0,112,124,126, 63, 15,  3,  1,  0,  0,  0, 15, 31, 63,124,120,112,112,112,120,124, 63, 31, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  3,  3,  1,  1,  3,  3,  7,  7,  7,  7,  7,  7,  7,  7,  3,  3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    };
    oled_write_raw_P(raw_logo, sizeof(raw_logo));
}


// 32 * 18 Merge logos
static const char PROGMEM merge_logo[] = {
    0xf8, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0e, 
    0x06, 0x04, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xf8, 0xf0, 0xc0, 
    0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 
    0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x0f, 
    0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 
    0x01, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00
};

int current_wpm = 0;

static void print_status_narrow(void) {
    oled_set_cursor(0,1);
    oled_write_raw_P(merge_logo, sizeof(merge_logo));
    oled_set_cursor(0,5);
    oled_write_P(PSTR("-----"), false);
    oled_set_cursor(0,6);
    oled_write_P(PSTR("LYR "), false);
    switch (get_highest_layer(layer_state)) {
        case _BASE:
            oled_write_P(PSTR("0"), false);
            break;
        case _ONE:
            oled_write_P(PSTR("1"), false);
            break;
        case _TWO:
            oled_write_P(PSTR("2"), false);
            break;
        case _THREE:
            oled_write_P(PSTR("3"), false);
            break;
        default:
            oled_write_ln_P(PSTR("Undef"), false);
    }
    led_t led_usb_state = host_keyboard_led_state();
    oled_write_ln_P(PSTR(" "), false);
    oled_write_P(PSTR("CAP "), false);
    oled_write_P(PSTR("."), led_usb_state.caps_lock);
    oled_write_P(PSTR("NUM "), false);
    oled_write_P(PSTR("."), led_usb_state.num_lock);
    oled_write_P(PSTR("SCR "), false);
    oled_write_P(PSTR("."), led_usb_state.scroll_lock);
    //oled_write_ln_P(PSTR(" "), false);
    oled_write_P(PSTR("-----"), false);

    // WPM counter Start (Need #include <stdio.h> to work)
    char wpm_str[8];
    oled_set_cursor(0,13);
    sprintf(wpm_str, " %03d", current_wpm);
    oled_write(wpm_str, false);
    oled_set_cursor(0,14);
    oled_write(" WPM ", false);
    // WPM counter End
}

void oled_task_user(void) {
    current_wpm = get_current_wpm();
    if (is_keyboard_master()) {
        print_status_narrow();
        //render_logo();
    } else {
        render_logo();
        //print_status_narrow();
    }
}

#endif
\ No newline at end of file

A keyboards/merge/um70/keymaps/default/readme.md => keyboards/merge/um70/keymaps/default/readme.md +5 -0
@@ 0,0 1,5 @@
# Default UM-70 Layout

![UM-70 Layout Image](https://i.imgur.com/5lucSbi.jpg)

This is the default layout that comes flashed on every UM-70.

A keyboards/merge/um70/keymaps/default/rules.mk => keyboards/merge/um70/keymaps/default/rules.mk +2 -0
@@ 0,0 1,2 @@
WPM_ENABLE = yes
LTO_ENABLE = yes
\ No newline at end of file

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

#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#define RGBLIGHT_EFFECT_SNAKE

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

#include QMK_KEYBOARD_H
#include <stdio.h>

enum layer_names {
    _BASE,
    _ONE,
    _TWO,
    _THREE
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

/*
 *          .---------------------------.          .-------------------------------.        .---.
 *          |Esc|  1|  2|  3|  4|  5|  6|          |  7|  8|  9|  0|  -|  =|`  |Bsp|        |EC |
 *          |-------------------------.          .---------------------------------|        |---|
 *          |Tab  |  Q|  W|  E|  R|  T|          |  Y|  U|  I|  O|  P|  [|  ]|  \  |        |Hom|
 *   .---.  |-------------------------.          '---------------------------------|        |---|
 *   |M0 |  |CapsL |  A|  S|  D|  F|  G|          |  H|  J|  K|  L|  ;|  :|   Retn |        |End|
 *   |---|  |----------------------------.        '--------------------------------|  .---. '---'
 *   |M1 |  |Shft    |  Z|  X|  C|  V|  B|          |  N|  M|  ,|  ,|  /|  Shift|     |Up | 
 *   |---|  |----------------------------|          |---------------------------' .-----------.
 *   |M2 |  |Ctl |Gui |Alt |Fn0 |Space   |          |    Space|   Alt|   Ctl|     |Lef|Dow|Rig|
 *   '---'  '----------------------------'          '-----------------------'     '-----------'
 */

[_BASE] = LAYOUT_rspace_split_bksp(
            KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,                KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC,    KC_MUTE,
            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_HOME,
    KC_1,   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,         KC_END,
    KC_2,   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_3,   KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC,                   KC_SPC, KC_RALT, KC_RCTL,                               KC_LEFT, KC_DOWN, KC_RGHT
),

[_ONE] = LAYOUT_rspace_split_bksp(
                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_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_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_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_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                              KC_TRNS, KC_TRNS, KC_TRNS,                               KC_TRNS, KC_TRNS, KC_TRNS
),
[_TWO] = LAYOUT_rspace_split_bksp(
                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_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_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_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_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                              KC_TRNS, KC_TRNS, KC_TRNS,                               KC_TRNS, KC_TRNS, KC_TRNS
),
[_THREE] = LAYOUT_rspace_split_bksp(
                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_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_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_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_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                              KC_TRNS, KC_TRNS, KC_TRNS,                               KC_TRNS, KC_TRNS, KC_TRNS
),
};

void encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) { /* Master Left */
        if (clockwise) {
            tap_code(KC_VOLU);
        } else {
            tap_code(KC_VOLD);
        }
    } else if (index == 1) { /* Master Right */
        if (clockwise) {
            tap_code(KC_VOLU);
        } else {
            tap_code(KC_VOLD);
        }
    }
}


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

oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    if (is_keyboard_master()) {
        return OLED_ROTATION_90;
    }

    return rotation;
}

static void render_logo(void) {
    static const char PROGMEM raw_logo[] = {
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,192,192,224,224,224,224,224,224,224,224,224,224,224,224,224,224,192,192,128,128,192,192,224,224,224,224,224,224,224,224,192,192,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 15,  3,  1,  0,  1,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,254,254,254,  0,  0,  0,  0,  0,  0,254,254,254,  0,  0,  0,254,254,254,252,248,224,192,128,224,248,252,254,254,254,  0,  0,128,128,128,128,128,128,  0, 14, 14, 14, 14,142,238,254,254,126, 30,  4,224,248,252, 62, 30, 14, 14, 14, 30, 62,252,248,240,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
        0,  0,  0,  0,  0,  0,  0,  0,  0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,240,192,128,  0,128,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127, 63, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 63, 63,124,112,112,112,112,124, 63, 63, 15,  0,  0,  0,127,127,127,  0,  1,  7, 15, 15,  7,  1,  0,127,127,127,  0,  0,  3,  3,  3,  3,  3,  3,  1,  0,112,124,126, 63, 15,  3,  1,  0,  0,  0, 15, 31, 63,124,120,112,112,112,120,124, 63, 31, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  3,  3,  1,  1,  3,  3,  7,  7,  7,  7,  7,  7,  7,  7,  3,  3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    };
    oled_write_raw_P(raw_logo, sizeof(raw_logo));
}


// 32 * 18 Merge logos
static const char PROGMEM merge_logo[] = {
    0xf8, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0e, 
    0x06, 0x04, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xf8, 0xf0, 0xc0, 
    0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 
    0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x0f, 
    0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 
    0x01, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00
};

int current_wpm = 0;

static void print_status_narrow(void) {
    oled_set_cursor(0,1);
    oled_write_raw_P(merge_logo, sizeof(merge_logo));
    oled_set_cursor(0,5);
    oled_write_P(PSTR("-----"), false);
    oled_set_cursor(0,6);
    oled_write_P(PSTR("LYR "), false);
    switch (get_highest_layer(layer_state)) {
        case _BASE:
            oled_write_P(PSTR("0"), false);
            break;
        case _ONE:
            oled_write_P(PSTR("1"), false);
            break;
        case _TWO:
            oled_write_P(PSTR("2"), false);
            break;
        case _THREE:
            oled_write_P(PSTR("3"), false);
            break;
        default:
            oled_write_ln_P(PSTR("Undef"), false);
    }
    led_t led_usb_state = host_keyboard_led_state();
    oled_write_ln_P(PSTR(" "), false);
    oled_write_P(PSTR("CAP "), false);
    oled_write_P(PSTR("."), led_usb_state.caps_lock);
    oled_write_P(PSTR("NUM "), false);
    oled_write_P(PSTR("."), led_usb_state.num_lock);
    oled_write_P(PSTR("SCR "), false);
    oled_write_P(PSTR("."), led_usb_state.scroll_lock);
    //oled_write_ln_P(PSTR(" "), false);
    oled_write_P(PSTR("-----"), false);

    // WPM counter Start (Need #include <stdio.h> to work)
    char wpm_str[8];
    oled_set_cursor(0,13);
    sprintf(wpm_str, " %03d", current_wpm);
    oled_write(wpm_str, false);
    oled_set_cursor(0,14);
    oled_write(" WPM ", false);
    // WPM counter End
}

void oled_task_user(void) {
    current_wpm = get_current_wpm();
    if (is_keyboard_master()) {
        print_status_narrow();
        //render_logo();
    } else {
        render_logo();
        //print_status_narrow();
    }
}

#endif

A keyboards/merge/um70/keymaps/via/rules.mk => keyboards/merge/um70/keymaps/via/rules.mk +3 -0
@@ 0,0 1,3 @@
VIA_ENABLE = yes
WPM_ENABLE = yes
LTO_ENABLE = yes
\ No newline at end of file

A keyboards/merge/um70/readme.md => keyboards/merge/um70/readme.md +14 -0
@@ 0,0 1,14 @@
# UM-70

![UM-70](https://i.imgur.com/zrvMOZel.jpeg)

A 70 keys keyboard in 65% layout with encoder and OLED screen sold by Merge. [Product page](https://mergedesign.store/products/um-70)

* Keyboard Maintainer: [duoshock](https://github.com/duoshock)
* Hardware Availability: [Merge Store](https://mergedesign.store/products/um-70)

Make example for this keyboard (after setting up your build environment):

    make merge/um70:default

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).
\ No newline at end of file

A keyboards/merge/um70/rules.mk => keyboards/merge/um70/rules.mk +25 -0
@@ 0,0 1,25 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = atmel-dfu

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = no         # Console for debug
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 = yes           # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no       # Enable Bluetooth
AUDIO_ENABLE = no           # Audio output
ENCODER_ENABLE = yes
SPLIT_KEYBOARD = yes
OLED_DRIVER_ENABLE = yes

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

#include "um70.h"

#ifdef RGB_MATRIX_ENABLE
/*
                          Underglow      Underglow             13,14 = split bksp, 14 = 2u bksp
    07 08 09 10 11 12 13     01             01        07 08 09 10 11 12 13 14
     14  15 16 17 18 19      02             02      15 16 17 18 19 20 21  22     23
20    21  22 23 24 25 26     03             03       24 25 26 27 28 29   30      31
27     28   29 30 31 32 33   04             04        32 33 34 35 36   37     38
34   35  36  37  38   39     05             05            39    40   41    42 43 44
                             06             06
*/

#define XX NO_LED

led_config_t g_led_config = { {
    {  6,  7,  8,  9, 10, 11, 12, XX },
    { 13, 14, 15, 16, 17, 18, XX, XX },
    { 20, 21, 22, 23, 24, 25, XX, XX },
    { 27, 28, 29, 30, 31, 32, XX, XX },
    { 34, 35, 36, 37, 38, 19, 26, 33 },

    { 45, 46, 47, 48, 49, 50, 51, 52 },
    { 53, 54, 55, 56, 57, 58, 59, 60 },
    { 62, 63, 64, 65, 66, 67, 68, XX },
    { 70, 71, 72, 73, 74, 75, 76, 61 },
    { 77, 78, 79, 80, 81, 82, XX, 69 },
}, {
    { 224, 0  }, { 224, 13 }, { 224, 26 }, { 148, 39 }, { 185, 52 }, {  224,  64 },

                 {  32,  0 }, {  64, 0  }, {  96, 0  }, { 128, 0  }, { 160, 0  }, {  192,  0  }, {  224,  0  }, 
                 {  32, 16 }, {  64, 16 }, {  96, 16 }, { 128, 16 }, { 160, 16 }, {  192,  16 },
    {   0, 32 }, {  32, 32 }, {  64, 32 }, {  96, 32 }, { 128, 32 }, { 160, 32 }, {  192,  32 },
    {   0, 48 }, {  32, 48 }, {  64, 48 }, {  96, 48 }, { 128, 48 }, { 160, 48 }, {  192,  48 },
    {   0, 64 }, {  32, 64 }, {  64, 64 }, {  96, 64 }, { 128, 64 }, { 160, 64 },

    { 224, 0  }, { 224, 13 }, { 224, 26 }, { 148, 39 }, { 185, 52 }, {  224,  64 },
    
    {   0,  0  }, {  32,  0 }, {  64, 0  }, {  96, 0  }, { 128, 0  }, { 160, 0  }, {  192,  0  }, {  224,  0  },
    {   0,  16 }, {  32, 16 }, {  64, 16 }, {  96, 16 }, { 128, 16 }, { 160, 16 }, {  192,  16 }, {  223,  16  }, {  224,  16  },
    {   0,  32 }, {  32, 32 }, {  64, 32 }, {  96, 32 }, { 128, 32 }, { 160, 32 }, {  192,  32 }, {  223,  32  },
    {   0,  48 }, {  32, 48 }, {  64, 48 }, {  96, 48 }, { 128, 48 }, { 160, 48 }, {  192,  48 },
    {   0,  46 }, {  32, 46 }, {  64, 64 }, {  96, 64 }, { 128, 64 }, { 160, 64 }

}, {
    2, 2, 2, 2, 2, 2,
    4, 4, 4, 4, 4, 4, 4,
    1, 4, 4, 4, 4, 4,
    4, 1, 4, 4, 4, 4, 4,
    4, 1, 4, 4, 4, 4, 4,
    4, 1, 1, 1, 1, 1,

    2, 2, 2, 2, 2, 2,
    4, 4, 4, 4, 4, 4, 4, 1,
    4, 4, 4, 4, 4, 4, 4, 1, 4,
    4, 4, 4, 4, 4, 4, 1, 4,
    4, 4, 4, 4, 4, 1, 4,
    1, 1, 1, 4, 4, 4
} };

#endif
\ No newline at end of file

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

#pragma once

#include "quantum.h"

#define XXX KC_NO

#define LAYOUT_rspace_split_bksp( \
            L00, L01, L02, L03, L04, L05, L06,              R00, R01, R02, R03, R04, R05, R06, R07,     R27, \
            L10, L11, L12, L13, L14, L15,                   R10, R11, R12, R13, R14, R15, R16, R17,     R37, \
    L45,    L20, L21, L22, L23, L24, L25,                   R20, R21, R22, R23, R24, R25, R26,          R47, \
    L46,    L30, L31, L32, L33, L34, L35,                   R30, R31, R32, R33, R34, R35,                    R36,\
    L47,    L40, L41, L42, L43, L44,                        R40, R41, R42,                              R43, R44, R45 \
) { \
    { L00, L01, L02, L03, L04, L05, L06, XXX }, \
    { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
    { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
    { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
    { L40, L41, L42, L43, L44, L45, L46, L47 }, \
    { R00, R01, R02, R03, R04, R05, R06, R07 }, \
    { R10, R11, R12, R13, R14, R15, R16, R17 }, \
    { R20, R21, R22, R23, R24, R25, R26, R27 }, \
    { R30, R31, R32, R33, R34, R35, R36, R37 }, \
    { R40, R41, R42, R43, R44, R45, XXX, R47 } \
}

#define LAYOUT_rspace_2u_bksp( \
            L00, L01, L02, L03, L04, L05, L06,              R00, R01, R02, R03, R04, R05,    R07,       R27, \
            L10, L11, L12, L13, L14, L15,                   R10, R11, R12, R13, R14, R15, R16, R17,     R37, \
    L45,    L20, L21, L22, L23, L24, L25,                   R20, R21, R22, R23, R24, R25, R26,          R47, \
    L46,    L30, L31, L32, L33, L34, L35,                   R30, R31, R32, R33, R34, R35,                    R36,\
    L47,    L40, L41, L42, L43, L44,                        R40, R41, R42,                              R43, R44, R45 \
) { \
    { L00, L01, L02, L03, L04, L05, L06, XXX }, \
    { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
    { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
    { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
    { L40, L41, L42, L43, L44, L45, L46, L47 }, \
    { R00, R01, R02, R03, R04, R05, XXX, R07 }, \
    { R10, R11, R12, R13, R14, R15, R16, R17 }, \
    { R20, R21, R22, R23, R24, R25, R26, R27 }, \
    { R30, R31, R32, R33, R34, R35, R36, R37 }, \
    { R40, R41, R42, R43, R44, R45, XXX, R47 } \
}

#define LAYOUT_lspace_2u_bksp( \
            L00, L01, L02, L03, L04, L05, L06,              R00, R01, R02, R03, R04, R05,    R07,       R27, \
            L10, L11, L12, L13, L14, L15,                   R10, R11, R12, R13, R14, R15, R16, R17,     R37, \
    L45,    L20, L21, L22, L23, L24, L25,                   R20, R21, R22, R23, R24, R25, R26,          R47, \
    L46,    L30, L31, L32, L33, L34, L35,                   R30, R31, R32, R33, R34, R35,                    R36,\
    L47,    L40, L41, L42, L44, L43,                        R40, R41, R42,                              R43, R44, R45 \
) { \
    { L00, L01, L02, L03, L04, L05, L06, XXX }, \
    { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
    { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
    { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
    { L40, L41, L42, L43, L44, L45, L46, L47 }, \
    { R00, R01, R02, R03, R04, R05, XXX, R07 }, \
    { R10, R11, R12, R13, R14, R15, R16, R17 }, \
    { R20, R21, R22, R23, R24, R25, R26, R27 }, \
    { R30, R31, R32, R33, R34, R35, R36, R37 }, \
    { R40, R41, R42, R43, R44, R45, XXX, R47 } \
}

#define LAYOUT_lspace_split_bksp( \
            L00, L01, L02, L03, L04, L05, L06,              R00, R01, R02, R03, R04, R05, R06, R07,     R27, \
            L10, L11, L12, L13, L14, L15,                   R10, R11, R12, R13, R14, R15, R16, R17,     R37, \
    L45,    L20, L21, L22, L23, L24, L25,                   R20, R21, R22, R23, R24, R25, R26,          R47, \
    L46,    L30, L31, L32, L33, L34, L35,                   R30, R31, R32, R33, R34, R35,                    R36,\
    L47,    L40, L41, L42, L44, L43,                        R40, R41, R42,                              R43, R44, R45 \
) { \
    { L00, L01, L02, L03, L04, L05, L06, XXX }, \
    { L10, L11, L12, L13, L14, L15, XXX, XXX }, \
    { L20, L21, L22, L23, L24, L25, XXX, XXX }, \
    { L30, L31, L32, L33, L34, L35, XXX, XXX }, \
    { L40, L41, L42, L43, L44, L45, L46, L47 }, \
    { R00, R01, R02, R03, R04, R05, R06, R07 }, \
    { R10, R11, R12, R13, R14, R15, R16, R17 }, \
    { R20, R21, R22, R23, R24, R25, R26, R27 }, \
    { R30, R31, R32, R33, R34, R35, R36, R37 }, \
    { R40, R41, R42, R43, R44, R45, XXX, R47 } \
}

M keyboards/ok60/ok60.h => keyboards/ok60/ok60.h +14 -0
@@ 45,6 45,20 @@
	{ K400,  K401,  K402,  KC_NO, KC_NO, KC_NO, K406,  KC_NO, KC_NO, KC_NO, K410,  K411,  K412,  K413,  KC_NO }  \
}

#define LAYOUT_60_iso_split_rshift( \
	K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012,       K014, \
	K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112,             \
	K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213,       \
	K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311,       K313, K314, \
	K400, K401, K402,                   K406,                   K410, K411, K412, K413        \
) { \
	{ K000,  K001,  K002,  K003,  K004,  K005,  K006,  K007,  K008,  K009,  K010,  K011,  K012,  KC_NO, K014 }, \
	{ K100,  K101,  K102,  K103,  K104,  K105,  K106,  K107,  K108,  K109,  K110,  K111,  K112,  KC_NO, KC_NO }, \
	{ K200,  K201,  K202,  K203,  K204,  K205,  K206,  K207,  K208,  K209,  K210,  K211,  K212,  K213,  KC_NO }, \
	{ K300,  K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,  KC_NO, K313,  KC314 }, \
	{ K400,  K401,  K402,  KC_NO, KC_NO, KC_NO, K406,  KC_NO, KC_NO, KC_NO, K410,  K411,  K412,  K413,  KC_NO }  \
}

#define LAYOUT_60_hhkb( \
	K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
	K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113,       \

M keyboards/tkc/portico/info.json => keyboards/tkc/portico/info.json +82 -74
@@ 1,79 1,87 @@
{
    "keyboard_name": "TKC Portico", 
    "url": "", 
    "maintainer": "TerryMathews", 
    "width": 16, 
    "height": 5, 
    "keyboard_name": "TKC Portico",
    "url": "",
    "maintainer": "TerryMathews",
    "width": 16,
    "height": 5,
    "layout_aliases": {
        "LAYOUT_all": "LAYOUT_65_ansi_blocker",
    },
    "layouts": {
        "LAYOUT": {
        "LAYOUT_65_ansi_blocker": {
            "layout": [
			{"label":"~", "x":0, "y":0}, 
			{"label":"!", "x":1, "y":0}, 
			{"label":"@", "x":2, "y":0}, 
			{"label":"#", "x":3, "y":0}, 
			{"label":"$", "x":4, "y":0}, 
			{"label":"%", "x":5, "y":0}, 
			{"label":"^", "x":6, "y":0}, 
			{"label":"&", "x":7, "y":0}, 
			{"label":"*", "x":8, "y":0}, 
			{"label":"(", "x":9, "y":0}, 
			{"label":")", "x":10, "y":0}, 
			{"label":"_", "x":11, "y":0}, 
			{"label":"+", "x":12, "y":0}, 
			{"label":"Backspace", "x":13, "y":0, "w":2}, 
			{"label":"Home", "x":15, "y":0}, 
			{"label":"Tab", "x":0, "y":1, "w":1.5}, 
			{"label":"Q", "x":1.5, "y":1}, 
			{"label":"W", "x":2.5, "y":1}, 
			{"label":"E", "x":3.5, "y":1}, 
			{"label":"R", "x":4.5, "y":1}, 
			{"label":"T", "x":5.5, "y":1}, 
			{"label":"Y", "x":6.5, "y":1}, 
			{"label":"U", "x":7.5, "y":1}, 
			{"label":"I", "x":8.5, "y":1}, 
			{"label":"O", "x":9.5, "y":1}, 
			{"label":"P", "x":10.5, "y":1}, 
			{"label":"{", "x":11.5, "y":1}, 
			{"label":"}", "x":12.5, "y":1}, 
			{"label":"|", "x":13.5, "y":1, "w":1.5}, 
			{"label":"PgUp", "x":15, "y":1}, 
			{"label":"Caps Lock", "x":0, "y":2, "w":1.75}, 
			{"label":"A", "x":1.75, "y":2}, 
			{"label":"S", "x":2.75, "y":2}, 
			{"label":"D", "x":3.75, "y":2}, 
			{"label":"F", "x":4.75, "y":2}, 
			{"label":"G", "x":5.75, "y":2}, 
			{"label":"H", "x":6.75, "y":2}, 
			{"label":"J", "x":7.75, "y":2}, 
			{"label":"K", "x":8.75, "y":2}, 
			{"label":"L", "x":9.75, "y":2}, 
			{"label":":", "x":10.75, "y":2}, 
			{"label":"\"", "x":11.75, "y":2}, 
			{"label":"Enter", "x":12.75, "y":2, "w":2.25}, 
			{"label":"PgDn", "x":15, "y":2}, 
			{"label":"Shift", "x":0, "y":3, "w":2.25}, 
			{"label":"Z", "x":2.25, "y":3}, 
			{"label":"X", "x":3.25, "y":3}, 
			{"label":"C", "x":4.25, "y":3}, 
			{"label":"V", "x":5.25, "y":3}, 
			{"label":"B", "x":6.25, "y":3}, 
			{"label":"N", "x":7.25, "y":3}, 
			{"label":"M", "x":8.25, "y":3}, 
			{"label":"<", "x":9.25, "y":3}, 
			{"label":">", "x":10.25, "y":3}, 
			{"label":"?", "x":11.25, "y":3}, 
			{"label":"Shift", "x":12.25, "y":3, "w":1.75}, 
			{"label":"<i class='kb kb-Arrows-Up'></i>", "x":14, "y":3}, 
			{"label":"End", "x":15, "y":3}, 
			{"label":"Ctrl", "x":0, "y":4, "w":1.25}, 
			{"label":"Win", "x":1.25, "y":4, "w":1.25}, 
			{"label":"Alt", "x":2.5, "y":4, "w":1.25}, 
			{"x":3.75, "y":4, "w":6.25}, 
			{"label":"Fn", "x":10, "y":4, "w":1.25}, 
			{"label":"Ctrl", "x":11.25, "y":4, "w":1.25}, 
			{"label":"<i class='kb kb-Arrows-Left'></i>", "x":13, "y":4}, 
			{"label":"<i class='kb kb-Arrows-Down'></i>", "x":14, "y":4}, 
			{"label":"<i class='kb kb-Arrows-Right'></i>", "x":15, "y":4}]
                {"label":"~", "x":0, "y":0},
                {"label":"!", "x":1, "y":0},
                {"label":"@", "x":2, "y":0},
                {"label":"#", "x":3, "y":0},
                {"label":"$", "x":4, "y":0},
                {"label":"%", "x":5, "y":0},
                {"label":"^", "x":6, "y":0},
                {"label":"&", "x":7, "y":0},
                {"label":"*", "x":8, "y":0},
                {"label":"(", "x":9, "y":0},
                {"label":")", "x":10, "y":0},
                {"label":"_", "x":11, "y":0},
                {"label":"+", "x":12, "y":0},
                {"label":"Backspace", "x":13, "y":0, "w":2},
                {"label":"Home", "x":15, "y":0},

                {"label":"Tab", "x":0, "y":1, "w":1.5},
                {"label":"Q", "x":1.5, "y":1},
                {"label":"W", "x":2.5, "y":1},
                {"label":"E", "x":3.5, "y":1},
                {"label":"R", "x":4.5, "y":1},
                {"label":"T", "x":5.5, "y":1},
                {"label":"Y", "x":6.5, "y":1},
                {"label":"U", "x":7.5, "y":1},
                {"label":"I", "x":8.5, "y":1},
                {"label":"O", "x":9.5, "y":1},
                {"label":"P", "x":10.5, "y":1},
                {"label":"{", "x":11.5, "y":1},
                {"label":"}", "x":12.5, "y":1},
                {"label":"|", "x":13.5, "y":1, "w":1.5},
                {"label":"PgUp", "x":15, "y":1},

                {"label":"Caps Lock", "x":0, "y":2, "w":1.75},
                {"label":"A", "x":1.75, "y":2},
                {"label":"S", "x":2.75, "y":2},
                {"label":"D", "x":3.75, "y":2},
                {"label":"F", "x":4.75, "y":2},
                {"label":"G", "x":5.75, "y":2},
                {"label":"H", "x":6.75, "y":2},
                {"label":"J", "x":7.75, "y":2},
                {"label":"K", "x":8.75, "y":2},
                {"label":"L", "x":9.75, "y":2},
                {"label":":", "x":10.75, "y":2},
                {"label":"\"", "x":11.75, "y":2},
                {"label":"Enter", "x":12.75, "y":2, "w":2.25},
                {"label":"PgDn", "x":15, "y":2},

                {"label":"Shift", "x":0, "y":3, "w":2.25},
                {"label":"Z", "x":2.25, "y":3},
                {"label":"X", "x":3.25, "y":3},
                {"label":"C", "x":4.25, "y":3},
                {"label":"V", "x":5.25, "y":3},
                {"label":"B", "x":6.25, "y":3},
                {"label":"N", "x":7.25, "y":3},
                {"label":"M", "x":8.25, "y":3},
                {"label":"<", "x":9.25, "y":3},
                {"label":">", "x":10.25, "y":3},
                {"label":"?", "x":11.25, "y":3},
                {"label":"Shift", "x":12.25, "y":3, "w":1.75},
                {"label":"<i class='kb kb-Arrows-Up'></i>", "x":14, "y":3},
                {"label":"End", "x":15, "y":3},

                {"label":"Ctrl", "x":0, "y":4, "w":1.25},
                {"label":"Win", "x":1.25, "y":4, "w":1.25},
                {"label":"Alt", "x":2.5, "y":4, "w":1.25},
                {"x":3.75, "y":4, "w":6.25},
                {"label":"Fn", "x":10, "y":4, "w":1.25},
                {"label":"Ctrl", "x":11.25, "y":4, "w":1.25},
                {"label":"<i class='kb kb-Arrows-Left'></i>", "x":13, "y":4},
                {"label":"<i class='kb kb-Arrows-Down'></i>", "x":14, "y":4},
                {"label":"<i class='kb kb-Arrows-Right'></i>", "x":15, "y":4}
            ]
        }
    }
}
\ No newline at end of file
}

M keyboards/tkc/portico/keymaps/default/keymap.c => keyboards/tkc/portico/keymaps/default/keymap.c +4 -4
@@ 18,28 18,28 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = LAYOUT_all(
    [0] = LAYOUT_65_ansi_blocker(
        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_HOME,
        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_PGUP,
        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, KC_PGDN,
        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_END,
        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                               MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
    ),
    [1] = LAYOUT_all(
    [1] = LAYOUT_65_ansi_blocker(
        KC_GESC,   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_DEL, KC_HOME,
        _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SLCK, KC_PAUS,   RESET, KC_PGUP,
        KC_CAPS, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______,          EEP_RST, KC_PGDN,
        KC_LSFT,          _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE,
        _______, _______, _______,                            _______,                            _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
    ),
    [2] = LAYOUT_all(
    [2] = LAYOUT_65_ansi_blocker(
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______, _______,
        _______,          _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______,                            _______,                            _______, _______, _______, _______, _______
    ),
    [3] = LAYOUT_all(
    [3] = LAYOUT_65_ansi_blocker(
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______, _______,

M keyboards/tkc/portico/keymaps/via/keymap.c => keyboards/tkc/portico/keymaps/via/keymap.c +4 -4
@@ 18,28 18,28 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = LAYOUT_all(
    [0] = LAYOUT_65_ansi_blocker(
        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_HOME,
        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_PGUP,
        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, KC_PGDN,
        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_END,
        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                               MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
    ),
    [1] = LAYOUT_all(
    [1] = LAYOUT_65_ansi_blocker(
        KC_GESC,   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_DEL, KC_HOME,
        _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SLCK, KC_PAUS,   RESET, KC_PGUP,
        KC_CAPS, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______,          EEP_RST, KC_PGDN,
        KC_LSFT,          _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE,
        _______, _______, _______,                            _______,                            _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
    ),
    [2] = LAYOUT_all(
    [2] = LAYOUT_65_ansi_blocker(
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______, _______,
        _______,          _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______,                            _______,                            _______, _______, _______, _______, _______
    ),
    [3] = LAYOUT_all(
    [3] = LAYOUT_65_ansi_blocker(
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______, _______,

M keyboards/tkc/portico/portico.h => keyboards/tkc/portico/portico.h +1 -1
@@ 21,7 21,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.

#define XXX KC_NO

#define LAYOUT_all( \
#define LAYOUT_65_ansi_blocker( \
    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \
    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C,      K2E, \

M keyboards/tkc/portico/readme.md => keyboards/tkc/portico/readme.md +4 -5
@@ 1,14 1,13 @@
# TKC Portico

![Photo](https://cdn.shopify.com/s/files/1/1679/2319/products/Portico_BoW_1_590x.png?v=1604373859)
![TKC Portico](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/tkc/portico/portico-clear_overhead_1024x1024.webp)

A 65% keyboard kit with per-key and underglow RGB lighting
A 65% keyboard kit with per-key and underglow RGB lighting.

* Keyboard Maintainer: [TerryMathews](https://github.com/TerryMathews)
* Hardware Supported: TKC Portico
* Hardware Availability: TBA
* Hardware Supported: TKC Portico (ATmega32U4)
* Hardware Availability: [TheKey.Company](https://thekey.company/products/portico-keyboard)

	
Reset board into bootloader by holding down Esc key while plugging in USB-C cable.

Make example for this keyboard (after setting up your build environment):

M keyboards/tkc/portico/rules.mk => keyboards/tkc/portico/rules.mk +2 -0
@@ 22,3 22,5 @@ BLUETOOTH_ENABLE = no          # Enable Bluetooth
AUDIO_ENABLE = no              # Audio output
RGB_MATRIX_ENABLE = yes        # Use RGB matrix
RGB_MATRIX_DRIVER = IS31FL3731

LAYOUTS = 65_ansi_blocker