Merge remote-tracking branch 'upstream/develop' into xap

This commit is contained in:
Nick Brassel 2023-01-25 11:24:52 +11:00
commit 33e8e63e74
No known key found for this signature in database
22 changed files with 512 additions and 177 deletions

View File

@ -43,7 +43,7 @@ While there are different strategies for doing the actual matrix detection, they
}
```
That datastructure is a direct representation of the matrix for a 4 row by 5 column numpad. When a key is pressed that key's position within the matrix will be returned as `1` instead of `0`.
That datastructure is a direct representation of the matrix for a 5 row by 4 column numpad. When a key is pressed that key's position within the matrix will be returned as `1` instead of `0`.
Matrix Scanning runs many times per second. The exact rate varies but typically it runs at least 10 times per second to avoid perceptible lag.

View File

@ -20,8 +20,8 @@
#define RGB_MATRIX_LED_COUNT 61
/* Limit animations to 62.5 FPS to avoid tearing. (1/.016 = 62.5 FPS). */
#define RGB_MATRIX_LED_FLUSH_LIMIT 16
/* Limit animations to 25 FPS to avoid tearing. (1/.040 = 25 FPS). */
#define RGB_MATRIX_LED_FLUSH_LIMIT 40
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES

View File

@ -0,0 +1,84 @@
/* Copyright 2023 MATTMCCA (@MATTMCCA)
* SPDX-License-Identifier: GPL-2.0-only
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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"
#ifdef RGB_MATRIX_ENABLE
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 1 //TIM1_CH1N (AF1)
#define WS2812_PWM_COMPLEMENTARY_OUTPUT
#define WS2812_DMA_STREAM STM32_DMA1_STREAM6
#define WS2812_DMA_CHANNEL 7 //7 works, CxS[3:0] 0111 = TIM1_UP on Channel 6? (RM0394.pdf pg.298)
#define RGB_DI_PIN A7 // The pin connected to the data pin of the LEDs
#define RGB_MATRIX_LED_COUNT 61 // The number of LEDs connected
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS // enable framebuffer effects
#define ENABLE_RGB_MATRIX_SOLID_COLOR // Static single color
#define ENABLE_RGB_MATRIX_ALPHAS_MODS // Static dual hue, speed is hue for secondary hue
#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN // Static gradient top to bottom, speed controls how much gradient changes
#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT // Static gradient left to right, speed controls how much gradient changes
#define ENABLE_RGB_MATRIX_BREATHING // Single hue brightness cycling animation
#define ENABLE_RGB_MATRIX_BAND_SAT // Single hue band fading saturation scrolling left to right
#define ENABLE_RGB_MATRIX_BAND_VAL // Single hue band fading brightness scrolling left to right
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT // Single hue 3 blade spinning pinwheel fades saturation
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL // Single hue 3 blade spinning pinwheel fades brightness
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT // Single hue spinning spiral fades saturation
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL // Single hue spinning spiral fades brightness
#define ENABLE_RGB_MATRIX_CYCLE_ALL // Full keyboard solid hue cycling through full gradient
#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT // Full gradient scrolling left to right
#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN // Full gradient scrolling top to bottom
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN // Full gradient scrolling out to in
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL // Full dual gradients scrolling out to in
#define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON // Full gradient Chevron shaped scrolling left to right
#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL // Full gradient spinning pinwheel around center of keyboard
#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL // Full gradient spinning spiral around center of keyboard
#define ENABLE_RGB_MATRIX_DUAL_BEACON // Full gradient spinning around center of keyboard
#define ENABLE_RGB_MATRIX_RAINBOW_BEACON // Full tighter gradient spinning around center of keyboard
#define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS // Full dual gradients spinning two halfs of keyboard
#define ENABLE_RGB_MATRIX_RAINDROPS // Randomly changes a single key's hue
#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // Randomly changes a single key's hue and saturation
#define ENABLE_RGB_MATRIX_HUE_BREATHING // Hue shifts up a slight amount at the same time, then shifts back
#define ENABLE_RGB_MATRIX_HUE_PENDULUM // Hue shifts up a slight amount in a wave to the right, then back to the left
#define ENABLE_RGB_MATRIX_HUE_WAVE // Hue shifts up a slight amount and then back down in a wave to the right
/* RGB_MATRIX_FRAMEBUFFER_EFFECTS) */
#define ENABLE_RGB_MATRIX_TYPING_HEATMAP
#define ENABLE_RGB_MATRIX_DIGITAL_RAIN
/* RGB_MATRIX_KEYPRESSES) | defined(RGB_MATRIX_KEYRELEASES) */
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE // Pulses keys hit to hue & value then fades value out
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE // Static single hue, pulses keys hit to shifted hue then fades to current hue
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE // Hue & value pulse near a single key hit then fades value out
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE // Hue & value pulse near multiple key hits then fades value out
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS // Hue & value pulse the same column and row of a single key hit then fades value out
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS // Hue & value pulse the same column and row of multiple key hits then fades value out
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS // Hue & value pulse away on the same column and row of a single key hit then fades value out
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS // Hue & value pulse away on the same column and row of multiple key hits then fades value out
#define ENABLE_RGB_MATRIX_SPLASH // Full gradient & value pulse away from a single key hit then fades value out
#define ENABLE_RGB_MATRIX_MULTISPLASH // Full gradient & value pulse away from multiple key hits then fades value out
#define ENABLE_RGB_MATRIX_SOLID_SPLASH // Hue & value pulse away from a single key hit then fades value out
#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH // Hue & value pulse away from multiple key hits then fades value out
#endif

View File

@ -0,0 +1,21 @@
/* Copyright 2023 MATTMCCA (@MATTMCCA)
* SPDX-License-Identifier: GPL-2.0-only
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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 HAL_USE_PWM TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,160 @@
{
"manufacturer": "MATTMCCA",
"keyboard_name": "black_hellebore",
"maintainer": "MATTMCCA",
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["B15", "B14", "B13", "A9", "A2", "B1", "B9", "B7", "B5", "B4", "B0", "A8", "B6", "B3"],
"rows": ["A15", "B8", "A4", "A3", "B2"]
},
"processor": "STM32L412",
"url": "https://github.com/MATTMCCA/The-Black-Hellebore",
"usb": {
"device_version": "1.0.0",
"pid": "0x4467",
"vid": "0x3141"
},
"rgb_matrix": {
"layout": [
{ "flags": 4, "matrix": [0, 0] , "x": 7 , "y": 5 } ,
{ "flags": 4, "matrix": [0, 1] , "x": 22 , "y": 5 } ,
{ "flags": 4, "matrix": [0, 2] , "x": 37 , "y": 5 } ,
{ "flags": 4, "matrix": [0, 3] , "x": 52 , "y": 5 } ,
{ "flags": 4, "matrix": [0, 4] , "x": 67 , "y": 5 } ,
{ "flags": 4, "matrix": [0, 5] , "x": 82 , "y": 5 } ,
{ "flags": 4, "matrix": [0, 6] , "x": 97 , "y": 5 } ,
{ "flags": 4, "matrix": [0, 7] , "x": 112, "y": 5 } ,
{ "flags": 4, "matrix": [0, 8] , "x": 127, "y": 5 } ,
{ "flags": 4, "matrix": [0, 9] , "x": 142, "y": 5 } ,
{ "flags": 4, "matrix": [0, 10], "x": 157, "y": 5 } ,
{ "flags": 4, "matrix": [0, 11], "x": 172, "y": 5 } ,
{ "flags": 4, "matrix": [0, 12], "x": 187, "y": 5 } ,
{ "flags": 4, "matrix": [0, 13], "x": 209, "y": 5 } ,
{ "flags": 4, "matrix": [1, 13], "x": 213, "y": 17 },
{ "flags": 4, "matrix": [1, 12], "x": 194, "y": 17 },
{ "flags": 4, "matrix": [1, 11], "x": 179, "y": 17 },
{ "flags": 4, "matrix": [1, 10], "x": 164, "y": 17 },
{ "flags": 4, "matrix": [1, 9] , "x": 149, "y": 17 },
{ "flags": 4, "matrix": [1, 8] , "x": 134, "y": 17 },
{ "flags": 4, "matrix": [1, 7] , "x": 119, "y": 17 },
{ "flags": 4, "matrix": [1, 6] , "x": 104, "y": 17 },
{ "flags": 4, "matrix": [1, 5] , "x": 90 , "y": 17 },
{ "flags": 4, "matrix": [1, 4] , "x": 75 , "y": 17 },
{ "flags": 4, "matrix": [1, 3] , "x": 60 , "y": 17 },
{ "flags": 4, "matrix": [1, 2] , "x": 45 , "y": 17 },
{ "flags": 4, "matrix": [1, 1] , "x": 30 , "y": 17 },
{ "flags": 4, "matrix": [1, 0] , "x": 11 , "y": 17 },
{ "flags": 4, "matrix": [2, 0] , "x": 13 , "y": 29 },
{ "flags": 4, "matrix": [2, 1] , "x": 34 , "y": 29 },
{ "flags": 4, "matrix": [2, 2] , "x": 49 , "y": 29 },
{ "flags": 4, "matrix": [2, 3] , "x": 63 , "y": 29 },
{ "flags": 4, "matrix": [2, 4] , "x": 78 , "y": 29 },
{ "flags": 4, "matrix": [2, 5] , "x": 93 , "y": 29 },
{ "flags": 4, "matrix": [2, 6] , "x": 108, "y": 29 },
{ "flags": 4, "matrix": [2, 7] , "x": 123, "y": 29 },
{ "flags": 4, "matrix": [2, 8] , "x": 138, "y": 29 },
{ "flags": 4, "matrix": [2, 9] , "x": 153, "y": 29 },
{ "flags": 4, "matrix": [2, 10], "x": 168, "y": 29 },
{ "flags": 4, "matrix": [2, 11], "x": 183, "y": 29 },
{ "flags": 4, "matrix": [2, 13], "x": 207, "y": 29 },
{ "flags": 4, "matrix": [3, 13], "x": 203, "y": 41 },
{ "flags": 4, "matrix": [3, 10], "x": 175, "y": 41 },
{ "flags": 4, "matrix": [3, 9] , "x": 161, "y": 41 },
{ "flags": 4, "matrix": [3, 8] , "x": 146, "y": 41 },
{ "flags": 4, "matrix": [3, 7] , "x": 131, "y": 41 },
{ "flags": 4, "matrix": [3, 6] , "x": 116, "y": 41 },
{ "flags": 4, "matrix": [3, 5] , "x": 101, "y": 41 },
{ "flags": 4, "matrix": [3, 4] , "x": 86 , "y": 41 },
{ "flags": 4, "matrix": [3, 3] , "x": 71 , "y": 41 },
{ "flags": 4, "matrix": [3, 2] , "x": 56 , "y": 41 },
{ "flags": 4, "matrix": [3, 1] , "x": 41 , "y": 41 },
{ "flags": 4, "matrix": [3, 0] , "x": 17 , "y": 41 },
{ "flags": 4, "matrix": [4, 0] , "x": 9 , "y": 54 },
{ "flags": 4, "matrix": [4, 1] , "x": 28 , "y": 54 },
{ "flags": 4, "matrix": [4, 2] , "x": 47 , "y": 54 },
{ "flags": 4, "matrix": [4, 5] , "x": 103, "y": 54 },
{ "flags": 4, "matrix": [4, 9] , "x": 159, "y": 54 },
{ "flags": 4, "matrix": [4, 10], "x": 177, "y": 54 },
{ "flags": 4, "matrix": [4, 11], "x": 196, "y": 54 },
{ "flags": 4, "matrix": [4, 13], "x": 215, "y": 54 }
]
},
"layouts": {
"LAYOUT_60_ansi": {
"layout": [
{ "matrix": [0, 0] , "x": 0 , "y": 0 },
{ "matrix": [0, 1] , "x": 1 , "y": 0 },
{ "matrix": [0, 2] , "x": 2 , "y": 0 },
{ "matrix": [0, 3] , "x": 3 , "y": 0 },
{ "matrix": [0, 4] , "x": 4 , "y": 0 },
{ "matrix": [0, 5] , "x": 5 , "y": 0 },
{ "matrix": [0, 6] , "x": 6 , "y": 0 },
{ "matrix": [0, 7] , "x": 7 , "y": 0 },
{ "matrix": [0, 8] , "x": 8 , "y": 0 },
{ "matrix": [0, 9] , "x": 9 , "y": 0 },
{ "matrix": [0, 10] , "x": 10 , "y": 0 },
{ "matrix": [0, 11] , "x": 11 , "y": 0 },
{ "matrix": [0, 12] , "x": 12 , "y": 0 },
{ "matrix": [0, 13], "w": 2 , "x": 13 , "y": 0 },
{ "matrix": [1, 0] , "w": 1.5 , "x": 0 , "y": 1 },
{ "matrix": [1, 1] , "x": 1.5 , "y": 1 },
{ "matrix": [1, 2] , "x": 2.5 , "y": 1 },
{ "matrix": [1, 3] , "x": 3.5 , "y": 1 },
{ "matrix": [1, 4] , "x": 4.5 , "y": 1 },
{ "matrix": [1, 5] , "x": 5.5 , "y": 1 },
{ "matrix": [1, 6] , "x": 6.5 , "y": 1 },
{ "matrix": [1, 7] , "x": 7.5 , "y": 1 },
{ "matrix": [1, 8] , "x": 8.5 , "y": 1 },
{ "matrix": [1, 9] , "x": 9.5 , "y": 1 },
{ "matrix": [1, 10] , "x": 10.5 , "y": 1 },
{ "matrix": [1, 11] , "x": 11.5 , "y": 1 },
{ "matrix": [1, 12] , "x": 12.5 , "y": 1 },
{ "matrix": [1, 13], "w": 1.5 , "x": 13.5 , "y": 1 },
{ "matrix": [2, 0] , "w": 1.75 , "x": 0 , "y": 2 },
{ "matrix": [2, 1] , "x": 1.75 , "y": 2 },
{ "matrix": [2, 2] , "x": 2.75 , "y": 2 },
{ "matrix": [2, 3] , "x": 3.75 , "y": 2 },
{ "matrix": [2, 4] , "x": 4.75 , "y": 2 },
{ "matrix": [2, 5] , "x": 5.75 , "y": 2 },
{ "matrix": [2, 6] , "x": 6.75 , "y": 2 },
{ "matrix": [2, 7] , "x": 7.75 , "y": 2 },
{ "matrix": [2, 8] , "x": 8.75 , "y": 2 },
{ "matrix": [2, 9] , "x": 9.75 , "y": 2 },
{ "matrix": [2, 10] , "x": 10.75, "y": 2 },
{ "matrix": [2, 11] , "x": 11.75, "y": 2 },
{ "matrix": [2, 13], "w": 2.25 , "x": 12.75, "y": 2 },
{ "matrix": [3, 0] , "w": 2.25 , "x": 0 , "y": 3 },
{ "matrix": [3, 1] , "x": 2.25 , "y": 3 },
{ "matrix": [3, 2] , "x": 3.25 , "y": 3 },
{ "matrix": [3, 3] , "x": 4.25 , "y": 3 },
{ "matrix": [3, 4] , "x": 5.25 , "y": 3 },
{ "matrix": [3, 5] , "x": 6.25 , "y": 3 },
{ "matrix": [3, 6] , "x": 7.25 , "y": 3 },
{ "matrix": [3, 7] , "x": 8.25 , "y": 3 },
{ "matrix": [3, 8] , "x": 9.25 , "y": 3 },
{ "matrix": [3, 9] , "x": 10.25, "y": 3 },
{ "matrix": [3, 10] , "x": 11.25, "y": 3 },
{ "matrix": [3, 13], "w": 2.75 , "x": 12.25, "y": 3 },
{ "matrix": [4, 0] , "w": 1.25 , "x": 0 , "y": 4 },
{ "matrix": [4, 1] , "w": 1.25 , "x": 1.25 , "y": 4 },
{ "matrix": [4, 2] , "w": 1.25 , "x": 2.5 , "y": 4 },
{ "matrix": [4, 5] , "w": 6.25 , "x": 3.75 , "y": 4 },
{ "matrix": [4, 9] , "w": 1.25 , "x": 10 , "y": 4 },
{ "matrix": [4, 10], "w": 1.25 , "x": 11.25, "y": 4 },
{ "matrix": [4, 11], "w": 1.25 , "x": 12.5 , "y": 4 },
{ "matrix": [4, 13], "w": 1.25 , "x": 13.75, "y": 4 }
]
}
}
}

View File

@ -0,0 +1,28 @@
/* Copyright 2023 MATTMCCA (@MATTMCCA)
* SPDX-License-Identifier: GPL-2.0-only
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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
)
};

View File

@ -0,0 +1,53 @@
/* Copyright 2023 MATTMCCA (@MATTMCCA)
* SPDX-License-Identifier: GPL-2.0-only
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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
),
[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,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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
)
};

View File

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

View File

@ -0,0 +1,25 @@
/* Copyright 2023 MATTMCCA (@MATTMCCA)
* SPDX-License-Identifier: GPL-2.0-only
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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_next <mcuconf.h>
#undef STM32_PWM_USE_ADVANCED
#define STM32_PWM_USE_ADVANCED TRUE
#undef STM32_PWM_USE_TIM1
#define STM32_PWM_USE_TIM1 TRUE

View File

@ -0,0 +1,24 @@
# The Black Hellebore
* Keyboard Maintainer: [MATTMCCA](https://github.com/MATTMCCA)
* Hardware Supported: *https://github.com/MATTMCCA/The-Black-Hellebore*
* Hardware Availability: *https://github.com/MATTMCCA/The-Black-Hellebore*
Make example for this keyboard (after setting up your build environment):
make black_hellebore:default
Flashing example for this keyboard:
make black_hellebore:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -0,0 +1,2 @@
RGB_MATRIX_DRIVER = WS2812
WS2812_DRIVER = pwm

View File

@ -15,7 +15,7 @@
},
"encoder": {
"rotary": [
{ "pin_a": "F0", "pin_b": "F1" }
{ "pin_a": "F4", "pin_b": "F5" }
]
}
}

View File

@ -23,7 +23,7 @@ enum {
TD_ESC_WINDOWS_EMOJI
};
void td_esc_spotlight_emoji (qk_tap_dance_state_t *state, void *user_data) {
void td_esc_spotlight_emoji (tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
tap_code(KC_ESC);
} else if (state->count == 2) {
@ -33,7 +33,7 @@ void td_esc_spotlight_emoji (qk_tap_dance_state_t *state, void *user_data) {
}
}
void td_esc_windows_emoji (qk_tap_dance_state_t *state, void *user_data) {
void td_esc_windows_emoji (tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
tap_code(KC_ESC);
} else if (state->count == 2) {
@ -44,7 +44,7 @@ void td_esc_windows_emoji (qk_tap_dance_state_t *state, void *user_data) {
};
// Tap Dance definitions
qk_tap_dance_action_t tap_dance_actions[] = {
tap_dance_action_t tap_dance_actions[] = {
[TD_ESC_SPOTLIGHT_EMOJI] = ACTION_TAP_DANCE_FN(td_esc_spotlight_emoji),
[TD_ESC_WINDOWS_EMOJI] = ACTION_TAP_DANCE_FN(td_esc_windows_emoji)
};

View File

@ -26,6 +26,17 @@ const matrix_row_t matrix_mask[] = {
#ifdef DIP_SWITCH_ENABLE
bool dip_switch_update_kb(uint8_t index, bool active) {
if (!dip_switch_update_user(index, active)) { return false;}
if (index == 0) {
default_layer_set(1UL << (active ? 1 : 0));
}
return true;
}
#endif // DIP_SWITCH_ENABLE
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {

View File

@ -48,7 +48,6 @@ enum preonic_keycodes {
#define LT_LOWER_SPC LT(_LOWER, KC_SPC)
#define LM_COMP_LALT LM(_COMPOSITOR, MOD_LALT)
#define LM_COMP_LALT_LSFT LM(_COMPOSITOR, MOD_LALT | MOD_LSFT)
#define KO_LAYER_MASK_EXCEPT(layer) ((~0) & ~(1 << layer))
@ -142,24 +141,24 @@ const key_override_t **key_overrides = (const key_override_t *[]){
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,------------------------------------------------------------------------------------------------------------------------------------.
* | Caps Lock | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Leader |
* |--------------+--------------------+------+------+------+------+-----------+------+------+------+--------------------+--------------|
* | Ctrl | Q | W | E | R | T | Y/Copy | U/Ü | I | O/Ö | P/Paste | Ctrl |
* |--------------+--------------------+------+------+------+------+-----------+------+------+------+--------------------+--------------|
* | Shift/Esc | A/Ä | S/ß | D | F | G | H | J | K | L | ' | Shift/Enter |
* |--------------+--------------------+------+------+------+------+-----------+------+------+------+--------------------+--------------|
* |Compositor+Alt| Z |X/Cut | C | V | B | N | M | , | . | / |Compositor+Alt|
* |--------------+--------------------+------+------+------+------+-----------+------+------+------+--------------------+--------------|
* | |Compositor+Alt+Shift| | |Raise |Lower |Lower/Space|Raise | | |Compositor+Alt+Shift| Manage |
* `------------------------------------------------------------------------------------------------------------------------------------'
* ,----------------------------------------------------------------------------------------------------------.
* | Caps Lock | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Leader |
* |--------------+-------+------+------+------+------+-----------+------+------+------+-------+--------------|
* | Ctrl | Q | W | E | R | T | Y/Copy | U/Ü | I | O/Ö |P/Paste| Ctrl |
* |--------------+-------+------+------+------+------+-----------+------+------+------+-------+--------------|
* | Shift/Esc | A/Ä | S/ß | D | F | G | H | J | K | L | ' | Shift/Enter |
* |--------------+-------+------+------+------+------+-----------+------+------+------+-------+--------------|
* | Alt | Z |X/Cut | C | V | B | N | M | , | . | / | Alt |
* |--------------+-------+------+------+------+------+-----------+------+------+------+-------+--------------|
* | Mouse | | | |Raise |Lower |Lower/Space|Raise | | | | Manage |
* `----------------------------------------------------------------------------------------------------------'
*/
[_QWERTY] = LAYOUT_preonic_grid(
KC_CAPS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LEAD,
KC_LCTL, KC_Q, KC_W, KC_E, KC_R, KC_T, LT_COPY_Y, LT_UE_U, KC_I, LT_OE_O, LT_PASTE_P, KC_RCTL,
MOD_TAP_LSFT_ESC, LT_AE_A, LT_SZ_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, MOD_TAP_LSFT_ENT,
LM_COMP_LALT, KC_Z, LT_CUT_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LM_COMP_LALT,
_______, LM_COMP_LALT_LSFT, _______, _______, RAISE, LOWER, LT_LOWER_SPC, RAISE, _______, _______, _______, MANAGE
KC_CAPS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LEAD,
KC_LCTL, KC_Q, KC_W, KC_E, KC_R, KC_T, LT_COPY_Y, LT_UE_U, KC_I, LT_OE_O, LT_PASTE_P, KC_RCTL,
MOD_TAP_LSFT_ESC, LT_AE_A, LT_SZ_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, MOD_TAP_LSFT_ENT,
LM_COMP_LALT, KC_Z, LT_CUT_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LM_COMP_LALT,
TG(_MOUSE), _______, _______, _______, RAISE, LOWER, LT_LOWER_SPC, RAISE, _______, _______, _______, MANAGE
),
/* Lower
* ,-----------------------------------------------------------------------------------.
@ -203,7 +202,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
/* Mouse
* ,-------------------------------------------------------------------------------------------------------------------------------------------------------.
* | Caps Lock | | | | | | | | | | | Leader |
* | | | | | | | | | | | | |
* |--------------+-------+--------------+--------------+--------------+--------------+-----------+-----------+---------+------------+------+--------------|
* | | | | | | |Wheel Left |Wheel Down |Wheel Up |Wheel Right | | Ctrl |
* |--------------+-------+--------------+--------------+--------------+--------------+-----------+-----------+---------+------------+------+--------------|
@ -211,15 +210,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------------+-------+--------------+--------------+--------------+--------------+-----------+-----------+---------+------------+------+--------------|
* |Compositor+Alt| | | | | | | | | | |Compositor+Alt|
* |--------------+-------+--------------+--------------+--------------+--------------+-----------+-----------+---------+------------+------+--------------|
* | | | |Accelaration 2|Accelaration 1|Accelaration 0| | | | | | |
* |Mouse | | |Accelaration 2|Accelaration 1|Accelaration 0| | | | | | |
* `-------------------------------------------------------------------------------------------------------------------------------------------------------'
*/
[_MOUSE] = LAYOUT_preonic_grid(
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_UP, KC_MS_WH_RIGHT, XXXXXXX, _______,
XXXXXXX, XXXXXXX, KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1, XXXXXXX, KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, XXXXXXX, XXXXXXX,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
_______, XXXXXXX, XXXXXXX, KC_MS_ACCEL2, KC_MS_ACCEL1, KC_MS_ACCEL0, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
),
/* Manage
* ,---------------------------------------------------------------------------------------.
@ -247,7 +246,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Q | W | E | R | T | Y | U | I | O | P | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | A | S | D | F | G | H | J | K | L | ' |Enter |
* |Shift | A | S | D | F | G | H | J | K | L | ' |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Z | X | C | V | B | N | M | , | . | / | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
@ -255,11 +254,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-----------------------------------------------------------------------------------'
*/
[_COMPOSITOR] = LAYOUT_preonic_grid(
XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,
XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, XXXXXXX,
XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT,
XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,
XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, XXXXXXX,
_______, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, _______,
XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
)
};
@ -396,11 +395,6 @@ static inline void leader_bindings(void) {
SEQ_ONE_KEY(KC_P) {
tap_code16(C(S(KC_V)));
}
/* Toggle mouse layer. */
SEQ_ONE_KEY(KC_CAPS) {
layer_invert(_MOUSE);
}
}
}

View File

@ -34,23 +34,6 @@ enum layers { _BASE = 0, _NAV, _SYM, _FUNCTION, _ADJUST };
// produces the key `tap` when tapped (i.e. pressed and released).
// clang-format off
#define LAYOUT_via( \
L00, L01, L02, L03, L04, L05, LE0, LE1, RE0, RE1, R06, R07, R08, R09, R10, R11, \
L12, L13, L14, L15, L16, L17, R18, R19, R20, R21, R22, R23, \
L24, L25, L26, L27, L28, L29, L30, L31, R32, R33, R34, R35, R36, R37, R38, R39, \
L40, L41, L42, L43, L44, R45, R46, R47, R48, R49 \
) \
{ \
{ LE0, LE1, L05, L04, L03, L02, L01, L00 }, \
{ RE0, RE1, L17, L16, L15, L14, L13, L12 }, \
{ L31, L30, L29, L28, L27, L26, L25, L24 }, \
{ L44, L43, L42, L41, L40, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, R06, R07, R08, R09, R10, R11 }, \
{ KC_NO, KC_NO, R18, R19, R20, R21, R22, R23 }, \
{ R32, R33, R34, R35, R36, R37, R38, R39 }, \
{ R45, R46, R47, R48, R49, KC_NO, KC_NO, KC_NO }, \
}
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Base Layer: QWERTY
@ -66,8 +49,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | Enter| | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_BASE] = LAYOUT_via(
KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_VOLD, KC_VOLU, KC_PGDN, KC_PGUP, KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSPC,
[_BASE] = LAYOUT(
KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSPC,
CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H, KC_J , KC_K , KC_L ,KC_SCLN,CTL_QUOT,
KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_N, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT,
ADJUST , KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP
@ -87,10 +70,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_NAV] = LAYOUT_via(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU, KC_DEL,
[_NAV] = LAYOUT(
_______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU, KC_DEL,
_______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_INS,
_______, _______, _______, _______, _______, _______, _______, KC_SCRL, _______, _______,KC_PAUSE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PSCR,
_______, _______, _______, _______, _______, _______, _______, KC_SCRL, _______, _______, KC_PAUSE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PSCR,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
@ -108,8 +91,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_SYM] = LAYOUT_via(
KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , _______, _______, _______, _______, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL ,
[_SYM] = LAYOUT(
KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL ,
KC_TILD , KC_EXLM, KC_AT , KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS,
KC_PIPE , KC_BSLS, KC_COLN, KC_SCLN, KC_MINS, KC_NUBS, KC_LBRC, _______, _______, KC_RBRC, KC_NUHS, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, KC_QUES,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
@ -129,8 +112,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_FUNCTION] = LAYOUT_via(
_______, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
[_FUNCTION] = LAYOUT(
_______, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______,
_______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, _______, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, _______,
_______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
@ -150,100 +133,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_ADJUST] = LAYOUT_via(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
[_ADJUST] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, RGB_TOG, RGB_SAI, RGB_HUI, RGB_VAI, RGB_MOD, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_VAD, RGB_RMOD, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
)
};
// clang-format on
#ifdef ENCODER_ENABLE
static uint8_t encoder_state[2] = {0};
static keypos_t encoder_ccw[2] = {{0, 0}, {0, 1}};
static keypos_t encoder_cw[2] = {{1, 0}, {1, 1}};
void encoder_action_unregister(void) {
for (int index = 0; index < 2; ++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;
#ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDN) },
[1] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
[2] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
[3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
[4] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
};
#endif
#ifdef OLED_ENABLE
bool oled_task_user(void) {
if (is_keyboard_master()) {
// QMK Logo and version information
// clang-format off
static const char PROGMEM qmk_logo[] = {
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
// clang-format on
oled_write_P(qmk_logo, false);
oled_write_P(PSTR("Kyria rev1.0 w/ VIA\n\n"), false);
// Host Keyboard Layer Status
oled_write_P(PSTR("Layer: "), false);
switch (get_highest_layer(layer_state | default_layer_state)) {
case 0:
oled_write_P(PSTR("Base\n"), false);
break;
case 1:
oled_write_P(PSTR("Nav\n"), false);
break;
case 2:
oled_write_P(PSTR("Sym\n"), false);
break;
case 3:
oled_write_P(PSTR("Function\n"), false);
break;
case 4:
oled_write_P(PSTR("Adjust\n"), false);
break;
}
// Host Keyboard LED Status
led_t led_usb_state = host_keyboard_led_state();
oled_write_P(led_usb_state.num_lock ? PSTR("NUMLCK ") : PSTR(" "), false);
oled_write_P(led_usb_state.caps_lock ? PSTR("CAPLCK ") : PSTR(" "), false);
oled_write_P(led_usb_state.scroll_lock ? PSTR("SCRLCK ") : PSTR(" "), false);
} else {
// clang-format off
static const char PROGMEM kyria_logo[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,240,112,120, 56, 60, 28, 30, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 30, 28, 60, 56,120,112,240,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,192,224,240,124, 62, 31, 15, 7, 3, 1,128,192,224,240,120, 56, 60, 28, 30, 14, 14, 7, 7,135,231,127, 31,255,255, 31,127,231,135, 7, 7, 14, 14, 30, 28, 60, 56,120,240,224,192,128, 1, 3, 7, 15, 31, 62,124,240,224,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,240,252,255, 31, 7, 1, 0, 0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135, 1, 0, 0,255,255, 0, 0, 1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192, 0, 0, 1, 7, 31,255,252,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,255,255,255, 0, 0, 0, 0, 0,254,255,255, 1, 1, 7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30, 7, 1, 1,255,255,254, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,255,255, 0, 0,192,192, 48, 48, 0, 0,240,240, 0, 0, 0, 0, 0, 0,240,240, 0, 0,240,240,192,192, 48, 48, 48, 48,192,192, 0, 0, 48, 48,243,243, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,192,192, 0, 0, 0, 0, 0,
0, 0, 0,255,255,255, 0, 0, 0, 0, 0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31, 7,255,255, 7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 63, 63, 3, 3, 12, 12, 48, 48, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 15, 15, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 63, 63, 48, 48, 0, 0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63, 0, 0, 0, 0, 0,
0, 0, 0, 0, 15, 63,255,248,224,128, 0, 0, 3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128, 0, 0,255,255, 0, 0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15, 3, 0, 0,128,224,248,255, 63, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 3, 7, 15, 62,124,248,240,224,192,128, 1, 3, 7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15, 7, 3, 1,128,192,224,240,248,124, 62, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
// clang-format on
oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
}
return false;
}
#endif

View File

@ -1,10 +1,10 @@
OLED_ENABLE = yes
OLED_DRIVER = SSD1306 # Enables the use of OLED displays
ENCODER_ENABLE = yes # Enables the use of one or more encoders
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
VIA_ENABLE = yes
NKRO_ENABLE = yes
KEY_LOCK_ENABLE = no
SPACE_CADET_ENABLE = no
MAGIC_ENABLE = no
GRAVE_ESCAPE_ENABLE = no
ENCODER_MAP_ENABLE = yes

View File

@ -34,7 +34,7 @@ def bux(cli):
@B _y ]# ,c vUWNWWPsfsssN9WyccnckAfUfWb0DR0&R5RRRddq2_ `@D`jr@2U@#c3@1@Qc- B@
@B !7! .r]` }AE0RdRqNd9dNR9fUIzzosPqqAddNNdER9EE9dPy! BQ!zy@iU@.Q@@y@8x- B@
@B :****>. '7adddDdR&gRNdRbd&dNNbbRdNdd5NdRRD0RSf}- .k0&EW`xR .8Q=NRRx B@
@B =**-rx*r}r~}" ;n2jkzsf3N3zsKsP5dddRddddRddNNqPzy\" '~****" B@
@B =**-rx*r}r~}" ;n2jkzsf3N3zsKsP5dddRddddRddNNqPzy\\" '~****" B@
@B :!!~!;=~r>:*_ `:^vxikylulKfHkyjzzozoIoklix|^!-` B@
@B ```'-_""::::!:_-.`` B@
@B `- .` B@

View File

@ -1,10 +1,13 @@
// Copyright 2022 Stefan Kerkmann (@KarlK90)
// SPDX-License-Identifier: GPL-2.0-or-later
#include "quantum.h"
#include "ws2812.h"
#include "hardware/pio.h"
#include "hardware/timer.h"
#include "hardware/clocks.h"
// Keep this exact include order otherwise we run into naming conflicts between
// pico-sdk and rp2040.h which we don't control.
#include "quantum.h"
#include "hardware/pio.h"
#if !defined(MCU_RP)
# error PIO Driver is only available for Raspberry Pi 2040 MCUs!
@ -132,7 +135,7 @@ static uint32_t RP_DMA_MODE_WS2812;
static int STATE_MACHINE = -1;
static SEMAPHORE_DECL(TRANSFER_COUNTER, 1);
static rtcnt_t LAST_TRANSFER;
static absolute_time_t LAST_TRANSFER;
/**
* @brief Convert RGBW value into WS2812 compatible 32-bit data word.
@ -161,7 +164,7 @@ static void ws2812_dma_callback(void* p, uint32_t ct) {
// Convert from ns to us
time_to_completion /= 1000;
LAST_TRANSFER = chSysGetRealtimeCounterX() + time_to_completion + WS2812_TRST_US;
update_us_since_boot(&LAST_TRANSFER, time_us_64() + time_to_completion + WS2812_TRST_US);
osalSysLockFromISR();
chSemSignalI(&TRANSFER_COUNTER);
@ -256,8 +259,7 @@ static inline void sync_ws2812_transfer(void) {
}
// Busy wait until last transfer has finished
while (unlikely(!timer_expired32(chSysGetRealtimeCounterX(), LAST_TRANSFER))) {
}
busy_wait_until(LAST_TRANSFER);
}
void ws2812_setleds(LED_TYPE* ledarray, uint16_t leds) {

View File

@ -25,6 +25,7 @@ PICOSDKROOT := $(TOP_DIR)/lib/pico-sdk
PICOSDKSRC = $(PICOSDKROOT)/src/rp2_common/hardware_clocks/clocks.c \
$(PICOSDKROOT)/src/rp2_common/hardware_pll/pll.c \
$(PICOSDKROOT)/src/rp2_common/hardware_pio/pio.c \
$(PICOSDKROOT)/src/rp2_common/hardware_timer/timer.c \
$(PICOSDKROOT)/src/rp2_common/hardware_flash/flash.c \
$(PICOSDKROOT)/src/rp2_common/hardware_gpio/gpio.c \
$(PICOSDKROOT)/src/rp2_common/hardware_claim/claim.c \
@ -44,6 +45,7 @@ PICOSDKINC = $(CHIBIOS)//os/various/pico_bindings/dumb/include \
$(PICOSDKROOT)/src/rp2_common/hardware_pll/include \
$(PICOSDKROOT)/src/rp2_common/hardware_pio/include \
$(PICOSDKROOT)/src/rp2_common/hardware_sync/include \
$(PICOSDKROOT)/src/rp2_common/hardware_timer/include \
$(PICOSDKROOT)/src/rp2_common/hardware_resets/include \
$(PICOSDKROOT)/src/rp2_common/hardware_watchdog/include \
$(PICOSDKROOT)/src/rp2_common/hardware_xosc/include \

View File

@ -11,44 +11,58 @@
#include "keymap_introspection.h"
#define NUM_KEYMAP_LAYERS ((uint8_t)(sizeof(keymaps) / ((MATRIX_ROWS) * (MATRIX_COLS) * sizeof(uint16_t))))
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Key mapping
uint8_t keymap_layer_count(void) {
return NUM_KEYMAP_LAYERS;
#define NUM_KEYMAP_LAYERS_RAW ((uint8_t)(sizeof(keymaps) / ((MATRIX_ROWS) * (MATRIX_COLS) * sizeof(uint16_t))))
uint8_t keymap_layer_count_raw(void) {
return NUM_KEYMAP_LAYERS_RAW;
}
__attribute__((weak)) uint8_t keymap_layer_count(void) {
return keymap_layer_count_raw();
}
#ifdef DYNAMIC_KEYMAP_ENABLE
_Static_assert(NUM_KEYMAP_LAYERS <= MAX_LAYER, "Number of keymap layers exceeds maximum set by DYNAMIC_KEYMAP_LAYER_COUNT");
_Static_assert(NUM_KEYMAP_LAYERS_RAW <= MAX_LAYER, "Number of keymap layers exceeds maximum set by DYNAMIC_KEYMAP_LAYER_COUNT");
#else
_Static_assert(NUM_KEYMAP_LAYERS <= MAX_LAYER, "Number of keymap layers exceeds maximum set by LAYER_STATE_(8|16|32)BIT");
_Static_assert(NUM_KEYMAP_LAYERS_RAW <= MAX_LAYER, "Number of keymap layers exceeds maximum set by LAYER_STATE_(8|16|32)BIT");
#endif
uint16_t keycode_at_keymap_location_raw(uint8_t layer_num, uint8_t row, uint8_t column) {
if (layer_num < NUM_KEYMAP_LAYERS && row < MATRIX_ROWS && column < MATRIX_COLS) {
if (layer_num < NUM_KEYMAP_LAYERS_RAW && row < MATRIX_ROWS && column < MATRIX_COLS) {
return pgm_read_word(&keymaps[layer_num][row][column]);
}
return KC_TRANSPARENT;
return KC_TRNS;
}
__attribute__((weak)) uint16_t keycode_at_keymap_location(uint8_t layer_num, uint8_t row, uint8_t column) {
return keycode_at_keymap_location_raw(layer_num, row, column);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Encoder mapping
#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE)
# define NUM_ENCODERMAP_LAYERS ((uint8_t)(sizeof(encoder_map) / ((NUM_ENCODERS) * (2) * sizeof(uint16_t))))
# define NUM_ENCODERMAP_LAYERS_RAW ((uint8_t)(sizeof(encoder_map) / ((NUM_ENCODERS) * (2) * sizeof(uint16_t))))
uint8_t encodermap_layer_count(void) {
return NUM_ENCODERMAP_LAYERS;
uint8_t encodermap_layer_count_raw(void) {
return NUM_ENCODERMAP_LAYERS_RAW;
}
_Static_assert(NUM_KEYMAP_LAYERS == NUM_ENCODERMAP_LAYERS, "Number of encoder_map layers doesn't match the number of keymap layers");
__attribute__((weak)) uint8_t encodermap_layer_count(void) {
return encodermap_layer_count_raw();
}
_Static_assert(NUM_KEYMAP_LAYERS_RAW == NUM_ENCODERMAP_LAYERS_RAW, "Number of encoder_map layers doesn't match the number of keymap layers");
uint16_t keycode_at_encodermap_location_raw(uint8_t layer_num, uint8_t encoder_idx, bool clockwise) {
if (layer_num < NUM_ENCODERMAP_LAYERS && encoder_idx < NUM_ENCODERS) {
if (layer_num < NUM_ENCODERMAP_LAYERS_RAW && encoder_idx < NUM_ENCODERS) {
return pgm_read_word(&encoder_map[layer_num][encoder_idx][clockwise ? 0 : 1]);
}
return KC_TRANSPARENT;
return KC_TRNS;
}
__attribute__((weak)) uint16_t keycode_at_encodermap_location(uint8_t layer_num, uint8_t encoder_idx, bool clockwise) {

View File

@ -4,7 +4,12 @@
#include <stdint.h>
// Get the number of layers defined in the keymap
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Key mapping
// Get the number of layers defined in the keymap, stored in firmware rather than any other persistent storage
uint8_t keymap_layer_count_raw(void);
// Get the number of layers defined in the keymap, potentially stored dynamically
uint8_t keymap_layer_count(void);
// Get the keycode for the keymap location, stored in firmware rather than any other persistent storage
@ -12,9 +17,14 @@ uint16_t keycode_at_keymap_location_raw(uint8_t layer_num, uint8_t row, uint8_t
// Get the keycode for the keymap location, potentially stored dynamically
uint16_t keycode_at_keymap_location(uint8_t layer_num, uint8_t row, uint8_t column);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Encoder mapping
#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE)
// Get the number of layers defined in the encoder map
// Get the number of layers defined in the encoder map, stored in firmware rather than any other persistent storage
uint8_t encodermap_layer_count_raw(void);
// Get the number of layers defined in the encoder map, potentially stored dynamically
uint8_t encodermap_layer_count(void);
// Get the keycode for the encoder mapping location, stored in firmware rather than any other persistent storage