Compare commits

...

6 Commits

Author SHA1 Message Date
Snipeye 5a1a6dc70d
Merge f7d902e619 into d0ac04a841 2024-05-18 18:23:04 +00:00
c0ldbru d0ac04a841
[Keyboard] Add h4ckb0ard (#23717)
* adds h4ckb0ard

* Update keyboards/rot13labs/h4ckb0ard/info.json

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/rot13labs/h4ckb0ard/info.json

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/rot13labs/h4ckb0ard/info.json

Co-authored-by: Joel Challis <git@zvecr.com>

* Update info.json

updating flags to indicate backlighting

* Update info.json

reduces max brightness to 100

* Delete keyboards/rot13labs/h4ckb0ard/config.h

removes this since its not needed anymore

* Update keyboards/rot13labs/h4ckb0ard/info.json

Co-authored-by: jack <0x6a73@protonmail.com>

* Update keyboards/rot13labs/h4ckb0ard/keymaps/default/keymap.c

Co-authored-by: jack <0x6a73@protonmail.com>

* Update keyboards/rot13labs/h4ckb0ard/keymaps/default/keymap.c

Co-authored-by: jack <0x6a73@protonmail.com>

---------

Co-authored-by: c0ldbru <c0ldbrusec@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2024-05-18 11:52:24 -06:00
Danny 8f2085421e
[Keyboard] Add Irispad (#23724)
* Add Irispad

* Fix x positions for RGB LEDs

* Add encoder/bootmagic settings in info.json and run format-json

* Add missing info.json

* Fix README formatting
2024-05-18 11:51:02 -06:00
Dasky 47bc02b2ff
Force CPI update using timer when using split pointing. (#23545) 2024-05-17 22:59:45 +01:00
Joel Challis 340be4bae3
Resolve home directory in userspace config (#23730) 2024-05-17 00:06:19 +01:00
Joshua Broekhuijsen f7d902e619 Better filter and documentation for qmk find 2024-05-13 12:56:21 -04:00
16 changed files with 531 additions and 16 deletions

View File

@ -159,10 +159,10 @@ For example, one could search for all keyboards using STM32F411:
qmk find -f 'processor=STM32F411'
```
...and one can further constrain the list to keyboards using STM32F411 as well as rgb_matrix support:
...and one can further constrain the list to keyboards using STM32F411 as well as rgb_matrix support with at least 3 columns:
```
qmk find -f 'processor=STM32F411' -f 'features.rgb_matrix=true'
qmk find -f 'processor=STM32F411' -f 'features.rgb_matrix=true' -f 'length(matrix_pins.cols, >=3)'
```
The following filter expressions are also supported:
@ -170,7 +170,7 @@ The following filter expressions are also supported:
- `exists(key)`: Match targets where `key` is present.
- `absent(key)`: Match targets where `key` is not present.
- `contains(key, value)`: Match targets where `key` contains `value`. Can be used for strings, arrays and object keys.
- `length(key, value)`: Match targets where the length of `key` is `value`. Can be used for strings, arrays and objects.
- `length(key, value)`: Match targets where the length of `key` matches `value`. Can be used for strings, arrays and objects.
You can also list arbitrary values for each matched target with `--print`:

View File

@ -0,0 +1,8 @@
{
"manufacturer": "Keebio",
"url": "https://keeb.io",
"maintainer": "Keebio",
"usb": {
"vid": "0xCB10"
}
}

View File

@ -0,0 +1,43 @@
{
"config": { "features": {"encoder_map": true, "tri_layer": true} },
"keyboard": "keebio/irispad",
"keymap": "default",
"layout": "LAYOUT",
"layers": [
[
"QK_GESC", "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" ,
"KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" ,
"KC_LCTL", "KC_A" , "KC_S" , "KC_D" , "KC_F" , "KC_G" ,
"KC_LSFT", "KC_Z" , "KC_X" , "KC_C" , "KC_V" , "KC_B" , "TL_UPPR",
"KC_LGUI", "TL_LOWR", "KC_ENT"
],
[
"KC_TILD", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC",
"KC_GRV" , "_______", "KC_UP" , "_______", "QK_BOOT", "_______",
"KC_DEL" , "KC_LEFT", "KC_DOWN", "KC_RGHT", "_______", "KC_LBRC",
"RGB_MOD", "EE_CLR" , "_______", "_______", "_______", "KC_LCBR", "KC_LPRN",
"_______", "_______", "KC_DEL"
],
[
"KC_F6" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_F4" , "KC_F5" ,
"KC_F12", "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10" , "KC_F11" ,
"RGB_MOD", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS",
"KC_MUTE", "KC_MSTP", "KC_MPLY", "KC_VOLD", "KC_PGDN", "KC_MINS", "KC_LPRN",
"_______", "_______", "_______"
]
],
"encoders": [
[
{"ccw": "KC_PGUP", "cw": "KC_PGDN"},
{"ccw": "KC_VOLD", "cw": "KC_VOLU"}
],
[
{"ccw": "_______", "cw": "_______"},
{"ccw": "_______", "cw": "_______"}
],
[
{"ccw": "_______", "cw": "_______"},
{"ccw": "_______", "cw": "_______"}
]
]
}

View File

@ -0,0 +1,43 @@
{
"config": { "features": {"encoder_map": true, "via": true} },
"keyboard": "keebio/irispad",
"keymap": "via",
"layout": "LAYOUT",
"layers": [
[
"QK_GESC", "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" ,
"KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" ,
"KC_LCTL", "KC_A" , "KC_S" , "KC_D" , "KC_F" , "KC_G" ,
"KC_LSFT", "KC_Z" , "KC_X" , "KC_C" , "KC_V" , "KC_B" , "TL_UPPR",
"KC_LGUI", "TL_LOWR", "KC_ENT"
],
[
"KC_TILD", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC",
"KC_GRV" , "_______", "KC_UP" , "_______", "QK_BOOT", "_______",
"KC_DEL" , "KC_LEFT", "KC_DOWN", "KC_RGHT", "_______", "KC_LBRC",
"RGB_MOD", "EE_CLR" , "_______", "_______", "_______", "KC_LCBR", "KC_LPRN",
"_______", "_______", "KC_DEL"
],
[
"KC_F6" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_F4" , "KC_F5" ,
"KC_F12", "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10" , "KC_F11" ,
"RGB_MOD", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS",
"KC_MUTE", "KC_MSTP", "KC_MPLY", "KC_VOLD", "KC_PGDN", "KC_MINS", "KC_LPRN",
"_______", "_______", "_______"
]
],
"encoders": [
[
{"ccw": "KC_PGUP", "cw": "KC_PGDN"},
{"ccw": "KC_VOLD", "cw": "KC_VOLU"}
],
[
{"ccw": "_______", "cw": "_______"},
{"ccw": "_______", "cw": "_______"}
],
[
{"ccw": "_______", "cw": "_______"},
{"ccw": "_______", "cw": "_______"}
]
]
}

View File

@ -0,0 +1,21 @@
# Irispad
An ergonomic gamepad based off of the Iris and sold by Keebio. [More info at Keebio](https://keeb.io).
* Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges)
* Hardware Supported: RP2040
* Hardware Availability: [Keebio](https://keeb.io)
Make example for this keyboard (after setting up your build environment):
make keebio/irispad/rev8:default
Example of flashing this keyboard:
make keebio/irispad/rev8:default:flash
See [build environment setup](https://docs.qmk.fm/#/newbs_getting_started) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
A build guide for this keyboard can be found here: [Iris Build Guide](https://docs.keeb.io/iris-rev6-build-guide)
Note: The Irispad PCB is a repurposed Iris Rev. 8 PCB from a batch that had all of the diodes flipped, so if you would like to use a regular Iris Rev. 8 PCB, you will need to change `ROW2COL` to `COL2ROW` in `keyboard.json`.

View File

@ -0,0 +1,11 @@
// Copyright 2024 Danny Nguyen (danny@keeb.io)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
#define I2C_DRIVER I2CD2
#define I2C1_SDA_PIN GP10
#define I2C1_SCL_PIN GP11

View File

@ -0,0 +1,151 @@
{
"keyboard_name": "Irispad Rev. 8",
"bootloader": "rp2040",
"diode_direction": "ROW2COL",
"encoder": {
"rotary": [
{"pin_a": "GP14", "pin_b": "GP15"},
{"pin_a": "GP26", "pin_b": "GP25"}
]
},
"features": {
"bootmagic": true,
"encoder": true,
"extrakey": true,
"mousekey": true,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["GP2", "GP3", "GP29", "GP27", "GP6", "GP5"],
"rows": ["GP0", "GP1", "GP7", "GP16", "GP28"]
},
"processor": "RP2040",
"rgb_matrix": {
"animations": {
"alphas_mods": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_sat": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"band_val": true,
"breathing": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"cycle_up_down": true,
"digital_rain": true,
"dual_beacon": true,
"gradient_left_right": true,
"gradient_up_down": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"jellybean_raindrops": true,
"multisplash": true,
"pixel_flow": true,
"pixel_fractal": true,
"pixel_rain": true,
"rainbow_beacon": true,
"rainbow_moving_chevron": true,
"rainbow_pinwheels": true,
"raindrops": true,
"solid_multisplash": true,
"solid_reactive": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_multinexus": true,
"solid_reactive_multiwide": true,
"solid_reactive_nexus": true,
"solid_reactive_simple": true,
"solid_reactive_wide": true,
"solid_splash": true,
"splash": true,
"typing_heatmap": true
},
"driver": "ws2812",
"layout": [
{"matrix": [0, 0], "x": 0, "y": 5, "flags": 4},
{"x": 18, "y": 5, "flags": 2},
{"matrix": [0, 1], "x": 37, "y": 5, "flags": 4},
{"matrix": [0, 2], "x": 76, "y": 2, "flags": 4},
{"x": 91, "y": 1, "flags": 2},
{"matrix": [0, 3], "x": 110, "y": 0, "flags": 4},
{"matrix": [0, 4], "x": 146, "y": 5, "flags": 4},
{"x": 165, "y": 3, "flags": 2},
{"matrix": [0, 5], "x": 183, "y": 3, "flags": 4},
{"matrix": [1, 5], "x": 183, "y": 17, "flags": 4},
{"matrix": [1, 4], "x": 137, "y": 15, "flags": 4},
{"matrix": [1, 3], "x": 110, "y": 13, "flags": 4},
{"matrix": [1, 2], "x": 73, "y": 15, "flags": 4},
{"matrix": [1, 1], "x": 37, "y": 18, "flags": 4},
{"matrix": [1, 0], "x": 0, "y": 18, "flags": 4},
{"matrix": [2, 0], "x": 0, "y": 32, "flags": 4},
{"matrix": [2, 1], "x": 37, "y": 32, "flags": 4},
{"matrix": [2, 2], "x": 73, "y": 28, "flags": 4},
{"matrix": [2, 3], "x": 110, "y": 27, "flags": 4},
{"matrix": [2, 4], "x": 137, "y": 28, "flags": 4},
{"matrix": [2, 5], "x": 183, "y": 30, "flags": 4},
{"matrix": [3, 5], "x": 183, "y": 43, "flags": 4},
{"matrix": [3, 4], "x": 146, "y": 42, "flags": 4},
{"matrix": [3, 3], "x": 110, "y": 40, "flags": 4},
{"x": 91, "y": 50, "flags": 2},
{"matrix": [3, 2], "x": 73, "y": 42, "flags": 4},
{"matrix": [3, 1], "x": 37, "y": 45, "flags": 4},
{"x": 18, "y": 43, "flags": 2},
{"matrix": [3, 0], "x": 0, "y": 45, "flags": 4},
{"matrix": [4, 5], "x": 224, "y": 52, "flags": 4},
{"matrix": [4, 4], "x": 206, "y": 64, "flags": 4},
{"x": 183, "y": 58, "flags": 2},
{"matrix": [4, 3], "x": 165, "y": 58, "flags": 4},
{"matrix": [4, 2], "x": 128, "y": 47, "flags": 4}
],
"max_brightness": 180,
"sleep": true
},
"usb": {
"device_version": "8.0.0",
"pid": "0x8356"
},
"ws2812": {
"driver": "vendor",
"pin": "GP9"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0.375},
{"matrix": [0, 1], "x": 1, "y": 0.375},
{"matrix": [0, 2], "x": 2, "y": 0.125},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0.125},
{"matrix": [0, 5], "x": 5, "y": 0.25},
{"matrix": [1, 0], "x": 0, "y": 1.375},
{"matrix": [1, 1], "x": 1, "y": 1.375},
{"matrix": [1, 2], "x": 2, "y": 1.125},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1.125},
{"matrix": [1, 5], "x": 5, "y": 1.25},
{"matrix": [2, 0], "x": 0, "y": 2.375},
{"matrix": [2, 1], "x": 1, "y": 2.375},
{"matrix": [2, 2], "x": 2, "y": 2.125},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2.125},
{"matrix": [2, 5], "x": 5, "y": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3.375},
{"matrix": [3, 1], "x": 1, "y": 3.375},
{"matrix": [3, 2], "x": 2, "y": 3.125},
{"matrix": [3, 3], "x": 3, "y": 3},
{"matrix": [3, 4], "x": 4, "y": 3.125},
{"matrix": [3, 5], "x": 5, "y": 3.25},
{"matrix": [4, 5], "x": 6.15, "y": 3.75},
{"matrix": [4, 2], "x": 3.5, "y": 4.25},
{"matrix": [4, 3], "x": 4.5, "y": 4.375},
{"matrix": [4, 4], "x": 5.6, "y": 4.75}
]
}
}
}

View File

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

View File

@ -0,0 +1,159 @@
{
"manufacturer": "rot13labs",
"keyboard_name": "H4CKB0ARD",
"maintainer": "c0ldbru",
"bootloader": "usbasploader",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["C0", "C1", "C2", "C3", "C4", "C5", "D0", "D1", "B5", "D7", "D6", "D4"],
"rows": ["B0", "B1", "B2", "B3"]
},
"processor": "atmega328p",
"usb": {
"pid": "0xBABE",
"vid": "0xBEEF",
"device_version": "13.3.7",
"no_startup_check": true
},
"ws2812": {
"pin": "B4"
},
"rgb_matrix": {
"animations": {
"cycle_up_down": true,
"jellybean_raindrops": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"pixel_fractal": true,
"rainbow_moving_chevron": true,
"cycle_pinwheel": true,
"pixel_rain": true,
"dual_beacon": true,
"hue_breathing": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"splash": true,
"multisplash": true,
"solid_splash": true,
"solid_reactive_cross": true
},
"driver": "ws2812",
"default": {
"animation": "cycle_up_down"
},
"layout": [
{"flags": 4, "matrix": [0, 11], "x": 0, "y": 0},
{"flags": 4, "matrix": [0, 10], "x": 1, "y": 0},
{"flags": 4, "matrix": [0, 9], "x": 2, "y": 0},
{"flags": 4, "matrix": [0, 8], "x": 3, "y": 0},
{"flags": 4, "matrix": [0, 7], "x": 4, "y": 0},
{"flags": 4, "matrix": [0, 6], "x": 5, "y": 0},
{"flags": 4, "matrix": [0, 5], "x": 6, "y": 0},
{"flags": 4, "matrix": [0, 4], "x": 7, "y": 0},
{"flags": 4, "matrix": [0, 3], "x": 8, "y": 0},
{"flags": 4, "matrix": [0, 2], "x": 9, "y": 0},
{"flags": 4, "matrix": [0, 1], "x": 10, "y": 0},
{"flags": 4, "matrix": [0, 0], "x": 11, "y": 0},
{"flags": 4, "matrix": [1, 0], "x": 0, "y": 1},
{"flags": 4, "matrix": [1, 1], "x": 1.25, "y": 1},
{"flags": 4, "matrix": [1, 2], "x": 2.25, "y": 1},
{"flags": 4, "matrix": [1, 3], "x": 3.25, "y": 1},
{"flags": 4, "matrix": [1, 4], "x": 4.25, "y": 1},
{"flags": 4, "matrix": [1, 5], "x": 5.25, "y": 1},
{"flags": 4, "matrix": [1, 6], "x": 6.25, "y": 1},
{"flags": 4, "matrix": [1, 7], "x": 7.25, "y": 1},
{"flags": 4, "matrix": [1, 8], "x": 8.25, "y": 1},
{"flags": 4, "matrix": [1, 9], "x": 9.25, "y": 1},
{"flags": 4, "matrix": [1, 11], "x": 10.25, "y": 1},
{"flags": 4, "matrix": [2, 11], "x": 0, "y": 2},
{"flags": 4, "matrix": [2, 10], "x": 1.75, "y": 2},
{"flags": 4, "matrix": [2, 8], "x": 2.75, "y": 2},
{"flags": 4, "matrix": [2, 7], "x": 3.75, "y": 2},
{"flags": 4, "matrix": [2, 6], "x": 4.75, "y": 2},
{"flags": 4, "matrix": [2, 5], "x": 5.75, "y": 2},
{"flags": 4, "matrix": [2, 4], "x": 6.75, "y": 2},
{"flags": 4, "matrix": [2, 3], "x": 7.75, "y": 2},
{"flags": 4, "matrix": [2, 2], "x": 8.75, "y": 2},
{"flags": 4, "matrix": [2, 1], "x": 10.5, "y": 2},
{"flags": 4, "matrix": [2, 0], "x": 11.5, "y": 2},
{"flags": 4, "matrix": [3, 0], "x": 0, "y": 3},
{"flags": 4, "matrix": [3, 1], "x": 1.25, "y": 3},
{"flags": 4, "matrix": [3, 2], "x": 2.5, "y": 3},
{"flags": 4, "matrix": [3, 4], "x": 3.5, "y": 3},
{"flags": 4, "matrix": [3, 6], "x": 5.75, "y": 3},
{"flags": 4, "matrix": [3, 8], "x": 8.5, "y": 3},
{"flags": 4, "matrix": [3, 9], "x": 9.5, "y": 3},
{"flags": 4, "matrix": [3, 10], "x": 10.5, "y": 3},
{"flags": 4, "matrix": [3, 11], "x": 11.5, "y": 3}
],
"max_brightness": 100
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [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, "w": 1.5},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 1},
{"matrix": [1, 2], "x": 2.25, "y": 1},
{"matrix": [1, 3], "x": 3.25, "y": 1},
{"matrix": [1, 4], "x": 4.25, "y": 1},
{"matrix": [1, 5], "x": 5.25, "y": 1},
{"matrix": [1, 6], "x": 6.25, "y": 1},
{"matrix": [1, 7], "x": 7.25, "y": 1},
{"matrix": [1, 8], "x": 8.25, "y": 1},
{"matrix": [1, 9], "x": 9.25, "y": 1},
{"matrix": [1, 11], "x": 10.25, "y": 1, "w": 2.25},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"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, "w": 1.75},
{"matrix": [2, 10], "x": 10.5, "y": 2},
{"matrix": [2, 11], "x": 11.5, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3, "w": 1.25},
{"matrix": [3, 2], "x": 2.5, "y": 3},
{"matrix": [3, 4], "x": 3.5, "y": 3, "w": 2.25},
{"matrix": [3, 6], "x": 5.75, "y": 3, "w": 2.75},
{"matrix": [3, 8], "x": 8.5, "y": 3},
{"matrix": [3, 9], "x": 9.5, "y": 3},
{"matrix": [3, 10], "x": 10.5, "y": 3},
{"matrix": [3, 11], "x": 11.5, "y": 3}
]
}
}
}

View File

@ -0,0 +1,45 @@
/* Copyright 2024 rot13labs
*
* 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_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RCTL, KC_UP, DF(1),
KC_LCTL, KC_LGUI, MO(2), KC_SPC, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT),
/* FN - symbols & audio controls */
[1] = LAYOUT(
KC_ESC, KC_MINS, KC_EQL, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_LBRC, KC_RBRC, KC_BSLS, KC_BSPC,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_COMM, KC_DOT, KC_SLSH, KC_RCTL, KC_VOLU, DF(2),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT),
/* ALT - numbers */
[2] = LAYOUT(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RCTL, KC_UP, DF(3),
KC_LCTL, KC_LGUI, _______, MO(3), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT),
/* SPC - RGB control layer */
[3] = LAYOUT(
KC_ESC, KC_Q, RGB_M_SW, KC_E, RGB_M_R, KC_T, KC_Y, RGB_SPD, RGB_SPI, RGB_RMOD, RGB_MOD, KC_DEL,
KC_TAB, KC_A, RGB_M_P, KC_D, KC_F, KC_G, KC_H, RGB_SAD, RGB_SAI, RGB_TOG, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, RGB_M_B, KC_N, KC_M, KC_RCTL, RGB_VAI, DF(0),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, _______, RGB_HUD, RGB_VAD, RGB_HUI),
};

View File

@ -0,0 +1,19 @@
# h4ckb0ard
![h4ckb0ard](https://i.imgur.com/U325abR.jpg)
A 40% keyboard for hackers using the c0ldbru layout, designed to minimize space without requiring users to buy extra keycaps just to use less.
* Keyboard Maintainer: [c0ldbru](https://github.com/c0ldbru)
* Hardware Supported: h4ckb0ard // atmega328p
* Hardware Availability: [rot13labs](https://rot13labs.com)
Make example for this keyboard (after setting up your build environment):
make rot13labs/h4ckb0ard: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
You can enter the bootloader to flash on new firmware by holding down the ESC key while plugging the h4ckb0ard in.

View File

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

View File

@ -11,7 +11,7 @@ from qmk.search import filter_help, search_keymap_targets
action='append',
default=[],
help= # noqa: `format-python` and `pytest` don't agree here.
f"Filter the list of keyboards based on their info.json data. Accepts the formats key=value, function(key), or function(key,value), eg. 'features.rgblight=true'. Valid functions are {filter_help()}. May be passed multiple times; all filters need to match. Value may include wildcards such as '*' and '?'." # noqa: `format-python` and `pytest` don't agree here.
f"Filter the list of keyboards based on their info.json data. Accepts the formats key=value, function(key), or function(key,value), eg. 'features.rgblight=true' or 'length(encoder.rotary, >=20)'. Valid functions are {filter_help()}. May be passed multiple times; all filters need to match. Value may include wildcards such as '*' and '?'." # noqa: `format-python` and `pytest` don't agree here.
)
@cli.argument('-p', '--print', arg_only=True, action='append', default=[], help="For each matched target, print the value of the supplied info.json key. May be passed multiple times.")
@cli.argument('-km', '--keymap', type=str, default='default', help="The keymap name to build. Default is 'default'.")

View File

@ -61,10 +61,22 @@ class Absent(FilterFunction):
class Length(FilterFunction):
func_name = "length"
funcMap = [
(">=", int.__ge__),
("<=", int.__le__),
(">", int.__gt__),
("<", int.__lt__),
]
def apply(self, target_info: TargetInfo) -> bool:
_kb, _km, info = target_info
return (self.key in info and len(info[self.key]) == int(self.value))
val = int(''.join(c for c in self.value if c.isdigit()))
comp = int.__eq__
for (start, func) in self.funcMap:
if (self.value.startswith(start)):
comp = func
break
return (self.key in info and comp(len(info[self.key]), val))
class Contains(FilterFunction):

View File

@ -12,29 +12,29 @@ from qmk.json_encoders import UserspaceJSONEncoder
def qmk_userspace_paths():
test_dirs = {}
test_dirs = set()
# If we're already in a directory with a qmk.json and a keyboards or layouts directory, interpret it as userspace
if environ.get('ORIG_CWD') is not None:
current_dir = Path(environ['ORIG_CWD'])
while len(current_dir.parts) > 1:
if (current_dir / 'qmk.json').is_file():
test_dirs[current_dir] = True
test_dirs.add(current_dir)
current_dir = current_dir.parent
# If we have a QMK_USERSPACE environment variable, use that
if environ.get('QMK_USERSPACE') is not None:
current_dir = Path(environ['QMK_USERSPACE'])
current_dir = Path(environ['QMK_USERSPACE']).expanduser()
if current_dir.is_dir():
test_dirs[current_dir] = True
test_dirs.add(current_dir)
# If someone has configured a directory, use that
if cli.config.user.overlay_dir is not None:
current_dir = Path(cli.config.user.overlay_dir)
current_dir = Path(cli.config.user.overlay_dir).expanduser().resolve()
if current_dir.is_dir():
test_dirs[current_dir] = True
test_dirs.add(current_dir)
return list(test_dirs.keys())
return list(test_dirs)
def qmk_userspace_validate(path):

View File

@ -710,16 +710,17 @@ static bool pointing_handlers_master(matrix_row_t master_matrix[], matrix_row_t
return true;
}
# endif
static uint32_t last_update = 0;
static uint16_t last_cpi = 0;
static uint32_t last_update = 0;
static uint32_t last_cpi_update = 0;
static uint16_t last_cpi = 0;
report_mouse_t temp_state;
uint16_t temp_cpi;
bool okay = read_if_checksum_mismatch(GET_POINTING_CHECKSUM, GET_POINTING_DATA, &last_update, &temp_state, &split_shmem->pointing.report, sizeof(temp_state));
if (okay) pointing_device_set_shared_report(temp_state);
temp_cpi = pointing_device_get_shared_cpi();
if (temp_cpi && last_cpi != temp_cpi) {
if (temp_cpi) {
split_shmem->pointing.cpi = temp_cpi;
okay = transport_write(PUT_POINTING_CPI, &split_shmem->pointing.cpi, sizeof(split_shmem->pointing.cpi));
okay = send_if_condition(PUT_POINTING_CPI, &last_cpi_update, last_cpi != temp_cpi, &split_shmem->pointing.cpi, sizeof(split_shmem->pointing.cpi));
if (okay) {
last_cpi = temp_cpi;
}