Merge branch 'master' of github.com:qmk/qmk_firmware

This commit is contained in:
Thomas Haukland 2022-11-12 12:14:19 +01:00
commit ed3dd5374f
502 changed files with 25735 additions and 11320 deletions

View File

@ -16,7 +16,7 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th
## Caveats ## Caveats
Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`). Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(MOD_LSFT)`).
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held. This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
Switching layers will not cancel the Key Lock. The Key Lock can be cancelled by calling the `cancel_key_lock()` function. Switching layers will not cancel the Key Lock. The Key Lock can be cancelled by calling the `cancel_key_lock()` function.

View File

@ -560,7 +560,7 @@ enum rgb_matrix_effects {
RGB_MATRIX_CYCLE_UP_DOWN, // Full gradient scrolling top to bottom RGB_MATRIX_CYCLE_UP_DOWN, // Full gradient scrolling top to bottom
RGB_MATRIX_CYCLE_OUT_IN, // Full gradient scrolling out to in RGB_MATRIX_CYCLE_OUT_IN, // Full gradient scrolling out to in
RGB_MATRIX_CYCLE_OUT_IN_DUAL, // Full dual gradients scrolling out to in RGB_MATRIX_CYCLE_OUT_IN_DUAL, // Full dual gradients scrolling out to in
RGB_MATRIX_RAINBOW_MOVING_CHEVRON, // Full gradent Chevron shapped scrolling left to right RGB_MATRIX_RAINBOW_MOVING_CHEVRON, // Full gradient Chevron shapped scrolling left to right
RGB_MATRIX_CYCLE_PINWHEEL, // Full gradient spinning pinwheel around center of keyboard RGB_MATRIX_CYCLE_PINWHEEL, // Full gradient spinning pinwheel around center of keyboard
RGB_MATRIX_CYCLE_SPIRAL, // Full gradient spinning spiral around center of keyboard RGB_MATRIX_CYCLE_SPIRAL, // Full gradient spinning spiral around center of keyboard
RGB_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard RGB_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard

View File

@ -21,7 +21,7 @@
## 注意事項 ## 注意事項
キーロックは、標準アクションキーと[ワンショットモディファイア](ja/one_shot_keys.md)キー (例えば、Shift を `OSM(KC_LSFT)` と定義した場合)のみを押し続けることができます。 キーロックは、標準アクションキーと[ワンショットモディファイア](ja/one_shot_keys.md)キー (例えば、Shift を `OSM(MOD_LSFT)` と定義した場合)のみを押し続けることができます。
これは、QMK の特殊機能(ワンショットモディファイアを除く)、または `KC_LPRN` のような shift を押されたキーのバージョンは含みません。[基本的なキーコード](ja/keycodes_basic.md)リストにある場合、押したままにすることができます。 これは、QMK の特殊機能(ワンショットモディファイアを除く)、または `KC_LPRN` のような shift を押されたキーのバージョンは含みません。[基本的なキーコード](ja/keycodes_basic.md)リストにある場合、押したままにすることができます。
レイヤーの切り替えは、キーロックを解除しません。 レイヤーの切り替えは、キーロックを解除しません。

View File

@ -1,6 +1,6 @@
# 'serial' Driver # 'serial' Driver
The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available, depending on the platform of your split keyboard. Note that none of the drivers support split keyboards with more then two halves. The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available, depending on the platform of your split keyboard. Note that none of the drivers support split keyboards with more than two halves.
| Driver | AVR | ARM | Connection between halves | | Driver | AVR | ARM | Connection between halves |
| --------------------------------------- | ------------------ | ------------------ | --------------------------------------------------------------------------------------------- | | --------------------------------------- | ------------------ | ------------------ | --------------------------------------------------------------------------------------------- |

View File

@ -0,0 +1,73 @@
// Copyright 2022 ziptyze (@ziptyze)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "config_common.h"
#define RGB_DI_PIN GP19
#define DRIVER_LED_TOTAL 61
#define RGBLED_NUM 61
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
#define RGBLIGHT_LIMIT_VAL 125
#define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 125
// RGB Matrix Animation modes. Explicitly enabled
// For full list of effects, see:
// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
# define ENABLE_RGB_MATRIX_ALPHAS_MODS
# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
# define ENABLE_RGB_MATRIX_BREATHING
# define ENABLE_RGB_MATRIX_BAND_SAT
# define ENABLE_RGB_MATRIX_BAND_VAL
# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
# define ENABLE_RGB_MATRIX_CYCLE_ALL
# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
# define ENABLE_RGB_MATRIX_DUAL_BEACON
# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
# define ENABLE_RGB_MATRIX_RAINDROPS
# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
# define ENABLE_RGB_MATRIX_HUE_BREATHING
# define ENABLE_RGB_MATRIX_HUE_PENDULUM
# define ENABLE_RGB_MATRIX_HUE_WAVE
# define ENABLE_RGB_MATRIX_PIXEL_RAIN
# define ENABLE_RGB_MATRIX_PIXEL_FLOW
# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
# define ENABLE_RGB_MATRIX_SPLASH
# define ENABLE_RGB_MATRIX_MULTISPLASH
# define ENABLE_RGB_MATRIX_SOLID_SPLASH
# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* Bootmagic Lite key configuration */
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0

View File

@ -0,0 +1,170 @@
{
"manufacturer": "1upkeyboards",
"keyboard_name": "pi60_rgb",
"maintainer": "ziptyze",
"processor": "RP2040",
"bootloader": "rp2040",
"board": "GENERIC_RP_RP2040",
"usb": {
"device_version": "1.0.0",
"pid": "0x5602",
"vid": "0x6F75"
},
"debounce": 5,
"diode_direction": "COL2ROW",
"dynamic_keymap": {
"layer_count": 10
},
"features": {
"audio": false,
"backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"rgb_matrix": true,
"rgblight": false
},
"matrix_pins": {
"cols": ["GP3", "GP4", "GP5", "GP20", "GP18", "GP13", "GP17", "GP16", "GP15", "GP12", "GP11", "GP14", "GP10", "GP9"],
"rows": ["GP1", "GP2", "GP8", "GP6", "GP0", "GP21"]
},
"mouse_key": {
"enabled": true
},
"rgb_matrix": {
"driver": "WS2812",
"layout": [
{ "flags": 1, "matrix": [5, 5], "x": 103, "y": 58 },
{ "flags": 1, "matrix": [5, 10], "x": 159, "y": 58 },
{ "flags": 1, "matrix": [5, 11], "x": 178, "y": 58 },
{ "flags": 1, "matrix": [5, 12], "x": 196, "y": 58 },
{ "flags": 1, "matrix": [5, 13], "x": 215, "y": 58 },
{ "flags": 1, "matrix": [3, 13], "x": 204, "y": 45 },
{ "flags": 4, "matrix": [3, 10], "x": 176, "y": 45 },
{ "flags": 4, "matrix": [3, 9], "x": 161, "y": 45 },
{ "flags": 4, "matrix": [3, 8], "x": 146, "y": 45 },
{ "flags": 4, "matrix": [3, 7], "x": 131, "y": 45 },
{ "flags": 4, "matrix": [3, 6], "x": 116, "y": 45 },
{ "flags": 4, "matrix": [3, 5], "x": 101, "y": 45 },
{ "flags": 4, "matrix": [3, 4], "x": 86, "y": 45 },
{ "flags": 4, "matrix": [3, 3], "x": 71, "y": 45 },
{ "flags": 4, "matrix": [3, 2], "x": 56, "y": 45 },
{ "flags": 4, "matrix": [3, 1], "x": 41, "y": 45 },
{ "flags": 1, "matrix": [4, 2], "x": 47, "y": 58 },
{ "flags": 1, "matrix": [4, 1], "x": 28, "y": 58 },
{ "flags": 1, "matrix": [4, 0], "x": 10, "y": 58 },
{ "flags": 1, "matrix": [3, 0], "x": 17, "y": 45 },
{ "flags": 1, "matrix": [2, 0], "x": 13, "y": 32 },
{ "flags": 4, "matrix": [2, 1], "x": 34, "y": 32 },
{ "flags": 4, "matrix": [2, 2], "x": 49, "y": 32 },
{ "flags": 4, "matrix": [2, 3], "x": 64, "y": 32 },
{ "flags": 4, "matrix": [2, 4], "x": 79, "y": 32 },
{ "flags": 4, "matrix": [2, 5], "x": 94, "y": 32 },
{ "flags": 4, "matrix": [2, 6], "x": 109, "y": 32 },
{ "flags": 4, "matrix": [2, 7], "x": 124, "y": 32 },
{ "flags": 4, "matrix": [2, 8], "x": 139, "y": 32 },
{ "flags": 4, "matrix": [2, 9], "x": 153, "y": 32 },
{ "flags": 4, "matrix": [2, 10], "x": 168, "y": 32 },
{ "flags": 4, "matrix": [2, 11], "x": 183, "y": 32 },
{ "flags": 1, "matrix": [2, 13], "x": 208, "y": 32 },
{ "flags": 1, "matrix": [1, 13], "x": 213, "y": 19 },
{ "flags": 4, "matrix": [1, 12], "x": 195, "y": 19 },
{ "flags": 4, "matrix": [1, 11], "x": 180, "y": 19 },
{ "flags": 4, "matrix": [1, 10], "x": 165, "y": 19 },
{ "flags": 4, "matrix": [1, 9], "x": 150, "y": 19 },
{ "flags": 4, "matrix": [1, 8], "x": 135, "y": 19 },
{ "flags": 4, "matrix": [1, 7], "x": 120, "y": 19 },
{ "flags": 4, "matrix": [1, 6], "x": 105, "y": 19 },
{ "flags": 4, "matrix": [1, 5], "x": 90, "y": 19 },
{ "flags": 4, "matrix": [1, 4], "x": 75, "y": 19 },
{ "flags": 4, "matrix": [1, 3], "x": 60, "y": 19 },
{ "flags": 4, "matrix": [1, 2], "x": 45, "y": 19 },
{ "flags": 4, "matrix": [1, 1], "x": 30, "y": 19 },
{ "flags": 1, "matrix": [1, 0], "x": 12, "y": 19 },
{ "flags": 1, "matrix": [0, 0], "x": 8, "y": 7 },
{ "flags": 4, "matrix": [0, 1], "x": 23, "y": 7 },
{ "flags": 4, "matrix": [0, 2], "x": 38, "y": 7 },
{ "flags": 4, "matrix": [0, 3], "x": 53, "y": 7 },
{ "flags": 4, "matrix": [0, 4], "x": 68, "y": 7 },
{ "flags": 4, "matrix": [0, 5], "x": 83, "y": 7 },
{ "flags": 4, "matrix": [0, 6], "x": 98, "y": 7 },
{ "flags": 4, "matrix": [0, 7], "x": 113, "y": 7 },
{ "flags": 4, "matrix": [0, 8], "x": 127, "y": 7 },
{ "flags": 4, "matrix": [0, 9], "x": 142, "y": 7 },
{ "flags": 4, "matrix": [0, 10], "x": 157, "y": 7 },
{ "flags": 4, "matrix": [0, 11], "x": 172, "y": 7 },
{ "flags": 4, "matrix": [0, 12], "x": 187, "y": 7 },
{ "flags": 1, "matrix": [0, 13], "x": 209, "y": 7 }
]
},
"layouts": {
"LAYOUT_60_ansi": {
"layout": [
{ "label": "Esc", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
{ "label": "1", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
{ "label": "2", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
{ "label": "3", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
{ "label": "4", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
{ "label": "5", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
{ "label": "6", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
{ "label": "7", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
{ "label": "8", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
{ "label": "9", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
{ "label": "0", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
{ "label": "-", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
{ "label": "=", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
{ "label": "BS", "matrix": [0, 13], "w": 2, "x": 13, "y": 0 },
{ "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
{ "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
{ "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
{ "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
{ "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
{ "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
{ "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
{ "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
{ "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
{ "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
{ "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
{ "label": "[", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
{ "label": "]", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
{ "label": "|", "matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1 },
{ "label": "Caps", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
{ "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
{ "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
{ "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
{ "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
{ "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
{ "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
{ "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
{ "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
{ "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
{ "label": ";", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
{ "label": "'", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
{ "label": "Enter", "matrix": [2, 13], "w": 2.25, "x": 12.75, "y": 2 },
{ "label": "LShift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
{ "label": "Z", "matrix": [3, 1], "w": 1, "x": 2.25, "y": 3 },
{ "label": "X", "matrix": [3, 2], "w": 1, "x": 3.25, "y": 3 },
{ "label": "C", "matrix": [3, 3], "w": 1, "x": 4.25, "y": 3 },
{ "label": "V", "matrix": [3, 4], "w": 1, "x": 5.25, "y": 3 },
{ "label": "B", "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3 },
{ "label": "N", "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3 },
{ "label": "M", "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3 },
{ "label": ",", "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3 },
{ "label": ".", "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3 },
{ "label": "/", "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3 },
{ "label": "RShift", "matrix": [3, 13], "w": 2.75, "x": 12.25, "y": 3 },
{ "label": "LCtrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
{ "label": "LGui", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
{ "label": "LAlt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
{ "label": "Space", "matrix": [5, 5], "w": 6.25, "x": 3.75, "y": 4 },
{ "label": "RAlt", "matrix": [5, 9], "w": 1.25, "x": 10, "y": 4 },
{ "label": "RGui", "matrix": [5, 10], "w": 1.25, "x": 11.25, "y": 4 },
{ "label": "FN", "matrix": [5, 12], "w": 1.25, "x": 12.5, "y": 4 },
{ "label": "RCtrl", "matrix": [5, 13], "w": 1.25, "x": 13.75, "y": 4 }
]
}
}
}

View File

@ -0,0 +1,36 @@
/* Copyright 2022 ziptyze
*
* 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_60_ansi(
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_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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL
),
[1] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
};

View File

@ -0,0 +1,100 @@
/* Copyright 2022 ziptyze
*
* 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_60_ansi(
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_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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
),
[1] = LAYOUT_60_ansi(
KC_GRV, 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS,
KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS
),
[2] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[3] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[4] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[5] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[6] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[7] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[8] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[9] = LAYOUT_60_ansi(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};

View File

@ -0,0 +1,2 @@
VIA_ENABLE = yes
LTO_ENABLE = yes

View File

@ -0,0 +1,23 @@
# pi60_rgb
The pi60 RGB is a 60% pcb from 1upkeyboards. This keyboard features an ANSI layout hot swap PCB with per-key in-switch RGB lighting. The controller is a Raspberry Pi rp2040 microcontroller.
* Keyboard Maintainer: [ziptyze](https://github.com/ziptyze)
* Hardware Availability: (https://1upkeyboards.com/shop/controllers/1upkeyboards-pi60rgb-60-pcb/)
Make example for this keyboard (after setting up your build environment):
make 1upkeyboards/pi60_rgb:default
Flashing example for this keyboard:
make 1upkeyboards/pi60_rgb: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 2 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Bootloader button**: Hold the button on the back of the PCB and plug in the keyboard

View File

@ -0,0 +1 @@
WS2812_DRIVER = vendor

View File

@ -36,9 +36,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
), ),
[_ADJUST] = LAYOUT_ortho_4x12( [_ADJUST] = LAYOUT_ortho_4x12(
RGB_VAI, RGB_SAI, RGB_HUI, RGB_MOD, XXXXXXX, RGB_TOG, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, _______, _______, _______, _______, RCMD(LALT(KC_1)), RCMD(LALT(KC_2)), RCMD(LALT(KC_3)), RCMD(LALT(KC_4)), RCMD(LALT(KC_5)), RCMD(LALT(KC_6)), RCMD(LALT(KC_7)), RCMD(LALT(KC_0)),
RGB_VAD, RGB_SAD, RGB_HUD, RGB_RMOD, XXXXXXX, XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, RGB_SAI, RGB_HUI, RGB_MOD, _______, RGB_TOG, RGB_VAI, RGB_VAD, RGB_SAD, RGB_HUD, RGB_RMOD, _______, _______,
KC_MUTE, KC_VOLD, KC_VOLU, KC_BRID, KC_BRIU, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LANG1, KC_LANG2, KC_MUTE, KC_VOLD, KC_VOLU, KC_BRID, KC_BRIU, QK_BOOT, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KANA _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
), ),
}; };

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define UNICODE_SELECTED_MODES UC_MAC, UC_LNX #define UNICODE_SELECTED_MODES UC_LNX
#define MOUSEKEY_INTERVAL 12 #define MOUSEKEY_INTERVAL 12
#define MOUSEKEY_MAX_SPEED 6 #define MOUSEKEY_MAX_SPEED 6
@ -30,3 +30,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MOUSEKEY_WHEEL_INTERVAL 50 #define MOUSEKEY_WHEEL_INTERVAL 50
// The default is 40 // The default is 40
#define MOUSEKEY_WHEEL_TIME_TO_MAX 100 #define MOUSEKEY_WHEEL_TIME_TO_MAX 100
#define FLOW_COUNT 6
#define FLOW_LAYERS_COUNT 5

View File

@ -0,0 +1,336 @@
/* Copyright 2022 @daliusd
*
* 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 "flow.h"
extern const uint16_t flow_config[FLOW_COUNT][2];
extern const uint16_t flow_layers_config[FLOW_LAYERS_COUNT][2];
// Represents the states a flow key can be in
typedef enum {
flow_up_unqueued,
flow_up_queued,
flow_up_queued_used,
flow_down_unused,
flow_down_used,
} flow_state_t;
#ifdef FLOW_ONESHOT_TERM
const int g_flow_oneshot_term = FLOW_ONESHOT_TERM;
#else
const int g_flow_oneshot_term = 500;
#endif
#ifdef FLOW_ONESHOT_WAIT_TERM
const int g_flow_oneshot_wait_term = FLOW_ONESHOT_WAIT_TERM;
#else
const int g_flow_oneshot_wait_term = 500;
#endif
flow_state_t flow_state[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = flow_up_unqueued };
bool flow_pressed[FLOW_COUNT][2] = { [0 ... FLOW_COUNT - 1] = {false, false} };
uint16_t flow_timers[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = 0 };
bool flow_timeout_timers_active[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = false };
uint16_t flow_timeout_timers_value[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = 0 };
uint16_t flow_timeout_wait_timers_value[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = 0 };
flow_state_t flow_layers_state[FLOW_LAYERS_COUNT] = {
[0 ... FLOW_LAYERS_COUNT - 1] = flow_up_unqueued
};
bool flow_layer_timeout_timers_active[FLOW_LAYERS_COUNT] = { [0 ... FLOW_LAYERS_COUNT - 1] = false };
uint16_t flow_layer_timeout_timers_value[FLOW_LAYERS_COUNT] = { [0 ... FLOW_LAYERS_COUNT - 1] = 0 };
uint16_t flow_layer_timeout_wait_timers_value[FLOW_LAYERS_COUNT] = { [0 ... FLOW_LAYERS_COUNT - 1] = 0 };
bool is_flow_ignored_key(uint16_t keycode) {
for (int i = 0; i < FLOW_COUNT; i++) {
if (flow_config[i][0] == keycode) {
return true;
}
}
for (int i = 0; i < FLOW_LAYERS_COUNT; i++) {
if (flow_layers_config[i][0] == keycode) {
return true;
}
}
if (keycode == KC_LSFT || keycode == KC_RSFT
|| keycode == KC_LCTL || keycode == KC_RCTL
|| keycode == KC_LALT || keycode == KC_RALT
|| keycode == KC_LGUI || keycode == KC_RGUI) {
return true;
}
return false;
}
bool update_flow_mods(
uint16_t keycode,
bool pressed
) {
bool pass = true;
bool flow_key_list_triggered[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = false };
bool flow_key_list_pressed[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = false };
bool flow_triggered = false;
for (uint8_t i = 0; i < FLOW_COUNT; i++) {
// Layer key
if (keycode == flow_config[i][0]) {
if (pressed) {
flow_pressed[i][0] = true;
} else {
flow_pressed[i][0] = false;
}
// KC mod key
} else if (keycode == flow_config[i][1]) {
if (pressed) {
if (flow_pressed[i][0]) {
flow_pressed[i][1] = true;
flow_key_list_triggered[i] = true;
flow_triggered = true;
flow_key_list_pressed[i] = true;
pass = false;
}
} else if (flow_pressed[i][1]) {
flow_pressed[i][1] = false;
if (flow_pressed[i][0]) {
flow_key_list_triggered[i] = true;
flow_triggered = true;
pass = false;
} else if ((flow_state[i] == flow_down_unused)
|| (flow_state[i] == flow_down_used)) {
flow_key_list_triggered[i] = true;
flow_triggered = true;
pass = false;
}
}
}
}
for (uint8_t i = 0; i < FLOW_COUNT; i++) {
if (flow_key_list_triggered[i]) {
if (flow_key_list_pressed[i]) {
if (flow_state[i] == flow_up_unqueued) {
register_code(flow_config[i][1]);
}
flow_timeout_wait_timers_value[i] = timer_read();
flow_state[i] = flow_down_unused;
} else {
// Trigger keyup
switch (flow_state[i]) {
case flow_down_unused:
if (!flow_pressed[i][1]) {
if (timer_elapsed(flow_timeout_wait_timers_value[i]) > g_flow_oneshot_wait_term) {
flow_state[i] = flow_up_unqueued;
unregister_code(flow_config[i][1]);
} else {
// If we didn't use the mod while trigger was held, queue it.
flow_state[i] = flow_up_queued;
flow_timeout_timers_active[i] = true;
flow_timeout_timers_value[i] = timer_read();
}
}
break;
case flow_down_used:
// If we did use the mod while trigger was held, unregister it.
if (!flow_pressed[i][1]) {
flow_state[i] = flow_up_unqueued;
unregister_code(flow_config[i][1]);
}
break;
default:
break;
}
}
} else if (!flow_triggered) {
if (pressed) {
if (!is_flow_ignored_key(keycode)) {
switch (flow_state[i]) {
case flow_up_queued:
flow_state[i] = flow_up_queued_used;
flow_timeout_timers_active[i] = false;
break;
case flow_up_queued_used:
flow_state[i] = flow_up_unqueued;
unregister_code(flow_config[i][1]);
break;
default:
break;
}
}
} else {
if (!is_flow_ignored_key(keycode)) {
// On non-ignored keyup, consider the oneshot used.
switch (flow_state[i]) {
case flow_down_unused:
flow_state[i] = flow_down_used;
break;
case flow_up_queued:
flow_state[i] = flow_up_unqueued;
unregister_code(flow_config[i][1]);
break;
case flow_up_queued_used:
flow_state[i] = flow_up_unqueued;
unregister_code(flow_config[i][1]);
break;
default:
break;
}
}
}
}
}
return pass;
}
void change_pressed_status(uint16_t keycode, bool pressed) {
for (int i = 0; i < FLOW_COUNT; i++) {
if (flow_config[i][0] == keycode) {
flow_pressed[i][0] = pressed;
}
}
}
bool update_flow_layers(
uint16_t keycode,
bool pressed,
keypos_t key_position
) {
uint8_t key_layer = read_source_layers_cache(key_position);
bool pass = true;
for (int i = 0; i < FLOW_LAYERS_COUNT; i++) {
uint16_t trigger = flow_layers_config[i][0];
uint16_t layer = flow_layers_config[i][1];
if (keycode == trigger) {
if (pressed) {
// Trigger keydown
if (flow_layers_state[i] == flow_up_unqueued) {
layer_on(layer);
change_pressed_status(trigger, true);
}
flow_layer_timeout_wait_timers_value[i] = timer_read();
flow_layers_state[i] = flow_down_unused;
pass = false;
} else {
// Trigger keyup
switch (flow_layers_state[i]) {
case flow_down_unused:
if (timer_elapsed(flow_layer_timeout_wait_timers_value[i]) > g_flow_oneshot_wait_term) {
flow_layers_state[i] = flow_up_unqueued;
layer_off(layer);
change_pressed_status(trigger, false);
pass = false;
} else {
// If we didn't use the layer while trigger was held, queue it.
flow_layers_state[i] = flow_up_queued;
flow_layer_timeout_timers_active[i] = true;
flow_layer_timeout_timers_value[i] = timer_read();
pass = false;
change_pressed_status(trigger, true);
}
break;
case flow_down_used:
// If we did use the layer while trigger was held, turn off it.
flow_layers_state[i] = flow_up_unqueued;
layer_off(layer);
change_pressed_status(trigger, false);
pass = false;
break;
default:
break;
}
}
} else {
if (pressed) {
if (key_layer == layer) {
// On non-ignored keyup, consider the oneshot used.
switch (flow_layers_state[i]) {
case flow_down_unused:
flow_layers_state[i] = flow_down_used;
break;
case flow_up_queued:
flow_layers_state[i] = flow_up_queued_used;
flow_layer_timeout_timers_active[i] = false;
break;
case flow_up_queued_used:
flow_layers_state[i] = flow_up_unqueued;
layer_off(layer);
change_pressed_status(trigger, false);
pass = false;
break;
default:
break;
}
}
} else {
// Ignore key ups from other layers
if (key_layer == layer) {
// On non-ignored keyup, consider the oneshot used.
switch (flow_layers_state[i]) {
case flow_up_queued:
flow_layers_state[i] = flow_up_unqueued;
layer_off(layer);
change_pressed_status(trigger, false);
break;
case flow_up_queued_used:
flow_layers_state[i] = flow_up_unqueued;
layer_off(layer);
change_pressed_status(trigger, false);
break;
default:
break;
}
}
}
}
}
return pass;
}
bool update_flow(
uint16_t keycode,
bool pressed,
keypos_t key_position
) {
bool pass = update_flow_mods(keycode, pressed);
pass = update_flow_layers(keycode, pressed, key_position) & pass;
return pass;
}
void flow_matrix_scan(void) {
for (int i = 0; i < FLOW_COUNT; i++) {
if (flow_timeout_timers_active[i]
&& timer_elapsed(flow_timeout_timers_value[i]) > g_flow_oneshot_term) {
flow_timeout_timers_active[i] = false;
flow_state[i] = flow_up_unqueued;
unregister_code(flow_config[i][1]);
}
}
for (int i = 0; i < FLOW_LAYERS_COUNT; i++) {
if (flow_layer_timeout_timers_active[i]
&& timer_elapsed(flow_layer_timeout_timers_value[i]) > g_flow_oneshot_term) {
flow_layer_timeout_timers_active[i] = false;
flow_layers_state[i] = flow_up_unqueued;
layer_off(flow_layers_config[i][1]);
change_pressed_status(flow_layers_config[i][0], false);
}
}
}

View File

@ -0,0 +1,27 @@
/*
Copyright 2022 Dalius Dobravolskas <dalius.dobravolskas@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include QMK_KEYBOARD_H
bool update_flow(
uint16_t keycode,
bool pressed,
keypos_t key_position
);
void flow_matrix_scan(void);

View File

@ -15,7 +15,7 @@
*/ */
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
#include "oneshot.h" #include "flow.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below. // Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
@ -25,11 +25,12 @@ enum layers {
_QWERTY, _QWERTY,
_SYM, _SYM,
_NAV, _NAV,
_NUMB, _MISC,
_TMUX, _TMUX,
_MOUSE, _MOUSE,
_MISC,
_FUNC, _FUNC,
_LT_MAC,
_LT_LINUX,
}; };
enum custom_keycodes { enum custom_keycodes {
@ -41,22 +42,40 @@ enum custom_keycodes {
TM_SLCT, TM_SLCT,
TM_SRCH, TM_SRCH,
TM_URL, TM_URL,
OS_CTRL,
OS_ALT,
OS_GUI,
OS_TMUX,
OS_MISC, OS_MISC,
OS_TMUX,
OS_FUNC, OS_FUNC,
LT_OSLNX,
}; };
// Shortcut to make keymap more readable // Shortcut to make keymap more readable
#define L_NAV MO(_NAV) #define L_NAV MO(_NAV)
#define L_SYM MO(_SYM) #define L_SYM MO(_SYM)
#define L_MOUSE TG(_MOUSE) #define L_MOUSE MO(_MOUSE)
#define K_PRINT (QK_LCTL | QK_LSFT | QK_LGUI | KC_4) #define K_PRINT (QK_LCTL | QK_LSFT | QK_LGUI | KC_4)
#define K_VIDEO (QK_LSFT | QK_LGUI | KC_5)
// flow_config should correspond to following format:
// * layer keycode
// * modifier keycode
const uint16_t flow_config[FLOW_COUNT][2] = {
{L_NAV, KC_LALT},
{L_NAV, KC_LGUI},
{L_NAV, KC_LCTL},
{L_SYM, KC_RCTL},
{L_SYM, KC_RGUI},
{L_SYM, KC_RALT},
};
const uint16_t flow_layers_config[FLOW_LAYERS_COUNT][2] = {
{OS_MISC, _MISC},
{OS_TMUX, _TMUX},
{OS_FUNC, _FUNC},
};
// Unicode characters
enum unicode_names { enum unicode_names {
SNEK, SNEK,
EURO, EURO,
@ -96,7 +115,7 @@ const uint32_t PROGMEM unicode_map[] = {
[LT_S_I] = 0x12f, // į [LT_S_I] = 0x12f, // į
[LT_L_I] = 0x12e, // Į [LT_L_I] = 0x12e, // Į
[LT_S_S] = 0x161, // š [LT_S_S] = 0x161, // š
[LT_L_S] = 0x160, // Š' [LT_L_S] = 0x160, // Š
[LT_S_U1] = 0x173, // ų [LT_S_U1] = 0x173, // ų
[LT_L_U1] = 0x172, // Ų [LT_L_U1] = 0x172, // Ų
[LT_S_U2] = 0x16b, // ū [LT_S_U2] = 0x16b, // ū
@ -110,14 +129,23 @@ const uint32_t PROGMEM unicode_map[] = {
#define K_SNEK X(SNEK) #define K_SNEK X(SNEK)
#define K_EURO X(EURO) #define K_EURO X(EURO)
#define K_LT_A XP(LT_S_A, LT_L_A) #define K_LT_A XP(LT_S_A, LT_L_A)
#define K_LT_AU X(LT_L_A)
#define K_LT_C XP(LT_S_C, LT_L_C) #define K_LT_C XP(LT_S_C, LT_L_C)
#define K_LT_CU X(LT_L_C)
#define K_LT_E1 XP(LT_S_E1, LT_L_E1) #define K_LT_E1 XP(LT_S_E1, LT_L_E1)
#define K_LT_E1U X(LT_L_E1)
#define K_LT_E2 XP(LT_S_E2, LT_L_E2) #define K_LT_E2 XP(LT_S_E2, LT_L_E2)
#define K_LT_E2U X(LT_L_E2)
#define K_LT_I XP(LT_S_I, LT_L_I) #define K_LT_I XP(LT_S_I, LT_L_I)
#define K_LT_IU X(LT_L_I)
#define K_LT_S XP(LT_S_S, LT_L_S) #define K_LT_S XP(LT_S_S, LT_L_S)
#define K_LT_SU X(LT_L_S)
#define K_LT_U1 XP(LT_S_U1, LT_L_U1) #define K_LT_U1 XP(LT_S_U1, LT_L_U1)
#define K_LT_U1U X(LT_L_U1)
#define K_LT_U2 XP(LT_S_U2, LT_L_U2) #define K_LT_U2 XP(LT_S_U2, LT_L_U2)
#define K_LT_U2U X(LT_L_U2)
#define K_LT_Z XP(LT_S_Z, LT_L_Z) #define K_LT_Z XP(LT_S_Z, LT_L_Z)
#define K_LT_ZU X(LT_L_Z)
#define K_LT_OB X(LT_OB) #define K_LT_OB X(LT_OB)
#define K_LT_CB X(LT_CB) #define K_LT_CB X(LT_CB)
@ -139,35 +167,35 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐ //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC , KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_LPRN ,KC_RPRN , KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC , KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_LPRN ,KC_RPRN ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
KC_GRV ,KC_PLUS ,KC_LBRC ,KC_RBRC ,K_LT_OB , KC_MINS ,OS_ALT ,OS_CTRL ,OS_GUI ,KC_PIPE , XXXXXXX ,KC_GRV ,KC_LBRC ,KC_RBRC ,KC_PLUS , KC_MINS ,KC_PIPE ,KC_RCTL ,KC_RGUI ,KC_RALT ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
K_SNEK ,KC_EQL ,KC_LCBR ,KC_RCBR ,K_LT_CB , KC_UNDS ,KC_QUOT ,KC_DQT ,K_EURO ,KC_BSLS , KC_DEL ,KC_BSPC ,KC_LCBR ,KC_RCBR ,KC_EQL , KC_UNDS ,KC_QUOT ,KC_DQT ,OS_MISC ,KC_BSLS ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘ //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
_______ , _______ , _______ , _______ _______ , _______ , _______ , XXXXXXX
// └────────┘ └────────┘ └────────┘ └────────┘ // └────────┘ └────────┘ └────────┘ └────────┘
), ),
[_NAV] = LAYOUT( [_NAV] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐ //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
KC_TILDE,L_MOUSE ,OS_FUNC ,OS_MISC ,OS_TMUX , K_LT_A ,K_LT_C ,K_LT_E1 ,K_LT_E2 ,K_LT_I , KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
KC_TAB ,OS_GUI ,OS_CTRL ,OS_ALT ,KC_ENT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,KC_END , KC_LALT ,KC_LGUI ,KC_LCTL ,KC_TAB ,KC_ENT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,KC_PGUP ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
KC_DELT ,KC_BSPC ,KC_ESC ,KC_PGDN ,KC_PGUP , KC_HOME ,K_LT_S ,K_LT_U1 ,K_LT_U2 ,K_LT_Z , KC_LSFT ,KC_BSPC ,KC_ESC ,KC_TILDE,OS_TMUX , OS_FUNC ,L_MOUSE ,KC_COMM ,KC_DOT ,KC_PGDN ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘ //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
_______ , _______ , _______ , _______ XXXXXXX , _______ , _______ , _______
// └────────┘ └────────┘ └────────┘ └────────┘ // └────────┘ └────────┘ └────────┘ └────────┘
), ),
[_NUMB] = LAYOUT( [_MISC] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐ //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , RESET ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BRID ,KC_BRIU ,KC_PSCR ,XXXXXXX ,K_PRINT ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 , XXXXXXX ,OS_ALT ,OS_CTRL ,OS_GUI ,XXXXXXX , XXXXXXX ,XXXXXXX ,DEBUG ,LT_OSLNX,XXXXXXX , KC_MPRV ,KC_MPLY ,KC_MNXT ,XXXXXXX ,K_VIDEO ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
KC_DELT ,KC_BSPC ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_VOLD ,KC_VOLU ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘ //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
_______ , _______ , _______ , _______ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
// └────────┘ └────────┘ └────────┘ └────────┘ // └────────┘ └────────┘ └────────┘ └────────┘
), ),
@ -185,127 +213,59 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MOUSE] = LAYOUT( [_MOUSE] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐ //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
XXXXXXX ,L_MOUSE ,KC_MS_U ,KC_BTN3 ,KC_WH_U , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,KC_MS_U ,KC_BTN3 ,KC_WH_U , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D , XXXXXXX ,KC_LALT ,KC_LCTL ,KC_LGUI ,XXXXXXX , XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D , XXXXXXX ,XXXXXXX ,KC_RCTL ,KC_RGUI ,KC_RALT ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,XXXXXXX ,KC_ESC ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘ //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
KC_BTN1 , KC_BTN2 , XXXXXXX , XXXXXXX KC_BTN1 , KC_BTN2 , _______ , XXXXXXX
// └────────┘ └────────┘ └────────┘ └────────┘
),
[_MISC] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
QK_BOOT,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BRID ,KC_BRIU ,XXXXXXX ,KC_PSCR ,K_PRINT ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,XXXXXXX ,DEBUG ,XXXXXXX ,XXXXXXX , KC_MPRV ,KC_MPLY ,XXXXXXX ,KC_MNXT ,XXXXXXX ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_VOLD ,KC_VOLU ,XXXXXXX ,XXXXXXX ,UC_MOD ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
// └────────┘ └────────┘ └────────┘ └────────┘ // └────────┘ └────────┘ └────────┘ └────────┘
), ),
[_FUNC] = LAYOUT( [_FUNC] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐ //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 , XXXXXXX ,XXXXXXX ,KC_RCTL ,KC_RGUI ,KC_RALT ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤ //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_F11 ,KC_F12 ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_F11 ,KC_F12 ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘ //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
// └────────┘ └────────┘ └────────┘ └────────┘ // └────────┘ └────────┘ └────────┘ └────────┘
), ),
[_LT_MAC] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC , KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_PLUS ,XXXXXXX ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_EQL ,XXXXXXX ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,KC_BSPC ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
XXXXXXX , XXXXXXX , _______ , XXXXXXX
// └────────┘ └────────┘ └────────┘ └────────┘
),
[_LT_LINUX] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
K_LT_AU ,K_LT_CU ,K_LT_E1U,K_LT_E2U,K_LT_IU , K_LT_SU ,K_LT_U1U,K_LT_U2U,K_LT_ZU ,XXXXXXX ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
K_LT_A ,K_LT_C ,K_LT_E1 ,K_LT_E2 ,K_LT_I , K_LT_S ,K_LT_U1 ,K_LT_U2 ,K_LT_Z ,XXXXXXX ,
//├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
XXXXXXX ,KC_BSPC ,XXXXXXX ,K_SNEK ,K_LT_OB , K_LT_CB ,K_EURO ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
//└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
XXXXXXX , XXXXXXX , _______ , XXXXXXX
// └────────┘ └────────┘ └────────┘ └────────┘
),
}; };
#define TMUX_PREFIX SS_DOWN(X_LCTL) "b" SS_UP(X_LCTL) #define TMUX_PREFIX SS_DOWN(X_LCTL) "b" SS_UP(X_LCTL)
bool is_oneshot_cancel_key(uint16_t keycode) { bool lt_os_is_linux = false;
switch (keycode) {
case L_SYM:
case L_NAV:
return true;
default:
return false;
}
}
bool is_oneshot_layer_cancel_key(uint16_t keycode) {
switch (keycode) {
case L_SYM:
case L_NAV:
return true;
default:
return false;
}
}
bool is_oneshot_ignored_key(uint16_t keycode) {
switch (keycode) {
case L_SYM:
case L_NAV:
case OS_CTRL:
case OS_ALT:
case OS_GUI:
case OS_TMUX:
case OS_MISC:
case KC_LSFT:
return true;
default:
return false;
}
}
bool is_oneshot_mod_key(uint16_t keycode) {
switch (keycode) {
case OS_CTRL:
case OS_ALT:
case OS_GUI:
return true;
default:
return false;
}
}
oneshot_state os_ctrl_state = os_up_unqueued;
oneshot_state os_alt_state = os_up_unqueued;
oneshot_state os_cmd_state = os_up_unqueued;
oneshot_state os_tmux_state = os_up_unqueued;
oneshot_state os_misc_state = os_up_unqueued;
oneshot_state os_func_state = os_up_unqueued;
bool process_record_user(uint16_t keycode, keyrecord_t *record) { bool process_record_user(uint16_t keycode, keyrecord_t *record) {
update_oneshot( if (!update_flow(keycode, record->event.pressed, record->event.key)) return false;
&os_ctrl_state, KC_LCTL, OS_CTRL,
keycode, record
);
update_oneshot(
&os_alt_state, KC_LALT, OS_ALT,
keycode, record
);
update_oneshot(
&os_cmd_state, KC_LGUI, OS_GUI,
keycode, record
);
bool handled = true;
handled = update_oneshot_layer(
&os_tmux_state, _TMUX, OS_TMUX,
keycode, record
) & handled;
handled = update_oneshot_layer(
&os_misc_state, _MISC, OS_MISC,
keycode, record
) & handled;
handled = update_oneshot_layer(
&os_func_state, _FUNC, OS_FUNC,
keycode, record
) & handled;
if (!handled) return false;
switch (keycode) { switch (keycode) {
case TM_LEFT: case TM_LEFT:
@ -340,10 +300,35 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!record->event.pressed) return true; if (!record->event.pressed) return true;
SEND_STRING(TMUX_PREFIX SS_LCTL("u")); SEND_STRING(TMUX_PREFIX SS_LCTL("u"));
return false; return false;
case LT_OSLNX:
if (!record->event.pressed) return true;
lt_os_is_linux = !lt_os_is_linux;
return false;
} }
return true; return true;
} }
layer_state_t layer_state_set_user(layer_state_t state) { void matrix_scan_user(void) {
return update_tri_layer_state(state, _SYM, _NAV, _NUMB); flow_matrix_scan();
}
bool lang_layer_on = false;
layer_state_t layer_state_set_user(layer_state_t state) {
state = update_tri_layer_state(state, _SYM, _NAV, lt_os_is_linux ? _LT_LINUX : _LT_MAC);
uint8_t hl = get_highest_layer(state);
if (hl == _LT_MAC) {
if (!lang_layer_on) {
tap_code16(LCTL(KC_SPC));
lang_layer_on = true;
}
} else {
if (lang_layer_on) {
tap_code16(LCTL(KC_SPC));
lang_layer_on = false;
}
}
return state;
} }

View File

@ -1,195 +0,0 @@
/* Copyright 2021 @daliusd
*
* 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 "print.h"
#include "oneshot.h"
void update_oneshot(
oneshot_state *state,
uint16_t mod,
uint16_t trigger,
uint16_t keycode,
keyrecord_t *record
) {
if (keycode == trigger) {
if (record->event.pressed) {
// Trigger keydown
if (*state == os_up_unqueued) {
register_code(mod);
}
*state = os_down_unused;
dprintf("trigger down (on?), mod: %d, ? -> os_down_unused\n", mod);
} else {
// Trigger keyup
switch (*state) {
case os_down_unused:
// If we didn't use the mod while trigger was held, queue it.
*state = os_up_queued;
dprintf("trigger up, mod: %d, os_down_unused -> os_up_queued\n", mod);
break;
case os_down_used:
// If we did use the mod while trigger was held, unregister it.
*state = os_up_unqueued;
unregister_code(mod);
dprintf("trigger up (off), mod: %d, os_down_used -> os_up_unqueued\n", mod);
break;
default:
break;
}
}
} else {
if (record->event.pressed) {
if (is_oneshot_cancel_key(keycode) && *state != os_up_unqueued) {
// Cancel oneshot on designated cancel keydown.
*state = os_up_unqueued;
unregister_code(mod);
dprintf("cancel (off), mod: %d, ? -> os_up_unqueued\n", mod);
}
if (!is_oneshot_ignored_key(keycode)) {
switch (*state) {
case os_up_queued:
*state = os_up_queued_used;
dprintf("key up (off), mod: %d, os_up_queued -> os_up_queued_used\n", mod);
break;
case os_up_queued_used:
*state = os_up_unqueued;
unregister_code(mod);
dprintf("key up (off), mod: %d, os_up_queued_used -> os_up_unqueued\n", mod);
break;
default:
break;
}
}
} else {
if (!is_oneshot_ignored_key(keycode)) {
// On non-ignored keyup, consider the oneshot used.
switch (*state) {
case os_down_unused:
*state = os_down_used;
dprintf("key up, mod: %d, os_down_unused -> os_down_used\n", mod);
break;
case os_up_queued:
*state = os_up_unqueued;
unregister_code(mod);
dprintf("key up (off), mod: %d, os_up_queued -> os_up_unqueued\n", mod);
break;
case os_up_queued_used:
*state = os_up_unqueued;
unregister_code(mod);
dprintf("key up (off), mod: %d, os_up_queued_used -> os_up_unqueued\n", mod);
break;
default:
break;
}
}
}
}
}
bool update_oneshot_layer(
oneshot_state *state,
uint16_t layer,
uint16_t trigger,
uint16_t keycode,
keyrecord_t *record
) {
if (keycode == trigger) {
if (record->event.pressed) {
// Trigger keydown
if (*state == os_up_unqueued) {
layer_on(layer);
}
*state = os_down_unused;
dprintf("trigger down (on?), layer: %d, ? -> os_down_unused\n", layer);
return false;
} else {
// Trigger keyup
switch (*state) {
case os_down_unused:
// If we didn't use the layer while trigger was held, queue it.
*state = os_up_queued;
dprintf("trigger up, layer: %d, os_down_unused -> os_up_queued\n", layer);
return false;
case os_down_used:
// If we did use the layer while trigger was held, turn off it.
*state = os_up_unqueued;
layer_off(layer);
dprintf("trigger up (off), layer: %d, os_down_used -> os_up_unqueued\n", layer);
return false;
default:
break;
}
}
} else {
if (record->event.pressed) {
if (is_oneshot_layer_cancel_key(keycode) && *state != os_up_unqueued) {
// Cancel oneshot layer on designated cancel keydown.
*state = os_up_unqueued;
layer_off(layer);
dprintf("cancel (off), layer: %d, ? -> os_up_unqueued\n", layer);
return false;
}
uint8_t key_layer = read_source_layers_cache(record->event.key);
if (key_layer == layer) {
// On non-ignored keyup, consider the oneshot used.
switch (*state) {
case os_down_unused:
*state = os_down_used;
dprintf("key down, layer: %d, os_down_unused -> os_down_used\n", layer);
return true;
case os_up_queued:
if (is_oneshot_mod_key(keycode)) {
*state = os_up_unqueued;
layer_off(layer);
dprintf("key down, layer: %d, os_up_queued -> os_up_unqueued\n", layer);
return false;
} else {
*state = os_up_queued_used;
dprintf("key down, layer: %d, os_up_queued -> os_up_queued_used\n", layer);
}
return true;
case os_up_queued_used:
*state = os_up_unqueued;
layer_off(layer);
dprintf("key down (off), layer: %d, os_up_queued_used -> os_up_unqueued\n", layer);
return false;
default:
break;
}
}
} else {
// Ignore key ups from other layers
uint8_t key_layer = read_source_layers_cache(record->event.key);
if (key_layer == layer) {
// On non-ignored keyup, consider the oneshot used.
switch (*state) {
case os_up_queued:
*state = os_up_unqueued;
layer_off(layer);
dprintf("key up (off), layer: %d, os_up_queued -> os_up_unqueued\n", layer);
return true;
case os_up_queued_used:
*state = os_up_unqueued;
layer_off(layer);
dprintf("key up (off), layer: %d, os_up_queued_used -> os_up_unqueued\n", layer);
return true;
default:
break;
}
}
}
}
return true;
}

View File

@ -1,65 +0,0 @@
/* Copyright 2021 @daliusd
*
* 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 QMK_KEYBOARD_H
// Represents the four states a oneshot key can be in
typedef enum {
os_up_unqueued,
os_up_queued,
os_up_queued_used,
os_down_unused,
os_down_used,
} oneshot_state;
// Custom oneshot mod implementation that doesn't rely on timers. If a mod is
// used while it is held it will be unregistered on keyup as normal, otherwise
// it will be queued and only released after the next non-mod keyup.
void update_oneshot(
oneshot_state *state,
uint16_t mod,
uint16_t trigger,
uint16_t keycode,
keyrecord_t *record
);
// Oneshot implementation for layers
bool update_oneshot_layer(
oneshot_state *state,
uint16_t layer,
uint16_t trigger,
uint16_t keycode,
keyrecord_t *record
);
// To be implemented by the consumer. Layers one shot implementation needs to
// know which keys are used as oneshot mods
bool is_oneshot_mod_key(
uint16_t keycode
);
// To be implemented by the consumer. Defines keys to cancel oneshot mods.
bool is_oneshot_cancel_key(uint16_t keycode);
// To be implemented by the consumer. Defines keys to cancel oneshot layers.
bool is_oneshot_layer_cancel_key(uint16_t keycode);
// To be implemented by the consumer. Defines keys to ignore when determining
// whether a oneshot mod has been used. Setting this to modifiers and layer
// change keys allows stacking multiple oneshot modifiers, and carrying them
// between layers.
bool is_oneshot_ignored_key(uint16_t keycode);

View File

@ -1,21 +1,306 @@
# My 34 keys layout # My 34 keys layout
This are my principles for layout: This is my principles for layout:
* I am using Callum style layout. Here you can read explanation by * I am using Callum style layout. Here you can read explanation by
Callum himself and his reasoning for not using mod-tap: Callum himself and his reasoning for not using mod-tap:
[here](../../../../users/callum/readme.md) [here](../../../../users/callum/readme.md)
* There should be only one way to type key. Key can be on * There should be only one way to type key. Key can be on
different layer but it must maintain its physical location. different layer but it must maintain its physical location. I
broke this rule for Shift key only.
* The less features are used the better. * The less features are used the better.
* trilayer is cool. * There is simple TMUX layer.
* There is 🐍 key for no reason. * Common keys must be accessible using two keys if possible.
As well I have added one shot layers compatible with Callum's one * It should be possible to work with left keyboard side and mouse
shot keys. in right hand without lifting hands for some scenarios (that's
why I had to duplicate Shift key).
There is simple TMUX layer as well. ## Improvements over Callum
* I have added one shot layers compatible with Callum's one shot
keys.
* There is one issue with accidental uppercase characters fixed
that exists in original Callum layout's implementation.
* Another annoying feature of Callum layer is one shot keys are
frozen until you cancel them. This is problem when you use one
hand for keyboard and another for mouse. E.g. you click Ctrl and
mouse to get some menu (on Mac OS X), and then you want to click
some item in that menu. You have to remember to cancel one shot in such
situation. I have added two settings two handle situations like
this:
* `FLOW_ONESHOT_WAIT_TERM` - if hold one shot key longer than
`FLOW_ONESHOT_WAIT_TERM` ms then mod key / layer key is not
treated as one shot key (defaults to 500ms).
* `FLOW_ONESHOT_TERM` - if you do not click another key in
`FLOW_ONESHOT_TERM` ms then one shot key / layer key is treated
as normal key. Therefore if you lift it after `FLOW_ONESHOT_TERM`
it will not be treated as one shot (defaults to 500ms).
After adding those two settings I have found out that I don't
need one shot cancel key anymore so I have removed it.
Since differences are significant I named this layout `flow`.
## Using flow with your keyboard
Copy `flow.c` and `flow.h` to keyboard folder.
Add following line to `rules.mk`:
```make
SRC += flow.c
```
Define following in `config.h` for modifiers and layers:
```c
#define FLOW_COUNT 7
#define FLOW_LAYERS_COUNT 3
```
In your `keymap.c` add and configure like this:
```c
#include "flow.h"
...
// flow_config should correspond to following format:
// * layer keycode
// * modifier keycode
const uint16_t flow_config[FLOW_COUNT][2] = {
{L_NAV, KC_LALT},
{L_NAV, KC_LGUI},
{L_NAV, KC_LCTL},
{L_NAV, KC_LSFT},
{L_SYM, KC_LCTL},
{L_SYM, KC_LGUI},
{L_SYM, KC_LALT},
};
// for layers configuration follow this format:
// * custom layer key
// * layer name
const uint16_t flow_layers_config[FLOW_LAYERS_COUNT][2] = {
{OS_TMUX, _TMUX},
{OS_MISC, _MISC},
{OS_FUNC, _FUNC},
};
...
// Add following to handle flow
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!update_flow(keycode, record->event.pressed, record->event.key)) return false;
return true;
}
void matrix_scan_user(void) {
flow_matrix_scan();
}
```
## Lithuanian letters
There are at least two ways how to enter Lithuanian letters: to
use Unicode support from QMK or to switch OS language when
necessary. Unicode support has some problems:
* it is OS specific (you need to change Unicode input mode based
on your OS and I sometimes switch between Mac OS X and Ubuntu).
This is minor issue but it is still issue.
* There is bug in Mac OS X and I can't enter `Š` using unicode
input method.
* Unicode Hex Input in Mac OS X is not perfect and there are some
minor issue while using it.
On Linux Unicode support meanwhile works perfectly.
This leaves us with other option to use OS language switching as
you most probably have done before. Still there is space for
improvement. E.g. I have added Lithuanian letters to trilayer and
trilayer activation toggles OS language (this works because I use
only two languages). Check `layer_state_set_user` implementation
for details.
# Rejected ideas
## Mods as combos
Sometimes when I press `NAV (layer key) + S + Tab` to get `Command
+ Tab` I ended up with `S + Nav + Tab`. This happened because I
did that really fast and sometimes clicked S slightly earlier than
NAV layer key. Initially I have solved this problem using Combo
keys, but that's additional dependency and combo keys are not
ideal for Callum layer. You need to release both keys to trigger
Combo key release. Therefore I have written custom code that
allows pressing S some milliseconds earlier. This is controlled by
FLOW_TERM and defaults to 10. I do not recommend setting this to
higher than 30.
This idea was rejected because it looks like 10ms did not made
that big difference.
## Swapper
Idea of swapper is to have key that registers Mode key (e.g.
Command while layer and some key is pressed) to simulate two key
combo, e.g. Command + Tab. Overall I found that 3 keys combo that
I have currently for swapping windows is equally good as 2 keys
swapper. Another problem with swapper is that it is OS specific.
Still if you want here is swapper implementation I have used:
```c
bool active;
void update_swapper(
uint16_t trigger,
uint16_t keycode,
bool pressed
) {
if (keycode == trigger) {
if (pressed) {
if (!active) {
active = true;
register_code(KC_LGUI);
}
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
}
} else if (active && keycode != KC_LSFT && keycode != KC_LEFT && keycode != KC_RIGHT) {
unregister_code(KC_LGUI);
active = false;
}
}
```
## Combos
I have seen that some people use two letter horizontal combos for
some actions, e.g. XC for Command+C, CV for Command+V, JK for ESC
and etc. I found that this kind of kicks me out of the flow when
working as it requires different kind of action and I need to
pause to make that action.
## Comma-space
I have noticed that I put space after comma `,` usually. That
means I can use comma + letter for something else with backspace,
e.g. for Lithuanian letters. Performance wise that works OK, but
practically that does not feel really good. Trilayer with language
layer switch works better.
Still if you are interested here is comma-space implementation:
```c
void swap_layout(void) {
uint8_t saved_mods = get_mods();
clear_mods();
tap_code16(LCTL(KC_SPC));
set_mods(saved_mods);
}
void press_with_layout_swap(uint16_t keycode) {
tap_code16(KC_BSPC);
swap_layout();
tap_code16(keycode);
swap_layout();
}
bool comma_pressed = false;
bool update_commaspace(
uint16_t keycode,
bool pressed
) {
if (keycode == KC_COMM) {
if (!(get_mods() & MOD_MASK_SHIFT)) {
comma_pressed = true;
}
} else if (comma_pressed) {
if (keycode != KC_LSFT) {
comma_pressed = false;
}
switch(keycode) {
case KC_Q:
if (pressed) {
press_with_layout_swap(KC_1);
return false;
}
break;
case KC_W:
if (pressed) {
press_with_layout_swap(KC_2);
return false;
}
break;
case KC_E:
if (pressed) {
press_with_layout_swap(KC_3);
return false;
}
break;
case KC_R:
if (pressed) {
press_with_layout_swap(KC_4);
return false;
}
break;
case KC_T:
if (pressed) {
press_with_layout_swap(KC_5);
return false;
}
break;
case KC_Y:
if (pressed) {
press_with_layout_swap(KC_6);
return false;
}
break;
case KC_U:
if (pressed) {
press_with_layout_swap(KC_7);
return false;
}
break;
case KC_I:
if (pressed) {
press_with_layout_swap(KC_8);
return false;
}
break;
case KC_O:
if (pressed) {
press_with_layout_swap(KC_EQL);
return false;
}
break;
}
}
return true;
};
```
## Using one shot layers on top layer keys (NAV and SYM)
While this looked promising and fun it was really easy to get lost
in which layer you actually are. You can still use it as `flow`
supports this scenario, but I do not recommend it.

View File

@ -2,4 +2,4 @@ UNICODE_ENABLE = no
UNICODEMAP_ENABLE = yes UNICODEMAP_ENABLE = yes
#CONSOLE_ENABLE = yes #CONSOLE_ENABLE = yes
SRC += oneshot.c SRC += flow.c

View File

@ -0,0 +1,62 @@
/*
Copyright 2022 ai03 Design Studio
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"
/* Mechanical lock switch support */
#define LOCKING_SUPPORT_ENABLE
#define LOCKING_RESYNC_ENABLE
/* Solenoid support */
#define SOLENOID_PIN B7
#define SOLENOID_DEFAULT_DWELL 15
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT

View File

@ -0,0 +1,90 @@
{
"keyboard_name": "Lunar II",
"manufacturer": "ai03 Design Studio",
"url": "https://ai03.com/projects/lunar-ii",
"maintainer": "ai03-2725",
"usb": {
"vid": "0xA103",
"pid": "0x0016",
"device_version": "1.0.0",
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"rows": [ "D0", "D1", "D2", "F0", "F1" ],
"cols": [ "F4", "F5", "F6", "F7", "C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4", "D5", "D3"]
},
"indicators": {
"caps_lock": "B3",
"on_state": 0
},
"build": {
"debounce_type": "asym_eager_defer_pk"
},
"layouts": {
"LAYOUT": {
"layout": [
{ "matrix": [0, 0], "x": 0.0, "y": 0.0 },
{ "matrix": [0, 1], "x": 1.0, "y": 0.0 },
{ "matrix": [0, 2], "x": 2.0, "y": 0.0 },
{ "matrix": [0, 3], "x": 3.0, "y": 0.0 },
{ "matrix": [0, 4], "x": 4.0, "y": 0.0 },
{ "matrix": [0, 5], "x": 5.0, "y": 0.0 },
{ "matrix": [0, 6], "x": 6.0, "y": 0.0 },
{ "matrix": [0, 7], "x": 7.0, "y": 0.0 },
{ "matrix": [0, 8], "x": 8.0, "y": 0.0 },
{ "matrix": [0, 9], "x": 9.0, "y": 0.0 },
{ "matrix": [0, 10], "x": 10.0, "y": 0.0 },
{ "matrix": [0, 11], "x": 11.0, "y": 0.0 },
{ "matrix": [0, 12], "x": 12.0, "y": 0.0 },
{ "matrix": [0, 13], "x": 13.0, "y": 0.0 },
{ "matrix": [2, 12], "x": 14.0, "y": 0.0 },
{ "matrix": [1, 0], "w": 1.5, "x": 0.0, "y": 1.0 },
{ "matrix": [1, 1], "x": 1.5, "y": 1.0 },
{ "matrix": [1, 2], "x": 2.5, "y": 1.0 },
{ "matrix": [1, 3], "x": 3.5, "y": 1.0 },
{ "matrix": [1, 4], "x": 4.5, "y": 1.0 },
{ "matrix": [1, 5], "x": 5.5, "y": 1.0 },
{ "matrix": [1, 6], "x": 6.5, "y": 1.0 },
{ "matrix": [1, 7], "x": 7.5, "y": 1.0 },
{ "matrix": [1, 8], "x": 8.5, "y": 1.0 },
{ "matrix": [1, 9], "x": 9.5, "y": 1.0 },
{ "matrix": [1, 10], "x": 10.5, "y": 1.0 },
{ "matrix": [1, 11], "x": 11.5, "y": 1.0 },
{ "matrix": [1, 12], "x": 12.5, "y": 1.0 },
{ "matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1.0 },
{ "matrix": [2, 0], "w": 1.75, "x": 0.0, "y": 2.0 },
{ "matrix": [2, 1], "x": 1.75, "y": 2.0 },
{ "matrix": [2, 2], "x": 2.75, "y": 2.0 },
{ "matrix": [2, 3], "x": 3.75, "y": 2.0 },
{ "matrix": [2, 4], "x": 4.75, "y": 2.0 },
{ "matrix": [2, 5], "x": 5.75, "y": 2.0 },
{ "matrix": [2, 6], "x": 6.75, "y": 2.0 },
{ "matrix": [2, 7], "x": 7.75, "y": 2.0 },
{ "matrix": [2, 8], "x": 8.75, "y": 2.0 },
{ "matrix": [2, 9], "x": 9.75, "y": 2.0 },
{ "matrix": [2, 10], "x": 10.75, "y": 2.0 },
{ "matrix": [2, 11], "x": 11.75, "y": 2.0 },
{ "matrix": [2, 13], "w": 2.25, "x": 12.75, "y": 2.0 },
{ "matrix": [3, 0], "w": 2.25, "x": 0.0, "y": 3.0 },
{ "matrix": [3, 2], "x": 2.25, "y": 3.0 },
{ "matrix": [3, 3], "x": 3.25, "y": 3.0 },
{ "matrix": [3, 4], "x": 4.25, "y": 3.0 },
{ "matrix": [3, 5], "x": 5.25, "y": 3.0 },
{ "matrix": [3, 6], "x": 6.25, "y": 3.0 },
{ "matrix": [3, 7], "x": 7.25, "y": 3.0 },
{ "matrix": [3, 8], "x": 8.25, "y": 3.0 },
{ "matrix": [3, 9], "x": 9.25, "y": 3.0 },
{ "matrix": [3, 10], "x": 10.25, "y": 3.0 },
{ "matrix": [3, 11], "x": 11.25, "y": 3.0 },
{ "matrix": [3, 13], "w": 2.75, "x": 12.25, "y": 3.0 },
{ "matrix": [4, 0], "w": 1.5, "x": 0.0, "y": 4.0 },
{ "matrix": [4, 2], "w": 1.25, "x": 1.5, "y": 4.0 },
{ "matrix": [4, 3], "w": 1.5, "x": 2.75, "y": 4.0 },
{ "matrix": [4, 7], "w": 6.5, "x": 4.25, "y": 4.0 },
{ "matrix": [4, 11], "w": 1.5, "x": 10.75, "y": 4.0 },
{ "matrix": [4, 12], "w": 1.25, "x": 12.25, "y": 4.0 },
{ "matrix": [4, 13], "w": 1.5, "x": 13.5, "y": 4.0 }
]
}
}
}

View File

@ -0,0 +1,34 @@
/* Copyright 2022 ai03 Design Studio
*
* 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_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_DEL,
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,
MO(1), 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL,
KC_CAPS, _______, _______, KC_PGUP, _______, _______, _______, _______, KC_UP, _______, _______, _______, _______, _______,
_______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
_______, HPT_TOG, HPT_FBK, HPT_DWLI, HPT_DWLD, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1,2 @@
# The default keymap for lunar_ii
Nothing special

View File

@ -0,0 +1,48 @@
/* Copyright 2022 ai03 Design Studio
*
* 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_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_DEL,
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,
MO(1), 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL,
KC_CAPS, _______, _______, KC_PGUP, _______, _______, _______, _______, KC_UP, _______, _______, _______, _______, _______,
_______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
_______, HPT_TOG, HPT_FBK, HPT_DWLI, HPT_DWLD, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
[3] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1,2 @@
# The via keymap for lunar_ii
Enables via support; for use with via configurator

View File

@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@ -0,0 +1,15 @@
# Lunar II
![lunar_ii](https://i.imgur.com/W3xbm4mh.png)
Second generation compact AEK keyboard
* Keyboard Maintainer: [ai03-2725](https://github.com/ai03-2725)
* Hardware Supported: The Lunar II PCB
* Hardware Availability: Switchplate Peripherals, TypePlus
Make example for this keyboard (after setting up your build environment):
make ai03/lunar_ii: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).

View File

@ -0,0 +1,21 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
BOOTLOADER = atmel-dfu
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Enable N-Key Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
HAPTIC_ENABLE = yes # Enable solenoid support
HAPTIC_DRIVER += SOLENOID

View File

@ -0,0 +1,79 @@
/* Copyright 2022 Binepad (@binpad) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
/*
* Wear Leveling EEPROM Emulation
*/
#define WEAR_LEVELING_LOGICAL_SIZE 2048 // Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM.
#define WEAR_LEVELING_BACKING_SIZE (WEAR_LEVELING_LOGICAL_SIZE * 2) // Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
/*
* RGB Matrix
*/
#ifdef RGB_MATRIX_ENABLE
/* ===========================================================================================
* PLEASE NOTE: Because the BN006 only has 6 keys, not all the animations are visually viable
* =========================================================================================== */
#define RGB_DI_PIN B15
#define DRIVER_LED_TOTAL 6
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
#define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_BREATHING // Sets the default mode, if none has been set
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
// RGB Matrix Animation modes. Explicitly enabled
// For full list of effects, see: https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
#define ENABLE_RGB_MATRIX_SOLID_COLOR
// #define ENABLE_RGB_MATRIX_ALPHAS_MODS
#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
#define ENABLE_RGB_MATRIX_BREATHING
// #define ENABLE_RGB_MATRIX_BAND_SAT
// #define ENABLE_RGB_MATRIX_BAND_VAL
// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
// #define ENABLE_RGB_MATRIX_CYCLE_ALL
// #define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
// #define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
// #define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
// #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
// #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
// #define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
// #define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
// #define ENABLE_RGB_MATRIX_DUAL_BEACON
// #define ENABLE_RGB_MATRIX_RAINBOW_BEACON
// #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
// #define ENABLE_RGB_MATRIX_RAINDROPS
// #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
// #define ENABLE_RGB_MATRIX_HUE_BREATHING
// #define ENABLE_RGB_MATRIX_HUE_PENDULUM
// #define ENABLE_RGB_MATRIX_HUE_WAVE
// #define ENABLE_RGB_MATRIX_PIXEL_RAIN
// #define ENABLE_RGB_MATRIX_PIXEL_FLOW
// #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
// #define ENABLE_RGB_MATRIX_TYPING_HEATMAP
// #define ENABLE_RGB_MATRIX_DIGITAL_RAIN
// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE
// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
#define ENABLE_RGB_MATRIX_SPLASH
// #define ENABLE_RGB_MATRIX_MULTISPLASH
#define ENABLE_RGB_MATRIX_SOLID_SPLASH
// #define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
#endif

View File

@ -0,0 +1,52 @@
{
"manufacturer": "Binepad",
"keyboard_name": "BN006",
"maintainer": "Binepad",
"bootloader": "stm32duino",
"debounce": 5,
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["A15", "B3", "B4"],
"rows": ["A8", "C14"]
},
"processor": "STM32F103",
"url": "https://binepad.com",
"usb": {
"vid": "0x4249",
"pid": "0x426E",
"device_version": "1.0.0"
},
"rgb_matrix": {
"driver": "WS2812",
"layout": [
{ "flags": 4, "matrix": [0, 0], "x": 0, "y": 0 },
{ "flags": 4, "matrix": [0, 1], "x": 112, "y": 0 },
{ "flags": 4, "matrix": [0, 2], "x": 224, "y": 0 },
{ "flags": 4, "matrix": [1, 0], "x": 0, "y": 64 },
{ "flags": 4, "matrix": [1, 1], "x": 112, "y": 64 },
{ "flags": 4, "matrix": [1, 2], "x": 224, "y": 64 }
]
},
"community_layouts": ["ortho_2x3"],
"layouts": {
"LAYOUT_ortho_2x3": {
"layout": [
{ "matrix": [0, 0], "x": 0, "y": 0 },
{ "matrix": [0, 1], "x": 1, "y": 0 },
{ "matrix": [0, 2], "x": 2, "y": 0 },
{ "matrix": [1, 0], "x": 0, "y": 1 },
{ "matrix": [1, 1], "x": 1, "y": 1 },
{ "matrix": [1, 2], "x": 2, "y": 1 }
]
}
}
}

View File

@ -0,0 +1,18 @@
/* Copyright 2022 Binepad (@binpad) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
*
* A B C
*
* D E F
*
*/
[0] = LAYOUT_ortho_2x3(
KC_MPLY, KC_MUTE, KC_VOLU,
KC_MPRV, KC_MNXT, KC_VOLD
)
};

View File

@ -0,0 +1,33 @@
/* Copyright 2022 Binepad (@binpad) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
*
* A B C
*
* D E F
*
*/
[0] = LAYOUT_ortho_2x3(
KC_MPLY, KC_MUTE, KC_VOLU,
KC_MPRV, KC_MNXT, KC_VOLD
),
[1] = LAYOUT_ortho_2x3(
_______, _______, _______,
_______, _______, _______
),
[2] = LAYOUT_ortho_2x3(
_______, _______, _______,
_______, _______, _______
),
[3] = LAYOUT_ortho_2x3(
_______, _______, _______,
_______, _______, _______
)
};

View File

@ -0,0 +1,4 @@
# Copyright 2022 Binepad (@binpad)
# SPDX-License-Identifier: GPL-2.0-or-later
VIA_ENABLE = yes

View File

@ -0,0 +1,26 @@
# BINEPAD BN006
The BN006 is a CNC machined 6-key macropad
* Keyboard Maintainer: [Binepad](https://github.com/binepad)
* Hardware Supported: BN006
* Hardware Availability: [Binepad.com](https://www.binepad.com/bn006)
Make example for this keyboard (after setting up your build environment):
make binepad/bn006:default
Flashing example for this keyboard:
make binepad/bn006:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key) 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` *(or `RESET`)* if it is available

View File

@ -0,0 +1,5 @@
# Copyright 2022 Binepad (@binpad)
# SPDX-License-Identifier: GPL-2.0-or-later
EPROM_DRIVER = wear_leveling
WEAR_LEVELING_DRIVER = embedded_flash

View File

@ -0,0 +1,29 @@
{
"manufacturer": "Binepad",
"keyboard_name": "BNR1",
"maintainer": "Binpad",
"debounce": 5,
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"encoder": true
},
"url": "http://binepad.com",
"usb": {
"vid": "0x4249",
"pid": "0x4231",
"device_version": "1.0.0"
},
"community_layouts": ["ortho_1x1"],
"layouts": {
"LAYOUT_ortho_1x1": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0, "w": 2, "h": 2}
]
}
}
}

View File

@ -0,0 +1,28 @@
/* Copyright 2022 Binepad (@binpad) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include QMK_KEYBOARD_H
enum {
_L0,
_L1
} keyboard_layers;
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_L0] = LAYOUT_ortho_1x1(
LT(_L1, KC_MUTE)
),
[_L1] = LAYOUT_ortho_1x1(
_______
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_L0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_L1] = { ENCODER_CCW_CW(KC_MS_WH_DOWN, KC_MS_WH_UP) }
};
#endif

View File

@ -0,0 +1,6 @@
# Copyright 2022 Binepad (@binpad)
# SPDX-License-Identifier: GPL-2.0-or-later
LTO_ENABLE = yes
ENCODER_MAP_ENABLE = yes

View File

@ -0,0 +1,11 @@
/* Copyright 2022 Binepad (@binpad) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#define TAPPING_TERM 175
#ifdef DYNAMIC_KEYMAP_LAYER_COUNT
#undef DYNAMIC_KEYMAP_LAYER_COUNT
#endif
#define DYNAMIC_KEYMAP_LAYER_COUNT 2

View File

@ -0,0 +1,28 @@
/* Copyright 2022 Binepad (@binpad) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include QMK_KEYBOARD_H
enum {
_L0,
_L1
} keyboard_layers;
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_L0] = LAYOUT_ortho_1x1(
LT(_L1, KC_MUTE)
),
[_L1] = LAYOUT_ortho_1x1(
_______
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_L0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_L1] = { ENCODER_CCW_CW(KC_MS_WH_DOWN, KC_MS_WH_UP) }
};
#endif

View File

@ -0,0 +1,7 @@
# Copyright 2022 Binepad (@binpad)
# SPDX-License-Identifier: GPL-2.0-or-later
LTO_ENABLE = yes
VIA_ENABLE = yes
ENCODER_MAP_ENABLE = yes

View File

@ -0,0 +1,23 @@
# BINEPAD BNR1
The BNR1 is a multifunction knob, which can be rotated, pressed, and rotated while pressed.
* Keyboard Maintainer: [Binpad](https://github.com/binepad)
* Hardware Supported: **BNR1** & **BNR1 R2** *("V1" ft. ATMega32u4 MCU)*
* Hardware Availability: [Binepad.com](https://www.binepad.com/bnr1)
Make example for this keyboard (after setting up your build environment):
make binepad/bnr1/v1: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).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the knob while plugging in the keyboard's USB cable
* **Physical reset button**: Briefly press the button on the underside of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` *(or `RESET`)* if it is available

View File

@ -0,0 +1,3 @@
# This file intentionally left blank
DEFAULT_FOLDER = binepad/bnr1/v1

View File

@ -0,0 +1,14 @@
{
"bootloader": "atmel-dfu",
"processor": "atmega32u4",
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["B0"],
"rows": ["E6"]
},
"encoder": {
"rotary": [
{ "pin_a": "D6", "pin_b": "D7" }
]
}
}

View File

@ -0,0 +1 @@
# This file intentionally left blank

View File

@ -0,0 +1,22 @@
// Copyright 2019 Manna Harbour
// https://github.com/manna-harbour/miryoku
// 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
#define XXX KC_NO
#define LAYOUT_miryoku(\
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19,\
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29,\
N30, N31, K32, K33, K34, K35, K36, K37, N38, N39\
)\
LAYOUT(\
XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX,\
XXX, K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, XXX,\
XXX, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, XXX,\
XXX, K20, K21, K22, K23, K24, XXX, XXX, K25, K26, K27, K28, K29, XXX,\
XXX, K32, K33, K34, K35, K36, K37, XXX\
)

View File

@ -1,9 +1,4 @@
// Copyright 2019 Manna Harbour // Copyright 2019 Manna Harbour
// https://github.com/manna-harbour/miryoku // https://github.com/manna-harbour/miryoku
// generated -*- buffer-read-only: t -*-
// 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/>. // 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/>.
#if !defined (MIRYOKU_LAYER_NAMES)
#define MIRYOKU_LAYER_NAMES BASE, BUTTON, NAV, MOUSE, MEDIA, NUM, SYM, FUN
#endif

View File

@ -28,8 +28,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
K41, K43, K45, K46, K48, K4A, K4E \ K41, K43, K45, K46, K48, K4A, K4E \
){ \ ){ \
{K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K1E},\ {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, XXX},\ {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, K2D, K2E},\ {K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E},\
{XXX, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E},\ {XXX, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E},\
{XXX, K41, XXX, K43, XXX, K45, K46, XXX, K48, XXX, K4A, XXX, XXX, XXX, K4E},\ {XXX, K41, XXX, K43, XXX, K45, K46, XXX, K48, XXX, K4A, XXX, XXX, XXX, K4E},\

View File

@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_PSCR, KC_SCRL, KC_PAUS, 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_PSCR, KC_SCRL, KC_PAUS,
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_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, 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_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
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_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, 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_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
KC_CLCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_P4, KC_P5, KC_P6, 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_BSLS, KC_ENT, KC_P4, KC_P5, KC_P6,
KC_LSFT, KC_NUBS, 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_P1, KC_P2, KC_P3, KC_PENT, KC_LSFT, KC_NUBS, 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_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_MD), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_MD), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
), ),

View File

@ -0,0 +1,25 @@
/*
Copyright 2015 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
#define DYNAMIC_KEYMAP_LAYER_COUNT 3
#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64

View File

@ -0,0 +1,142 @@
{
"keyboard_name": "Brutal v2 1800",
"maintainer": "awkannan",
"manufacturer": "CannonKeys",
"processor": "RP2040",
"bootloader": "rp2040",
"usb": {
"vid": "0xCA04",
"pid": "0x000D",
"device_version": "0.0.1"
},
"url": "https://cannonkeys.com",
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP28", "GP27", "GP26", "GP25", "GP24", "GP23", "GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP16", "GP9", "GP6", "GP5", "GP4", "GP3"],
"rows": ["GP13", "GP12", "GP11", "GP10", "GP8", "GP7"]
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
},
"indicators": {
"caps_lock": "GP29",
"num_lock": "GP2",
"on_state": 0
},
"build": {
"debounce_type": "asym_eager_defer_pk",
},
"layouts": {
"LAYOUT_all": {
"layout": [
{ "label": "Esc", "matrix": [0, 0], "x": 0.0, "y": 0.0 },
{ "label": "F1", "matrix": [0, 1], "x": 1.25, "y": 0.0 },
{ "label": "F2", "matrix": [0, 2], "x": 2.25, "y": 0.0 },
{ "label": "F3", "matrix": [0, 3], "x": 3.25, "y": 0.0 },
{ "label": "F4", "matrix": [0, 4], "x": 4.25, "y": 0.0 },
{ "label": "F5", "matrix": [0, 5], "x": 5.5, "y": 0.0 },
{ "label": "F6", "matrix": [0, 6], "x": 6.5, "y": 0.0 },
{ "label": "F7", "matrix": [0, 7], "x": 7.5, "y": 0.0 },
{ "label": "F8", "matrix": [0, 8], "x": 8.5, "y": 0.0 },
{ "label": "F9", "matrix": [0, 9], "x": 9.75, "y": 0.0 },
{ "label": "F10", "matrix": [0, 10], "x": 10.75, "y": 0.0 },
{ "label": "F11", "matrix": [0, 11], "x": 11.75, "y": 0.0 },
{ "label": "F12", "matrix": [0, 12], "x": 12.75, "y": 0.0 },
{ "label": "Del", "matrix": [0, 13], "x": 14.0, "y": 0.0 },
{ "matrix": [0, 14], "x": 15.5, "y": 0.0 },
{ "matrix": [0, 15], "x": 16.5, "y": 0.0 },
{ "matrix": [0, 16], "x": 17.5, "y": 0.0 },
{ "matrix": [0, 17], "x": 18.5, "y": 0.0 },
{ "label": "~", "matrix": [1, 0], "x": 0.0, "y": 1.25 },
{ "label": "!", "matrix": [1, 1], "x": 1.0, "y": 1.25 },
{ "label": "@", "matrix": [1, 2], "x": 2.0, "y": 1.25 },
{ "label": "#", "matrix": [1, 3], "x": 3.0, "y": 1.25 },
{ "label": "$", "matrix": [1, 4], "x": 4.0, "y": 1.25 },
{ "label": "%", "matrix": [1, 5], "x": 5.0, "y": 1.25 },
{ "label": "^", "matrix": [1, 6], "x": 6.0, "y": 1.25 },
{ "label": "&", "matrix": [1, 7], "x": 7.0, "y": 1.25 },
{ "label": "*", "matrix": [1, 8], "x": 8.0, "y": 1.25 },
{ "label": "(", "matrix": [1, 9], "x": 9.0, "y": 1.25 },
{ "label": ")", "matrix": [1, 10], "x": 10.0, "y": 1.25 },
{ "label": "_", "matrix": [1, 11], "x": 11.0, "y": 1.25 },
{ "label": "+", "matrix": [1, 12], "x": 12.0, "y": 1.25 },
{ "matrix": [1, 13], "x": 13.0, "y": 1.25 },
{ "matrix": [3, 12], "x": 14.0, "y": 1.25 },
{ "label": "Insert", "matrix": [1, 14], "x": 15.5, "y": 1.25 },
{ "label": "Home", "matrix": [1, 15], "x": 16.5, "y": 1.25 },
{ "label": "PgUp", "matrix": [1, 16], "x": 17.5, "y": 1.25 },
{ "matrix": [1, 17], "x": 18.5, "y": 1.25 },
{ "label": "Tab", "matrix": [2, 0], "w": 1.5, "x": 0.0, "y": 2.25 },
{ "label": "Q", "matrix": [2, 1], "x": 1.5, "y": 2.25 },
{ "label": "W", "matrix": [2, 2], "x": 2.5, "y": 2.25 },
{ "label": "E", "matrix": [2, 3], "x": 3.5, "y": 2.25 },
{ "label": "R", "matrix": [2, 4], "x": 4.5, "y": 2.25 },
{ "label": "T", "matrix": [2, 5], "x": 5.5, "y": 2.25 },
{ "label": "Y", "matrix": [2, 6], "x": 6.5, "y": 2.25 },
{ "label": "U", "matrix": [2, 7], "x": 7.5, "y": 2.25 },
{ "label": "I", "matrix": [2, 8], "x": 8.5, "y": 2.25 },
{ "label": "O", "matrix": [2, 9], "x": 9.5, "y": 2.25 },
{ "label": "P", "matrix": [2, 10], "x": 10.5, "y": 2.25 },
{ "label": "{", "matrix": [2, 11], "x": 11.5, "y": 2.25 },
{ "label": "}", "matrix": [2, 12], "x": 12.5, "y": 2.25 },
{ "label": "|", "matrix": [2, 13], "w": 1.5, "x": 13.5, "y": 2.25 },
{ "label": "Delete", "matrix": [2, 14], "x": 15.5, "y": 2.25 },
{ "label": "End", "matrix": [2, 15], "x": 16.5, "y": 2.25 },
{ "label": "PgDn", "matrix": [2, 16], "x": 17.5, "y": 2.25 },
{ "matrix": [2, 17], "x": 18.5, "y": 2.25 },
{ "label": "Caps Lock", "matrix": [3, 0], "w": 1.75, "x": 0.0, "y": 3.25 },
{ "label": "A", "matrix": [3, 1], "x": 1.75, "y": 3.25 },
{ "label": "S", "matrix": [3, 2], "x": 2.75, "y": 3.25 },
{ "label": "D", "matrix": [3, 3], "x": 3.75, "y": 3.25 },
{ "label": "F", "matrix": [3, 4], "x": 4.75, "y": 3.25 },
{ "label": "G", "matrix": [3, 5], "x": 5.75, "y": 3.25 },
{ "label": "H", "matrix": [3, 6], "x": 6.75, "y": 3.25 },
{ "label": "J", "matrix": [3, 7], "x": 7.75, "y": 3.25 },
{ "label": "K", "matrix": [3, 8], "x": 8.75, "y": 3.25 },
{ "label": "L", "matrix": [3, 9], "x": 9.75, "y": 3.25 },
{ "label": ":", "matrix": [3, 10], "x": 10.75, "y": 3.25 },
{ "label": "\"", "matrix": [3, 11], "x": 11.75, "y": 3.25 },
{ "label": "Enter", "matrix": [3, 13], "w": 2.25, "x": 12.75, "y": 3.25 },
{ "matrix": [3, 14], "x": 15.5, "y": 3.25 },
{ "matrix": [3, 15], "x": 16.5, "y": 3.25 },
{ "matrix": [3, 16], "x": 17.5, "y": 3.25 },
{ "matrix": [3, 17], "x": 18.5, "y": 3.25 },
{ "label": "Shift", "matrix": [4, 0], "w": 1.25, "x": 0.0, "y": 4.25 },
{ "matrix": [4, 1], "x": 1.25, "y": 4.25 },
{ "label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25 },
{ "label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25 },
{ "label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25 },
{ "label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25 },
{ "label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25 },
{ "label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25 },
{ "label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25 },
{ "label": "<", "matrix": [4, 9], "x": 9.25, "y": 4.25 },
{ "label": ">", "matrix": [4, 10], "x": 10.25, "y": 4.25 },
{ "label": "?", "matrix": [4, 11], "x": 11.25, "y": 4.25 },
{ "label": "Shift", "matrix": [4, 12], "w": 1.75, "x": 12.25, "y": 4.25 },
{ "label": "\u2191", "matrix": [4, 13], "x": 14.25, "y": 4.25 },
{ "matrix": [4, 14], "x": 15.5, "y": 4.25 },
{ "matrix": [4, 15], "x": 16.5, "y": 4.25 },
{ "matrix": [4, 16], "x": 17.5, "y": 4.25 },
{ "matrix": [4, 17], "x": 18.5, "y": 4.25 },
{ "label": "Ctrl", "matrix": [5, 0], "w": 1.25, "x": 0.0, "y": 5.25 },
{ "label": "Alt", "matrix": [5, 1], "w": 1.25, "x": 1.25, "y": 5.25 },
{ "label": "Alt", "matrix": [5, 2], "w": 1.25, "x": 2.5, "y": 5.25 },
{ "matrix": [5, 6], "w": 6.25, "x": 3.75, "y": 5.25 },
{ "label": "Alt", "matrix": [5, 10], "w": 1.5, "x": 10.0, "y": 5.25 },
{ "label": "Ctrl", "matrix": [5, 11], "w": 1.5, "x": 11.5, "y": 5.25 },
{ "label": "\u2190", "matrix": [5, 12], "x": 13.25, "y": 5.25 },
{ "label": "\u2193", "matrix": [5, 13], "x": 14.25, "y": 5.25 },
{ "label": "\u2192", "matrix": [5, 14], "x": 15.25, "y": 5.25 },
{ "matrix": [5, 15], "x": 16.5, "y": 5.25 },
{ "matrix": [5, 16], "x": 17.5, "y": 5.25 },
{ "matrix": [5, 17], "x": 18.5, "y": 5.25 }
]
}
}
}

View File

@ -0,0 +1,48 @@
/*
Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_names {
_BASE,
_FN1,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all(
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_PSCR, KC_DEL, KC_INS, KC_PGUP, KC_PGDN,
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_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
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_P7, KC_P8, KC_P9, KC_PPLS,
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_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUHS, 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_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
),
[_FN1] = LAYOUT_all(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
BL_INC, BL_DEC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};

View File

@ -0,0 +1,58 @@
/*
Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_names {
_BASE,
_FN1,
_FN2,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all(
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_PSCR, KC_DEL, KC_INS, KC_PGUP, KC_PGDN,
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_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
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_P7, KC_P8, KC_P9, KC_PPLS,
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_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUHS, 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_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
),
[_FN1] = LAYOUT_all(
QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
BL_INC, BL_DEC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[_FN2] = LAYOUT_all(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};

View File

@ -0,0 +1,22 @@
# Brutal v2 1800
Brutal v2 1800 Keyboard
* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
* Hardware Supported: RP2040
* Hardware Availability: [CannonKeys](https://cannonkeys.com)
Make example for this keyboard (after setting up your build environment):
make cannonkeys/brutalv2_1800: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).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Toggle the switch on the back of the pcb to "Rcovery" and briefly press the button on the back of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -0,0 +1,2 @@
EEPROM_DRIVER = wear_leveling
WEAR_LEVELING_DRIVER = rp2040_flash

View File

@ -0,0 +1,20 @@
/* Copyright 2022 Andrew Kannan
*
* 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
#define BACKLIGHT_PWM_DRIVER PWMD3
#define BACKLIGHT_PWM_CHANNEL 1
#define BACKLIGHT_PAL_MODE 1

View File

@ -0,0 +1,27 @@
/* Copyright 2020 QMK
*
* 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/>.
*/
/*
* This file was auto-generated by:
* `qmk chibios-confmigrate -i keyboards/cannonkeys/an_c/halconf.h -r platforms/chibios/common/configs/halconf.h`
*/
#pragma once
#define HAL_USE_PWM TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,108 @@
{
"manufacturer": "CannonKeys",
"keyboard_name": "Ellipse",
"maintainer": "awkannan",
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"backlight": true,
},
"matrix_pins": {
"cols": ["B11", "B10", "B2", "A9", "A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "C13", "C14", "C15"],
"rows": ["B1", "B0", "A7", "A5", "A4"]
},
"backlight": {
"breathing": true,
"breathing_period": 5,
"levels": 15,
"pin": "A6"
},
"indicators": {
"caps_lock": "A3",
"on_state": 0
},
"processor": "STM32F072",
"url": "https://cannonkeys.com/",
"usb": {
"device_version": "1.0.0",
"vid": "0xCA04",
"pid": "0x0015"
},
"layouts": {
"LAYOUT_all": {
"layout": [
{ "label": "Esc", "matrix": [0, 0], "x": 0.0, "y": 0.0 },
{ "label": "!", "matrix": [0, 1], "x": 1.0, "y": 0.0 },
{ "label": "@", "matrix": [0, 2], "x": 2.0, "y": 0.0 },
{ "label": "#", "matrix": [0, 3], "x": 3.0, "y": 0.0 },
{ "label": "$", "matrix": [0, 4], "x": 4.0, "y": 0.0 },
{ "label": "%", "matrix": [0, 5], "x": 5.0, "y": 0.0 },
{ "label": "^", "matrix": [0, 6], "x": 6.0, "y": 0.0 },
{ "label": "&", "matrix": [0, 7], "x": 7.0, "y": 0.0 },
{ "label": "*", "matrix": [0, 8], "x": 8.0, "y": 0.0 },
{ "label": "(", "matrix": [0, 9], "x": 9.0, "y": 0.0 },
{ "label": ")", "matrix": [0, 10], "x": 10.0, "y": 0.0 },
{ "label": "_", "matrix": [0, 11], "x": 11.0, "y": 0.0 },
{ "label": "+", "matrix": [0, 12], "x": 12.0, "y": 0.0 },
{ "label": "Bksp", "matrix": [0, 13], "x": 13.0, "y": 0.0 },
{ "label": "Del", "matrix": [0, 14], "x": 14.0, "y": 0.0 },
{ "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0.0, "y": 1.0 },
{ "label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1.0 },
{ "label": "W", "matrix": [1, 2], "x": 2.5, "y": 1.0 },
{ "label": "E", "matrix": [1, 3], "x": 3.5, "y": 1.0 },
{ "label": "R", "matrix": [1, 4], "x": 4.5, "y": 1.0 },
{ "label": "T", "matrix": [1, 5], "x": 5.5, "y": 1.0 },
{ "label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1.0 },
{ "label": "U", "matrix": [1, 7], "x": 7.5, "y": 1.0 },
{ "label": "I", "matrix": [1, 8], "x": 8.5, "y": 1.0 },
{ "label": "O", "matrix": [1, 9], "x": 9.5, "y": 1.0 },
{ "label": "P", "matrix": [1, 10], "x": 10.5, "y": 1.0 },
{ "label": "{", "matrix": [1, 11], "x": 11.5, "y": 1.0 },
{ "label": "}", "matrix": [1, 12], "x": 12.5, "y": 1.0 },
{ "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1.0 },
{ "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0.0, "y": 2.0 },
{ "label": "A", "matrix": [2, 1], "x": 1.75, "y": 2.0 },
{ "label": "S", "matrix": [2, 2], "x": 2.75, "y": 2.0 },
{ "label": "D", "matrix": [2, 3], "x": 3.75, "y": 2.0 },
{ "label": "F", "matrix": [2, 4], "x": 4.75, "y": 2.0 },
{ "label": "G", "matrix": [2, 5], "x": 5.75, "y": 2.0 },
{ "label": "H", "matrix": [2, 6], "x": 6.75, "y": 2.0 },
{ "label": "J", "matrix": [2, 7], "x": 7.75, "y": 2.0 },
{ "label": "K", "matrix": [2, 8], "x": 8.75, "y": 2.0 },
{ "label": "L", "matrix": [2, 9], "x": 9.75, "y": 2.0 },
{ "label": ":", "matrix": [2, 10], "x": 10.75, "y": 2.0 },
{ "label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2.0 },
{ "label": "\\", "matrix": [2, 12], "x": 12.75, "y": 2.0 },
{ "label": "Enter", "matrix": [2, 14], "w": 2.25, "x": 12.75, "y": 2.0 },
{ "label": "Shift", "matrix": [3, 0], "w": 1.25, "x": 0.0, "y": 3.0 },
{ "label": "|", "matrix": [3, 1], "x": 1.25, "y": 3.0 },
{ "label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3.0 },
{ "label": "X", "matrix": [3, 3], "x": 3.25, "y": 3.0 },
{ "label": "C", "matrix": [3, 4], "x": 4.25, "y": 3.0 },
{ "label": "V", "matrix": [3, 5], "x": 5.25, "y": 3.0 },
{ "label": "B", "matrix": [3, 6], "x": 6.25, "y": 3.0 },
{ "label": "N", "matrix": [3, 7], "x": 7.25, "y": 3.0 },
{ "label": "M", "matrix": [3, 8], "x": 8.25, "y": 3.0 },
{ "label": "<", "matrix": [3, 9], "x": 9.25, "y": 3.0 },
{ "label": ">", "matrix": [3, 10], "x": 10.25, "y": 3.0 },
{ "label": "?", "matrix": [3, 11], "x": 11.25, "y": 3.0 },
{ "label": "Shift", "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3.0 },
{ "label": "Fn", "matrix": [3, 14], "x": 14.0, "y": 3.0 },
{ "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0.0, "y": 4.0 },
{ "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4.0 },
{ "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4.0 },
{ "matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4.0 },
{ "label": "Alt", "matrix": [4, 10], "w": 1.25, "x": 10.0, "y": 4.0 },
{ "label": "Win", "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4.0 },
{ "label": "Fn", "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4.0 },
{ "label": "Menu", "matrix": [4, 14], "w": 1.25, "x": 13.75, "y": 4.0 }
]
}
}
}

View File

@ -0,0 +1,45 @@
// Copyright 2022 Andrew Kannan (@awkannan)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_FN1,
_FN2,
_FN3
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all(
QK_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_DEL,
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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT,
KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1), KC_RGUI, KC_RCTL
),
[_FN1] = LAYOUT_all(
KC_GRV, 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_DEL,
RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
BL_BRTG, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, QK_BOOT
),
[_FN2] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
[_FN3] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1,45 @@
// Copyright 2022 Andrew Kannan (@awkannan)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_FN1,
_FN2,
_FN3
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all(
QK_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_DEL,
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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT,
KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1), KC_RGUI, KC_RCTL
),
[_FN1] = LAYOUT_all(
KC_GRV, 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_DEL,
RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
BL_BRTG, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, QK_BOOT
),
[_FN2] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
[_FN3] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@ -0,0 +1,28 @@
/* Copyright 2020 QMK
*
* 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/>.
*/
/*
* This file was auto-generated by:
* `qmk chibios-confmigrate -i keyboards/cannonkeys/an_c/mcuconf.h -r platforms/chibios/GENERIC_STM32_F072XB/configs/mcuconf.h`
*/
#pragma once
#include_next <mcuconf.h>
#undef STM32_PWM_USE_TIM3
#define STM32_PWM_USE_TIM3 TRUE

View File

@ -0,0 +1,25 @@
# Ellipse
*An ellipse inspired 60% keyboard with 3 mounting styles from Skepur*
* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
* Hardware Supported: STM32F072CBT6
* Hardware Availability: [CannonKeys](https://cannonkeys.com)
Make example for this keyboard (after setting up your build environment):
make cannonkeys/ellipse:default
Flashing example for this keyboard:
make cannonkeys/ellipse:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Swap the boot switch on the back of the PCB to "1" and hit the reset button
* **Keycode in layout**: Press the key mapped to `RESET` if it is available

View File

@ -0,0 +1,2 @@
# Wildcard to allow APM32 MCU
DFU_SUFFIX_ARGS = -v FFFF -p FFFF

View File

@ -0,0 +1,94 @@
{
"manufacturer": "CannonKeys",
"keyboard_name": "Ellipse HS",
"maintainer": "awkannan",
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["B11", "B10", "B2", "A9", "A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "C13", "C14", "C15"],
"rows": ["B1", "B0", "A7", "A5", "A4"]
},
"processor": "STM32F072",
"url": "https://cannonkeys.com/",
"usb": {
"device_version": "1.0.0",
"vid": "0xCA04",
"pid": "0x0016"
},
"layouts": {
"LAYOUT_all": {
"layout": [
{ "label": "Esc", "matrix": [0, 0], "x": 0.0, "y": 0.0 },
{ "label": "!", "matrix": [0, 1], "x": 1.0, "y": 0.0 },
{ "label": "@", "matrix": [0, 2], "x": 2.0, "y": 0.0 },
{ "label": "#", "matrix": [0, 3], "x": 3.0, "y": 0.0 },
{ "label": "$", "matrix": [0, 4], "x": 4.0, "y": 0.0 },
{ "label": "%", "matrix": [0, 5], "x": 5.0, "y": 0.0 },
{ "label": "^", "matrix": [0, 6], "x": 6.0, "y": 0.0 },
{ "label": "&", "matrix": [0, 7], "x": 7.0, "y": 0.0 },
{ "label": "*", "matrix": [0, 8], "x": 8.0, "y": 0.0 },
{ "label": "(", "matrix": [0, 9], "x": 9.0, "y": 0.0 },
{ "label": ")", "matrix": [0, 10], "x": 10.0, "y": 0.0 },
{ "label": "_", "matrix": [0, 11], "x": 11.0, "y": 0.0 },
{ "label": "+", "matrix": [0, 12], "x": 12.0, "y": 0.0 },
{ "label": "Del", "matrix": [0, 13], "x": 13.0, "y": 0.0 },
{ "label": "Bksp", "matrix": [0, 14], "x": 14.0, "y": 0.0 },
{ "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0.0, "y": 1.0 },
{ "label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1.0 },
{ "label": "W", "matrix": [1, 2], "x": 2.5, "y": 1.0 },
{ "label": "E", "matrix": [1, 3], "x": 3.5, "y": 1.0 },
{ "label": "R", "matrix": [1, 4], "x": 4.5, "y": 1.0 },
{ "label": "T", "matrix": [1, 5], "x": 5.5, "y": 1.0 },
{ "label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1.0 },
{ "label": "U", "matrix": [1, 7], "x": 7.5, "y": 1.0 },
{ "label": "I", "matrix": [1, 8], "x": 8.5, "y": 1.0 },
{ "label": "O", "matrix": [1, 9], "x": 9.5, "y": 1.0 },
{ "label": "P", "matrix": [1, 10], "x": 10.5, "y": 1.0 },
{ "label": "{", "matrix": [1, 11], "x": 11.5, "y": 1.0 },
{ "label": "}", "matrix": [1, 12], "x": 12.5, "y": 1.0 },
{ "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1.0 },
{ "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0.0, "y": 2.0 },
{ "label": "A", "matrix": [2, 1], "x": 1.75, "y": 2.0 },
{ "label": "S", "matrix": [2, 2], "x": 2.75, "y": 2.0 },
{ "label": "D", "matrix": [2, 3], "x": 3.75, "y": 2.0 },
{ "label": "F", "matrix": [2, 4], "x": 4.75, "y": 2.0 },
{ "label": "G", "matrix": [2, 5], "x": 5.75, "y": 2.0 },
{ "label": "H", "matrix": [2, 6], "x": 6.75, "y": 2.0 },
{ "label": "J", "matrix": [2, 7], "x": 7.75, "y": 2.0 },
{ "label": "K", "matrix": [2, 8], "x": 8.75, "y": 2.0 },
{ "label": "L", "matrix": [2, 9], "x": 9.75, "y": 2.0 },
{ "label": ":", "matrix": [2, 10], "x": 10.75, "y": 2.0 },
{ "label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2.0 },
{ "label": "Enter", "matrix": [2, 14], "w": 2.25, "x": 12.75, "y": 2.0 },
{ "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0.0, "y": 3.0 },
{ "label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3.0 },
{ "label": "X", "matrix": [3, 3], "x": 3.25, "y": 3.0 },
{ "label": "C", "matrix": [3, 4], "x": 4.25, "y": 3.0 },
{ "label": "V", "matrix": [3, 5], "x": 5.25, "y": 3.0 },
{ "label": "B", "matrix": [3, 6], "x": 6.25, "y": 3.0 },
{ "label": "N", "matrix": [3, 7], "x": 7.25, "y": 3.0 },
{ "label": "M", "matrix": [3, 8], "x": 8.25, "y": 3.0 },
{ "label": "<", "matrix": [3, 9], "x": 9.25, "y": 3.0 },
{ "label": ">", "matrix": [3, 10], "x": 10.25, "y": 3.0 },
{ "label": "?", "matrix": [3, 11], "x": 11.25, "y": 3.0 },
{ "label": "Shift", "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3.0 },
{ "label": "Fn", "matrix": [3, 14], "x": 14.0, "y": 3.0 },
{ "label": "Ctrl", "matrix": [4, 0], "w": 1.5, "x": 0.0, "y": 4.0 },
{ "label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4.0 },
{ "label": "Alt", "matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4.0 },
{ "matrix": [4, 6], "w": 7.0, "x": 4.0, "y": 4.0 },
{ "label": "Alt", "matrix": [4, 11], "w": 1.5, "x": 11.0, "y": 4.0 },
{ "label": "Win", "matrix": [4, 12], "x": 12.5, "y": 4.0 },
{ "label": "Menu", "matrix": [4, 14], "w": 1.5, "x": 13.5, "y": 4.0 }
]
}
}
}

View File

@ -0,0 +1,45 @@
// Copyright 2022 Andrew Kannan (@awkannan)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_FN1,
_FN2,
_FN3
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all(
QK_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_DEL,
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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[_FN1] = LAYOUT_all(
KC_GRV, 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_DEL,
RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
BL_BRTG, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
BL_INC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, QK_BOOT
),
[_FN2] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
[_FN3] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1,45 @@
// Copyright 2022 Andrew Kannan (@awkannan)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_FN1,
_FN2,
_FN3
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all(
QK_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_DEL,
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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[_FN1] = LAYOUT_all(
KC_GRV, 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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, QK_BOOT
),
[_FN2] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
[_FN3] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@ -0,0 +1,25 @@
# Ellipse Hotswap
*A ellipse inspired 60% keyboard with 3 mounting styles from Skepur*
* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
* Hardware Supported: STM32F072CBT6
* Hardware Availability: [CannonKeys](https://cannonkeys.com)
Make example for this keyboard (after setting up your build environment):
make cannonkeys/ellipse_hs:default
Flashing example for this keyboard:
make cannonkeys/ellipse_hs:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Swap the boot switch on the back of the PCB to "1" and hit the reset button
* **Keycode in layout**: Press the key mapped to `RESET` if it is available

View File

@ -0,0 +1,2 @@
# Wildcard to allow APM32 MCU
DFU_SUFFIX_ARGS = -v FFFF -p FFFF

View File

@ -39,6 +39,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define RGBLIGHT_EFFECT_ALTERNATING #define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_TWINKLE #define RGBLIGHT_EFFECT_TWINKLE
#define LED_CAPS_LOCK_PIN B6
#define LED_SCROLL_LOCK_PIN B2
/* define if matrix has ghost */ /* define if matrix has ghost */
//#define MATRIX_HAS_GHOST //#define MATRIX_HAS_GHOST

46
keyboards/crkbd/keymaps/ericgebhart/keymap.c Executable file → Normal file
View File

@ -1,5 +1,5 @@
/* /*
Copyright 2018 Eric Gebhart <e.a.gebhart@gmail.com> Copyright 2018-2022 Eric Gebhart <e.a.gebhart@gmail.com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -14,47 +14,5 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "ericgebhart.h"
#define Crkbd_base(...) Base_3x6_3(__VA_ARGS__) // See: users/ericgebhart.
#define Crkbd_bepo(...) Base_bepo_3x6_3(__VA_ARGS__)
#define Crkbd_bepo6(...) Base_bepo6_3x6_3(__VA_ARGS__)
#define Crkbd_transient(...) Transient6_3x6_3(__VA_ARGS__)
/*
* The `Crkbd_base` macro is a template to allow the use of identical
* modifiers for the default layouts (eg QWERTY, Colemak, Dvorak, etc), so
* that there is no need to set them up for each layout, and modify all of
* them if I want to change them. This helps to keep consistency and ease
* of use. K## is a placeholder to pass through the individual keycodes
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// Qwerty based Base layers
[_DVORAK] = Crkbd_base(___DVORAK___),
[_BEAKL] = Crkbd_base(___BEAKL15___),
[_COLEMAK] = Crkbd_base(___COLEMAK_DH___),
[_QWERTY] = Crkbd_base(___QWERTY___),
// Bepo base layers
[_BEAKL_BP] = Crkbd_bepo(___BEAKL15_FR___),
[_DVORAK_BP] = Crkbd_bepo(___DVORAK_FR___),
[_BEPO] = Crkbd_bepo6(___BEPO6___),
// Transient layers.
[_SYMB] = Crkbd_transient(___SYMB_BEAKLB_3x12___),
[_SYMB_BP] = Crkbd_transient(___SYMB_BEAKLB_BP_3x12___),
[_KEYPAD] = Crkbd_transient(___KP_C_3x12___),
[_KEYPAD_BP] = Crkbd_transient(___KP_C_BP_3x12___),
[_TOPROWS] = Crkbd_transient(___TOPROWS_3x12___),
[_TOPROWS_BP] = Crkbd_transient(___TOPROWS_BP_3x12___),
[_NAV] = Crkbd_transient(___NAV_3x12___),
[_LAYERS] = Crkbd_transient(___LAYERS_3x12___),
//[_RGB] = Crkbd_transient(___RGB_3x12___),
[_ADJUST] = Crkbd_transient(___ADJUST_3x12___),
///HPT_TOG, KC_NUKE, ___, ___, TG_MODS, HPT_FBK
};

View File

@ -0,0 +1,51 @@
/*
This is the c configuration file for the keymap
Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2015 Jack Humbert
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
/* Select hand configuration */
#define MASTER_LEFT
// #define MASTER_RIGHT
// #define EE_HANDS
//#define TAPPING_FORCE_HOLD
#define TAPPING_TERM 200
#define IGNORE_MOD_TAP_INTERRUPT
#ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_KNIGHT
#define RGBLIGHT_EFFECT_CHRISTMAS
#define RGBLIGHT_EFFECT_STATIC_GRADIENT
#define RGBLIGHT_EFFECT_RGB_TEST
#define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_TWINKLE
#define RGBLIGHT_LIMIT_VAL 120
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
#endif
#define OLED_FONT_H "keyboards/crkbd/lib/glcdfont.c"

View File

@ -0,0 +1,176 @@
/*
Copyright 2019 @foostan
Copyright 2020 Drashna Jaelre <@drashna>
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>
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_split_3x6_3(
// \--------------------------------------------------------------------| |---------------------------------------------------------------------/
XXXXXXX, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_BSPC, XXXXXXX,
// \----------+-------+-------+---------------+---------------+---------| |--------+---------------+---------------+--------+---------+---------/
XXXXXXX, KC_A, KC_R, LCTL_T(KC_S), LGUI_T(KC_T), KC_G, KC_M, RGUI_T(KC_N), RCTL_T(KC_E), KC_I, KC_O, XXXXXXX,
// \----------+-------+-------+---------------+---------------+---------| |--------+---------------+---------------+--------+---------+---------/
XXXXXXX, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX,
// \----------+-------+-------+---------------+---------------+---------| |--------+---------------+---------------+--------+---------+---------/
KC_ESC, MO(1), KC_LSPO, KC_SPC, MO(2), KC_TAB
// \---------------+---------------+---------| |--------+---------------+---------------/
),
[1] = LAYOUT_split_3x6_3(
//,------------------------------------------------------. ,-----------------------------------------------------.
KC_NO, KC_GRV, KC_TILD, KC_PEQL, KC_UNDS, KC_PIPE, KC_PPLS, KC_7, KC_8, KC_9, KC_BSPC, KC_NO,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_NO , KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_RPRN, KC_PMNS, RGUI_T(KC_4), RCTL_T(KC_5), KC_6, KC_QUOT, KC_NO,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_NO, KC_NO, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSLS, KC_SCLN, KC_1, KC_2, KC_3, KC_DQUO, KC_NO,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
KC_LGUI, _______, KC_TRNS, KC_RSFT, MO(3), KC_0
//`--------------------------' `--------------------------'
),
[2] = LAYOUT_split_3x6_3(
//,-----------------------------------------------------. ,-----------------------------------------------------.
KC_NO, KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ENT, KC_NO, KC_DEL, KC_NO,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_NO, KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_NO, KC_NO,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_NO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LGUI, MO(3), KC_LSFT, KC_TRNS, _______, KC_RALT
//`--------------------------' `--------------------------'
),
[3] = LAYOUT_split_3x6_3(
//,-----------------------------------------------------. ,-----------------------------------------------------.
XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT
//`--------------------------' `--------------------------'
)
};
#ifdef OLED_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
if (!is_keyboard_master()) {
return OLED_ROTATION_180; // flips the display 180 degrees if offhand
}
return rotation;
}
#define L_BASE 0
#define L_LOWER 2
#define L_RAISE 4
#define L_ADJUST 8
void oled_render_layer_state(void) {
oled_write_P(PSTR("Layer: "), false);
switch (layer_state) {
case L_BASE:
oled_write_ln_P(PSTR("Default"), false);
break;
case L_LOWER:
oled_write_ln_P(PSTR("Lower"), false);
break;
case L_RAISE:
oled_write_ln_P(PSTR("Raise"), false);
break;
case L_ADJUST:
case L_ADJUST|L_LOWER:
case L_ADJUST|L_RAISE:
case L_ADJUST|L_LOWER|L_RAISE:
oled_write_ln_P(PSTR("Adjust"), false);
break;
}
}
char keylog_str[24] = {};
const char code_to_name[60] = {
' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
'#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
void set_keylog(uint16_t keycode, keyrecord_t *record) {
char name = ' ';
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) ||
(keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
if (keycode < 60) {
name = code_to_name[keycode];
}
// update keylog
snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
record->event.key.row, record->event.key.col,
keycode, name);
}
void oled_render_keylog(void) {
oled_write(keylog_str, false);
}
void render_bootmagic_status(bool status) {
/* Show Ctrl-Gui Swap options */
static const char PROGMEM logo[][2][3] = {
{{0x97, 0x98, 0}, {0xb7, 0xb8, 0}},
{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}},
};
if (status) {
oled_write_ln_P(logo[0][0], false);
oled_write_ln_P(logo[0][1], false);
} else {
oled_write_ln_P(logo[1][0], false);
oled_write_ln_P(logo[1][1], false);
}
}
void oled_render_logo(void) {
static const char PROGMEM crkbd_logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
0};
oled_write_P(crkbd_logo, false);
}
bool oled_task_user(void) {
if (is_keyboard_master()) {
oled_render_layer_state();
oled_render_keylog();
} else {
oled_render_logo();
}
return false;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
set_keylog(keycode, record);
}
return true;
}
#endif // OLED_ENABLE

View File

@ -0,0 +1,6 @@
MOUSEKEY_ENABLE = yes
RGBLIGHT_ENABLE = yes
OLED_ENABLE = yes
OLED_DRIVER = SSD1306
LTO_ENABLE = yes
BOOTLOADER = caterina

View File

@ -18,26 +18,7 @@
#include "kb16.h" #include "kb16.h"
// OLED animation // OLED animation
#include "lib/logo.h" #include "./lib/logo.h"
#ifdef RGB_MATRIX_ENABLE
led_config_t g_led_config = { {
{ 0, 1, 2, 3, NO_LED, NO_LED, NO_LED },
{ 4, 5, 6, 7, NO_LED, NO_LED, NO_LED },
{ 8, 9, 10, 11, NO_LED, NO_LED, NO_LED },
{ 12, 13, 14, 15, NO_LED, NO_LED, NO_LED }
}, {
{0 , 0}, {75 , 0}, {149, 0}, {224, 0},
{0 , 21}, {75 , 21}, {149, 21}, {224, 21},
{0 , 43}, {75 , 43}, {149, 43}, {224, 43},
{0 , 64}, {75 , 64}, {149, 64}, {224, 64},
}, {
1, 1, 1, 1,
1, 4, 4, 1,
1, 4, 4, 1,
1, 1, 1, 1,
} };
#endif
#ifdef OLED_ENABLE #ifdef OLED_ENABLE
uint16_t startup_timer; uint16_t startup_timer;

View File

@ -19,29 +19,8 @@
#include "quantum.h" #include "quantum.h"
#define XXX KC_NO #if defined(KEYBOARD_doio_kb16_rev1)
#include "rev1.h"
/* 06 ◯ 05 16 ◯ 15 #elif defined(KEYBOARD_doio_kb16_rev2)
* #include "rev2.h"
* 00 01 02 03 04 14 #endif
*
* 10 11 12 13
* 26 25
* 20 21 22 23
* 24
* 30 31 32 33
*
*/
#define LAYOUT( \
K00, K01, K02, K03, K06, K04, K05, \
K10, K11, K12, K13, K16, K14, K15, \
K20, K21, K22, K23, K26, K24, K25, \
K30, K31, K32, K33 \
) { \
{ K00, K01, K02, K03, K04, K05, K06 }, \
{ K10, K11, K12, K13, K14, K15, K16 }, \
{ K20, K21, K22, K23, K24, K25, K26 }, \
{ K30, K31, K32, K33, XXX, XXX, XXX } \
}

View File

@ -1,9 +0,0 @@
SRC += oled/bongocat.c
VIA_ENABLE = yes
# Additional thing to reduce compiled size
GRAVE_ESC_ENABLE = no
# OLED enabled
WPM_ENABLE = yes

View File

@ -1,26 +1,13 @@
# KB16-01 # KB16-01
![KB16-01](https://i.imgur.com/lpq47ELh.png) #### This keyboard have 2 revision, so before you need to write your own firmware code. Please read it carefully, or you could accident bricked your keeb after that.
A macropad that have 16-key keyboard made by DOIO, which controlled by an Atmega32u4 chipset. The keyboard features per-key RGB, 3 encoder and an OLED screen for displaying useful information. - **Revision 1**: Using ATMEGA32U4.
* Keyboard Maintainer: [HorrorTroll](https://github.com/HorrorTroll) When you try to go bootloader mode, QMK Toolbox will showing this message `Atmel DFU device connected (libusb0): Atmel Corp. ATmega32U4 (03EB:2FF4:0000)`. So please compile Revision 1 and flash after that.
* Hardware Supported: Atmega32u4
Make example for this keyboard (after setting up your build environment): Oh, and one more thing. As for the Bongo Cat on OLED screen, due to small flash size that ATMEGA32U4 support. It need to be disable Mouse key support.
make doio/kb16/rev1:default - **Revision 2**: Using APM32F103CBT6 (clone STM32F103CBT6).
Flashing example for this keyboard: When you try to go bootloader mode, QMK Toolbox will showing this message `STM32Duino device connected: LeafLabs Maple 003 (1EAF:0003:0201)`. So please compile Revision 2 and flash after that.
make doio/kb16/rev1: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 (1! key) and plug in the keyboard
* **Physical reset button**: Short press the button under Spacebar keycap to enter the Bootloader and flash the firmware
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -21,11 +21,11 @@
/* key matrix size */ /* key matrix size */
#define MATRIX_ROWS 4 #define MATRIX_ROWS 4
#define MATRIX_COLS 7 #define MATRIX_COLS 5
/* key matrix pins */ /* key matrix pins */
#define MATRIX_ROW_PINS { D5, D4, D3, D2 } #define MATRIX_ROW_PINS { D5, D4, D3, D2 }
#define MATRIX_COL_PINS { F5, F4, F1, F0, B7, B4, B5 } #define MATRIX_COL_PINS { F5, F4, F1, F0, B7 }
#define BOOTMAGIC_LITE_ROW 0 #define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0 #define BOOTMAGIC_LITE_COLUMN 0
@ -40,7 +40,7 @@
#define FORCE_NKRO #define FORCE_NKRO
/* Use the custom font */ /* Use the custom font */
#define OLED_FONT_H "lib/glcdfont.c" #define OLED_FONT_H "./lib/glcdfont.c"
/* Encoder pins */ /* Encoder pins */
#define ENCODERS_PAD_A { F7, C7, D7 } #define ENCODERS_PAD_A { F7, C7, D7 }

View File

@ -16,27 +16,21 @@
{"label":"3#", "x":2, "y":0}, {"label":"3#", "x":2, "y":0},
{"label":"4$", "x":3, "y":0}, {"label":"4$", "x":3, "y":0},
{"label":"Encoder 1 CCW", "x":4.25, "y":0, "w":0.5},
{"label":"Encoder 1", "x":4.75, "y":0}, {"label":"Encoder 1", "x":4.75, "y":0},
{"label":"Encoder 1 CW", "x":5.75, "y":0, "w":0.5},
{"label":"5%", "x":0, "y":1}, {"label":"5%", "x":0, "y":1},
{"label":"6^", "x":1, "y":1}, {"label":"6^", "x":1, "y":1},
{"label":"7&", "x":2, "y":1}, {"label":"7&", "x":2, "y":1},
{"label":"8*", "x":3, "y":1}, {"label":"8*", "x":3, "y":1},
{"label":"Encoder 2 CCW", "x":6.25, "y":0, "w":0.5}, {"label":"Encoder 2", "x":6, "y":0},
{"label":"Encoder 2", "x":6.75, "y":0},
{"label":"Encoder 2 CW", "x":7.75, "y":0, "w":0.5},
{"label":"9(", "x":0, "y":2}, {"label":"9(", "x":0, "y":2},
{"label":"0)", "x":1, "y":2}, {"label":"0)", "x":1, "y":2},
{"label":"\u2191", "x":2, "y":2}, {"label":"\u2191", "x":2, "y":2},
{"label":"Enter", "x":3, "y":2}, {"label":"Enter", "x":3, "y":2},
{"label":"Encoder 3 CCW", "x":5.25, "y":2.5, "w":0.5}, {"label":"Encoder 3", "x":5.375, "y":2.5},
{"label":"Encoder 3", "x":5.75, "y":2.5},
{"label":"Encoder 3 CW", "x":6.75, "y":2.5, "w":0.5},
{"label":"Fn", "x":0, "y":3}, {"label":"Fn", "x":0, "y":3},
{"label":"\u2190", "x":1, "y":3}, {"label":"\u2190", "x":1, "y":3},

View File

@ -17,7 +17,7 @@
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
// OLED animation // OLED animation
#include "oled/bongocat.h" #include "./lib/bongocat/bongocat.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below. // Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
@ -55,11 +55,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_BASE] = LAYOUT( [_BASE] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_MPRV, KC_MPLY, KC_MNXT, KC_1, KC_2, KC_3, KC_4, KC_MPLY,
KC_5, KC_6, KC_7, KC_8, KC_PGDN, TO(_FN), KC_PGUP, KC_5, KC_6, KC_7, KC_8, TO(_FN),
KC_9, KC_0, KC_UP, KC_ENT, KC_VOLD, KC_MUTE, KC_VOLU, KC_9, KC_0, KC_UP, KC_ENT, KC_MUTE,
MO(_FN2), KC_LEFT, KC_DOWN, KC_RIGHT MO(_FN2), KC_LEFT, KC_DOWN, KC_RIGHT
), ),
@ -74,11 +74,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_FN] = LAYOUT( [_FN] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, TO(_FN1), _______, _______, _______, _______, _______, TO(_FN1),
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______ _______, _______, _______, _______
), ),
@ -93,11 +93,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_FN1] = LAYOUT( [_FN1] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, TO(_FN2), _______, _______, _______, _______, _______, TO(_FN2),
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______ _______, _______, _______, _______
), ),
@ -112,11 +112,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
VaiHudVad VaiHudVad
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_FN2] = LAYOUT( [_FN2] = LAYOUT(
RGB_SPI, RGB_SPD, _______, QK_BOOT, _______, _______, _______, RGB_SPI, RGB_SPD, _______, QK_BOOT, _______,
RGB_SAI, RGB_SAD, _______, _______, _______, TO(_BASE), _______, RGB_SAI, RGB_SAD, _______, _______, TO(_BASE),
RGB_TOG, RGB_MOD, RGB_HUI, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, _______, _______,
_______, RGB_VAI, RGB_HUD, RGB_VAD _______, RGB_VAI, RGB_HUD, RGB_VAD
), ),
}; };
@ -138,43 +138,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
} }
#endif #endif
#ifdef ENCODER_ENABLE #ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
#define ENCODERS 3 [_BASE] = { ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
static uint8_t encoder_state[ENCODERS] = {0}; [_FN] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
static keypos_t encoder_cw[ENCODERS] = {{ 5, 0 }, { 5, 1 }, { 5, 2 }}; [_FN1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
static keypos_t encoder_ccw[ENCODERS] = {{ 6, 0 }, { 6, 1 }, { 6, 2 }}; [_FN2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
};
void encoder_action_unregister(void) {
for (int index = 0; index < ENCODERS; ++index) {
if (encoder_state[index]) {
keyevent_t encoder_event = (keyevent_t) {
.key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index],
.pressed = false,
.time = (timer_read() | 1)
};
encoder_state[index] = 0;
action_exec(encoder_event);
}
}
}
void encoder_action_register(uint8_t index, bool clockwise) {
keyevent_t encoder_event = (keyevent_t) {
.key = clockwise ? encoder_cw[index] : encoder_ccw[index],
.pressed = true,
.time = (timer_read() | 1)
};
encoder_state[index] = (clockwise ^ 1) | (clockwise << 1);
action_exec(encoder_event);
}
void matrix_scan_user(void) {
encoder_action_unregister();
}
bool encoder_update_user(uint8_t index, bool clockwise) {
encoder_action_register(index, clockwise);
return false;
}
#endif #endif

View File

@ -0,0 +1,17 @@
SRC += ./lib/bongocat/bongocat.c
# Build Options
# change yes to no to disable
#
MOUSEKEY_ENABLE = no # Mouse keys
VIA_ENABLE = yes
# Additional thing to reduce compiled size
GRAVE_ESC_ENABLE = no
# OLED enabled
WPM_ENABLE = yes
# Encoder enabled
ENCODER_MAP_ENABLE = yes

View File

@ -0,0 +1,140 @@
/* Copyright 2022 DOIO
* Copyright 2022 HorrorTroll <https://github.com/HorrorTroll>
*
* 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
// OLED animation
#include "./lib/layer_status/layer_status.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_names {
_BASE,
_FN,
_FN1,
_FN2
};
// enum layer_keycodes { };
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
1 2 3 4 Ply TO1
5 6 7 8
9 0 Ent
Mut
Fn2
! @ # $
% ^ & *
( )
*/
/* Row: 0 1 2 3 4 */
[_BASE] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_MPLY,
KC_5, KC_6, KC_7, KC_8, TO(_FN),
KC_9, KC_0, KC_UP, KC_ENT, KC_MUTE,
MO(_FN2), KC_LEFT, KC_DOWN, KC_RIGHT
),
/*
*/
/* Row: 0 1 2 3 4 */
[_FN] = LAYOUT(
_______, _______, _______, _______, _______,
_______, _______, _______, _______, TO(_FN1),
_______, _______, _______, _______, _______,
_______, _______, _______, _______
),
/*
*/
/* Row: 0 1 2 3 4 */
[_FN1] = LAYOUT(
_______, _______, _______, _______, _______,
_______, _______, _______, _______, TO(_FN2),
_______, _______, _______, _______, _______,
_______, _______, _______, _______
),
/*
SpiSpd TO0
SaiSad
TogModHui
VaiHudVad
*/
/* Row: 0 1 2 3 4 */
[_FN2] = LAYOUT(
RGB_SPI, RGB_SPD, _______, QK_BOOT, _______,
RGB_SAI, RGB_SAD, _______, _______, TO(_BASE),
RGB_TOG, RGB_MOD, RGB_HUI, _______, _______,
_______, RGB_VAI, RGB_HUD, RGB_VAD
),
};
#ifdef OLED_ENABLE
bool oled_task_user(void) {
render_layer_status();
return true;
}
#endif
#ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = { ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
[_FN1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
[_FN2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
};
#endif

View File

@ -0,0 +1,135 @@
/* Copyright 2022 DOIO
* Copyright 2022 HorrorTroll <https://github.com/HorrorTroll>
* Copyright 2022 Ryan Anderson <ryan@michonline.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// OLED animation
#include "lib/layer_status/layer_status.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_names {
_BASE = 0,
_FN,
_FN1,
_FN2,
};
// enum layer_keycodes { };
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
C-DC-EM-DM-E Ply TO1
5 6 7 8
9 0 Ent
Mut
Fn2
! @ # $
% ^ & *
( )
*/
/* Row: 0 1 2 3 4 5 6 */
[_BASE] = LAYOUT(C(KC_D), C(KC_E), LCMD(KC_D), LCMD(KC_E), KC_MPLY,
KC_5, KC_6, LCTL(LCMD(KC_H)), KC_8, TO(_FN),
KC_9, KC_0, KC_UP, KC_ENT, KC_MUTE,
MO(_FN2), KC_LEFT, KC_DOWN, KC_RIGHT),
/*
*/
/* Row: 0 1 2 3 4 5 6 */
[_FN] = LAYOUT(_______, _______, _______, _______, _______,
_______, _______, _______, _______, TO(_FN1),
_______, _______, _______, _______, _______,
_______, _______, _______, _______),
/*
*/
/* Row: 0 1 2 3 4 5 6 */
[_FN1] = LAYOUT(_______, _______, _______, _______, _______,
_______, _______, _______, _______, TO(_FN2),
_______, _______, _______, _______, _______,
_______, _______, _______, _______),
/*
SpiSpd TO0
SaiSad
TogModHui
VaiHudVad
*/
/* Row: 0 1 2 3 4 5 6 */
[_FN2] = LAYOUT(RGB_SPI, RGB_SPD, _______, QK_BOOT, _______,
RGB_SAI, RGB_SAD, _______, _______, TO(_BASE),
RGB_TOG, RGB_MOD, RGB_HUI, _______, _______,
_______, RGB_VAI, RGB_HUD, RGB_VAD),
};
// clang-format on
#ifdef OLED_ENABLE
bool oled_task_user(void) {
render_layer_status();
return true;
}
#endif
#ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = {ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
[_FN] = {ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
[_FN2] = {ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
[_BASE] = {ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
};
#endif

View File

@ -0,0 +1,10 @@
# pugmajere's Google Meet optimized version of the default keymap
A lightly modified version of the default keymap.
The top row is converted to keys used for muting audio and video in
Google Meet, in both Linux and MacOS. (Yes, they annoyingly have
different conventions.)
The ASCII-art depiction uses "C-E" to mean "ctrl-e", and "M-E" to mean
CMD(GUI) and "e", roughly following Emacs naming conventions.

View File

@ -0,0 +1,2 @@
# Encoder enabled
ENCODER_MAP_ENABLE = yes

View File

@ -56,11 +56,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_BASE] = LAYOUT( [_BASE] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, _______, KC_MPLY, _______, KC_1, KC_2, KC_3, KC_4, KC_MPLY,
KC_5, KC_6, KC_7, KC_8, _______, TO(_FN), _______, KC_5, KC_6, KC_7, KC_8, TO(_FN),
KC_9, KC_0, KC_UP, KC_ENT, _______, KC_MUTE, _______, KC_9, KC_0, KC_UP, KC_ENT, KC_MUTE,
MO(_FN2), KC_LEFT, KC_DOWN, KC_RIGHT MO(_FN2), KC_LEFT, KC_DOWN, KC_RIGHT
), ),
@ -75,11 +75,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_FN] = LAYOUT( [_FN] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, TO(_FN1), _______, _______, _______, _______, _______, TO(_FN1),
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______ _______, _______, _______, _______
), ),
@ -94,11 +94,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_FN1] = LAYOUT( [_FN1] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, TO(_FN2), _______, _______, _______, _______, _______, TO(_FN2),
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______ _______, _______, _______, _______
), ),
@ -113,11 +113,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
VaiHudVad VaiHudVad
*/ */
/* Row: 0 1 2 3 4 5 6 */ /* Row: 0 1 2 3 4 */
[_FN2] = LAYOUT( [_FN2] = LAYOUT(
RGB_SPI, RGB_SPD, _______, QK_BOOT, _______, _______, _______, RGB_SPI, RGB_SPD, _______, QK_BOOT, _______,
RGB_SAI, RGB_SAD, _______, _______, _______, TO(_BASE), _______, RGB_SAI, RGB_SAD, _______, _______, TO(_BASE),
RGB_TOG, RGB_MOD, RGB_HUI, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, _______, _______,
_______, RGB_VAI, RGB_HUD, RGB_VAD _______, RGB_VAI, RGB_HUD, RGB_VAD
), ),
}; };
@ -133,8 +133,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#ifdef ENCODER_MAP_ENABLE #ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = { ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [_BASE] = { ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [_FN] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
[_FN1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [_FN1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
[_FN2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [_FN2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
}; };
#endif #endif

View File

@ -0,0 +1,4 @@
VIA_ENABLE = yes
# Encoder enabled
ENCODER_MAP_ENABLE = yes

View File

@ -0,0 +1,30 @@
# KB16-01 (Revision 1)
![KB16-01](https://i.imgur.com/lpq47ELh.png)
A macropad that have 16-key keyboard made by DOIO, which controlled by an Atmega32u4 chipset. The keyboard features per-key RGB, 3 encoder and an OLED screen for displaying useful information.
* Keyboard Maintainer: [HorrorTroll](https://github.com/HorrorTroll)
* Hardware Supported: Atmega32u4
Make example for this keyboard (after setting up your build environment):
`make doio/kb16/rev1:default`
or with the qmk cli:
`qmk compile -kb doio/kb16/rev1 -km default`
Flashing example for this keyboard:
`make doio/kb16/rev1:default:flash`
or with the qmk cli:
`qmk flash -kb doio/kb16/rev1 -km 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).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (1! 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

View File

@ -0,0 +1,37 @@
/* Copyright 2022 DOIO
* Copyright 2022 HorrorTroll <https://github.com/HorrorTroll>
*
* 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 "rev1.h"
#ifdef RGB_MATRIX_ENABLE
led_config_t g_led_config = { {
{ 0, 1, 2, 3, NO_LED },
{ 4, 5, 6, 7, NO_LED },
{ 8, 9, 10, 11, NO_LED },
{ 12, 13, 14, 15, NO_LED }
}, {
{0 , 0}, {75 , 0}, {149, 0}, {224, 0},
{0 , 21}, {75 , 21}, {149, 21}, {224, 21},
{0 , 43}, {75 , 43}, {149, 43}, {224, 43},
{0 , 64}, {75 , 64}, {149, 64}, {224, 64},
}, {
1, 1, 1, 1,
1, 4, 4, 1,
1, 4, 4, 1,
1, 1, 1, 1,
} };
#endif

View File

@ -0,0 +1,46 @@
/* Copyright 2022 DOIO
* Copyright 2022 HorrorTroll <https://github.com/HorrorTroll>
*
* 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
/* ┌───┬───┬───┬───┐ ┌───┐ ┌───┐
* 00 01 02 03 04 14
*
* 10 11 12 13
*
* 20 21 22 23
* 24
* 30 31 32 33
*
*/
#define LAYOUT( \
K00, K01, K02, K03, K04, \
K10, K11, K12, K13, K14, \
K20, K21, K22, K23, K24, \
K30, K31, K32, K33 \
) { \
{ K00, K01, K02, K03, K04 }, \
{ K10, K11, K12, K13, K14 }, \
{ K20, K21, K22, K23, K24 }, \
{ K30, K31, K32, K33, XXX } \
}

View File

@ -1,5 +1,5 @@
SRC += lib/layer_status/layer_status.c SRC += ./lib/layer_status/layer_status.c
SRC += lib/logo.c SRC += ./lib/logo.c
# MCU name # MCU name
MCU = atmega32u4 MCU = atmega32u4

View File

@ -0,0 +1,95 @@
/* Copyright 2022 DOIO
* Copyright 2022 HorrorTroll <https://github.com/HorrorTroll>
*
* 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"
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 5
/* key matrix pins */
#define MATRIX_ROW_PINS { B3, B4, B9, B8 }
#define MATRIX_COL_PINS { B14, B13, B12, B0, A7 }
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Forcing to use NKRO instead 6KRO */
#define FORCE_NKRO
#ifdef OLED_ENABLE
/* Mapping I2C2 for OLED */
#define I2C1_SCL_PIN B10
#define I2C1_SDA_PIN B11
#define I2C_DRIVER I2CD2
/* Use the custom font */
#define OLED_FONT_H "./lib/glcdfont.c"
#endif
/* Encoder pins */
#define ENCODERS_PAD_A { B5, A1, A3 }
#define ENCODERS_PAD_B { B6, A2, A4 }
#ifdef RGB_MATRIX_ENABLE
/* RGB Matrix config */
#define RGB_DI_PIN A10
#define DRIVER_LED_TOTAL 16
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200
#define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_UP_DOWN
#define RGB_MATRIX_KEYPRESSES
/* RGB Matrix effect */
#define ENABLE_RGB_MATRIX_ALPHAS_MODS
#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
#define ENABLE_RGB_MATRIX_BREATHING
#define ENABLE_RGB_MATRIX_BAND_SAT
#define ENABLE_RGB_MATRIX_BAND_VAL
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
#define ENABLE_RGB_MATRIX_CYCLE_ALL
#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
#define ENABLE_RGB_MATRIX_DUAL_BEACON
#define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
#define ENABLE_RGB_MATRIX_RAINDROPS
#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
#define ENABLE_RGB_MATRIX_HUE_BREATHING
#define ENABLE_RGB_MATRIX_HUE_PENDULUM
#define ENABLE_RGB_MATRIX_HUE_WAVE
#define ENABLE_RGB_MATRIX_PIXEL_RAIN
#define ENABLE_RGB_MATRIX_PIXEL_FLOW
#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
#define ENABLE_RGB_MATRIX_MULTISPLASH
#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
#endif

Some files were not shown because too many files have changed in this diff Show More