From 7ddc7fb033e3360b9df8734fd5085e3ec9d8de83 Mon Sep 17 00:00:00 2001 From: David <150765454+Trinxic@users.noreply.github.com> Date: Sun, 7 Jul 2024 20:04:02 -0400 Subject: [PATCH] Add files via upload --- keyboards/boardsource/unicorne/config.h | 42 ++ keyboards/boardsource/unicorne/halconf.h | 9 + keyboards/boardsource/unicorne/info.json | 173 ++++++++ .../unicorne/keymaps/Trinxic/keymap.json | 25 ++ .../unicorne/keymaps/david/keymap.c | 407 ++++++++++++++++++ .../unicorne/keymaps/david/keymap.c.old | 25 ++ .../unicorne/keymaps/default/keymap.json | 25 ++ .../unicorne/keymaps/via/keymap.json | 30 ++ keyboards/boardsource/unicorne/mcuconf.h | 13 + keyboards/boardsource/unicorne/readme.md | 25 ++ keyboards/boardsource/unicorne/rules.mk | 8 + keyboards/boardsource/unicorne/unicorne.c | 39 ++ keyboards/boardsource/unicorne/unicorne.h | 194 +++++++++ 13 files changed, 1015 insertions(+) create mode 100644 keyboards/boardsource/unicorne/config.h create mode 100644 keyboards/boardsource/unicorne/halconf.h create mode 100644 keyboards/boardsource/unicorne/info.json create mode 100644 keyboards/boardsource/unicorne/keymaps/Trinxic/keymap.json create mode 100644 keyboards/boardsource/unicorne/keymaps/david/keymap.c create mode 100644 keyboards/boardsource/unicorne/keymaps/david/keymap.c.old create mode 100644 keyboards/boardsource/unicorne/keymaps/default/keymap.json create mode 100644 keyboards/boardsource/unicorne/keymaps/via/keymap.json create mode 100644 keyboards/boardsource/unicorne/mcuconf.h create mode 100644 keyboards/boardsource/unicorne/readme.md create mode 100644 keyboards/boardsource/unicorne/rules.mk create mode 100644 keyboards/boardsource/unicorne/unicorne.c create mode 100644 keyboards/boardsource/unicorne/unicorne.h diff --git a/keyboards/boardsource/unicorne/config.h b/keyboards/boardsource/unicorne/config.h new file mode 100644 index 00000000..faefc0a3 --- /dev/null +++ b/keyboards/boardsource/unicorne/config.h @@ -0,0 +1,42 @@ +// Copyright 2023 jack (@waffle87) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +// Board: +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET + +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP22 +#define I2C1_SCL_PIN GP23 + +#define MASTER_LEFT + +// Audio Buzzer: +#define AUDIO_PIN GP28 +#define AUDIO_PWM_DRIVER PWMD6 +#define AUDIO_INIT_DELAY +#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_A +// #define STARTUP_SONG SONG(ODE_TO_JOY) // AHHHHHHHHH + +// Analog Sticks: +#define ANALOG_JOYSTICK_Y_AXIS_PIN GP26 +#define ANALOG_JOYSTICK_X_AXIS_PIN GP27 +#define POINTING_DEVICE_INVERT_Y +#define POINTING_DEVICE_INVERT_X + +// Reset Upon Reinitializtion: +#define OS_DETECTION_KEYBOARD_RESET // enables the keyboard reset upon a USB device reinitialization, + // such as switching devices on some KVMs +// OLEDs: +#define OLED_BRIGHTNESS 200 +#define OLED_TIMEOUT 10000 + +// Tap Dance: (milliseconds) +#define TAPPING_TERM 175 + +// Split Keyboard Actions +#define SPLIT_ACTIVITY_ENABLE // allow timeouts +#define SPLIT_LED_STATE_ENABLE // caps-lock, num-lock, etc. +#define SPLIT_MODS_ENABLE // mod key status +#define SPLIT_OLED_ENABLE // oled status (on, off, etc.) +#define SPLIT_WPM_ENABLE // words-per-minute \ No newline at end of file diff --git a/keyboards/boardsource/unicorne/halconf.h b/keyboards/boardsource/unicorne/halconf.h new file mode 100644 index 00000000..21ed454e --- /dev/null +++ b/keyboards/boardsource/unicorne/halconf.h @@ -0,0 +1,9 @@ +// Copyright 2022 jack (@waffle87) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define HAL_USE_I2C TRUE +#define HAL_USE_PWM TRUE +#define HAL_USE_ADC TRUE + +#include_next diff --git a/keyboards/boardsource/unicorne/info.json b/keyboards/boardsource/unicorne/info.json new file mode 100644 index 00000000..52f28b67 --- /dev/null +++ b/keyboards/boardsource/unicorne/info.json @@ -0,0 +1,173 @@ +{ + "manufacturer": "Boardsource", + "maintainer": "waffle87", + "processor": "RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "audio": true, + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true, + "pointing_device": false, + "rgb_matrix": true + }, + "indicators": { + "caps": "GP24" + }, + "split": { + "enabled": true, + "soft_serial_pin": "GP0", + "transport": { + "sync": { + "layer_state": true + } + } + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x7563", + "vid": "0x4273" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP29" + }, + "matrix_pins": { + "cols": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7"], + "rows": ["GP14", "GP15", "GP16", "GP17"] + }, + "encoder": { + "rotary": [ + {"pin_a": "GP8", "pin_b": "GP9"} + ] + }, + "rgb_matrix": { + "animations": { + "alphas_mods": true, + "band_sat": true, + "band_val": true, + "breathing": true, + "gradient_left_right": true, + "gradient_up_down": true + }, + "default": { + "animation": "alphas_mods" + }, + "max_brightness": 150, + "split_count": [27, 27], + "driver": "ws2812", + "layout": [ + {"x": 85, "y": 16, "flags": 2}, + {"x": 50, "y": 13, "flags": 2}, + {"x": 16, "y": 20, "flags": 2}, + {"x": 16, "y": 38, "flags": 2}, + {"x": 50, "y": 48, "flags": 2}, + {"x": 85, "y": 52, "flags": 2}, + {"matrix": [3, 5], "x": 95, "y": 63, "flags": 1}, + {"matrix": [2, 5], "x": 85, "y": 39, "flags": 4}, + {"matrix": [1, 5], "x": 85, "y": 21, "flags": 4}, + {"matrix": [0, 5], "x": 85, "y": 4, "flags": 4}, + {"matrix": [0, 4], "x": 68, "y": 2, "flags": 4}, + {"matrix": [1, 4], "x": 68, "y": 19, "flags": 4}, + {"matrix": [2, 4], "x": 68, "y": 37, "flags": 4}, + {"matrix": [3, 4], "x": 80, "y": 58, "flags": 1}, + {"matrix": [3, 3], "x": 60, "y": 55, "flags": 1}, + {"matrix": [2, 3], "x": 50, "y": 35, "flags": 4}, + {"matrix": [1, 3], "x": 50, "y": 13, "flags": 4}, + {"matrix": [0, 3], "x": 50, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 33, "y": 3, "flags": 4}, + {"matrix": [1, 2], "x": 33, "y": 20, "flags": 4}, + {"matrix": [2, 2], "x": 33, "y": 37, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 42, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 24, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 7, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 7, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 24, "flags": 1}, + {"matrix": [2, 0], "x": 0, "y": 41, "flags": 1}, + {"x": 139, "y": 16, "flags": 2}, + {"x": 174, "y": 13, "flags": 2}, + {"x": 208, "y": 20, "flags": 2}, + {"x": 208, "y": 38, "flags": 2}, + {"x": 174, "y": 48, "flags": 2}, + {"x": 139, "y": 52, "flags": 2}, + {"matrix": [7, 5], "x": 129, "y": 63, "flags": 1}, + {"matrix": [6, 5], "x": 139, "y": 39, "flags": 4}, + {"matrix": [5, 5], "x": 139, "y": 21, "flags": 4}, + {"matrix": [4, 5], "x": 139, "y": 4, "flags": 4}, + {"matrix": [4, 4], "x": 156, "y": 2, "flags": 4}, + {"matrix": [5, 4], "x": 156, "y": 19, "flags": 4}, + {"matrix": [6, 4], "x": 156, "y": 37, "flags": 4}, + {"matrix": [7, 4], "x": 144, "y": 58, "flags": 1}, + {"matrix": [7, 3], "x": 164, "y": 55, "flags": 1}, + {"matrix": [6, 3], "x": 174, "y": 35, "flags": 4}, + {"matrix": [5, 3], "x": 174, "y": 13, "flags": 4}, + {"matrix": [4, 3], "x": 174, "y": 0, "flags": 4}, + {"matrix": [4, 2], "x": 191, "y": 3, "flags": 4}, + {"matrix": [5, 2], "x": 191, "y": 20, "flags": 4}, + {"matrix": [6, 2], "x": 191, "y": 37, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 24, "flags": 4}, + {"matrix": [4, 1], "x": 208, "y": 7, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 7, "flags": 1}, + {"matrix": [5, 0], "x": 0, "y": 24, "flags": 1}, + {"matrix": [6, 0], "x": 0, "y": 41, "flags": 1} + ], + "sleep": true + }, + "community_layouts": ["split_3x6_3"], + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x6_3" + }, + "layouts": { + "LAYOUT_split_3x6_3": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.3}, + {"matrix": [0, 1], "x": 1, "y": 0.3}, + {"matrix": [0, 2], "x": 2, "y": 0.1}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.1}, + {"matrix": [0, 5], "x": 5, "y": 0.2}, + {"matrix": [4, 5], "x": 9, "y": 0.2}, + {"matrix": [4, 4], "x": 10, "y": 0.1}, + {"matrix": [4, 3], "x": 11, "y": 0}, + {"matrix": [4, 2], "x": 12, "y": 0.1}, + {"matrix": [4, 1], "x": 13, "y": 0.3}, + {"matrix": [4, 0], "x": 14, "y": 0.3}, + {"matrix": [1, 0], "x": 0, "y": 1.3}, + {"matrix": [1, 1], "x": 1, "y": 1.3}, + {"matrix": [1, 2], "x": 2, "y": 1.1}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.1}, + {"matrix": [1, 5], "x": 5, "y": 1.2}, + {"matrix": [5, 5], "x": 9, "y": 1.2}, + {"matrix": [5, 4], "x": 10, "y": 1.1}, + {"matrix": [5, 3], "x": 11, "y": 1}, + {"matrix": [5, 2], "x": 12, "y": 1.1}, + {"matrix": [5, 1], "x": 13, "y": 1.3}, + {"matrix": [5, 0], "x": 14, "y": 1.3}, + {"matrix": [2, 0], "x": 0, "y": 2.3}, + {"matrix": [2, 1], "x": 1, "y": 2.3}, + {"matrix": [2, 2], "x": 2, "y": 2.1}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.1}, + {"matrix": [2, 5], "x": 5, "y": 2.2}, + {"matrix": [6, 5], "x": 9, "y": 2.2}, + {"matrix": [6, 4], "x": 10, "y": 2.1}, + {"matrix": [6, 3], "x": 11, "y": 2}, + {"matrix": [6, 2], "x": 12, "y": 2.1}, + {"matrix": [6, 1], "x": 13, "y": 2.3}, + {"matrix": [6, 0], "x": 14, "y": 2.3}, + {"matrix": [3, 3], "x": 4, "y": 3.7}, + {"matrix": [3, 4], "x": 5, "y": 3.7}, + {"matrix": [3, 5], "x": 6, "y": 3.2, "h": 1.5}, + {"matrix": [7, 5], "x": 8, "y": 3.2, "h": 1.5}, + {"matrix": [7, 4], "x": 9, "y": 3.7}, + {"matrix": [7, 3], "x": 10, "y": 3.7} + ] + } + } +} diff --git a/keyboards/boardsource/unicorne/keymaps/Trinxic/keymap.json b/keyboards/boardsource/unicorne/keymaps/Trinxic/keymap.json new file mode 100644 index 00000000..1980bc3c --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/Trinxic/keymap.json @@ -0,0 +1,25 @@ +{ + "keyboard": "boardsource/unicorne", + "keymap": "default", + "layout": "LAYOUT_split_3x6_3", + "layers": [ + [ + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "KC_LCTL", "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_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_ESC", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)", "KC_RALT" + ], + [ + "_______", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "_______", + "_______", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RGB_VAI", "RGB_HUI", "RGB_SAI", "RGB_MOD", "RGB_TOG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RGB_VAD", "RGB_HUD", "RGB_SAD", "RGB_RMOD", "CK_TOGG", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/boardsource/unicorne/keymaps/david/keymap.c b/keyboards/boardsource/unicorne/keymaps/david/keymap.c new file mode 100644 index 00000000..7da59c8d --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/david/keymap.c @@ -0,0 +1,407 @@ +#include QMK_KEYBOARD_H + + +// ------------------ Tap-Dance ----------------- // +enum { + TD_SHFT_CAPS = 0 +}; +tap_dance_action_t tap_dance_actions[] = { + [TD_SHFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) +}; +// if caps lock is on && is pressed: toggle/turn off caps lock + +// ------------------- Layers ------------------- // +enum layers { // Layers + _DVRK, + _QWRT, + _GAME, + _SYMB, + _NAV, + _FUNC, + _SYS +}; + +/* Layer Blueprint: + [_{NAME}] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //'--------------------------' '--------------------------' + ), +*/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_DVRK] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + KC_TAB, KC_SCLN, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_ENT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + TD(TD_SHFT_CAPS), KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + KC_LGUI, KC_BSPC, MO(_NAV), MO(_SYMB), KC_SPC, KC_RALT + //'--------------------------' '--------------------------' + ), + [_QWRT] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + TD(TD_SHFT_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + KC_LGUI, KC_BSPC, MO(_NAV), MO(_SYMB), KC_SPC, KC_RALT + //'--------------------------' '--------------------------' + ), + [_GAME] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + KC_TAB, KC_T, KC_Q, KC_W, KC_E, KC_R, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_G, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_B, KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + KC_LALT, KC_SPC, MO(_SYMB), MO(_NAV), KC_SPC, KC_LGUI + //'--------------------------' '--------------------------' + ), + [_SYMB] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + KC_ESC, _______, _______, _______, KC_ASTR, KC_CIRC, KC_PLUS, KC_1, KC_2, KC_3, KC_PERC, TO(_FUNC), + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_HASH, KC_LPRN, KC_RPRN, KC_SLSH, KC_BSLS, KC_EQL, KC_4, KC_5, KC_6, KC_0, KC_AT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, KC_LBRC, KC_RBRC, KC_EXLM, KC_GRV, KC_MINS, KC_7, KC_8, KC_9, KC_DLR, _______, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + _______, _______, XXXXXXX, _______, _______, _______ + //'--------------------------' '--------------------------' + ), + [_NAV] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + TO(_FUNC), XXXXXXX, KC_FIND, KC_UNDO, KC_AGIN, XXXXXXX, XXXXXXX, KC_END, KC_PGDN, KC_PGUP, KC_HOME, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, KC_CUT, KC_COPY, KC_PSTE, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + KC_LGUI, XXXXXXX, _______, XXXXXXX, _______, _______ + //'--------------------------' '--------------------------' + ), + [_FUNC] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_VOLU, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, XXXXXXX, KC_MUTE, KC_MPLY, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, KC_VOLD, KC_MPRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + TO(_SYS), TO(_DVRK), XXXXXXX, XXXXXXX, TO(_DVRK), TO(_SYS) + //'--------------------------' '--------------------------' + ), + [_SYS] = LAYOUT_split_3x6_3( + //,-----------------------------------------------------, ,-----------------------------------------------------, + QK_RBT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_VAI, RGB_SPI, BL_BRTG, BL_UP, QK_RBT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_VAD, RGB_SPD, BL_TOGG, BL_DOWN, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, + //'--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------' + TO(_QWRT), TO(_DVRK), TO(_GAME), TO(_GAME), TO(_DVRK), TO(_QWRT) + //'--------------------------' '--------------------------' + ) +}; + + +// don't touch.. idk what this does at the moment +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + +}; +#endif + +// Layer Timeout +void matrix_scan_user(void) { + if ( // any 'toggled' layer is active + (get_highest_layer(layer_state) == _FUNC + || get_highest_layer(layer_state) == _SYS) + && last_input_activity_elapsed() > 10000 // 10 seconds + ) { + layer_move(_DVRK); + oled_off(); // not working... now try + } +} + +// ------------------- Macros ------------------- // +// https://docs.qmk.fm/feature_advanced_keycodes#shift-backspace-for-delete +uint8_t mod_state; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mod_state = get_mods(); // Store the current modifier state + switch (keycode) { + case KC_BSPC: { + // Track delete key status: registered or not? + static bool delkey_registered; + if (record->event.pressed) { + // Detect the activation of either shift keys + if (mod_state & MOD_MASK_SHIFT) { + // Temporarily canceling both shifts + // so 'shift' isn't applied to KC_DEL + del_mods(MOD_MASK_SHIFT); + register_code(KC_DEL); + // Update the boolean variable to reflect the status of KC_DEL + delkey_registered = true; + // Reapplying modifier state so that the held shift key(s) + // still work even after having tapped the Backspace/Delete key. + set_mods(mod_state); + return false; + } + } else { // on release of KC_BSPC + // In case KC_DEL is still being sent even after the release of KC_BSPC + if (delkey_registered) { + unregister_code(KC_DEL); + delkey_registered = false; + return false; + } + } + // Let QMK process the KC_BSPC keycode as usual outside of shift + return true; + } + } + return true; +}; + +// ---------------- OLED Screens ---------------- // +#ifdef OLED_ENABLE + +// Rotate Screens +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + bool vertical_text = false; + if (vertical_text) { // vertical + if (!is_keyboard_left()) { return OLED_ROTATION_180; } + return rotation; + } else { // horizontal + return OLED_ROTATION_270; + } +} + +// Layer Status +void render_current_layer(void) { + oled_set_cursor(0, 1); + switch (get_highest_layer(layer_state)) { + case _DVRK: + oled_write_P(PSTR(" DVRK\n"), false); break; + case _QWRT: + oled_write_P(PSTR(" QWRT\n"), false); break; + case _GAME: + oled_write_P(PSTR(" GAME\n"), false); break; + case _SYMB: + oled_write_P(PSTR(" SYMB\n"), false); break; + case _NAV: + oled_write_P(PSTR(" NAV\n"), false); break; + case _FUNC: + oled_write_P(PSTR(" FUNC\n"), false); break; + case _SYS: + oled_write_P(PSTR(" SYS\n"), false); break; + default: + oled_write_P(PSTR("ERROR\n"), false); break; + } +} + +// Logos +static void render_apple_logo(void) { + static const char PROGMEM raw_logo_apple[] = { // `const unsigned char` + 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,128,128, 0, 0, 0, + 112,124, 62, 62,159,135,128,128,128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,224,248,252,254,255,255,255,255,255,255,255,255,254, + 254,254,255,255,255,255,255,255,255, 31, 15, 6, 0, 0, 0, 0, + 0, 0, 0, 31,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,248,224,192,192, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 7, 15, 31, 63,127,127,127, 63, 63, 31, + 31, 31, 31, 63, 63,127,127, 63, 63, 31, 15, 3, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo_apple, sizeof(raw_logo_apple)); +} +static void render_arch_logo(void) { + static const char PROGMEM raw_arch_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,224, + 240,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,224,248,242,247,239, + 255,255,255,252,240,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,192,240,252,254,255,255,127, 7, 3, 1, + 1, 3, 7,127,255,255,255,252,184,160,128, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 12, 7, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 14, 8, 0, 0, 0, + }; + oled_write_raw_P(raw_arch_logo, sizeof(raw_arch_logo)); +} +static void render_windows_logo(void) { + static const char PROGMEM raw_windows_logo[] = { + 0, 0, 0,128,128,128,128,192,192,192,192,192,192,224, 0,224, + 224,224,224,224,240,240,240,240,240,240,248,248,248, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255, 0,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, + 0, 0, 0,254,254,254,254,254,254,254,254,254,254,254, 0,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254, 0, 0, 0, + 0, 0, 0, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 0, 7, + 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 31, 0, 0, 0, + }; + oled_write_raw_P(raw_windows_logo, sizeof(raw_windows_logo)); +} +// Display Current OS on start-up +bool process_detected_host_os_kb(os_variant_t detected_os) { + if (!process_detected_host_os_user(detected_os)) { + return false; + } + if (is_keyboard_master()) { + oled_set_cursor(0, 5); + switch (detected_os) { + case OS_MACOS: + case OS_IOS: + render_apple_logo(); + break; + case OS_WINDOWS: + render_windows_logo(); + break; + case OS_LINUX: + render_arch_logo(); // this would be awkward if it's not Arch.. + // I'm not drawing the penguin for this + break; + case OS_UNSURE: + oled_write(PSTR("OS: ?"), false); + // display some symbol to represent unfamiliar OS + break; + } + } + return true; +} + +// Mod Key Icons (Paired) +static const char PROGMEM mod_icons[4][4][64] = { // 1 = pressed + { // ctl_shft +/*0 0*/ { 0,240,248, 4, 2,130,194, 98, 50, 98,194,130, 2, 4,248, 0, 0,240,248, 4, 2, 66, 98,242,250,242, 98, 66, 2, 4,248, 0, 0, 31, 63,112, 96, 97, 96, 96, 96, 96, 96, 97, 32, 16, 15, 0, 0, 31, 63,112, 96, 96, 96,111,111,111, 96, 96, 32, 16, 15, 0}, +/*0 1*/ { 0,240,248, 4, 2,130,194, 98, 50, 98,194,130, 2, 4,248, 0, 0,240,248,252,124, 60, 28, 12, 28, 60,124,252,248,240, 0, 0, 0, 31, 63,112, 96, 97, 96, 96, 96, 96, 96, 97, 32, 16, 15, 0, 0, 31, 63,127,127,127, 96, 96, 96,127,127,127, 63, 31, 0, 0}, +/*1 0*/ { 0,240,248,252,252,124, 60,156, 60,124,252,252,248,240, 0, 0, 0,240,248, 4, 2, 66, 98,242,250,242, 98, 66, 2, 4,248, 0, 0, 31, 63,127,124,126,127,127,127,126,124,127, 63, 31, 0, 0, 0, 31, 63,112, 96, 96, 96,111,111,111, 96, 96, 32, 16, 15, 0}, +/*1 1*/ { 0,240,248,252,252,124, 60,156, 60,124,252,252,248,240, 0, 0, 0,240,248,252,124, 60, 28, 12, 28, 60,124,252,248,240, 0, 0, 0, 31, 63,127,124,126,127,127,127,126,124,127, 63, 31, 0, 0, 0, 31, 63,127,127,127, 96, 96, 96,127,127,127, 63, 31, 0, 0}, + }, { // gui_alt (linux/unknown) +/*0 0*/ { 0,240,248, 4,114,250,154,154,154,154,154,186, 50, 4,248, 0, 0,240,248, 4, 2,194,226, 50, 50, 50,226,194, 2, 4,248, 0, 0, 31, 63,112,102,110,108,108,108,108,108,111, 39, 16, 15, 0, 0, 31, 63,112, 96,103,103, 97, 97, 97,103,103, 32, 16, 15, 0}, +/*0 1*/ { 0,240,248, 4,114,250,154,154,154,154,154,186, 50, 4,248, 0, 0,240,248,252,124, 60,156,156,156, 60,124,252,248,240, 0, 0, 0, 31, 63,112,102,110,108,108,108,108,108,111, 39, 16, 15, 0, 0, 31, 63,127,112,112,125,125,125,112,112,127, 63, 31, 0, 0}, +/*1 0*/ { 0,240,248, 28, 12,204,204,204,204,204,140,156,248,240, 0, 0, 0,240,248, 4, 2,194,226, 50, 50, 50,226,194, 2, 4,248, 0, 0, 31, 63,115, 98,102,102,102,102,102, 96,113, 63, 31, 0, 0, 0, 31, 63,112, 96,103,103, 97, 97, 97,103,103, 32, 16, 15, 0}, +/*1 1*/ { 0,240,248, 28, 12,204,204,204,204,204,140,156,248,240, 0, 0, 0,240,248,252,124, 60,156,156,156, 60,124,252,248,240, 0, 0, 0, 31, 63,115, 98,102,102,102,102,102, 96,113, 63, 31, 0, 0, 0, 31, 63,127,112,112,125,125,125,112,112,127, 63, 31, 0, 0}, + }, { // gui_alt (mac/ios) +/*0 0*/ { 0,240,248, 4, 18, 42,242, 34, 34, 34,242, 42, 18, 4,248, 0, 0,240,248, 4, 2, 18, 18, 34,194, 2, 18, 18, 2, 4,248, 0, 0, 31, 63,112,100,106,103, 98, 98, 98,103,106, 36, 16, 15, 0, 0, 31, 63,112, 96, 96, 96, 96, 97, 98,100,100, 32, 16, 15, 0}, +/*0 1*/ { 0,240,248, 4, 18, 42,242, 34, 34, 34,242, 42, 18, 4,248, 0, 0,240,248,252,220,220,188,124,252,220,220,252,248,240, 0, 0, 0, 31, 63,112,100,106,103, 98, 98, 98,103,106, 36, 16, 15, 0, 0, 31, 63,127,127,127,127,124,123,119,119,127, 63, 31, 0, 0}, +/*1 0*/ { 0,240,248,220,172, 28,188,188,188, 28,172,220,248,240, 0, 0, 0,240,248, 4, 2, 18, 18, 34,194, 2, 18, 18, 2, 4,248, 0, 0, 31, 63,119,107,112,123,123,123,112,107,119, 63, 31, 0, 0, 0, 31, 63,112, 96, 96, 96, 96, 97, 98,100,100, 32, 16, 15, 0}, +/*1 1*/ { 0,240,248,220,172, 28,188,188,188, 28,172,220,248,240, 0, 0, 0,240,248,252,220,220,188,124,252,220,220,252,248,240, 0, 0, 0, 31, 63,119,107,112,123,123,123,112,107,119, 63, 31, 0, 0, 0, 31, 63,127,127,127,127,124,123,119,119,127, 63, 31, 0, 0}, + }, { // gui_alt (windows) +/*0 0*/ { 0,240,248, 4, 2,114,114,114, 2,114,114,114, 2, 4,248, 0, 0,240,248, 4, 2,194,226, 50, 50, 50,226,194, 2, 4,248, 0, 0, 31, 63,112, 96,103,103,103, 96,103,103,103, 32, 16, 15, 0, 0, 31, 63,112, 96,103,103, 97, 97, 97,103,103, 32, 16, 15, 0}, +/*0 1*/ { 0,240,248, 4, 2,114,114,114, 2,114,114,114, 2, 4,248, 0, 0,240,248,252,124, 60,156,156,156, 60,124,252,248,240, 0, 0, 0, 31, 63,112, 96,103,103,103, 96,103,103,103, 32, 16, 15, 0, 0, 31, 63,127,112,112,125,125,125,112,112,127, 63, 31, 0, 0}, +/*1 0*/ { 0,240,248,252, 28, 28, 28,252, 28, 28, 28,252,248,240, 0, 0, 0,240,248, 4, 2,194,226, 50, 50, 50,226,194, 2, 4,248, 0, 0, 31, 63,127,113,113,113,127,113,113,113,127, 63, 31, 0, 0, 0, 31, 63,112, 96,103,103, 97, 97, 97,103,103, 32, 16, 15, 0}, +/*1 1*/ { 0,240,248,252, 28, 28, 28,252, 28, 28, 28,252,248,240, 0, 0, 0,240,248,252,124, 60,156,156,156, 60,124,252,248,240, 0, 0, 0, 31, 63,127,113,113,113,127,113,113,113,127, 63, 31, 0, 0, 0, 31, 63,127,112,112,125,125,125,112,112,127, 63, 31, 0, 0}, + } +}; + + +static void render_ctl_shift(int ctl, int shft) { + oled_write_raw_P( + mod_icons[0][2*ctl + shft], + sizeof(mod_icons[0][2*ctl + shft]) + ); +} + + +static void render_gui_alt(int gui, int alt) { + int os_num; + os_variant_t detected_os = detected_host_os(); + switch (detected_os) { + case OS_MACOS: + case OS_IOS: + os_num = 1; + break; + case OS_WINDOWS: + os_num = 2; + break; + default: + os_num = 0; + } + + oled_write_raw_P( + mod_icons[1 + os_num][2*gui + alt], + sizeof(mod_icons[1 + os_num][2*gui + alt]) + ); +} + + +void render_mod_status(uint8_t mod_status) { + bool is_caps = host_keyboard_led_state().caps_lock; + #ifdef CAPS_WORD_ENABLE + is_caps |= is_caps_word_on(); + #endif + + oled_set_cursor(0, 5); + render_ctl_shift( + (mod_status & MOD_MASK_CTRL) ? 1 : 0, + (mod_status & MOD_MASK_SHIFT || is_caps) ? 1 : 0 + ); + + oled_set_cursor(0, 7); + render_gui_alt( + (mod_status & MOD_MASK_GUI) ? 1 : 0, + (mod_status & MOD_MASK_ALT) ? 1 : 0 + ); +} + +// Display Words-per-minute +int peak_wpm, curr_wpm; +void render_wpm(void) { + curr_wpm = get_current_wpm(); + + // get WPM Peak | reset if wpm is 0 + oled_set_cursor(1, 12); + if (curr_wpm == 0) { peak_wpm = 0; } + if (curr_wpm > peak_wpm || last_input_activity_elapsed() > 3500) { + peak_wpm = curr_wpm; + } + oled_write(get_u8_str(peak_wpm, '0'), false); + + oled_set_cursor(0, 13); + oled_write(PSTR("-----"), false); + oled_set_cursor(1, 14); + oled_write(get_u8_str(get_current_wpm(), '0'), false); + oled_set_cursor(1, 15); + oled_write(PSTR("WPM"), false); +} + + +void render_caps_lock(void) { + oled_set_cursor(1, 10); + oled_write_P( + host_keyboard_led_state().caps_lock ? PSTR("CAPS") : PSTR("\n"), + false + ); +} + + +void master_oled(void) { // Left Side + render_current_layer(); + // render_caps_lock(); // don't need if I have mod key status active +} + + +void slave_oled(void) { // Right Side + render_current_layer(); + render_mod_status(get_mods() | get_oneshot_mods()); + render_wpm(); +} + + +bool oled_task_user() { + if(is_keyboard_master()) master_oled(); + else slave_oled(); + + return false; +} + +#endif \ No newline at end of file diff --git a/keyboards/boardsource/unicorne/keymaps/david/keymap.c.old b/keyboards/boardsource/unicorne/keymaps/david/keymap.c.old new file mode 100644 index 00000000..f69fd2f0 --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/david/keymap.c.old @@ -0,0 +1,25 @@ +#include QMK_KEYBOARD_H + + +/* THIS FILE WAS GENERATED! + * + * This file was generated by qmk json2c. You may or may not want to + * edit it directly. + */ + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split_3x6_3(KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_LCTL, 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_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ESC, KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_RALT), + [1] = LAYOUT_split_3x6_3(_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + [2] = LAYOUT_split_3x6_3(QK_BOOT, _______, _______, _______, _______, _______, RGB_VAI, RGB_HUI, RGB_SAI, RGB_MOD, RGB_TOG, _______, EE_CLR, _______, _______, _______, _______, _______, RGB_VAD, RGB_HUD, RGB_SAD, RGB_RMOD, CK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + +}; +#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) + + + + diff --git a/keyboards/boardsource/unicorne/keymaps/default/keymap.json b/keyboards/boardsource/unicorne/keymaps/default/keymap.json new file mode 100644 index 00000000..1980bc3c --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/default/keymap.json @@ -0,0 +1,25 @@ +{ + "keyboard": "boardsource/unicorne", + "keymap": "default", + "layout": "LAYOUT_split_3x6_3", + "layers": [ + [ + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "KC_LCTL", "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_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_ESC", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)", "KC_RALT" + ], + [ + "_______", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "_______", + "_______", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RGB_VAI", "RGB_HUI", "RGB_SAI", "RGB_MOD", "RGB_TOG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RGB_VAD", "RGB_HUD", "RGB_SAD", "RGB_RMOD", "CK_TOGG", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/boardsource/unicorne/keymaps/via/keymap.json b/keyboards/boardsource/unicorne/keymaps/via/keymap.json new file mode 100644 index 00000000..230fc6e3 --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/via/keymap.json @@ -0,0 +1,30 @@ +{ + "keyboard": "boardsource/unicorne", + "keymap": "via", + "layout": "LAYOUT_split_3x6_3", + "config": { + "features": { + "via": true + } + }, + "layers": [ + [ + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "KC_LCTL", "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_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_ESC", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)", "KC_RALT" + ], + [ + "_______", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "_______", + "_______", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RGB_VAI", "RGB_HUI", "RGB_SAI", "RGB_MOD", "RGB_TOG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RGB_VAD", "RGB_HUD", "RGB_SAD", "RGB_RMOD", "CK_TOGG", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/boardsource/unicorne/mcuconf.h b/keyboards/boardsource/unicorne/mcuconf.h new file mode 100644 index 00000000..60e7b581 --- /dev/null +++ b/keyboards/boardsource/unicorne/mcuconf.h @@ -0,0 +1,13 @@ +// Copyright 2022 jack (@waffle87) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#include_next + +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C1 TRUE + +#undef RP_PWM_USE_PWM6 +#define RP_PWM_USE_PWM6 TRUE + +#undef RP_ADC_USE_ADC1 +#define RP_ADC_USE_ADC1 TRUE diff --git a/keyboards/boardsource/unicorne/readme.md b/keyboards/boardsource/unicorne/readme.md new file mode 100644 index 00000000..3f4472b8 --- /dev/null +++ b/keyboards/boardsource/unicorne/readme.md @@ -0,0 +1,25 @@ +# Unicorne + +![image](https://i.imgur.com/akJJFUmh.jpeg) + +* Keyboard Maintainer: [waffle87](https://github.com/waffle87) +* Hardware Supported: Unicorne PCBs w/ integrated RP2040 microcontroller +* Hardware Availability: [boardsource.xyz](https://boardsource.xyz) + +Make example for this keyboard (after setting up your build environment): + + make boardsource/unicorne:default + +Flashing example for this keyboard: + + make boardsource/unicorne: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 (the top left key) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/boardsource/unicorne/rules.mk b/keyboards/boardsource/unicorne/rules.mk new file mode 100644 index 00000000..0e5f2886 --- /dev/null +++ b/keyboards/boardsource/unicorne/rules.mk @@ -0,0 +1,8 @@ +SERIAL_DRIVER = vendor +AUDIO_DRIVER = pwm_hardware +POINTING_DEVICE_DRIVER = analog_joystick +BOOTLOADER = rp2040 +LTO_ENABLE = yes +WPM_ENABLE = yes +TAP_DANCE_ENABLE = yes +OS_DETECTION_ENABLE = yes \ No newline at end of file diff --git a/keyboards/boardsource/unicorne/unicorne.c b/keyboards/boardsource/unicorne/unicorne.c new file mode 100644 index 00000000..dc753643 --- /dev/null +++ b/keyboards/boardsource/unicorne/unicorne.c @@ -0,0 +1,39 @@ +// Copyright 2023 jack (@waffle87) +// SPDX-License-Identifier: GPL-2.0-or-later +#include "unicorne.h" + +/* DEFAULT DISPLAY: +#ifdef OLED_ENABLE +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + if (!is_keyboard_master()) { + return OLED_ROTATION_180; + } + return rotation; +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + if (is_keyboard_master()) { + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_raw(layer_zero, sizeof(layer_zero)); + break; + case 1: + oled_write_raw(layer_one, sizeof(layer_one)); + break; + case 2: + oled_write_raw(layer_two, sizeof(layer_two)); + break; + case 3: + oled_write_raw(layer_three, sizeof(layer_three)); + break; + } + } else { + oled_write_raw(logo, sizeof(logo)); + } + return false; +} +#endif +*/ \ No newline at end of file diff --git a/keyboards/boardsource/unicorne/unicorne.h b/keyboards/boardsource/unicorne/unicorne.h new file mode 100644 index 00000000..68bbeeb1 --- /dev/null +++ b/keyboards/boardsource/unicorne/unicorne.h @@ -0,0 +1,194 @@ +// Copyright 2023 jack (@waffle87) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#include "quantum.h" + +#ifdef OLED_ENABLE +// clang-format off +static const char PROGMEM logo[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x01, 0xe3, 0xe7, 0xe7, 0xe3, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, + 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0xe0, + 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xe7, 0xc1, 0x81, 0x81, 0x81, 0xc1, 0x00, 0x00, 0x7f, + 0xff, 0xff, 0xff, 0xe3, 0xc1, 0x81, 0x81, 0xc1, 0xe3, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, + 0xcd, 0x8c, 0x8c, 0x8c, 0x8d, 0xcf, 0xcf, 0xcf, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x03, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 layer_zero[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x18, 0x30, 0x60, 0xe0, 0xc0, 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, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc8, 0xf8, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x0f, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, + 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0xfc, 0x0e, 0x07, 0x03, 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, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x80, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf8, 0xf0, 0x60, + 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x01, 0x03, 0x07, + 0x07, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, + 0x00, 0x01, 0x03, 0x07, 0x06, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + + +static const char PROGMEM layer_one[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x18, 0x30, 0x60, 0xe0, 0xc0, 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, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc8, 0xf8, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x0f, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, + 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x80, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x3f, 0x70, 0xe0, 0xc0, 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, 0xf8, 0xf0, 0x60, + 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x01, 0x03, 0x07, + 0x07, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, + 0x00, 0x01, 0x03, 0x07, 0x06, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + + +static const char PROGMEM layer_two[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x18, 0x30, 0x60, 0xe0, 0xc0, 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, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc8, 0xf8, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x0f, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, + 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x80, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xe0, 0x70, 0x38, 0x1f, 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, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf0, 0x60, + 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x01, 0x03, 0x07, + 0x07, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 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, 0x0f, 0x0f, 0x00, + 0x00, 0x01, 0x03, 0x07, 0x06, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + + +static const char PROGMEM layer_three[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x18, 0x30, 0x60, 0xe0, 0xc0, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 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, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc8, 0xf8, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x0f, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, + 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 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, 0x03, 0x07, 0x0e, 0xfc, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x80, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf8, 0xf0, 0x60, + 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x01, 0x03, 0x07, + 0x07, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, + 0x00, 0x01, 0x03, 0x07, 0x06, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +// clang-format on +#endif