2020 May 30 Breaking Changes Update (#9215)
* Branch point for 2020 May 30 Breaking Change * Migrate `ACTION_LAYER_TOGGLE` to `TG()` (#8954) * Migrate `ACTION_MODS_ONESHOT` to `OSM()` (#8957) * Migrate `ACTION_DEFAULT_LAYER_SET` to `DF()` (#8958) * Migrate `ACTION_LAYER_MODS` to `LM()` (#8959) * Migrate `ACTION_MODS_TAP_KEY` to `MT()` (#8968) * Convert V-USB usbdrv to a submodule (#8321) * Unify Tap Hold functions and documentation (#8348) * Changing board names to prevent confusion (#8412) * Move the Keyboardio Model01 to a keyboardio/ subdir (#8499) * Move spaceman keyboards (#8830) * Migrate miscellaneous `fn_actions` entries (#8977) * Migrate `ACTION_MODS_KEY` to chained mod keycodes (#8979) * Organizing my keyboards (plaid, tartan, ergoinu) (#8537) * Refactor Lily58 to use split_common (#6260) * Refactor zinc to use split_common (#7114) * Add a message if bin/qmk doesn't work (#9000) * Fix conflicting types for 'tfp_printf' (#8269) * Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup (#6480) * Refactor and updates to TKC1800 code (#8472) * Switch to qmk forks for everything (#9019) * audio refactor: replace deprecated PLAY_NOTE_ARRAY (#8484) * Audio enable corrections (2/3) (#8903) * Split HHKB to ANSI and JP layouts and Add VIA support for each (#8582) * Audio enable corrections (Part 4) (#8974) * Fix typo from PR7114 (#9171) * Augment future branch Changelogs (#8978) * Revert "Branch point for 2020 May 30 Breaking Change"master
parent
7b8a013826
commit
fced377ac0
|
@ -12,7 +12,13 @@
|
||||||
branch = master
|
branch = master
|
||||||
[submodule "lib/googletest"]
|
[submodule "lib/googletest"]
|
||||||
path = lib/googletest
|
path = lib/googletest
|
||||||
url = https://github.com/google/googletest
|
url = https://github.com/qmk/googletest
|
||||||
[submodule "lib/lufa"]
|
[submodule "lib/lufa"]
|
||||||
path = lib/lufa
|
path = lib/lufa
|
||||||
url = https://github.com/qmk/lufa
|
url = https://github.com/qmk/lufa
|
||||||
|
[submodule "lib/vusb"]
|
||||||
|
path = lib/vusb
|
||||||
|
url = https://github.com/qmk/v-usb
|
||||||
|
[submodule "lib/printf"]
|
||||||
|
path = lib/printf
|
||||||
|
url = https://github.com/qmk/printf
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -562,14 +562,16 @@ endef
|
||||||
%:
|
%:
|
||||||
# Check if we have the CMP tool installed
|
# Check if we have the CMP tool installed
|
||||||
cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
|
cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
|
||||||
# Ensure that python3 is installed. This check can be removed after python is used in more places.
|
# Ensure that bin/qmk works. This will be a failing check after the next develop merge on 2020 Aug 29.
|
||||||
if ! python3 --version 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
|
if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
|
||||||
# Check if the submodules are dirty, and display a warning if they are
|
# Check if the submodules are dirty, and display a warning if they are
|
||||||
ifndef SKIP_GIT
|
ifndef SKIP_GIT
|
||||||
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
|
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
|
||||||
if [ ! -e lib/chibios-contrib ]; then git submodule sync lib/chibios-contrib && git submodule update --depth 50 --init lib/chibios-contrib; fi
|
if [ ! -e lib/chibios-contrib ]; then git submodule sync lib/chibios-contrib && git submodule update --depth 50 --init lib/chibios-contrib; fi
|
||||||
if [ ! -e lib/ugfx ]; then git submodule sync lib/ugfx && git submodule update --depth 50 --init lib/ugfx; fi
|
if [ ! -e lib/ugfx ]; then git submodule sync lib/ugfx && git submodule update --depth 50 --init lib/ugfx; fi
|
||||||
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
|
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
|
||||||
|
if [ ! -e lib/vusb ]; then git submodule sync lib/vusb && git submodule update --depth 50 --init lib/vusb; fi
|
||||||
|
if [ ! -e lib/printf ]; then git submodule sync lib/printf && git submodule update --depth 50 --init lib/printf; fi
|
||||||
git submodule status --recursive 2>/dev/null | \
|
git submodule status --recursive 2>/dev/null | \
|
||||||
while IFS= read -r x; do \
|
while IFS= read -r x; do \
|
||||||
case "$$x" in \
|
case "$$x" in \
|
||||||
|
|
|
@ -0,0 +1,239 @@
|
||||||
|
# QMK Breaking Change - 2020 May 30 Changelog
|
||||||
|
|
||||||
|
Four times a year QMK runs a process for merging Breaking Changes. A Breaking Change is any change which modifies how QMK behaves in a way that is incompatible or potentially dangerous. We limit these changes to 4 times per year so that users can have confidence that updating their QMK tree will not break their keymaps.
|
||||||
|
|
||||||
|
The list of changes follows.
|
||||||
|
|
||||||
|
|
||||||
|
## Core Changes
|
||||||
|
|
||||||
|
### Converting V-USB usbdrv to a submodule
|
||||||
|
|
||||||
|
[#8321](https://github.com/qmk/qmk_firmware/pull/8321) and [qmk_compiler#62](https://github.com/qmk/qmk_compiler/pull/62).
|
||||||
|
|
||||||
|
These PRs move the V-USB driver code out of the qmk_firmware repository and into a submodule pointed at https://github.com/obdev/v-usb. This will make it easier to update the codebase if needed, while applying any potential QMK-specific modifications by forking it to the QMK GitHub organization.
|
||||||
|
|
||||||
|
### Unify Tap Hold functions and documentation
|
||||||
|
|
||||||
|
[#8348](https://github.com/qmk/qmk_firmware/pull/8348)
|
||||||
|
|
||||||
|
Updates all of the per key tap-hold functions to pass the `keyrecord_t` structure, and include documentation changes.
|
||||||
|
|
||||||
|
Any remaining versions or code outside of the main repo will need to be converted:
|
||||||
|
| Old function | New Function |
|
||||||
|
|------------------------------------------------------|---------------------------------------------------------------------------|
|
||||||
|
|`uint16_t get_tapping_term(uint16_t keycode)` |`uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record)` |
|
||||||
|
|`bool get_ignore_mod_tap_interrupt(uint16_t keycode)` |`bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record)` |
|
||||||
|
|
||||||
|
### Python Required In The Build Process
|
||||||
|
|
||||||
|
[#9000](https://github.com/qmk/qmk_firmware/pull/9000)
|
||||||
|
|
||||||
|
This is the last release of QMK that will work without having Python 3.6 (or later) installed. If your environment is not fully setup you will get a warning instructing you to set it up.
|
||||||
|
|
||||||
|
After the next breaking change you will not be able to build if `bin/qmk hello` does not work.
|
||||||
|
|
||||||
|
### Upgrade from tinyprintf to mpaland/printf
|
||||||
|
|
||||||
|
[#8269](https://github.com/qmk/qmk_firmware/pull/8269)
|
||||||
|
|
||||||
|
- Provides debug functionality on ChibiOS/ARM that is more compliant than previous integrations.
|
||||||
|
- Less maintenence, fewer QMK customisations, and allows QMK to sidestep previous compile and runtime issues.
|
||||||
|
- A `make git-submodule` may be required after pulling the latest QMK Firmware code to update to the new dependency.
|
||||||
|
|
||||||
|
### Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup
|
||||||
|
|
||||||
|
[#6480](https://github.com/qmk/qmk_firmware/pull/6480)
|
||||||
|
|
||||||
|
- Changes `RGB_DISABLE_AFTER_TIMEOUT` to be based on milliseconds instead of ticks.
|
||||||
|
- Includes a code cleanup, resulting in a savings of 100 bytes, depending on features used.
|
||||||
|
- Fixed issues with timeouts / suspending at the wrong time not turning off all LEDs in some cases.
|
||||||
|
|
||||||
|
The `RGB_DISABLE_AFTER_TIMEOUT` definition is now deprecated, and has been superseded by `RGB_DISABLE_TIMEOUT`. To use the new definition, rename `RGB_DISABLE_AFTER_TIMEOUT` to `RGB_DISABLE_TIMEOUT` in your `config.h` file, and multiply the value set by 1200.
|
||||||
|
|
||||||
|
Before: `#define RGB_DISABLE_AFTER_TIMEOUT 100`
|
||||||
|
After: `#define RGB_DISABLE_TIMEOUT 120000`
|
||||||
|
|
||||||
|
### Switch to qmk forks for everything
|
||||||
|
|
||||||
|
[#9019](https://github.com/qmk/qmk_firmware/pull/9019)
|
||||||
|
|
||||||
|
Fork all QMK submodules to protect against upstream repositories disappearing.
|
||||||
|
|
||||||
|
### code cleanup regarding deprecated macro PLAY_NOTE_ARRAY by replacing it with PLAY_SONG
|
||||||
|
|
||||||
|
[#8484](https://github.com/qmk/qmk_firmware/pull/8484)
|
||||||
|
|
||||||
|
Removes the deprecated `PLAY_NOTE_ARRAY` macro. References to it are replaced with `PLAY_SONG`, which references the same function.
|
||||||
|
|
||||||
|
### fixing wrong configuration of AUDIO feature
|
||||||
|
|
||||||
|
[#8903](https://github.com/qmk/qmk_firmware/pull/8903) and [#8974](https://github.com/qmk/qmk_firmware/pull/8974)
|
||||||
|
|
||||||
|
`audio_avr.c` does not default to any pin; there has to be a #define XX_AUDIO in config.h at some level for Audio to actually work. Otherwise, the Audio code ends up cluttering the firmware, possibly breaking builds because the maximum allowed firmware size is exceeded.
|
||||||
|
|
||||||
|
These changes fix this by disabling Audio on keyboards that have the feature misconfigured, and therefore non-functional.
|
||||||
|
|
||||||
|
Also, add a compile-time error to alert the user to a missing pin-configuration (on AVR boards) when `AUDIO_ENABLE = yes` is set.
|
||||||
|
|
||||||
|
|
||||||
|
## Keyboard Refactors
|
||||||
|
|
||||||
|
### Migrating Lily58 to use split_common
|
||||||
|
|
||||||
|
[#6260](https://github.com/qmk/qmk_firmware/pull/6260)
|
||||||
|
|
||||||
|
Modifies the default firmware for Lily58 to use the `split_common` library, instead of including and depending on its own set of libraries for the following functionality:
|
||||||
|
|
||||||
|
- SSD1306 display
|
||||||
|
- i2c for OLED
|
||||||
|
- Serial Communication
|
||||||
|
|
||||||
|
This allows current lily58 firmware to advance with updates to the `split_common` library, which is shared with many other split keyboards.
|
||||||
|
|
||||||
|
#### To migrate existing Lily58 firmware:
|
||||||
|
|
||||||
|
[Changes to `config.h`](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-445ac369c8717dcd6fc6fc3630836fc1):
|
||||||
|
- Remove `#define SSD1306OLED` from config.h
|
||||||
|
|
||||||
|
|
||||||
|
[Changes to `keymap.c`](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7):
|
||||||
|
- Find/Replace each instance of `#ifdef SSD1306OLED` with `#ifdef OLED_DRIVER_ENABLE`
|
||||||
|
- The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190)
|
||||||
|
- Alternatively, if you did not change the OLED code from that in `default`, you may find it easier to simply copy the [relevant section](https://github.com/qmk/qmk_firmware/blob/4ac310668501ae6786c711ecc8f01f62ddaa1c0b/keyboards/lily58/keymaps/default/keymap.c#L138-L172). Otherwise, the changes you need to make are as follows (sample change [here](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7R138-R173))
|
||||||
|
- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L138-L141) the block
|
||||||
|
```c
|
||||||
|
#ifdef SSD1306OLED
|
||||||
|
iota_gfx_init(!has_usb()); // turns on the display
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
|
||||||
|
```c
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- Remove the functions `matrix_scan_user`, `matrix_update` and `iota_gfx_task_user`
|
||||||
|
- Find/Replace `matrix_render_user(struct CharacterMatrix *matrix)` with `iota_gfx_task_user(void)`
|
||||||
|
- Find/Replace `is_master` with `is_keyboard_master()`
|
||||||
|
- For each instance of `matrix_write_ln(matrix, display_fn())`, rewrite it as `oled_write_ln(read_layer_state(), false);`
|
||||||
|
- For each instance of `matrix_write(matrix, read_logo());`, replace with `oled_write(read_logo(), false);`
|
||||||
|
|
||||||
|
### Refactor zinc to use split_common
|
||||||
|
|
||||||
|
[#7114](https://github.com/qmk/qmk_firmware/pull/7114) and [#9171](https://github.com/qmk/qmk_firmware/pull/9171)
|
||||||
|
|
||||||
|
* Refactor to use split_common and remove split codes under the zinc/revx/
|
||||||
|
* Add - backlight RGB LED and/or underglow RGB LED option
|
||||||
|
* Add - continuous RGB animations feature (between L and R halves)
|
||||||
|
* Fix - keymap files to adapt to changes
|
||||||
|
* all authors of keymaps confirmed this PR
|
||||||
|
* Update - documents and rules.mk
|
||||||
|
|
||||||
|
### Refactor of TKC1800 to use common OLED code
|
||||||
|
|
||||||
|
[#8472](https://github.com/qmk/qmk_firmware/pull/8472)
|
||||||
|
|
||||||
|
Modifies the default firmware for TKC1800 to use the in-built I2C and OLED drivers, instead of including and depending on its own set of libraries for the following functionality:
|
||||||
|
|
||||||
|
- SSD1306 display
|
||||||
|
- i2c for OLED
|
||||||
|
|
||||||
|
This allows current TKC1800 firmware to advance with updates to those drivers, which are shared with other keyboards.
|
||||||
|
|
||||||
|
#### To migrate existing TKC1800 firmware:
|
||||||
|
|
||||||
|
[Changes to `config.h`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-d10b26e676b4a55cbb00d71955116526):
|
||||||
|
- Remove `#define SSD1306OLED` from config.h
|
||||||
|
|
||||||
|
[Changes to `tkc1800.c`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-3b35bd30abe89c8110717c6972cd2cc5):
|
||||||
|
- Add the following to avoid debug errors on HID_listen if the screen is not present
|
||||||
|
```c
|
||||||
|
void keyboard_pre_init_kb(void) {
|
||||||
|
setPinInputHigh(D0);
|
||||||
|
setPinInputHigh(D1);
|
||||||
|
|
||||||
|
keyboard_pre_init_user();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[Changes to `keymap.c`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-05a2a344ce27e4d045fe68520ccd4771):
|
||||||
|
- Find/Replace each instance of `#ifdef SSD1306OLED` with `#ifdef OLED_DRIVER_ENABLE`
|
||||||
|
- The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190)
|
||||||
|
- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L91-L158) the block
|
||||||
|
```c
|
||||||
|
#ifdef SSD1306OLED
|
||||||
|
iota_gfx_init(!has_usb()); // turns on the display
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
|
||||||
|
```c
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- Remove the function `iota_gfx_task_user`
|
||||||
|
|
||||||
|
### Split HHKB to ANSI and JP layouts and Add VIA support for each
|
||||||
|
|
||||||
|
[#8582](https://github.com/qmk/qmk_firmware/pull/8582)
|
||||||
|
|
||||||
|
- Splits the HHKB codebase into two separate folders `keyboards/hhkb/ansi` and `keyboards/hhkb/jp`.
|
||||||
|
- Adds VIA Configurator support for both versions.
|
||||||
|
|
||||||
|
#### Migrating existing HHKB keymaps
|
||||||
|
|
||||||
|
- Remove any checks for the `HHKB_JP` definition
|
||||||
|
- All checks for this definition have been removed, and each version uses the source that is appropriate to that version.
|
||||||
|
- Move the directory for your keymap into the appropriate `keymaps` directory
|
||||||
|
- `keyboards/hhkb/ansi/keymaps/` for ANSI HHKBs
|
||||||
|
- `keyboards/hhkb/jp/keymaps/` for HHKB JPs
|
||||||
|
- Compile with the new keyboard names
|
||||||
|
- This PR changes the compilation instructions for the HHKB Alternate Controller. To compile firmware for this controller moving forward, use:
|
||||||
|
- `make hhkb/ansi` for ANSI-layout HHKBs
|
||||||
|
- `make hhkb/jp` for HHKB JP keyboards
|
||||||
|
|
||||||
|
|
||||||
|
## Keyboard Moves
|
||||||
|
|
||||||
|
- [#8412](https://github.com/qmk/qmk_firmware/pull/8412 "Changing board names to prevent confusion") by blindassassin111
|
||||||
|
- [#8499](https://github.com/qmk/qmk_firmware/pull/8499 "Move the Keyboardio Model01 to a keyboardio/ subdir") by algernon
|
||||||
|
- [#8830](https://github.com/qmk/qmk_firmware/pull/8830 "Move spaceman keyboards") by Spaceman (formerly known as Rionlion100)
|
||||||
|
- [#8537](https://github.com/qmk/qmk_firmware/pull/8537 "Organizing my keyboards (plaid, tartan, ergoinu)") by hsgw
|
||||||
|
|
||||||
|
Keyboards by Keyboardio, Spaceman, and hsgw move to vendor folders, while PCBs designed by blindassassin111 are renamed.
|
||||||
|
|
||||||
|
Old Name | New Name
|
||||||
|
:----------------- | :-----------------
|
||||||
|
2_milk | spaceman/2_milk
|
||||||
|
at101_blackheart | at101_bh
|
||||||
|
ergoinu | dm9records/ergoinu
|
||||||
|
model01 | keyboardio/model01
|
||||||
|
omnikey_blackheart | omnikey_bh
|
||||||
|
pancake | spaceman/pancake
|
||||||
|
plaid | dm9records/plaid
|
||||||
|
tartan | dm9records/tartan
|
||||||
|
z150_blackheart | z150_bh
|
||||||
|
|
||||||
|
If you own one of these PCBs, please use the new names to compile your firmware moving forward.
|
||||||
|
|
||||||
|
|
||||||
|
## Keycode Migration PRs
|
||||||
|
|
||||||
|
[#8954](https://github.com/qmk/qmk_firmware/pull/8954 "Migrate `ACTION_LAYER_TOGGLE` to `TG()`"), [#8957](https://github.com/qmk/qmk_firmware/pull/8957 "Migrate `ACTION_MODS_ONESHOT` to `OSM()`"), [#8958](https://github.com/qmk/qmk_firmware/pull/8958 "Migrate `ACTION_DEFAULT_LAYER_SET` to `DF()`"), [#8959](https://github.com/qmk/qmk_firmware/pull/8959 "Migrate `ACTION_LAYER_MODS` to `LM()`"), [#8968](https://github.com/qmk/qmk_firmware/pull/8968 "Migrate `ACTION_MODS_TAP_KEY` to `MT()`"), [#8977](https://github.com/qmk/qmk_firmware/pull/8977 "Migrate miscellaneous `fn_actions` entries"), and [#8979](https://github.com/qmk/qmk_firmware/pull/8979 "Migrate `ACTION_MODS_KEY` to chained mod keycodes")
|
||||||
|
|
||||||
|
Authored by fauxpark, these pull requests remove references to deprecated TMK macros that have been superseded by native QMK keycodes.
|
||||||
|
|
||||||
|
Old `fn_actions` action | New QMK keycode
|
||||||
|
:---------------------- | :--------------
|
||||||
|
`ACTION_DEFAULT_LAYER_SET(layer)` | `DF(layer)`
|
||||||
|
`ACTION_LAYER_MODS(layer, mod)` | `LM(layer, mod)`
|
||||||
|
`ACTION_LAYER_ONESHOT(mod)` | `OSL(mod)`
|
||||||
|
`ACTION_LAYER_TOGGLE(layer)` | `TG(layer)`
|
||||||
|
`ACTION_MODS_ONESHOT(mod)` | `OSM(mod)`
|
||||||
|
`ACTION_MODS_TAP_KEY(mod, kc)` | `MT(mod, kc)`
|
||||||
|
`ACTION_MODS_KEY(mod, kc)`<br>e.g. `ACTION_MODS_KEY(MOD_LCTL, KC_0)` | `MOD(kc)`<br>e.g. `LCTL(KC_0)`
|
|
@ -115,6 +115,7 @@
|
||||||
* [Overview](breaking_changes.md)
|
* [Overview](breaking_changes.md)
|
||||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||||
* History
|
* History
|
||||||
|
* [2020 May 30](ChangeLog/20200530.md)
|
||||||
* [2020 Feb 29](ChangeLog/20200229.md)
|
* [2020 Feb 29](ChangeLog/20200229.md)
|
||||||
* [2019 Aug 30](ChangeLog/20190830.md)
|
* [2019 Aug 30](ChangeLog/20190830.md)
|
||||||
|
|
||||||
|
|
|
@ -6,27 +6,28 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
||||||
|
|
||||||
## What has been included in past Breaking Changes?
|
## What has been included in past Breaking Changes?
|
||||||
|
|
||||||
|
* [2020 May 30](ChangeLog/20200530.md)
|
||||||
* [2020 Feb 29](ChangeLog/20200229.md)
|
* [2020 Feb 29](ChangeLog/20200229.md)
|
||||||
* [2019 Aug 30](ChangeLog/20190830.md)
|
* [2019 Aug 30](ChangeLog/20190830.md)
|
||||||
|
|
||||||
## When is the next Breaking Change?
|
## When is the next Breaking Change?
|
||||||
|
|
||||||
The next Breaking Change is scheduled for May 30, 2020.
|
The next Breaking Change is scheduled for Aug 29, 2020.
|
||||||
|
|
||||||
### Important Dates
|
### Important Dates
|
||||||
|
|
||||||
* [x] 2020 Feb 29 - `future` is created. It will be rebased weekly.
|
* [x] 2020 May 30 - `develop` is created. It will be rebased weekly.
|
||||||
* [ ] 2020 May 2 - `future` closed to new PR's.
|
* [ ] 2020 Aug 1 - `develop` closed to new PR's.
|
||||||
* [ ] 2020 May 2 - Call for testers.
|
* [ ] 2020 Aug 1 - Call for testers.
|
||||||
* [ ] 2020 May 28 - `master` is locked, no PR's merged.
|
* [ ] 2020 Aug 27 - `master` is locked, no PR's merged.
|
||||||
* [ ] 2020 May 30 - Merge `future` to `master`.
|
* [ ] 2020 Aug 29 - Merge `develop` to `master`.
|
||||||
* [ ] 2020 May 30 - `master` is unlocked. PR's can be merged again.
|
* [ ] 2020 Aug 29 - `master` is unlocked. PR's can be merged again.
|
||||||
|
|
||||||
## What changes will be included?
|
## What changes will be included?
|
||||||
|
|
||||||
To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `future` is closed, and a PR with that label applied is not guaranteed to be merged.
|
To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `develop` is closed, and a PR with that label applied is not guaranteed to be merged.
|
||||||
|
|
||||||
If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `future` closes. After `future` closes no new breaking changes will be accepted.
|
If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `develop` closes. After `develop` closes no new breaking changes will be accepted.
|
||||||
|
|
||||||
Criteria for acceptance:
|
Criteria for acceptance:
|
||||||
|
|
||||||
|
@ -37,9 +38,9 @@ Criteria for acceptance:
|
||||||
|
|
||||||
This section documents various processes we use when running the Breaking Changes process.
|
This section documents various processes we use when running the Breaking Changes process.
|
||||||
|
|
||||||
## Rebase `future` from `master`
|
## Rebase `develop` from `master`
|
||||||
|
|
||||||
This is run every Friday while `future` is open.
|
This is run every Friday while `develop` is open.
|
||||||
|
|
||||||
Process:
|
Process:
|
||||||
|
|
||||||
|
@ -47,31 +48,31 @@ Process:
|
||||||
cd qmk_firmware
|
cd qmk_firmware
|
||||||
git checkout master
|
git checkout master
|
||||||
git pull --ff-only
|
git pull --ff-only
|
||||||
git checkout future
|
git checkout develop
|
||||||
git rebase master
|
git rebase master
|
||||||
git push --force
|
git push --force
|
||||||
```
|
```
|
||||||
|
|
||||||
## Creating the `future` branch
|
## Creating the `develop` branch
|
||||||
|
|
||||||
This happens immediately after the previous `future` branch is merged.
|
This happens immediately after the previous `develop` branch is merged.
|
||||||
|
|
||||||
* `qmk_firmware` git commands
|
* `qmk_firmware` git commands
|
||||||
* [ ] `git checkout master`
|
* [ ] `git checkout master`
|
||||||
* [ ] `git pull --ff-only`
|
* [ ] `git pull --ff-only`
|
||||||
* [ ] `git checkout -b future`
|
* [ ] `git checkout -b develop`
|
||||||
* [ ] Edit `readme.md`
|
* [ ] Edit `readme.md`
|
||||||
* [ ] Add a big notice at the top that this is a testing branch.
|
* [ ] Add a big notice at the top that this is a testing branch.
|
||||||
* [ ] Include a link to this document
|
* [ ] Include a link to this document
|
||||||
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
|
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
|
||||||
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
|
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
|
||||||
* [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
|
* [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
|
||||||
* [ ] `git push origin future`
|
* [ ] `git push origin develop`
|
||||||
* [ ] `git push --tags`
|
* [ ] `git push --tags`
|
||||||
|
|
||||||
## 4 Weeks Before Merge
|
## 4 Weeks Before Merge
|
||||||
|
|
||||||
* `future` is now closed to new PR's, only fixes for current PR's may be merged
|
* `develop` is now closed to new PR's, only fixes for current PR's may be merged
|
||||||
* Post call for testers
|
* Post call for testers
|
||||||
* [ ] Discord
|
* [ ] Discord
|
||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
|
@ -94,15 +95,15 @@ This happens immediately after the previous `future` branch is merged.
|
||||||
## Day Of Merge
|
## Day Of Merge
|
||||||
|
|
||||||
* `qmk_firmware` git commands
|
* `qmk_firmware` git commands
|
||||||
* [ ] `git checkout future`
|
* [ ] `git checkout develop`
|
||||||
* [ ] `git pull --ff-only`
|
* [ ] `git pull --ff-only`
|
||||||
* [ ] `git rebase origin/master`
|
* [ ] `git rebase origin/master`
|
||||||
* [ ] Edit `readme.md`
|
* [ ] Edit `readme.md`
|
||||||
* [ ] Remove the notes about `future`
|
* [ ] Remove the notes about `develop`
|
||||||
* [ ] Roll up the ChangeLog into one file.
|
* [ ] Roll up the ChangeLog into one file.
|
||||||
* [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
|
* [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
|
||||||
* [ ] `git push origin future`
|
* [ ] `git push origin develop`
|
||||||
* GitHub Actions
|
* GitHub Actions
|
||||||
* [ ] Create a PR for `future`
|
* [ ] Create a PR for `develop`
|
||||||
* [ ] Make sure travis comes back clean
|
* [ ] Make sure travis comes back clean
|
||||||
* [ ] Merge `future` PR
|
* [ ] Merge `develop` PR
|
||||||
|
|
|
@ -27,7 +27,7 @@ If you are contributing core code, and the only reason it needs to go through br
|
||||||
|
|
||||||
We require submissions that go through the Breaking Change process to include a changelog entry. The entry should be a short summary of the changes your pull request makes – [each section here started as a changelog](ChangeLog/20190830.md "n.b. This should link to the 2019 Aug 30 Breaking Changes doc - @noroadsleft").
|
We require submissions that go through the Breaking Change process to include a changelog entry. The entry should be a short summary of the changes your pull request makes – [each section here started as a changelog](ChangeLog/20190830.md "n.b. This should link to the 2019 Aug 30 Breaking Changes doc - @noroadsleft").
|
||||||
|
|
||||||
Your changelog should be located at `docs/ChangeLog/YYYYMMDD/PR####.md`, where `YYYYMMDD` is the date on which QMK's breaking change branch – usually named `future` – will be merged into the `master` branch, and `####` is the number of your pull request.
|
Your changelog should be located at `docs/ChangeLog/YYYYMMDD/PR####.md`, where `YYYYMMDD` is the date on which QMK's breaking change branch – usually named `develop` – will be merged into the `master` branch, and `####` is the number of your pull request.
|
||||||
|
|
||||||
If your submission requires action on the part of users, your changelog should instruct users what action(s) must be taken, or link to a location that does so.
|
If your submission requires action on the part of users, your changelog should instruct users what action(s) must be taken, or link to a location that does so.
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
case KC_ENTER:
|
case KC_ENTER:
|
||||||
// Play a tone when enter is pressed
|
// Play a tone when enter is pressed
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
PLAY_SONG(tone_qwerty);
|
||||||
}
|
}
|
||||||
return true; // Let QMK send the enter press/release events
|
return true; // Let QMK send the enter press/release events
|
||||||
default:
|
default:
|
||||||
|
@ -438,7 +438,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
case KC_ENTER:
|
case KC_ENTER:
|
||||||
// Play a tone when enter is pressed
|
// Play a tone when enter is pressed
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
PLAY_SONG(tone_qwerty);
|
||||||
}
|
}
|
||||||
return true; // Let QMK send the enter press/release events
|
return true; // Let QMK send the enter press/release events
|
||||||
case RGB_LYR: // This allows me to use underglow as layer indication, or as normal
|
case RGB_LYR: // This allows me to use underglow as layer indication, or as normal
|
||||||
|
@ -486,56 +486,3 @@ And you're done. The RGB layer indication will only work if you want it to. And
|
||||||
* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
|
* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
|
||||||
|
|
||||||
The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
|
The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
|
||||||
|
|
||||||
# Custom Tapping Term
|
|
||||||
|
|
||||||
By default, the tapping term and related options (such as `IGNORE_MOD_TAP_INTERRUPT`) are defined globally, and are not configurable by key. For most users, this is perfectly fine. But in some cases, dual function keys would be greatly improved by different timeout behaviors than `LT` keys, or because some keys may be easier to hold than others. Instead of using custom key codes for each, this allows for per key configurable timeout behaviors.
|
|
||||||
|
|
||||||
There are two configurable options to control per-key timeout behaviors:
|
|
||||||
|
|
||||||
- `TAPPING_TERM_PER_KEY`
|
|
||||||
- `IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
|
|
||||||
|
|
||||||
You need to add `#define` lines to your `config.h` for each feature you want.
|
|
||||||
|
|
||||||
```
|
|
||||||
#define TAPPING_TERM_PER_KEY
|
|
||||||
#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Example `get_tapping_term` Implementation
|
|
||||||
|
|
||||||
To change the `TAPPING_TERM` based on the keycode, you'd want to add something like the following to your `keymap.c` file:
|
|
||||||
|
|
||||||
```c
|
|
||||||
uint16_t get_tapping_term(uint16_t keycode) {
|
|
||||||
switch (keycode) {
|
|
||||||
case SFT_T(KC_SPC):
|
|
||||||
return TAPPING_TERM + 1250;
|
|
||||||
case LT(1, KC_GRV):
|
|
||||||
return 130;
|
|
||||||
default:
|
|
||||||
return TAPPING_TERM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example `get_ignore_mod_tap_interrupt` Implementation
|
|
||||||
|
|
||||||
To change the `IGNORE_MOD_TAP_INTERRUPT` value based on the keycode, you'd want to add something like the following to your `keymap.c` file:
|
|
||||||
|
|
||||||
```c
|
|
||||||
bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
|
|
||||||
switch (keycode) {
|
|
||||||
case SFT_T(KC_SPC):
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## `get_tapping_term` / `get_ignore_mod_tap_interrupt` Function Documentation
|
|
||||||
|
|
||||||
Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.
|
|
||||||
|
|
|
@ -374,7 +374,8 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
|
||||||
```c
|
```c
|
||||||
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
|
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
|
||||||
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
|
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
|
||||||
#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
|
#define RGB_DISABLE_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off
|
||||||
|
#define RGB_DISABLE_AFTER_TIMEOUT 0 // OBSOLETE: number of ticks to wait until disabling effects
|
||||||
#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
|
#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
|
||||||
#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
||||||
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
||||||
|
|
|
@ -62,7 +62,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
case KC_ENTER:
|
case KC_ENTER:
|
||||||
// enter が押された時に音を再生します
|
// enter が押された時に音を再生します
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
PLAY_SONG(tone_qwerty);
|
||||||
}
|
}
|
||||||
return true; // QMK に enter のプレスまたはリリースイベントを送信させます
|
return true; // QMK に enter のプレスまたはリリースイベントを送信させます
|
||||||
default:
|
default:
|
||||||
|
@ -440,7 +440,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
case KC_ENTER:
|
case KC_ENTER:
|
||||||
// enter が押された時に音を再生します
|
// enter が押された時に音を再生します
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
PLAY_SONG(tone_qwerty);
|
||||||
}
|
}
|
||||||
return true; // QMK に enter のプレスまたはリリースイベントを送信させます
|
return true; // QMK に enter のプレスまたはリリースイベントを送信させます
|
||||||
case RGB_LYR: // これにより、アンダーグローをレイヤー表示として、あるいは通常通りに使うことができます。
|
case RGB_LYR: // これにより、アンダーグローをレイヤー表示として、あるいは通常通りに使うことができます。
|
||||||
|
@ -511,7 +511,7 @@ void eeconfig_init_user(void) { // EEPROM がリセットされます!
|
||||||
キーコードに基づいて `TAPPING_TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
|
キーコードに基づいて `TAPPING_TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
uint16_t get_tapping_term(uint16_t keycode) {
|
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case SFT_T(KC_SPC):
|
case SFT_T(KC_SPC):
|
||||||
return TAPPING_TERM + 1250;
|
return TAPPING_TERM + 1250;
|
||||||
|
@ -528,7 +528,7 @@ uint16_t get_tapping_term(uint16_t keycode) {
|
||||||
キーコードに基づいて `IGNORE_MOD_TAP_INTERRUPT` の値を変更するには、次のようなものを `keymap.c` ファイルに追加します:
|
キーコードに基づいて `IGNORE_MOD_TAP_INTERRUPT` の値を変更するには、次のようなものを `keymap.c` ファイルに追加します:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
|
bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case SFT_T(KC_SPC):
|
case SFT_T(KC_SPC):
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -4,6 +4,38 @@ While Tap-Hold options are fantastic, they are not without their issues. We hav
|
||||||
|
|
||||||
These options let you modify the behavior of the Tap-Hold keys.
|
These options let you modify the behavior of the Tap-Hold keys.
|
||||||
|
|
||||||
|
## Tapping Term
|
||||||
|
|
||||||
|
The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. And the exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key.
|
||||||
|
|
||||||
|
You can set the global time for this by adding the following setting to your `config.h`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define TAPPING_TERM 200
|
||||||
|
```
|
||||||
|
|
||||||
|
This setting is defined in milliseconds, and does default to 200ms. This is a good average for a majority of people.
|
||||||
|
|
||||||
|
For more granular control of this feature, you can add the following to your `config.h`:
|
||||||
|
```c
|
||||||
|
#define TAPPING_TERM_PER_KEY
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then add the following function to your keymap:
|
||||||
|
|
||||||
|
```c
|
||||||
|
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
switch (keycode) {
|
||||||
|
case SFT_T(KC_SPC):
|
||||||
|
return TAPPING_TERM + 1250;
|
||||||
|
case LT(1, KC_GRV):
|
||||||
|
return 130;
|
||||||
|
default:
|
||||||
|
return TAPPING_TERM;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Permissive Hold
|
## Permissive Hold
|
||||||
|
|
||||||
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
|
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
|
||||||
|
@ -27,6 +59,25 @@ Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this wil
|
||||||
|
|
||||||
?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
|
?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
|
||||||
|
|
||||||
|
For more granular control of this feature, you can add the following to your `config.h`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define PERMISSIVE_HOLD_PER_KEY
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then add the following function to your keymap:
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
switch (keycode) {
|
||||||
|
case LT(1, KC_BSPC):
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Ignore Mod Tap Interrupt
|
## Ignore Mod Tap Interrupt
|
||||||
|
|
||||||
To enable this setting, add this to your `config.h`:
|
To enable this setting, add this to your `config.h`:
|
||||||
|
@ -62,7 +113,7 @@ For more granular control of this feature, you can add the following to your `co
|
||||||
You can then add the following function to your keymap:
|
You can then add the following function to your keymap:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
|
bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case SFT_T(KC_SPC):
|
case SFT_T(KC_SPC):
|
||||||
return true;
|
return true;
|
||||||
|
@ -126,3 +177,13 @@ To enable `retro tapping`, add the following to your `config.h`:
|
||||||
Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
|
Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
|
||||||
|
|
||||||
For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead.
|
For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead.
|
||||||
|
|
||||||
|
## Why do we include the key record for the per key functions?
|
||||||
|
|
||||||
|
One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that.
|
||||||
|
|
||||||
|
Well, it's simply really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine tune those to not interfere with your normal typing.
|
||||||
|
|
||||||
|
## Why is there no `*_kb` or `*_user` functions?!
|
||||||
|
|
||||||
|
Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.
|
||||||
|
|
|
@ -57,7 +57,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
case KC_ENTER:
|
case KC_ENTER:
|
||||||
// 当按下回车时播放音符
|
// 当按下回车时播放音符
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
PLAY_SONG(tone_qwerty);
|
||||||
}
|
}
|
||||||
return true; // 让QMK触发回车按下/释放事件
|
return true; // 让QMK触发回车按下/释放事件
|
||||||
default:
|
default:
|
||||||
|
@ -413,7 +413,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
case KC_ENTER:
|
case KC_ENTER:
|
||||||
// 在按下回车时播放音符
|
// 在按下回车时播放音符
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
PLAY_NOTE_ARRAY(tone_qwerty);
|
PLAY_SONG(tone_qwerty);
|
||||||
}
|
}
|
||||||
return true; // 让QMK产生回车按下/释放事件
|
return true; // 让QMK产生回车按下/释放事件
|
||||||
case RGB_LYR: // 本句让underglow作为层指示,或正常使用。
|
case RGB_LYR: // 本句让underglow作为层指示,或正常使用。
|
||||||
|
@ -473,7 +473,7 @@ void eeconfig_init_user(void) { // EEPROM正被重置
|
||||||
想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加如下代码:
|
想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加如下代码:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
uint16_t get_tapping_term(uint16_t keycode) {
|
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case SFT_T(KC_SPC):
|
case SFT_T(KC_SPC):
|
||||||
return TAPPING_TERM + 1250;
|
return TAPPING_TERM + 1250;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
#include "at101_bh.h"
|
|
@ -1,5 +1,4 @@
|
||||||
#ifndef at101_blackheart_H
|
#pragma once
|
||||||
#define at101_blackheart_H
|
|
||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
|
@ -24,5 +23,3 @@
|
||||||
{ K1000, K1001, KC_NO, KC_NO, KC_NO, K1005, K1006, K1007, K1008, K1009 }, \
|
{ K1000, K1001, KC_NO, KC_NO, KC_NO, K1005, K1006, K1007, K1008, K1009 }, \
|
||||||
{ K1100, K1101, K1102, KC_NO, KC_NO, K1105, K1106, K1107, K1108, KC_NO } \
|
{ K1100, K1101, K1102, KC_NO, KC_NO, K1105, K1106, K1107, K1108, KC_NO } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
|
@ -7,7 +7,7 @@
|
||||||
#define PRODUCT_ID 0x6060
|
#define PRODUCT_ID 0x6060
|
||||||
#define DEVICE_VER 0x0001
|
#define DEVICE_VER 0x0001
|
||||||
#define MANUFACTURER blindassassin111
|
#define MANUFACTURER blindassassin111
|
||||||
#define PRODUCT AT101_Blackheart PCB
|
#define PRODUCT AT101_BH PCB
|
||||||
#define DESCRIPTION Replacement AT101 PCB
|
#define DESCRIPTION Replacement AT101 PCB
|
||||||
|
|
||||||
/* key matrix size */
|
/* key matrix size */
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"keyboard_name": "AT101 Blackheart PCB",
|
"keyboard_name": "AT101 BH PCB",
|
||||||
"keyboard_folder": "at101_blackheart",
|
"keyboard_folder": "at101_bh",
|
||||||
"url": "https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html",
|
"url": "https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html",
|
||||||
"maintainer": "qmk, blindassassin111",
|
"maintainer": "qmk, blindassassin111",
|
||||||
"width": 22.5,
|
"width": 22.5,
|
|
@ -1,15 +1,15 @@
|
||||||
# AT101 Blackheart PCB
|
# AT101 BH PCB
|
||||||
|
|
||||||
![AT101 Blackheart PCB](https://deskthority.net/resources/image/48571)
|
![AT101 BH PCB](https://deskthority.net/resources/image/48571)
|
||||||
|
|
||||||
A replacement PCB for AT101 keyboards.
|
A replacement PCB for AT101 keyboards.
|
||||||
|
|
||||||
Keyboard Maintainer: QMK Community and blindassassin111
|
Keyboard Maintainer: QMK Community and blindassassin111
|
||||||
Hardware Supported: AT101 blackheart PCB
|
Hardware Supported: AT101 BH PCB
|
||||||
Hardware Availability: https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html
|
Hardware Availability: https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
make at101_blackheart:default
|
make at101_bh: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).
|
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).
|
|
@ -1 +0,0 @@
|
||||||
#include "at101_blackheart.h"
|
|
|
@ -102,7 +102,7 @@ enum keyboard_macros {
|
||||||
#define SC_CCLS LCTL(KC_F4)
|
#define SC_CCLS LCTL(KC_F4)
|
||||||
|
|
||||||
#define TG_NKRO MAGIC_TOGGLE_NKRO
|
#define TG_NKRO MAGIC_TOGGLE_NKRO
|
||||||
#define OS_SHFT KC_FN0
|
#define OS_SHFT OSM(MOD_LSFT)
|
||||||
|
|
||||||
#define ________________ _______, _______
|
#define ________________ _______, _______
|
||||||
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
|
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
|
||||||
|
@ -258,10 +258,6 @@ void persistent_default_layer_set(uint16_t default_layer) {
|
||||||
default_layer_set(default_layer);
|
default_layer_set(default_layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
|
||||||
[0] = ACTION_MODS_ONESHOT(MOD_LSFT),
|
|
||||||
};
|
|
||||||
|
|
||||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
|
||||||
// MACRODOWN only works in this function
|
// MACRODOWN only works in this function
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
#define KC_RAIS MO(RAISE)
|
#define KC_RAIS MO(RAISE)
|
||||||
#define KC_LOWR MO(LOWER)
|
#define KC_LOWR MO(LOWER)
|
||||||
|
#define KC_TGBD TG(BDO)
|
||||||
|
#define KC_TGRS TG(RESETL)
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[DVORAK] = LAYOUT_kc(
|
[DVORAK] = LAYOUT_kc(
|
||||||
|
@ -17,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
NO, QUOT, COMM, DOT, P, Y, F, G, C, R, L, NO, \
|
NO, QUOT, COMM, DOT, P, Y, F, G, C, R, L, NO, \
|
||||||
NO, A, O, E, U, I, D, H, T, N, S, NO, \
|
NO, A, O, E, U, I, D, H, T, N, S, NO, \
|
||||||
NO, SCLN, Q, J, K, X, B, M, W, V, Z, NO, \
|
NO, SCLN, Q, J, K, X, B, M, W, V, Z, NO, \
|
||||||
NO, FN2, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
|
NO, TGBD, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
|
||||||
),
|
),
|
||||||
|
|
||||||
[QWERTY] = LAYOUT_kc(
|
[QWERTY] = LAYOUT_kc(
|
||||||
|
@ -25,7 +27,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
NO, Q, W, E, R, T, Y, U, I, O, P, NO, \
|
NO, Q, W, E, R, T, Y, U, I, O, P, NO, \
|
||||||
NO, A, S, D, F, G, H, J, K, L, SCLN, NO, \
|
NO, A, S, D, F, G, H, J, K, L, SCLN, NO, \
|
||||||
NO, Z, X, C, V, B, N, M, COMM, DOT, SLSH, NO, \
|
NO, Z, X, C, V, B, N, M, COMM, DOT, SLSH, NO, \
|
||||||
NO, FN2, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
|
NO, TGBD, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
|
||||||
),
|
),
|
||||||
|
|
||||||
[RAISE] = LAYOUT_kc(
|
[RAISE] = LAYOUT_kc(
|
||||||
|
@ -33,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
NO, TILD, GRV, LCBR, RCBR, DQUO, QUOT, EQL, PLUS, MINS, QUES, NO, \
|
NO, TILD, GRV, LCBR, RCBR, DQUO, QUOT, EQL, PLUS, MINS, QUES, NO, \
|
||||||
NO, ESC, TAB, LPRN, RPRN, BSLS, SLSH, LEFT, DOWN, UP, RGHT, NO, \
|
NO, ESC, TAB, LPRN, RPRN, BSLS, SLSH, LEFT, DOWN, UP, RGHT, NO, \
|
||||||
NO, TRNS, TRNS, LBRC, RBRC, TRNS, INS, PIPE, UNDS, TRNS, TRNS, NO, \
|
NO, TRNS, TRNS, LBRC, RBRC, TRNS, INS, PIPE, UNDS, TRNS, TRNS, NO, \
|
||||||
NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN3, NO
|
NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TGRS, NO
|
||||||
),
|
),
|
||||||
|
|
||||||
[LOWER] = LAYOUT_kc(
|
[LOWER] = LAYOUT_kc(
|
||||||
|
@ -49,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
NO, TAB, Q, W, E, R, 6, Y, I, O, P, NO, \
|
NO, TAB, Q, W, E, R, 6, Y, I, O, P, NO, \
|
||||||
NO, LSFT, A, S, D, F, 7, G, H, J, K, NO, \
|
NO, LSFT, A, S, D, F, 7, G, H, J, K, NO, \
|
||||||
NO, T, Z, X, C, V, 8, B, N, M, L, NO, \
|
NO, T, Z, X, C, V, 8, B, N, M, L, NO, \
|
||||||
NO, LCTL, SPC, SPC, SPC, SPC, COMM, ENT, 9, NO, NO, NO, FN2, NO
|
NO, LCTL, SPC, SPC, SPC, SPC, COMM, ENT, 9, NO, NO, NO, TGBD, NO
|
||||||
),
|
),
|
||||||
|
|
||||||
[RESETL] = LAYOUT(
|
[RESETL] = LAYOUT(
|
||||||
|
@ -57,15 +59,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_FN3,KC_NO
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, TG(RESETL),KC_NO
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
|
||||||
[2] = ACTION_LAYER_TOGGLE(BDO), // BDO layer
|
|
||||||
[3] = ACTION_LAYER_TOGGLE(RESETL) // RESET layer
|
|
||||||
};
|
|
||||||
|
|
||||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
// MACRODOWN only works in this function
|
// MACRODOWN only works in this function
|
||||||
switch (id) {
|
switch (id) {
|
||||||
|
|
|
@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
KC_TAB, SE_AO, SE_AE, SE_OE, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_COMM,SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \
|
KC_TAB, SE_AO, SE_AE, SE_OE, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_COMM,SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \
|
||||||
KC_LCTRL,KC_A, KC_O, KC_E, KC_U, KC_I, KC_H, KC_D, KC_T, KC_N, KC_S, SE_MINS, KC_ENT, \
|
KC_LCTRL,KC_A, KC_O, KC_E, KC_U, KC_I, KC_H, KC_D, KC_T, KC_N, KC_S, SE_MINS, KC_ENT, \
|
||||||
KC_LSFT, SE_LTGT,KC_DOT, KC_Q, KC_J, KC_K, KC_B, KC_X, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, \
|
KC_LSFT, SE_LTGT,KC_DOT, KC_Q, KC_J, KC_K, KC_B, KC_X, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, \
|
||||||
MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_FN1, KC_LEFT,KC_DOWN,KC_RGHT),
|
MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,TG(KM_QWERTY), KC_LEFT,KC_DOWN,KC_RGHT),
|
||||||
/* Layer 1: Standard ISO layer */
|
/* Layer 1: Standard ISO layer */
|
||||||
[KM_QWERTY] = LAYOUT( \
|
[KM_QWERTY] = LAYOUT( \
|
||||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,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_SLCK,KC_PAUS, \
|
||||||
|
@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, SE_AO, SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, SE_AO, SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \
|
||||||
KC_LCTRL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SE_OE, SE_AE, KC_ENT, \
|
KC_LCTRL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SE_OE, SE_AE, KC_ENT, \
|
||||||
KC_LSFT, SE_LTGT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, SE_MINS, KC_RSFT, KC_UP, \
|
KC_LSFT, SE_LTGT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, SE_MINS, KC_RSFT, KC_UP, \
|
||||||
MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_FN1, KC_LEFT,KC_DOWN,KC_RGHT),
|
MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,TG(KM_QWERTY), KC_LEFT,KC_DOWN,KC_RGHT),
|
||||||
/* Layer 2: Media layer */
|
/* Layer 2: Media layer */
|
||||||
[KM_MEDIA] = LAYOUT( \
|
[KM_MEDIA] = LAYOUT( \
|
||||||
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_WAKE,KC_PWR, KC_SLEP, \
|
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_WAKE,KC_PWR, KC_SLEP, \
|
||||||
|
@ -75,10 +75,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
_______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______),
|
_______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______),
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
|
||||||
[1] = ACTION_LAYER_TOGGLE(KM_QWERTY)
|
|
||||||
};
|
|
||||||
|
|
||||||
void matrix_scan_user(void)
|
void matrix_scan_user(void)
|
||||||
{
|
{
|
||||||
uint8_t layer = biton32(layer_state);
|
uint8_t layer = biton32(layer_state);
|
||||||
|
|
|
@ -158,12 +158,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
//#define MAGIC_KEY_SLEEP_LED Z
|
//#define MAGIC_KEY_SLEEP_LED Z
|
||||||
|
|
||||||
// Audio Click
|
// Audio Click
|
||||||
#define AUDIO_CLICKY
|
//#define AUDIO_CLICKY
|
||||||
|
|
||||||
// Music Mode Polyphony
|
// Music Mode Polyphony
|
||||||
// NOTE: Must change polyphony_rate to a number higher than 0 in voices.c
|
// NOTE: Must change polyphony_rate to a number higher than 0 in voices.c
|
||||||
#define AUDIO_VOICES
|
//#define AUDIO_VOICES
|
||||||
#define PITCH_STANDARD_A 880.0f
|
//#define PITCH_STANDARD_A 880.0f
|
||||||
|
|
||||||
// Mouse keys
|
// Mouse keys
|
||||||
#define MOUSEKEY_DELAY 0
|
#define MOUSEKEY_DELAY 0
|
||||||
|
|
|
@ -28,5 +28,5 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by d
|
||||||
#MIDI_ENABLE = yes # MIDI controls
|
#MIDI_ENABLE = yes # MIDI controls
|
||||||
UNICODE_ENABLE = no # Unicode
|
UNICODE_ENABLE = no # Unicode
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = yes # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
|
|
|
@ -38,6 +38,7 @@ void matrix_scan_user(void) {
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
case SONG_SU:
|
case SONG_SU:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
PLAY_SONG(tone_startup);
|
PLAY_SONG(tone_startup);
|
||||||
|
@ -58,7 +59,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||||
MIDI_ENABLE = no # MIDI controls
|
MIDI_ENABLE = no # MIDI controls
|
||||||
AUDIO_ENABLE = yes # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output
|
||||||
UNICODE_ENABLE = no # Unicode
|
UNICODE_ENABLE = no # Unicode
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||||
|
|
|
@ -175,7 +175,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
// Configure ignore mod tap interrupt per key
|
// Configure ignore mod tap interrupt per key
|
||||||
bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
|
bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
// I don't like how mod tap interrupt feels with these keys specifically when I'm typing
|
// I don't like how mod tap interrupt feels with these keys specifically when I'm typing
|
||||||
case LCTL_T(KC_ESC):
|
case LCTL_T(KC_ESC):
|
||||||
|
|
|
@ -283,13 +283,9 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
||||||
CAPS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, INS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
CAPS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, INS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
||||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
||||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, TILD, TRNS,APP, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
|
||||||
TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS
|
TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
const action_t PROGMEM fn_actions[] = {
|
|
||||||
[1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -124,7 +124,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
|
||||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
|
oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint16_t get_tapping_term(uint16_t keycode) {
|
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case ALT_T(KC_A):
|
case ALT_T(KC_A):
|
||||||
return TAPPING_TERM + 100;
|
return TAPPING_TERM + 100;
|
||||||
|
|
|
@ -26,7 +26,7 @@ void matrix_init_kb(void)
|
||||||
|
|
||||||
#ifdef AUDIO_ENABLE
|
#ifdef AUDIO_ENABLE
|
||||||
audio_init();
|
audio_init();
|
||||||
PLAY_NOTE_ARRAY(test_sound, false, STACCATO);
|
PLAY_SONG(test_sound);
|
||||||
// Fix port B5
|
// Fix port B5
|
||||||
cbi(DDRB, 5);
|
cbi(DDRB, 5);
|
||||||
sbi(PORTB, 5);
|
sbi(PORTB, 5);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"keyboard_name": "Ergoinu",
|
"keyboard_name": "Ergoinu",
|
||||||
"url": "",
|
"url": "",
|
||||||
"maintainer": "hsgw",
|
"maintainer": "hsgw(Takuya Urakawa)",
|
||||||
"width": 18,
|
"width": 18,
|
||||||
"height": 5.4,
|
"height": 5.4,
|
||||||
"layouts": {
|
"layouts": {
|
|
@ -11,11 +11,11 @@ Hardware Availability & Repository: [https://github.com/hsgw/ergoinu](https://gi
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
make ergoinu:default
|
make dm9records/ergoinu:default
|
||||||
|
|
||||||
(or)
|
(or)
|
||||||
|
|
||||||
make ergoinu:default_jis
|
make dm9records/ergoinu:default_jis
|
||||||
|
|
||||||
|
|
||||||
See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
|
See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
|
|
@ -35,8 +35,6 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
CUSTOM_MATRIX = yes
|
CUSTOM_MATRIX = yes
|
||||||
SRC += matrix.c serial.c split_util.c
|
SRC += matrix.c serial.c split_util.c
|
||||||
|
|
||||||
DEFAULT_FOLDER = ergoinu
|
|
||||||
|
|
||||||
# ergoinu configs
|
# ergoinu configs
|
||||||
DISABLE_PROMICRO_LEDs = yes
|
DISABLE_PROMICRO_LEDs = yes
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
{
|
{
|
||||||
"keyboard_name": "Plaid // Through Hole",
|
"keyboard_name": "Plaid // Through Hole",
|
||||||
"keyboard_folder": "planid",
|
"keyboard_folder": "dm9records/plaid",
|
||||||
"url": "https://github.com/hsgw/plaid",
|
"url": "https://github.com/hsgw/plaid",
|
||||||
"maintainer": "hsgw",
|
"maintainer": "hsgw(Takuya Urakawa)",
|
||||||
"width": 12,
|
"width": 12,
|
||||||
"height": 4,
|
"height": 4,
|
||||||
"layouts": {
|
"layouts": {
|
|
@ -9,11 +9,11 @@ Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/hsgw/plaid)
|
||||||
Hardware Availability: Group buy in r/mk
|
Hardware Availability: Group buy in r/mk
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
Make example for this keyboard (after setting up your build environment):
|
||||||
make plaid:default
|
make dm9records/plaid:default
|
||||||
|
|
||||||
Flashing example for this keyboard:
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
make plaid:default:flash
|
make dm9records/plaid:default:flash
|
||||||
|
|
||||||
## Bootloader
|
## Bootloader
|
||||||
use usbasploader in my repository.
|
use usbasploader in my repository.
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"keyboard_name": "Tartan # Through Hole",
|
"keyboard_name": "Tartan # Through Hole",
|
||||||
"keyboard_folder": "tartan",
|
"keyboard_folder": "dm9records/tartan",
|
||||||
"url": "https://github.com/hsgw/tartan",
|
"url": "https://github.com/hsgw/tartan",
|
||||||
"maintainer": "hsgw(Takuya Urakawa)",
|
"maintainer": "hsgw(Takuya Urakawa)",
|
||||||
"width": 13,
|
"width": 13,
|
|
@ -10,12 +10,12 @@ A 60% keyboard with only through hole components.
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
make tartan:default
|
make dm9records/tartan:default
|
||||||
|
|
||||||
Flash firmware:
|
Flash firmware:
|
||||||
|
|
||||||
// In bootloader mode
|
// In bootloader mode
|
||||||
make tartan:default:flash
|
make dm9records/tartan:default:flash
|
||||||
|
|
||||||
## Bootloader
|
## Bootloader
|
||||||
use usbasploader in my repository.
|
use usbasploader in my repository.
|
|
@ -23,7 +23,7 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||||
MIDI_ENABLE = yes # MIDI controls
|
MIDI_ENABLE = yes # MIDI controls
|
||||||
AUDIO_ENABLE = yes # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output
|
||||||
UNICODE_ENABLE = no # Unicode
|
UNICODE_ENABLE = no # Unicode
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
||||||
|
|
|
@ -9,10 +9,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
|
||||||
[1] = TT(1)
|
|
||||||
};
|
|
||||||
|
|
||||||
layer_state_t layer_state_set_user(layer_state_t state) {
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
|
||||||
uint8_t layer = get_highest_layer(state);
|
uint8_t layer = get_highest_layer(state);
|
||||||
|
|
|
@ -18,17 +18,6 @@ enum custom_keycodes {
|
||||||
ADJUST,
|
ADJUST,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Fn keys */
|
|
||||||
|
|
||||||
enum {
|
|
||||||
|
|
||||||
F_SFT = 0,
|
|
||||||
F_ALT,
|
|
||||||
F_CTRL,
|
|
||||||
F_NUMPAD
|
|
||||||
// F_LOWER,
|
|
||||||
// F_RAISE,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define KC_ KC_TRNS
|
#define KC_ KC_TRNS
|
||||||
#define KC_XXXX KC_NO
|
#define KC_XXXX KC_NO
|
||||||
|
@ -57,8 +46,8 @@ enum {
|
||||||
#define KC_UDO LCTL(KC_Z)
|
#define KC_UDO LCTL(KC_Z)
|
||||||
#define KC_CUT LCTL(KC_X)
|
#define KC_CUT LCTL(KC_X)
|
||||||
#define KC_SVE LCTL(KC_S)
|
#define KC_SVE LCTL(KC_S)
|
||||||
#define KC_OSH F(F_SFT)
|
#define KC_OSH OSM(MOD_LSFT)
|
||||||
#define KC_OCTL F(F_CTRL)
|
#define KC_OCTL OSM(MOD_LCTL)
|
||||||
#define KC_NUMP TT(_NUMPAD)
|
#define KC_NUMP TT(_NUMPAD)
|
||||||
#define KC_SHESC MT(MOD_LSFT,KC_ESC)
|
#define KC_SHESC MT(MOD_LSFT,KC_ESC)
|
||||||
#define KC_SHENT MT(MOD_RSFT,KC_ENT)
|
#define KC_SHENT MT(MOD_RSFT,KC_ENT)
|
||||||
|
@ -142,14 +131,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
|
||||||
[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
|
|
||||||
,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
|
|
||||||
,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case COLEMAK:
|
case COLEMAK:
|
||||||
|
|
|
@ -65,9 +65,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
*/
|
*/
|
||||||
[_FL] = LAYOUT(
|
[_FL] = LAYOUT(
|
||||||
KC_GRAVE,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_DELETE, \
|
KC_GRAVE,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_DELETE, \
|
||||||
KC_TRNS,F(1),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_CALC,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS, \
|
KC_TRNS,TG(1),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_CALC,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS, \
|
||||||
KC_TRNS,KC_MUTE,KC__VOLDOWN,KC__VOLUP,KC_TRNS,KC_TRNS,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,KC_TRNS,KC_TRNS,KC_TRNS, \
|
KC_TRNS,KC_MUTE,KC__VOLDOWN,KC__VOLUP,KC_TRNS,KC_TRNS,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,KC_TRNS,KC_TRNS,KC_TRNS, \
|
||||||
KC_TRNS,KC_TRNS,F(3),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_END,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
|
KC_TRNS,KC_TRNS,TG(3),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_END,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
|
||||||
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
|
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -106,8 +106,6 @@ enum function_id {
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
[1] = ACTION_LAYER_TOGGLE(1), // Toggle Arrow Layer overlay
|
|
||||||
[3] = ACTION_LAYER_TOGGLE(3), // Toggle Underglow Layer overlay
|
|
||||||
[4] = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow
|
[4] = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow
|
||||||
[5] = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode
|
[5] = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode
|
||||||
[6] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
|
[6] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
|
||||||
|
|
|
@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_PGUP, KC_TRNS, KC_END, KC_MPRV, KC_MNXT, KC_MPLY, \
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_PGUP, KC_TRNS, KC_END, KC_MPRV, KC_MNXT, KC_MPLY, \
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, \
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, KC_HOME, LCTL(KC_LEFT), LCTL(KC_END), LCTL(KC_RIGHT), KC_TRNS, RESET, \
|
KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, KC_HOME, LCTL(KC_LEFT), LCTL(KC_END), LCTL(KC_RIGHT), KC_TRNS, RESET, \
|
||||||
KC_TRNS, KC_TRNS, F(9), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
KC_TRNS, KC_TRNS, LM(2, MOD_LSFT), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
[_SL] = LAYOUT_60_ansi(
|
[_SL] = LAYOUT_60_ansi(
|
||||||
|
@ -99,7 +99,6 @@ const uint16_t PROGMEM fn_actions[] = {
|
||||||
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
|
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
|
||||||
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
|
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
|
||||||
#endif
|
#endif
|
||||||
[9] = ACTION_LAYER_MODS(2, MOD_LSFT)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
|
|
@ -29,7 +29,6 @@ TRAN
|
||||||
#define TT_SYM MO(_SYM)
|
#define TT_SYM MO(_SYM)
|
||||||
#define TT_MOV LT(_MOV,KC_BSPC)
|
#define TT_MOV LT(_MOV,KC_BSPC)
|
||||||
#define TT_NUM MO(_NUM)
|
#define TT_NUM MO(_NUM)
|
||||||
#define SSFT ACTION_MODS_ONESHOT(MOD_LSFT)
|
|
||||||
|
|
||||||
enum macro_keycodes {
|
enum macro_keycodes {
|
||||||
DHPASTE=1,
|
DHPASTE=1,
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
#include "ansi.h"
|
|
@ -0,0 +1,23 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
#define LAYOUT( \
|
||||||
|
K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \
|
||||||
|
K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \
|
||||||
|
K33, K04, K03, K14, K15, K24, K25, K45, K44, K65, K64, K74, K53, \
|
||||||
|
K34, K05, K06, K07, K16, K17, K26, K46, K66, K76, K75, K55, K54, \
|
||||||
|
K35, K36, K37, K57, K56) \
|
||||||
|
\
|
||||||
|
{ \
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07 }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17 }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, KC_NO }, \
|
||||||
|
{ K30, K31, K32, K33, K34, K35, K36, K37 }, \
|
||||||
|
{ K40, K41, K42, K43, K44, K45, K46, KC_NO }, \
|
||||||
|
{ K50, K51, K52, K53, K54, K55, K56, K57 }, \
|
||||||
|
{ K60, K61, K62, K63, K64, K65, K66, KC_NO }, \
|
||||||
|
{ K70, K71, K72, K73, K74, K75, K76, KC_NO } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LAYOUT_60_hhkb LAYOUT
|
|
@ -15,25 +15,20 @@ 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/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_H
|
#pragma once
|
||||||
#define CONFIG_H
|
|
||||||
|
|
||||||
#include "config_common.h"
|
#include "config_common.h"
|
||||||
|
|
||||||
/* USB Device descriptor parameter */
|
/* USB Device descriptor parameter */
|
||||||
#define VENDOR_ID 0xFEED
|
#define VENDOR_ID 0x4848 // HH = happy hacking
|
||||||
#define PRODUCT_ID 0xCAFE
|
#define PRODUCT_ID 0x0001 // ANSI HHKB
|
||||||
#define DEVICE_VER 0x0104
|
#define DEVICE_VER 0x0104
|
||||||
#define MANUFACTURER q.m.k
|
#define MANUFACTURER q.m.k
|
||||||
#define PRODUCT HHKB mod
|
#define PRODUCT HHKB mod
|
||||||
#define DESCRIPTION q.m.k keyboard firmware for HHKB
|
#define DESCRIPTION q.m.k keyboard firmware for HHKB
|
||||||
|
|
||||||
/* key matrix size */
|
/* key matrix size */
|
||||||
#ifdef HHKB_JP
|
|
||||||
# define MATRIX_ROWS 16
|
|
||||||
#else
|
|
||||||
#define MATRIX_ROWS 8
|
#define MATRIX_ROWS 8
|
||||||
#endif
|
|
||||||
#define MATRIX_COLS 8
|
#define MATRIX_COLS 8
|
||||||
|
|
||||||
#define TAPPING_TERM 200
|
#define TAPPING_TERM 200
|
||||||
|
@ -107,5 +102,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
//#define NO_ACTION_ONESHOT
|
//#define NO_ACTION_ONESHOT
|
||||||
//#define NO_ACTION_MACRO
|
//#define NO_ACTION_MACRO
|
||||||
//#define NO_ACTION_FUNCTION
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
#endif
|
|
|
@ -0,0 +1,157 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Timer resolution check
|
||||||
|
#if (1000000/TIMER_RAW_FREQ > 20)
|
||||||
|
# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* HHKB Matrix I/O
|
||||||
|
*
|
||||||
|
* row: HC4051[A,B,C] selects scan row0-7
|
||||||
|
* row-ext: [En0,En1] row extention for JP
|
||||||
|
* col: LS145[A,B,C,D] selects scan col0-7 and enable(D)
|
||||||
|
* key: on: 0/off: 1
|
||||||
|
* prev: hysteresis control: assert(1) when previous key state is on
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega32U4__)
|
||||||
|
/*
|
||||||
|
* For TMK HHKB alt controller(ATMega32U4)
|
||||||
|
*
|
||||||
|
* row: PB0-2
|
||||||
|
* col: PB3-5,6
|
||||||
|
* key: PD7(pull-uped)
|
||||||
|
* prev: PB7
|
||||||
|
* power: PD4(L:off/H:on)
|
||||||
|
* row-ext: PC6,7 for HHKB JP(active low)
|
||||||
|
*/
|
||||||
|
static inline void KEY_ENABLE(void) { (PORTB &= ~(1<<6)); }
|
||||||
|
static inline void KEY_UNABLE(void) { (PORTB |= (1<<6)); }
|
||||||
|
static inline bool KEY_STATE(void) { return (PIND & (1<<7)); }
|
||||||
|
static inline void KEY_PREV_ON(void) { (PORTB |= (1<<7)); }
|
||||||
|
static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); }
|
||||||
|
#ifdef HHKB_POWER_SAVING
|
||||||
|
static inline void KEY_POWER_ON(void) {
|
||||||
|
DDRB = 0xFF; PORTB = 0x40; // change pins output
|
||||||
|
DDRD |= (1<<4); PORTD |= (1<<4); // MOS FET switch on
|
||||||
|
/* Without this wait you will miss or get false key events. */
|
||||||
|
_delay_ms(5); // wait for powering up
|
||||||
|
}
|
||||||
|
static inline void KEY_POWER_OFF(void) {
|
||||||
|
/* input with pull-up consumes less than without it when pin is open. */
|
||||||
|
DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up
|
||||||
|
DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off
|
||||||
|
}
|
||||||
|
static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); }
|
||||||
|
#else
|
||||||
|
static inline void KEY_POWER_ON(void) {}
|
||||||
|
static inline void KEY_POWER_OFF(void) {}
|
||||||
|
static inline bool KEY_POWER_STATE(void) { return true; }
|
||||||
|
#endif
|
||||||
|
static inline void KEY_INIT(void)
|
||||||
|
{
|
||||||
|
/* row,col,prev: output */
|
||||||
|
DDRB = 0xFF;
|
||||||
|
PORTB = 0x40; // unable
|
||||||
|
/* key: input with pull-up */
|
||||||
|
DDRD &= ~0x80;
|
||||||
|
PORTD |= 0x80;
|
||||||
|
|
||||||
|
KEY_UNABLE();
|
||||||
|
KEY_PREV_OFF();
|
||||||
|
|
||||||
|
KEY_POWER_OFF();
|
||||||
|
}
|
||||||
|
static inline void KEY_SELECT(uint8_t ROW, uint8_t COL)
|
||||||
|
{
|
||||||
|
PORTB = (PORTB & 0xC0) | (((COL) & 0x07)<<3) | ((ROW) & 0x07);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__AVR_AT90USB1286__)
|
||||||
|
/*
|
||||||
|
* For Teensy++(AT90USB1286)
|
||||||
|
*
|
||||||
|
* HHKB pro HHKB pro2
|
||||||
|
* row: PB0-2 (6-8) (5-7)
|
||||||
|
* col: PB3-5,6 (9-12) (8-11)
|
||||||
|
* key: PE6(pull-uped) (4) (3)
|
||||||
|
* prev: PE7 (5) (4)
|
||||||
|
*
|
||||||
|
* TODO: convert into 'staitc inline' function
|
||||||
|
*/
|
||||||
|
#define KEY_INIT() do { \
|
||||||
|
DDRB |= 0x7F; \
|
||||||
|
DDRE |= (1<<7); \
|
||||||
|
DDRE &= ~(1<<6); \
|
||||||
|
PORTE |= (1<<6); \
|
||||||
|
} while (0)
|
||||||
|
#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \
|
||||||
|
(((COL) & 0x07)<<3) | \
|
||||||
|
((ROW) & 0x07))
|
||||||
|
#define KEY_ENABLE() (PORTB &= ~(1<<6))
|
||||||
|
#define KEY_UNABLE() (PORTB |= (1<<6))
|
||||||
|
#define KEY_STATE() (PINE & (1<<6))
|
||||||
|
#define KEY_PREV_ON() (PORTE |= (1<<7))
|
||||||
|
#define KEY_PREV_OFF() (PORTE &= ~(1<<7))
|
||||||
|
#define KEY_POWER_ON()
|
||||||
|
#define KEY_POWER_OFF()
|
||||||
|
#define KEY_POWER_STATE() true
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
# error "define code for matrix scan"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// For ATMega328P with V-USB
|
||||||
|
//
|
||||||
|
// #elif defined(__AVR_ATmega328P__)
|
||||||
|
// Ports for V-USB
|
||||||
|
// key: PB0(pull-uped)
|
||||||
|
// prev: PB1
|
||||||
|
// row: PB2-4
|
||||||
|
// col: PC0-2,3
|
||||||
|
// power: PB5(Low:on/Hi-z:off)
|
||||||
|
#define KEY_INIT() do { \
|
||||||
|
DDRB |= 0x3E; \
|
||||||
|
DDRB &= ~(1<<0); \
|
||||||
|
PORTB |= 1<<0; \
|
||||||
|
DDRC |= 0x0F; \
|
||||||
|
KEY_UNABLE(); \
|
||||||
|
KEY_PREV_OFF(); \
|
||||||
|
} while (0)
|
||||||
|
#define KEY_SELECT(ROW, COL) do { \
|
||||||
|
PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \
|
||||||
|
PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \
|
||||||
|
} while (0)
|
||||||
|
#define KEY_ENABLE() (PORTC &= ~(1<<3))
|
||||||
|
#define KEY_UNABLE() (PORTC |= (1<<3))
|
||||||
|
#define KEY_STATE() (PINB & (1<<0))
|
||||||
|
#define KEY_PREV_ON() (PORTB |= (1<<1))
|
||||||
|
#define KEY_PREV_OFF() (PORTB &= ~(1<<1))
|
||||||
|
// Power supply switching
|
||||||
|
#define KEY_POWER_ON() do { \
|
||||||
|
KEY_INIT(); \
|
||||||
|
PORTB &= ~(1<<5); \
|
||||||
|
_delay_ms(1); \
|
||||||
|
} while (0)
|
||||||
|
#define KEY_POWER_OFF() do { \
|
||||||
|
DDRB &= ~0x3F; \
|
||||||
|
PORTB &= ~0x3F; \
|
||||||
|
DDRC &= ~0x0F; \
|
||||||
|
PORTC &= ~0x0F; \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
|
@ -0,0 +1,73 @@
|
||||||
|
{
|
||||||
|
"keyboard_name": "HHKB",
|
||||||
|
"url": "",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"width": 15,
|
||||||
|
"height": 5,
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [
|
||||||
|
{ "label": "Esc", "x": 0, "y": 0 },
|
||||||
|
{ "label": "!", "x": 1, "y": 0 },
|
||||||
|
{ "label": "@", "x": 2, "y": 0 },
|
||||||
|
{ "label": "#", "x": 3, "y": 0 },
|
||||||
|
{ "label": "$", "x": 4, "y": 0 },
|
||||||
|
{ "label": "%", "x": 5, "y": 0 },
|
||||||
|
{ "label": "^", "x": 6, "y": 0 },
|
||||||
|
{ "label": "&", "x": 7, "y": 0 },
|
||||||
|
{ "label": "*", "x": 8, "y": 0 },
|
||||||
|
{ "label": "(", "x": 9, "y": 0 },
|
||||||
|
{ "label": ")", "x": 10, "y": 0 },
|
||||||
|
{ "label": "_", "x": 11, "y": 0 },
|
||||||
|
{ "label": "+", "x": 12, "y": 0 },
|
||||||
|
{ "label": "|", "x": 13, "y": 0 },
|
||||||
|
{ "label": "~", "x": 14, "y": 0 },
|
||||||
|
{ "label": "Tab", "x": 0, "y": 1, "w": 1.5 },
|
||||||
|
{ "label": "Q", "x": 1.5, "y": 1 },
|
||||||
|
{ "label": "W", "x": 2.5, "y": 1 },
|
||||||
|
{ "label": "E", "x": 3.5, "y": 1 },
|
||||||
|
{ "label": "R", "x": 4.5, "y": 1 },
|
||||||
|
{ "label": "T", "x": 5.5, "y": 1 },
|
||||||
|
{ "label": "Y", "x": 6.5, "y": 1 },
|
||||||
|
{ "label": "U", "x": 7.5, "y": 1 },
|
||||||
|
{ "label": "I", "x": 8.5, "y": 1 },
|
||||||
|
{ "label": "O", "x": 9.5, "y": 1 },
|
||||||
|
{ "label": "P", "x": 10.5, "y": 1 },
|
||||||
|
{ "label": "{", "x": 11.5, "y": 1 },
|
||||||
|
{ "label": "}", "x": 12.5, "y": 1 },
|
||||||
|
{ "label": "Delete", "x": 13.5, "y": 1, "w": 1.5 },
|
||||||
|
{ "label": "Control", "x": 0, "y": 2, "w": 1.75 },
|
||||||
|
{ "label": "A", "x": 1.75, "y": 2 },
|
||||||
|
{ "label": "S", "x": 2.75, "y": 2 },
|
||||||
|
{ "label": "D", "x": 3.75, "y": 2 },
|
||||||
|
{ "label": "F", "x": 4.75, "y": 2 },
|
||||||
|
{ "label": "G", "x": 5.75, "y": 2 },
|
||||||
|
{ "label": "H", "x": 6.75, "y": 2 },
|
||||||
|
{ "label": "J", "x": 7.75, "y": 2 },
|
||||||
|
{ "label": "K", "x": 8.75, "y": 2 },
|
||||||
|
{ "label": "L", "x": 9.75, "y": 2 },
|
||||||
|
{ "label": ":", "x": 10.75, "y": 2 },
|
||||||
|
{ "label": "\"", "x": 11.75, "y": 2 },
|
||||||
|
{ "label": "Return", "x": 12.75, "y": 2, "w": 2.25 },
|
||||||
|
{ "label": "Shift", "x": 0, "y": 3, "w": 2.25 },
|
||||||
|
{ "label": "Z", "x": 2.25, "y": 3 },
|
||||||
|
{ "label": "X", "x": 3.25, "y": 3 },
|
||||||
|
{ "label": "C", "x": 4.25, "y": 3 },
|
||||||
|
{ "label": "V", "x": 5.25, "y": 3 },
|
||||||
|
{ "label": "B", "x": 6.25, "y": 3 },
|
||||||
|
{ "label": "N", "x": 7.25, "y": 3 },
|
||||||
|
{ "label": "M", "x": 8.25, "y": 3 },
|
||||||
|
{ "label": "<", "x": 9.25, "y": 3 },
|
||||||
|
{ "label": ">", "x": 10.25, "y": 3 },
|
||||||
|
{ "label": "?", "x": 11.25, "y": 3 },
|
||||||
|
{ "label": "Shift", "x": 12.25, "y": 3, "w": 1.75 },
|
||||||
|
{ "label": "Fn", "x": 14, "y": 3 },
|
||||||
|
{ "label": "", "x": 1.5, "y": 4 },
|
||||||
|
{ "label": "", "x": 2.5, "y": 4, "w": 1.5 },
|
||||||
|
{ "x": 4, "y": 4, "w": 6 },
|
||||||
|
{ "label": "", "x": 10, "y": 4, "w": 1.5 },
|
||||||
|
{ "label": "", "x": 11.5, "y": 4 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue